You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@isis.apache.org by mg...@apache.org on 2014/12/18 21:46:14 UTC

isis git commit: ISIS-972 Make it possible to set FontAwesome icons after the label for action links

Repository: isis
Updated Branches:
  refs/heads/master c7fb77052 -> 21170a38b


ISIS-972 Make it possible to set FontAwesome icons after the label for action links


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

Branch: refs/heads/master
Commit: 21170a38b8fe6005168dbcca7c5e53429ac11e40
Parents: c7fb770
Author: Martin Tzvetanov Grigorov <mg...@apache.org>
Authored: Sat Dec 13 00:12:17 2014 +0200
Committer: Martin Tzvetanov Grigorov <mg...@apache.org>
Committed: Thu Dec 18 22:43:33 2014 +0200

----------------------------------------------------------------------
 .../viewer/wicket/model/links/LinkAndLabel.java |  9 +++-
 .../actionmenu/CssClassFaBehavior.java          | 36 ++++++++++++++
 .../AdditionalLinksAsDropDownPanel.html         |  1 -
 .../AdditionalLinksAsListInlinePanel.html       |  1 -
 .../entityactions/AdditionalLinksPanel.java     | 20 ++++----
 .../actionmenu/serviceactions/CssMenuItem.java  | 27 ++++++++---
 .../serviceactions/CssSubMenuItemsPanel.html    |  1 -
 .../serviceactions/ServiceActionsPanel.html     |  2 +-
 .../serviceactions/ServiceActionsPanel.java     |  7 +--
 .../serviceactions/TertiaryActionsPanel.html    |  1 -
 .../serviceactions/TertiaryActionsPanel.java    |  7 +--
 .../collection/bulk/BulkActionsLinkFactory.java |  5 +-
 .../linkandlabel/ActionLinkFactoryAbstract.java |  3 +-
 .../isis/applib/annotation/ActionLayout.java    | 10 ++++
 .../isis/applib/annotation/CssClassFa.java      |  2 +
 .../core/metamodel/facets/FacetFactory.java     |  4 --
 ...ssClassFaFacetForActionLayoutAnnotation.java |  9 ++--
 ...lassFaFacetOnActionFromLayoutProperties.java | 21 ++++++--
 .../members/cssclassfa/CssClassFaFacet.java     |  8 ++-
 .../cssclassfa/CssClassFaFacetAbstract.java     | 11 ++++-
 .../CssClassFaFacetOnMemberAnnotation.java      |  5 +-
 .../CssClassFaFacetOnMemberFactory.java         | 26 ++++++++--
 ...ClassFaFacetOnMemberFromConfiguredRegex.java |  5 +-
 .../CssClassFaFacetOnMemberFromProperties.java  |  8 ++-
 .../CssClassFaFacetOnTypeAnnotation.java        |  2 +-
 .../layoutmetadata/ActionLayoutFacetRepr.java   |  3 +-
 .../layoutmetadata/CssClassFaFacetRepr.java     |  3 +-
 .../json/LayoutMetadataReaderFromJson.java      |  8 +--
 .../metamodel/spec/feature/ObjectAction.java    |  5 ++
 .../facetprocessor/FacetProcessor.java          |  1 -
 .../AbstractFacetFactoryJUnit4TestCase.java     |  1 +
 .../ActionLayoutAnnotationFacetFactoryTest.java | 51 ++++++++++++++++++++
 ...assFaAnnotationOnMemberFacetFactoryTest.java | 33 ++++++++++++-
 .../cssclassfa/CssClassFaFacetAbstractTest.java |  2 +-
 ...ssClassFacetOnTypeAnnotationFactoryTest.java |  9 +++-
 ...ClassFaFacetOnTypeAnnotationFactoryTest.java | 32 +++++++++++-
 .../src/main/java/dom/todo/ToDoItem.layout.json |  3 +-
 37 files changed, 306 insertions(+), 76 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/isis/blob/21170a38/component/viewer/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/links/LinkAndLabel.java
----------------------------------------------------------------------
diff --git a/component/viewer/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/links/LinkAndLabel.java b/component/viewer/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/links/LinkAndLabel.java
index 658317c..3939436 100644
--- a/component/viewer/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/links/LinkAndLabel.java
+++ b/component/viewer/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/links/LinkAndLabel.java
@@ -46,6 +46,7 @@ public class LinkAndLabel implements Serializable {
     private final String actionIdentifier;
     private final String cssClass;
     private final String cssClassFa;
+    private final ActionLayout.CssClassFaPosition cssClassFaPosition;
     private final ActionLayout.Position position;
 
     public LinkAndLabel(
@@ -58,6 +59,7 @@ public class LinkAndLabel implements Serializable {
             final String identifier,
             final String cssClass,
             final String cssClassFa,
+            final ActionLayout.CssClassFaPosition cssClassFaPosition,
             final ActionLayout.Position position) {
         this.link = link;
         this.label = label;
@@ -68,6 +70,7 @@ public class LinkAndLabel implements Serializable {
         this.actionIdentifier = identifier;
         this.cssClass = cssClass;
         this.cssClassFa = cssClassFa;
+        this.cssClassFaPosition = cssClassFaPosition;
         this.position = position;
     }
 
@@ -107,6 +110,10 @@ public class LinkAndLabel implements Serializable {
         return cssClassFa;
     }
 
+    public ActionLayout.CssClassFaPosition getCssClassFaPosition() {
+        return cssClassFaPosition;
+    }
+
     public ActionLayout.Position getPosition() {
         return position;
     }
@@ -121,4 +128,4 @@ public class LinkAndLabel implements Serializable {
             };
         }
     }
-}
\ No newline at end of file
+}

http://git-wip-us.apache.org/repos/asf/isis/blob/21170a38/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/actionmenu/CssClassFaBehavior.java
----------------------------------------------------------------------
diff --git a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/actionmenu/CssClassFaBehavior.java b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/actionmenu/CssClassFaBehavior.java
new file mode 100644
index 0000000..b1c2a77
--- /dev/null
+++ b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/actionmenu/CssClassFaBehavior.java
@@ -0,0 +1,36 @@
+package org.apache.isis.viewer.wicket.ui.components.actionmenu;
+
+import org.apache.wicket.Component;
+import org.apache.wicket.behavior.Behavior;
+import org.apache.isis.applib.annotation.ActionLayout;
+
+/**
+ * A behavior that prepends or appends the markup needed to show a Font Awesome icon
+ * for a LinkAndLabel
+ */
+public class CssClassFaBehavior extends Behavior {
+
+    private final String cssClassFa;
+    private final ActionLayout.CssClassFaPosition position;
+
+    public CssClassFaBehavior(final String cssClassFa, final ActionLayout.CssClassFaPosition position) {
+        this.cssClassFa = cssClassFa;
+        this.position = position;
+    }
+
+    @Override
+    public void beforeRender(final Component component) {
+        super.beforeRender(component);
+        if (position == null || ActionLayout.CssClassFaPosition.LEFT == position) {
+            component.getResponse().write("<span class=\""+cssClassFa+" fontAwesomeIcon\"></span>");
+        }
+    }
+
+    @Override
+    public void afterRender(final Component component) {
+        if (ActionLayout.CssClassFaPosition.RIGHT == position) {
+            component.getResponse().write("<span class=\""+cssClassFa+" fontAwesomeIcon\"></span>");
+        }
+        super.afterRender(component);
+    }
+}

http://git-wip-us.apache.org/repos/asf/isis/blob/21170a38/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/actionmenu/entityactions/AdditionalLinksAsDropDownPanel.html
----------------------------------------------------------------------
diff --git a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/actionmenu/entityactions/AdditionalLinksAsDropDownPanel.html b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/actionmenu/entityactions/AdditionalLinksAsDropDownPanel.html
index 18a716c..a240cce 100644
--- a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/actionmenu/entityactions/AdditionalLinksAsDropDownPanel.html
+++ b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/actionmenu/entityactions/AdditionalLinksAsDropDownPanel.html
@@ -32,7 +32,6 @@
                     <ul class="dropdown-menu dropdown-menu-right" role="menu">
                         <li wicket:id="additionalLinkItem" class="additionalLinkItem">
                             <a href="#" wicket:id="additionalLink">
-                                <span wicket:id="additionalLinkFontAwesome"></span>
                                 <span wicket:id="additionalLinkTitle" class="additionalLinkItem">[link title]</span>
                             </a>
                         </li>

http://git-wip-us.apache.org/repos/asf/isis/blob/21170a38/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/actionmenu/entityactions/AdditionalLinksAsListInlinePanel.html
----------------------------------------------------------------------
diff --git a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/actionmenu/entityactions/AdditionalLinksAsListInlinePanel.html b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/actionmenu/entityactions/AdditionalLinksAsListInlinePanel.html
index 9fcacee..7cc41f1 100644
--- a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/actionmenu/entityactions/AdditionalLinksAsListInlinePanel.html
+++ b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/actionmenu/entityactions/AdditionalLinksAsListInlinePanel.html
@@ -27,7 +27,6 @@
             <ul wicket:id="additionalLinkList" class="additionalLinkList additionalLinkListInline list-unstyled list-inline">
                 <li wicket:id="additionalLinkItem" class="additionalLinkItem">
                     <a href="#" wicket:id="additionalLink" class="btn btn-sm btn-default">
-                        <span wicket:id="additionalLinkFontAwesome"></span>
                         <span wicket:id="additionalLinkTitle" class="additionalLinkItem">[link title]</span>
                     </a>
                 </li>

http://git-wip-us.apache.org/repos/asf/isis/blob/21170a38/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/actionmenu/entityactions/AdditionalLinksPanel.java
----------------------------------------------------------------------
diff --git a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/actionmenu/entityactions/AdditionalLinksPanel.java b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/actionmenu/entityactions/AdditionalLinksPanel.java
index aa3cec9..5724453 100644
--- a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/actionmenu/entityactions/AdditionalLinksPanel.java
+++ b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/actionmenu/entityactions/AdditionalLinksPanel.java
@@ -28,9 +28,11 @@ import org.apache.wicket.markup.html.basic.Label;
 import org.apache.wicket.markup.html.link.AbstractLink;
 import org.apache.wicket.markup.html.list.ListItem;
 import org.apache.wicket.markup.html.list.ListView;
+import org.apache.isis.applib.annotation.ActionLayout;
 import org.apache.isis.core.commons.lang.StringExtensions;
 import org.apache.isis.viewer.wicket.model.links.LinkAndLabel;
 import org.apache.isis.viewer.wicket.model.links.ListOfLinksModel;
+import org.apache.isis.viewer.wicket.ui.components.actionmenu.CssClassFaBehavior;
 import org.apache.isis.viewer.wicket.ui.panels.PanelAbstract;
 import org.apache.isis.viewer.wicket.ui.util.Components;
 import org.apache.isis.viewer.wicket.ui.util.CssClassAppender;
@@ -41,7 +43,6 @@ public class AdditionalLinksPanel extends PanelAbstract<ListOfLinksModel> {
 
     private static final String ID_ADDITIONAL_LINK_LIST = "additionalLinkList";
     private static final String ID_ADDITIONAL_LINK_ITEM = "additionalLinkItem";
-    private static final String ID_ADDITIONAL_LINK_FONT_AWESOME = "additionalLinkFontAwesome";
     private static final String ID_ADDITIONAL_LINK_TITLE = "additionalLinkTitle";
 
     public static final String ID_ADDITIONAL_LINK = "additionalLink";
@@ -102,15 +103,6 @@ public class AdditionalLinksPanel extends PanelAbstract<ListOfLinksModel> {
                 
                 final AbstractLink link = linkAndLabel.getLink();
 
-                final String cssClassFa = linkAndLabel.getCssClassFa();
-                if(Strings.isNullOrEmpty(cssClassFa)) {
-                    Components.permanentlyHide(link, ID_ADDITIONAL_LINK_FONT_AWESOME);
-                } else {
-                    Label dummy = new Label(ID_ADDITIONAL_LINK_FONT_AWESOME, "");
-                    link.addOrReplace(dummy);
-                    dummy.add(new CssClassAppender(cssClassFa));
-                }
-
                 final String itemTitle = first(linkAndLabel.getDisabledReasonIfAny(), linkAndLabel.getDescriptionIfAny());
                 if(itemTitle != null) {
                     item.add(new AttributeAppender("title", itemTitle));
@@ -132,6 +124,13 @@ public class AdditionalLinksPanel extends PanelAbstract<ListOfLinksModel> {
                 viewTitleLabel.add(new CssClassAppender(StringExtensions.asLowerDashed(linkAndLabel.getLabel())));
 
                 link.addOrReplace(viewTitleLabel);
+
+                final String cssClassFa = linkAndLabel.getCssClassFa();
+                if(!Strings.isNullOrEmpty(cssClassFa)) {
+                    final ActionLayout.CssClassFaPosition position = linkAndLabel.getCssClassFaPosition();
+                    viewTitleLabel.add(new CssClassFaBehavior(cssClassFa, position));
+                }
+
                 item.addOrReplace(link);
             }
         };
@@ -145,5 +144,4 @@ public class AdditionalLinksPanel extends PanelAbstract<ListOfLinksModel> {
         return null;
     }
 
-
 }

http://git-wip-us.apache.org/repos/asf/isis/blob/21170a38/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/actionmenu/serviceactions/CssMenuItem.java
----------------------------------------------------------------------
diff --git a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/actionmenu/serviceactions/CssMenuItem.java b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/actionmenu/serviceactions/CssMenuItem.java
index 3e8914d..b06bc95 100644
--- a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/actionmenu/serviceactions/CssMenuItem.java
+++ b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/actionmenu/serviceactions/CssMenuItem.java
@@ -32,6 +32,7 @@ import org.apache.wicket.markup.html.basic.Label;
 import org.apache.wicket.markup.html.form.SubmitLink;
 import org.apache.wicket.markup.html.link.AbstractLink;
 import org.apache.wicket.model.Model;
+import org.apache.isis.applib.annotation.ActionLayout;
 import org.apache.isis.core.commons.authentication.AuthenticationSession;
 import org.apache.isis.core.commons.ensure.Ensure;
 import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
@@ -45,6 +46,7 @@ import org.apache.isis.core.runtime.system.context.IsisContext;
 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.ActionModel;
+import org.apache.isis.viewer.wicket.ui.components.actionmenu.CssClassFaBehavior;
 import org.apache.isis.viewer.wicket.ui.components.widgets.linkandlabel.ActionLinkFactory;
 import org.apache.isis.viewer.wicket.ui.pages.PageAbstract;
 import org.apache.isis.viewer.wicket.ui.util.Components;
@@ -136,6 +138,11 @@ class CssMenuItem implements Serializable {
             return this;
         }
 
+        public Builder withCssClassFaPosition(final ActionLayout.CssClassFaPosition position) {
+            cssMenuItem.setCssClassFaPosition(position);
+            return this;
+        }
+
         /**
          * Returns the built {@link CssMenuItem}, associating with
          * {@link #parent(CssMenuItem) parent} (if specified).
@@ -167,6 +174,7 @@ class CssMenuItem implements Serializable {
     private String actionIdentifier;
     private String cssClass;
     private String cssClassFa;
+    private ActionLayout.CssClassFaPosition cssClassFaPosition;
 
     private String description;
 
@@ -264,6 +272,14 @@ class CssMenuItem implements Serializable {
         return cssClassFa;
     }
 
+    public void setCssClassFaPosition(final ActionLayout.CssClassFaPosition position) {
+        this.cssClassFaPosition = position;
+    }
+
+    public ActionLayout.CssClassFaPosition getCssClassFaPosition() {
+        return cssClassFaPosition;
+    }
+
 
     /**
      * Only populated if not {@link #isEnabled() enabled}.
@@ -331,7 +347,8 @@ class CssMenuItem implements Serializable {
                 .separator(separator)
                 .withActionIdentifier(ObjectAction.Utils.actionIdentifierFor(objectAction))
                 .withCssClass(ObjectAction.Utils.cssClassFor(objectAction))
-                .withCssClassFa(ObjectAction.Utils.cssClassFaFor(objectAction));
+                .withCssClassFa(ObjectAction.Utils.cssClassFaFor(objectAction))
+                .withCssClassFaPosition(ObjectAction.Utils.cssClassFaPositionFor(objectAction));
 
         return builder;
     }
@@ -376,12 +393,8 @@ class CssMenuItem implements Serializable {
             link.add(new CssClassAppender(this.actionIdentifier));
 
             String cssClassFa = getCssClassFa();
-            if (Strings.isNullOrEmpty(cssClassFa)) {
-                Components.permanentlyHide(link, "menuLinkFontAwesome");
-            } else {
-                Label dummy = new Label("menuLinkFontAwesome", "");
-                dummy.add(new CssClassAppender(cssClassFa));
-                link.add(dummy);
+            if (!Strings.isNullOrEmpty(cssClassFa)) {
+                label.add(new CssClassFaBehavior(cssClassFa, getCssClassFaPosition()));
             }
 
             if(! this.isEnabled()) {

http://git-wip-us.apache.org/repos/asf/isis/blob/21170a38/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/actionmenu/serviceactions/CssSubMenuItemsPanel.html
----------------------------------------------------------------------
diff --git a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/actionmenu/serviceactions/CssSubMenuItemsPanel.html b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/actionmenu/serviceactions/CssSubMenuItemsPanel.html
index 9c1e14f..d70febc 100644
--- a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/actionmenu/serviceactions/CssSubMenuItemsPanel.html
+++ b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/actionmenu/serviceactions/CssSubMenuItemsPanel.html
@@ -23,7 +23,6 @@
     <ul class="cssSubMenuItemsPanel">
         <li wicket:id="subMenuItems" class="cssSubMenuItem">
             <a wicket:id="menuLink" class="btn btn-primary btn-sm">
-                <span class="fontAwesomeIcon" wicket:id="menuLinkFontAwesome"></span>
                 <span class="menuLabel" wicket:id="menuLabel">[menu label]</span>
             </a>
             <p wicket:id="menuLabel">[menu label]</p>

http://git-wip-us.apache.org/repos/asf/isis/blob/21170a38/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/actionmenu/serviceactions/ServiceActionsPanel.html
----------------------------------------------------------------------
diff --git a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/actionmenu/serviceactions/ServiceActionsPanel.html b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/actionmenu/serviceactions/ServiceActionsPanel.html
index 3a6dd5d..d4f9f78 100644
--- a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/actionmenu/serviceactions/ServiceActionsPanel.html
+++ b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/actionmenu/serviceactions/ServiceActionsPanel.html
@@ -13,7 +13,7 @@
 
             <wicket:fragment wicket:id="leafItem">
                 <a class="menuLink" wicket:id="menuLink">
-                    <span class="fontAwesomeIcon" wicket:id="menuLinkFontAwesome"></span> <span class="menuLinkLabel" wicket:id="menuLinkLabel"></span>
+                    <span class="menuLinkLabel" wicket:id="menuLinkLabel"></span>
                 </a>
             </wicket:fragment>
 

http://git-wip-us.apache.org/repos/asf/isis/blob/21170a38/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/actionmenu/serviceactions/ServiceActionsPanel.java
----------------------------------------------------------------------
diff --git a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/actionmenu/serviceactions/ServiceActionsPanel.java b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/actionmenu/serviceactions/ServiceActionsPanel.java
index b2324cd..396eb48 100644
--- a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/actionmenu/serviceactions/ServiceActionsPanel.java
+++ b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/actionmenu/serviceactions/ServiceActionsPanel.java
@@ -20,7 +20,7 @@ import org.apache.wicket.markup.html.panel.Fragment;
 import org.apache.wicket.markup.html.panel.Panel;
 import org.apache.wicket.model.Model;
 import org.apache.wicket.request.resource.CssResourceReference;
-import org.apache.isis.viewer.wicket.ui.util.Components;
+import org.apache.isis.viewer.wicket.ui.components.actionmenu.CssClassFaBehavior;
 import org.apache.isis.viewer.wicket.ui.util.CssClassAppender;
 
 /**
@@ -152,12 +152,9 @@ public class ServiceActionsPanel extends Panel {
 
             String cssClassFa = menuItem.getCssClassFa();
             if (Strings.isNullOrEmpty(cssClassFa)) {
-                Components.permanentlyHide(subMenuItemLink, "menuLinkFontAwesome");
                 subMenuItemLink.add(new CssClassAppender("menuLinkSpacer"));
             } else {
-                Label dummy = new Label("menuLinkFontAwesome", "");
-                dummy.add(new CssClassAppender(cssClassFa));
-                subMenuItemLink.addOrReplace(dummy);
+                menuItemLabel.add(new CssClassFaBehavior(cssClassFa, menuItem.getCssClassFaPosition()));
             }
         } else {
             leafItem = new Fragment("content", "empty", ServiceActionsPanel.this);

http://git-wip-us.apache.org/repos/asf/isis/blob/21170a38/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/actionmenu/serviceactions/TertiaryActionsPanel.html
----------------------------------------------------------------------
diff --git a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/actionmenu/serviceactions/TertiaryActionsPanel.html b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/actionmenu/serviceactions/TertiaryActionsPanel.html
index 3bdef47..5eab260 100644
--- a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/actionmenu/serviceactions/TertiaryActionsPanel.html
+++ b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/actionmenu/serviceactions/TertiaryActionsPanel.html
@@ -20,7 +20,6 @@
 
             <wicket:fragment wicket:id="leafItem">
                 <a class="menuLink" wicket:id="menuLink">
-                    <span class="fontAwesomeIcon" wicket:id="menuLinkFontAwesome"></span>
                     <span class="menuLinkLabel" wicket:id="menuLinkLabel"></span>
                 </a>
             </wicket:fragment>

http://git-wip-us.apache.org/repos/asf/isis/blob/21170a38/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/actionmenu/serviceactions/TertiaryActionsPanel.java
----------------------------------------------------------------------
diff --git a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/actionmenu/serviceactions/TertiaryActionsPanel.java b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/actionmenu/serviceactions/TertiaryActionsPanel.java
index 86c7378..a27bc17 100644
--- a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/actionmenu/serviceactions/TertiaryActionsPanel.java
+++ b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/actionmenu/serviceactions/TertiaryActionsPanel.java
@@ -21,8 +21,8 @@ import org.apache.wicket.markup.html.panel.Panel;
 import org.apache.wicket.model.Model;
 import org.apache.wicket.request.resource.CssResourceReference;
 import org.apache.isis.viewer.wicket.model.models.PageType;
+import org.apache.isis.viewer.wicket.ui.components.actionmenu.CssClassFaBehavior;
 import org.apache.isis.viewer.wicket.ui.pages.PageClassRegistry;
-import org.apache.isis.viewer.wicket.ui.util.Components;
 import org.apache.isis.viewer.wicket.ui.util.CssClassAppender;
 
 /**
@@ -145,12 +145,9 @@ public class TertiaryActionsPanel extends Panel {
 
             String cssClassFa = menuItem.getCssClassFa();
             if (Strings.isNullOrEmpty(cssClassFa)) {
-                Components.permanentlyHide(subMenuItemLink, "menuLinkFontAwesome");
                 subMenuItemLink.add(new CssClassAppender("menuLinkSpacer"));
             } else {
-                Label dummy = new Label("menuLinkFontAwesome", "");
-                dummy.add(new CssClassAppender(cssClassFa));
-                subMenuItemLink.addOrReplace(dummy);
+                menuItemLabel.add(new CssClassFaBehavior(cssClassFa, menuItem.getCssClassFaPosition()));
             }
         } else {
             leafItem = new Fragment("content", "empty", TertiaryActionsPanel.this);

http://git-wip-us.apache.org/repos/asf/isis/blob/21170a38/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collection/bulk/BulkActionsLinkFactory.java
----------------------------------------------------------------------
diff --git a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collection/bulk/BulkActionsLinkFactory.java b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collection/bulk/BulkActionsLinkFactory.java
index 8ba0c16..1ccbd22 100644
--- a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collection/bulk/BulkActionsLinkFactory.java
+++ b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collection/bulk/BulkActionsLinkFactory.java
@@ -204,9 +204,10 @@ public final class BulkActionsLinkFactory implements ActionLinkFactory {
         final String description = ObjectAction.Utils.descriptionOf(objectAction);
         final String cssClass = ObjectAction.Utils.cssClassFor(objectAction);
         final String cssClassFa = ObjectAction.Utils.cssClassFaFor(objectAction);
+        final ActionLayout.CssClassFaPosition cssClassFaPosition = ObjectAction.Utils.cssClassFaPositionFor(objectAction);
         final ActionLayout.Position position = ObjectAction.Utils.actionLayoutPositionOf(objectAction);
 
-        return new LinkAndLabel(link, objectAction.getName(), null, description, false, explorationOrPrototype, actionIdentifier, cssClass, cssClassFa, position);
+        return new LinkAndLabel(link, objectAction.getName(), null, description, false, explorationOrPrototype, actionIdentifier, cssClass, cssClassFa, cssClassFaPosition, position);
     }
     
     
@@ -227,4 +228,4 @@ public final class BulkActionsLinkFactory implements ActionLinkFactory {
         return IsisContext.getPersistenceSession().getServicesInjector();
     }
 
-}
\ No newline at end of file
+}

http://git-wip-us.apache.org/repos/asf/isis/blob/21170a38/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/linkandlabel/ActionLinkFactoryAbstract.java
----------------------------------------------------------------------
diff --git a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/linkandlabel/ActionLinkFactoryAbstract.java b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/linkandlabel/ActionLinkFactoryAbstract.java
index dff6cd9..e400a06 100644
--- a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/linkandlabel/ActionLinkFactoryAbstract.java
+++ b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/linkandlabel/ActionLinkFactoryAbstract.java
@@ -212,8 +212,9 @@ public abstract class ActionLinkFactoryAbstract implements ActionLinkFactory {
         final ActionLayout.Position position = ObjectAction.Utils.actionLayoutPositionOf(objectAction);
         final String cssClass = ObjectAction.Utils.cssClassFor(objectAction);
         final String cssClassFa = ObjectAction.Utils.cssClassFaFor(objectAction);
+        final ActionLayout.CssClassFaPosition cssClassFaPosition = ObjectAction.Utils.cssClassFaPositionFor(objectAction);
 
-        return new LinkAndLabel(link, label, disabledReasonIfAny, description, blobOrClob, prototype, actionIdentifier, cssClass, cssClassFa, position);
+        return new LinkAndLabel(link, label, disabledReasonIfAny, description, blobOrClob, prototype, actionIdentifier, cssClass, cssClassFa, cssClassFaPosition, position);
     }
 
 

http://git-wip-us.apache.org/repos/asf/isis/blob/21170a38/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 93e2836..47bf4a0 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
@@ -49,6 +49,16 @@ public @interface ActionLayout {
     String cssClassFa() default "";
 
     /**
+     * Indicates the position of the <a href="http://fortawesome.github.io/Font-Awesome/">Font Awesome</a>
+     * icon. The icon could be rendered on the left or the right of the action button
+     */
+    CssClassFaPosition cssClassFaPosition() default CssClassFaPosition.LEFT;
+
+    enum CssClassFaPosition {
+        LEFT, RIGHT
+    }
+
+    /**
      * Description of this action, eg to be rendered in a tooltip.
      */
     String describedAs() default "";

http://git-wip-us.apache.org/repos/asf/isis/blob/21170a38/core/applib/src/main/java/org/apache/isis/applib/annotation/CssClassFa.java
----------------------------------------------------------------------
diff --git a/core/applib/src/main/java/org/apache/isis/applib/annotation/CssClassFa.java b/core/applib/src/main/java/org/apache/isis/applib/annotation/CssClassFa.java
index 3ff2f4f..a25e8c0 100644
--- a/core/applib/src/main/java/org/apache/isis/applib/annotation/CssClassFa.java
+++ b/core/applib/src/main/java/org/apache/isis/applib/annotation/CssClassFa.java
@@ -30,5 +30,7 @@ import java.lang.annotation.*;
 @Retention(RetentionPolicy.RUNTIME)
 public @interface CssClassFa {
     String value();
+
+    ActionLayout.CssClassFaPosition position() default ActionLayout.CssClassFaPosition.LEFT;
 }
 

http://git-wip-us.apache.org/repos/asf/isis/blob/21170a38/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 18d99cc..fbedb4a 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
@@ -32,10 +32,6 @@ 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;
-import org.apache.isis.core.metamodel.spec.feature.OneToManyAssociation;
-import org.apache.isis.core.metamodel.spec.feature.OneToOneAssociation;
 
 public interface FacetFactory {
 

http://git-wip-us.apache.org/repos/asf/isis/blob/21170a38/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/layout/CssClassFaFacetForActionLayoutAnnotation.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/layout/CssClassFaFacetForActionLayoutAnnotation.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/layout/CssClassFaFacetForActionLayoutAnnotation.java
index c4d2772..12d5b0d 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/layout/CssClassFaFacetForActionLayoutAnnotation.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/layout/CssClassFaFacetForActionLayoutAnnotation.java
@@ -27,16 +27,17 @@ import org.apache.isis.core.metamodel.facets.members.cssclassfa.CssClassFaFacetA
 
 public class CssClassFaFacetForActionLayoutAnnotation extends CssClassFaFacetAbstract {
 
-    public static CssClassFaFacet create(ActionLayout actionLayout, FacetHolder holder) {
+    public static CssClassFaFacet create(final ActionLayout actionLayout, final FacetHolder holder) {
         if(actionLayout == null) {
             return null;
         }
         final String cssClassFa = Strings.emptyToNull(actionLayout.cssClassFa());
-        return cssClassFa != null ? new CssClassFaFacetForActionLayoutAnnotation(cssClassFa, holder) : null;
+        ActionLayout.CssClassFaPosition cssClassFaPosition = actionLayout.cssClassFaPosition();
+        return cssClassFa != null ? new CssClassFaFacetForActionLayoutAnnotation(cssClassFa, cssClassFaPosition, holder) : null;
     }
 
-    private CssClassFaFacetForActionLayoutAnnotation(String value, FacetHolder holder) {
-        super(value, holder);
+    private CssClassFaFacetForActionLayoutAnnotation(final String value, final ActionLayout.CssClassFaPosition position, final FacetHolder holder) {
+        super(value, position, holder);
     }
 
 }

http://git-wip-us.apache.org/repos/asf/isis/blob/21170a38/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/layout/CssClassFaFacetOnActionFromLayoutProperties.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/layout/CssClassFaFacetOnActionFromLayoutProperties.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/layout/CssClassFaFacetOnActionFromLayoutProperties.java
index de082f5..f264082 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/layout/CssClassFaFacetOnActionFromLayoutProperties.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/layout/CssClassFaFacetOnActionFromLayoutProperties.java
@@ -21,26 +21,37 @@ 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.ActionLayout;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 import org.apache.isis.core.metamodel.facets.members.cssclassfa.CssClassFaFacet;
 import org.apache.isis.core.metamodel.facets.members.cssclassfa.CssClassFaFacetAbstract;
 
 public class CssClassFaFacetOnActionFromLayoutProperties extends CssClassFaFacetAbstract {
 
-    public static CssClassFaFacet create(Properties properties, FacetHolder holder) {
+    public static CssClassFaFacet create(final Properties properties, final FacetHolder holder) {
         final String cssClassFa = cssClassFa(properties);
-        return cssClassFa != null? new CssClassFaFacetOnActionFromLayoutProperties(cssClassFa, holder): null;
+        ActionLayout.CssClassFaPosition position = cssClassFaPosition(properties);
+        return cssClassFa != null? new CssClassFaFacetOnActionFromLayoutProperties(cssClassFa, position, holder): null;
     }
 
-    private CssClassFaFacetOnActionFromLayoutProperties(String cssClass, FacetHolder holder) {
-        super(cssClass, holder);
+    private CssClassFaFacetOnActionFromLayoutProperties(final String cssClass, final ActionLayout.CssClassFaPosition position, final FacetHolder holder) {
+        super(cssClass, position, holder);
     }
 
-    private static String cssClassFa(Properties properties) {
+    private static String cssClassFa(final Properties properties) {
         if(properties == null) {
             return null;
         }
         return Strings.emptyToNull(properties.getProperty("cssClassFa"));
     }
 
+    private static ActionLayout.CssClassFaPosition cssClassFaPosition(final Properties properties) {
+        if (properties == null) {
+            return null;
+        }
+        String cssClassFaPosition = Strings.emptyToNull(properties.getProperty("cssClassFaPosition"));
+        return cssClassFaPosition != null
+            ? ActionLayout.CssClassFaPosition.valueOf(cssClassFaPosition.toUpperCase())
+            : ActionLayout.CssClassFaPosition.LEFT;
+    }
 }

http://git-wip-us.apache.org/repos/asf/isis/blob/21170a38/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/members/cssclassfa/CssClassFaFacet.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/members/cssclassfa/CssClassFaFacet.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/members/cssclassfa/CssClassFaFacet.java
index 85a7da3..88b39d8 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/members/cssclassfa/CssClassFaFacet.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/members/cssclassfa/CssClassFaFacet.java
@@ -19,6 +19,7 @@
 
 package org.apache.isis.core.metamodel.facets.members.cssclassfa;
 
+import org.apache.isis.applib.annotation.ActionLayout;
 import org.apache.isis.core.metamodel.facets.SingleStringValueFacet;
 
 /**
@@ -26,7 +27,12 @@ import org.apache.isis.core.metamodel.facets.SingleStringValueFacet;
  *
  * <p>
  * In the standard Apache Isis Programming Model, corresponds to annotating the
- * member with <tt>{@literal @}{@link org.apache.isis.applib.annotation.CssClassFa CssClassFa}</tt>.
+ * member with <tt>{@literal @}{@link org.apache.isis.applib.annotation.ActionLayout#cssClassFa()  ActionLayout}</tt>#cssClassFa().
  */
 public interface CssClassFaFacet extends SingleStringValueFacet {
+
+    /**
+     * @return The position of the <a href="http://fortawesome.github.io/Font-Awesome/">Font Awesome</a> icon.
+     */
+    ActionLayout.CssClassFaPosition getPosition();
 }

http://git-wip-us.apache.org/repos/asf/isis/blob/21170a38/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/members/cssclassfa/CssClassFaFacetAbstract.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/members/cssclassfa/CssClassFaFacetAbstract.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/members/cssclassfa/CssClassFaFacetAbstract.java
index b3d2d7f..c4453a7 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/members/cssclassfa/CssClassFaFacetAbstract.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/members/cssclassfa/CssClassFaFacetAbstract.java
@@ -24,6 +24,7 @@ import java.util.regex.Pattern;
 import com.google.common.base.Joiner;
 import com.google.common.base.Splitter;
 import com.google.common.collect.Sets;
+import org.apache.isis.applib.annotation.ActionLayout;
 import org.apache.isis.core.metamodel.facetapi.Facet;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 import org.apache.isis.core.metamodel.facets.SingleStringValueFacetAbstract;
@@ -32,8 +33,16 @@ public class CssClassFaFacetAbstract extends SingleStringValueFacetAbstract impl
 
     private static final Pattern WHITESPACE = Pattern.compile("\\s+");
 
-    public CssClassFaFacetAbstract(final String value, final FacetHolder holder) {
+    private final ActionLayout.CssClassFaPosition position;
+
+    public CssClassFaFacetAbstract(final String value, final ActionLayout.CssClassFaPosition position, final FacetHolder holder) {
         super(type(), holder, sanitize(value));
+        this.position = position;
+    }
+
+    @Override
+    public ActionLayout.CssClassFaPosition getPosition() {
+        return position;
     }
 
     /**

http://git-wip-us.apache.org/repos/asf/isis/blob/21170a38/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/members/cssclassfa/annotprop/CssClassFaFacetOnMemberAnnotation.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/members/cssclassfa/annotprop/CssClassFaFacetOnMemberAnnotation.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/members/cssclassfa/annotprop/CssClassFaFacetOnMemberAnnotation.java
index dbb3441..06fe32f 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/members/cssclassfa/annotprop/CssClassFaFacetOnMemberAnnotation.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/members/cssclassfa/annotprop/CssClassFaFacetOnMemberAnnotation.java
@@ -19,12 +19,13 @@
 
 package org.apache.isis.core.metamodel.facets.members.cssclassfa.annotprop;
 
+import org.apache.isis.applib.annotation.ActionLayout;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 import org.apache.isis.core.metamodel.facets.members.cssclassfa.CssClassFaFacetAbstract;
 
 public class CssClassFaFacetOnMemberAnnotation extends CssClassFaFacetAbstract {
 
-    public CssClassFaFacetOnMemberAnnotation(final String value, final FacetHolder holder) {
-        super(value, holder);
+    public CssClassFaFacetOnMemberAnnotation(final String value, final ActionLayout.CssClassFaPosition position, final FacetHolder holder) {
+        super(value, position, holder);
     }
 }

http://git-wip-us.apache.org/repos/asf/isis/blob/21170a38/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/members/cssclassfa/annotprop/CssClassFaFacetOnMemberFactory.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/members/cssclassfa/annotprop/CssClassFaFacetOnMemberFactory.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/members/cssclassfa/annotprop/CssClassFaFacetOnMemberFactory.java
index 09ec8d3..c8d2369 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/members/cssclassfa/annotprop/CssClassFaFacetOnMemberFactory.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/members/cssclassfa/annotprop/CssClassFaFacetOnMemberFactory.java
@@ -27,6 +27,7 @@ import java.util.regex.Matcher;
 import java.util.regex.Pattern;
 import com.google.common.base.Strings;
 import com.google.common.collect.Maps;
+import org.apache.isis.applib.annotation.ActionLayout;
 import org.apache.isis.applib.annotation.CssClassFa;
 import org.apache.isis.core.commons.config.ConfigurationConstants;
 import org.apache.isis.core.commons.config.IsisConfiguration;
@@ -79,21 +80,36 @@ public class CssClassFaFacetOnMemberFactory extends FacetFactoryAbstract impleme
 
     private CssClassFaFacet createFromAnnotationIfPossible(final ProcessMethodContext processMethodContext) {
         final CssClassFa annotation = Annotations.getAnnotation(processMethodContext.getMethod(), CssClassFa.class);
-        return annotation != null ? new CssClassFaFacetOnMemberAnnotation(annotation.value(), processMethodContext.getFacetHolder()) : null;
+        return annotation != null ? new CssClassFaFacetOnMemberAnnotation(annotation.value(), annotation.position(), processMethodContext.getFacetHolder()) : null;
     }
 
     //region > faIconFromPattern
 
+    /**
+     * The pattern matches definitions like:
+     * <ul>
+     *     <li>methodNameRegex:cssClassFa - will render the Font Awesome icon on the left of the title</li>
+     *     <li>methodNameRegex:cssClassFa:(left|right) - will render the Font Awesome icon on the specified position of the title</li>
+     * </ul>
+     */
     private final static Pattern FA_ICON_REGEX_PATTERN = Pattern.compile("([^:]+):(.+)");
 
     private CssClassFaFacet createFromConfiguredRegexIfPossible(final ProcessMethodContext processMethodContext) {
         final Method method = processMethodContext.getMethod();
 
         String value = faIconIfAnyFor(method);
-
-        return value != null
-                ? new CssClassFaFacetOnMemberFromConfiguredRegex(value, processMethodContext.getFacetHolder())
-                : null;
+        ActionLayout.CssClassFaPosition position = ActionLayout.CssClassFaPosition.LEFT;
+        if (value != null) {
+            int idxOfSeparator = value.indexOf(':');
+            if (idxOfSeparator > -1) {
+                value = value.substring(0, idxOfSeparator);
+                String rest = value.substring(idxOfSeparator + 1);
+                position = ActionLayout.CssClassFaPosition.valueOf(rest.toUpperCase());
+            }
+            return new CssClassFaFacetOnMemberFromConfiguredRegex(value, position, processMethodContext.getFacetHolder());
+        } else {
+            return null;
+        }
     }
 
     private String faIconIfAnyFor(Method method) {

http://git-wip-us.apache.org/repos/asf/isis/blob/21170a38/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/members/cssclassfa/annotprop/CssClassFaFacetOnMemberFromConfiguredRegex.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/members/cssclassfa/annotprop/CssClassFaFacetOnMemberFromConfiguredRegex.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/members/cssclassfa/annotprop/CssClassFaFacetOnMemberFromConfiguredRegex.java
index 9be8ed8..39c32a3 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/members/cssclassfa/annotprop/CssClassFaFacetOnMemberFromConfiguredRegex.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/members/cssclassfa/annotprop/CssClassFaFacetOnMemberFromConfiguredRegex.java
@@ -19,12 +19,13 @@
 
 package org.apache.isis.core.metamodel.facets.members.cssclassfa.annotprop;
 
+import org.apache.isis.applib.annotation.ActionLayout;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 import org.apache.isis.core.metamodel.facets.members.cssclassfa.CssClassFaFacetAbstract;
 
 public class CssClassFaFacetOnMemberFromConfiguredRegex extends CssClassFaFacetAbstract {
 
-    public CssClassFaFacetOnMemberFromConfiguredRegex(final String value, final FacetHolder holder) {
-        super(value, holder);
+    public CssClassFaFacetOnMemberFromConfiguredRegex(final String value, final ActionLayout.CssClassFaPosition position, final FacetHolder holder) {
+        super(value, position, holder);
     }
 }

http://git-wip-us.apache.org/repos/asf/isis/blob/21170a38/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/members/cssclassfa/annotprop/CssClassFaFacetOnMemberFromProperties.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/members/cssclassfa/annotprop/CssClassFaFacetOnMemberFromProperties.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/members/cssclassfa/annotprop/CssClassFaFacetOnMemberFromProperties.java
index 6d29f16..bf6fd40 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/members/cssclassfa/annotprop/CssClassFaFacetOnMemberFromProperties.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/members/cssclassfa/annotprop/CssClassFaFacetOnMemberFromProperties.java
@@ -20,16 +20,22 @@
 package org.apache.isis.core.metamodel.facets.members.cssclassfa.annotprop;
 
 import java.util.Properties;
+import org.apache.isis.applib.annotation.ActionLayout;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 import org.apache.isis.core.metamodel.facets.members.cssclassfa.CssClassFaFacetAbstract;
 
 public class CssClassFaFacetOnMemberFromProperties extends CssClassFaFacetAbstract {
 
     public CssClassFaFacetOnMemberFromProperties(final Properties properties, final FacetHolder holder) {
-        super(valueFrom(properties), holder);
+        super(valueFrom(properties), positionFrom(properties), holder);
     }
 
     private static String valueFrom(Properties properties) {
         return properties.getProperty("value");
     }
+
+    private static ActionLayout.CssClassFaPosition positionFrom(final Properties properties) {
+        String position = properties.getProperty("position");
+        return ActionLayout.CssClassFaPosition.valueOf(position.toUpperCase());
+    }
 }

http://git-wip-us.apache.org/repos/asf/isis/blob/21170a38/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/cssclassfa/annotation/annotation/CssClassFaFacetOnTypeAnnotation.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/cssclassfa/annotation/annotation/CssClassFaFacetOnTypeAnnotation.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/cssclassfa/annotation/annotation/CssClassFaFacetOnTypeAnnotation.java
index ad61151..b826fe7 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/cssclassfa/annotation/annotation/CssClassFaFacetOnTypeAnnotation.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/cssclassfa/annotation/annotation/CssClassFaFacetOnTypeAnnotation.java
@@ -26,6 +26,6 @@ import org.apache.isis.core.metamodel.facets.members.cssclassfa.CssClassFaFacetA
 public class CssClassFaFacetOnTypeAnnotation extends CssClassFaFacetAbstract {
 
     public CssClassFaFacetOnTypeAnnotation(final CssClassFa cssClassFa, final FacetHolder holder) {
-        super(cssClassFa.value(), holder);
+        super(cssClassFa.value(), cssClassFa.position(), holder);
     }
 }

http://git-wip-us.apache.org/repos/asf/isis/blob/21170a38/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 92219e2..73702af 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
@@ -23,9 +23,10 @@ import org.apache.isis.applib.annotation.Where;
 public class ActionLayoutFacetRepr {
     public String cssClass;
     public String cssClassFa;
+    public String cssClassFaPosition;
     public String describedAs;
     public Where hidden;
     public String named;
     public ActionLayout.Position position;
     public boolean prototype;
-}
\ No newline at end of file
+}

http://git-wip-us.apache.org/repos/asf/isis/blob/21170a38/core/metamodel/src/main/java/org/apache/isis/core/metamodel/layoutmetadata/CssClassFaFacetRepr.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/layoutmetadata/CssClassFaFacetRepr.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/layoutmetadata/CssClassFaFacetRepr.java
index 07e2c17..f45f6c5 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/layoutmetadata/CssClassFaFacetRepr.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/layoutmetadata/CssClassFaFacetRepr.java
@@ -19,4 +19,5 @@ package org.apache.isis.core.metamodel.layoutmetadata;
 
 public class CssClassFaFacetRepr {
     public String value;
-}
\ No newline at end of file
+    public String position;
+}

http://git-wip-us.apache.org/repos/asf/isis/blob/21170a38/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 eeb7d10..0d95421 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
@@ -326,6 +326,9 @@ public class LayoutMetadataReaderFromJson implements LayoutMetadataReader {
             if(actionLayout.cssClassFa != null) {
                 props.setProperty(prefix + "." + actionName + ".actionLayout.cssClassFa", actionLayout.cssClassFa);
             }
+            if(actionLayout.cssClassFaPosition != null) {
+                props.setProperty(prefix + "." + actionName + ".actionLayout.cssClassFaPosition", actionLayout.cssClassFaPosition);
+            }
             if(actionLayout.describedAs != null) {
                 props.setProperty(prefix + "." + actionName + ".actionLayout.describedAs", actionLayout.describedAs);
             }
@@ -354,6 +357,7 @@ public class LayoutMetadataReaderFromJson implements LayoutMetadataReader {
         final CssClassFaFacetRepr cssClassFa = actionRepr.cssClassFa;
         if(cssClassFa != null) {
             props.setProperty(prefix +"." + actionName + ".cssClassFa.value", cssClassFa.value);
+            props.setProperty(prefix +"." + actionName + ".cssClassFa.position", cssClassFa.position);
         }
         final DescribedAsFacetRepr describedAs = actionRepr.describedAs;
         if(describedAs!= null) {
@@ -368,9 +372,7 @@ public class LayoutMetadataReaderFromJson implements LayoutMetadataReader {
     public LayoutMetadata asLayoutMetadata(Class<?> domainClass) throws ReaderException {
         try {
             return readMetadata(domainClass);
-        } catch (IOException e) {
-            throw new ReaderException(e);
-        } catch (RuntimeException e) {
+        } catch (IOException | RuntimeException e) {
             throw new ReaderException(e);
         }
     }

http://git-wip-us.apache.org/repos/asf/isis/blob/21170a38/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 00038043..ad7bc2a 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
@@ -260,6 +260,11 @@ public interface ObjectAction extends ObjectMember {
             return facetValueIfAnyFor(action, CssClassFaFacet.class);
         }
 
+        public static ActionLayout.CssClassFaPosition cssClassFaPositionFor(final ObjectAction action) {
+            CssClassFaFacet facet = action.getFacet(CssClassFaFacet.class);
+            return facet != null ? facet.getPosition() : ActionLayout.CssClassFaPosition.LEFT;
+        }
+
         public static String cssClassFor(final ObjectAction action) {
             return facetValueIfAnyFor(action, CssClassFacet.class);
         }

http://git-wip-us.apache.org/repos/asf/isis/blob/21170a38/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 469aba7..d72ab5e 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
@@ -36,7 +36,6 @@ 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 static org.apache.isis.core.commons.ensure.Ensure.ensureThatState;
 import static org.hamcrest.CoreMatchers.is;

http://git-wip-us.apache.org/repos/asf/isis/blob/21170a38/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/AbstractFacetFactoryJUnit4TestCase.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/AbstractFacetFactoryJUnit4TestCase.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/AbstractFacetFactoryJUnit4TestCase.java
index 85a7504..3cb415f 100644
--- a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/AbstractFacetFactoryJUnit4TestCase.java
+++ b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/AbstractFacetFactoryJUnit4TestCase.java
@@ -24,6 +24,7 @@ import java.util.List;
 
 import org.jmock.auto.Mock;
 import org.junit.After;
+import org.junit.Assert;
 import org.junit.Before;
 import org.junit.Rule;
 

http://git-wip-us.apache.org/repos/asf/isis/blob/21170a38/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/actions/layout/ActionLayoutAnnotationFacetFactoryTest.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/actions/layout/ActionLayoutAnnotationFacetFactoryTest.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/actions/layout/ActionLayoutAnnotationFacetFactoryTest.java
index fe5412b..2d59fcd 100644
--- a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/actions/layout/ActionLayoutAnnotationFacetFactoryTest.java
+++ b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/actions/layout/ActionLayoutAnnotationFacetFactoryTest.java
@@ -26,6 +26,13 @@ import org.apache.isis.core.metamodel.facets.AbstractFacetFactoryTest;
 import org.apache.isis.core.metamodel.facets.FacetFactory.ProcessMethodContext;
 import org.apache.isis.core.metamodel.facets.actions.position.ActionPositionFacet;
 import org.apache.isis.core.metamodel.facets.actions.position.ActionPositionFacetFallback;
+import org.apache.isis.core.metamodel.facets.members.cssclassfa.CssClassFaFacet;
+
+import static org.hamcrest.Matchers.equalTo;
+import static org.hamcrest.Matchers.instanceOf;
+import static org.hamcrest.Matchers.is;
+import static org.hamcrest.Matchers.notNullValue;
+import static org.junit.Assert.assertThat;
 
 public class ActionLayoutAnnotationFacetFactoryTest extends AbstractFacetFactoryTest {
 
@@ -69,4 +76,48 @@ public class ActionLayoutAnnotationFacetFactoryTest extends AbstractFacetFactory
         assertTrue(facet instanceof ActionPositionFacetFallback);
     }
 
+    public void testCssClassFaLeftPositionIsDefault() {
+        final ActionLayoutFactory facetFactory = new ActionLayoutFactory();
+
+        class Customer {
+            @SuppressWarnings("unused")
+            @ActionLayout(cssClassFa = "font-awesome")
+            public String foz() {
+                return null;
+            }
+        }
+        final Method method = findMethod(Customer.class, "foz");
+
+        facetFactory.process(new ProcessMethodContext(Customer.class, null, null, method, methodRemover, facetedMethod));
+
+        Facet facet = facetedMethod.getFacet(CssClassFaFacet.class);
+        assertThat(facet, is(notNullValue()));
+        assertThat(facet, is(instanceOf(CssClassFaFacetForActionLayoutAnnotation.class)));
+        CssClassFaFacetForActionLayoutAnnotation classFaFacetForActionLayoutAnnotation = (CssClassFaFacetForActionLayoutAnnotation) facet;
+        assertThat(classFaFacetForActionLayoutAnnotation.value(), is(equalTo("fa fa-fw font-awesome")));
+        assertThat(classFaFacetForActionLayoutAnnotation.getPosition(), is(ActionLayout.CssClassFaPosition.LEFT));
+    }
+
+    public void testCssClassFaRightPosition() {
+        final ActionLayoutFactory facetFactory = new ActionLayoutFactory();
+
+        class Customer {
+            @SuppressWarnings("unused")
+            @ActionLayout(cssClassFa = "font-awesome", cssClassFaPosition = ActionLayout.CssClassFaPosition.RIGHT)
+            public String foz() {
+                return null;
+            }
+        }
+        final Method method = findMethod(Customer.class, "foz");
+
+        facetFactory.process(new ProcessMethodContext(Customer.class, null, null, method, methodRemover, facetedMethod));
+
+        Facet facet = facetedMethod.getFacet(CssClassFaFacet.class);
+        assertThat(facet, is(notNullValue()));
+        assertThat(facet, is(instanceOf(CssClassFaFacetForActionLayoutAnnotation.class)));
+        CssClassFaFacetForActionLayoutAnnotation classFaFacetForActionLayoutAnnotation = (CssClassFaFacetForActionLayoutAnnotation) facet;
+        assertThat(classFaFacetForActionLayoutAnnotation.value(), is(equalTo("fa fa-fw font-awesome")));
+        assertThat(classFaFacetForActionLayoutAnnotation.getPosition(), is(ActionLayout.CssClassFaPosition.RIGHT));
+    }
+
 }

http://git-wip-us.apache.org/repos/asf/isis/blob/21170a38/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/members/cssclassfa/CssClassFaAnnotationOnMemberFacetFactoryTest.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/members/cssclassfa/CssClassFaAnnotationOnMemberFacetFactoryTest.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/members/cssclassfa/CssClassFaAnnotationOnMemberFacetFactoryTest.java
index 1008887..0e6787d 100644
--- a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/members/cssclassfa/CssClassFaAnnotationOnMemberFacetFactoryTest.java
+++ b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/members/cssclassfa/CssClassFaAnnotationOnMemberFacetFactoryTest.java
@@ -20,6 +20,7 @@ package org.apache.isis.core.metamodel.facets.members.cssclassfa;
 
 import java.lang.reflect.Method;
 import org.junit.Test;
+import org.apache.isis.applib.annotation.ActionLayout;
 import org.apache.isis.applib.annotation.CssClassFa;
 import org.apache.isis.core.metamodel.facetapi.Facet;
 import org.apache.isis.core.metamodel.facets.AbstractFacetFactoryJUnit4TestCase;
@@ -55,8 +56,38 @@ public class CssClassFaAnnotationOnMemberFacetFactoryTest extends AbstractFacetF
 
         final Facet facet = facetedMethod.getFacet(CssClassFaFacet.class);
         assertThat(facet, is(not(nullValue())));
-        assertThat(facet instanceof CssClassFaFacetAbstract, is(true));
+        assertThat(facet, is(instanceOf(CssClassFaFacetAbstract.class)));
         final CssClassFaFacetAbstract cssClassFacetAbstract = (CssClassFaFacetAbstract) facet;
         assertThat(cssClassFacetAbstract.value(), equalTo("fa fa-fw fa-foo"));
+        assertThat(cssClassFacetAbstract.getPosition(), is(ActionLayout.CssClassFaPosition.LEFT));
+    }
+
+    @Test
+    public void testCssClassFaAnnotationPickedUpOnClassRightPosition() {
+
+        final CssClassFaFacetOnMemberFactory facetFactory = new CssClassFaFacetOnMemberFactory();
+        facetFactory.setSpecificationLookup(mockSpecificationLoaderSpi);
+
+        class Customer {
+
+            @CssClassFa(value = "fa fa-foo", position = ActionLayout.CssClassFaPosition.RIGHT)
+            public String foo() {
+                return "Joe";
+            }
+        }
+
+        expectNoMethodsRemoved();
+
+        final Method actionMethod = findMethod(Customer.class, "foo", new Class[] { });
+
+        facetedMethod = FacetedMethod.createForAction(Customer.class, actionMethod);
+        facetFactory.process(new FacetFactory.ProcessMethodContext(Customer.class, null, null, facetedMethod.getMethod(), mockMethodRemover, facetedMethod));
+
+        final Facet facet = facetedMethod.getFacet(CssClassFaFacet.class);
+        assertThat(facet, is(not(nullValue())));
+        assertThat(facet, is(instanceOf(CssClassFaFacetAbstract.class)));
+        final CssClassFaFacetAbstract cssClassFacetAbstract = (CssClassFaFacetAbstract) facet;
+        assertThat(cssClassFacetAbstract.value(), equalTo("fa fa-fw fa-foo"));
+        assertThat(cssClassFacetAbstract.getPosition(), is(ActionLayout.CssClassFaPosition.RIGHT));
     }
 }

http://git-wip-us.apache.org/repos/asf/isis/blob/21170a38/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/members/cssclassfa/CssClassFaFacetAbstractTest.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/members/cssclassfa/CssClassFaFacetAbstractTest.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/members/cssclassfa/CssClassFaFacetAbstractTest.java
index cc03f80..d0051b9 100644
--- a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/members/cssclassfa/CssClassFaFacetAbstractTest.java
+++ b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/members/cssclassfa/CssClassFaFacetAbstractTest.java
@@ -25,4 +25,4 @@ public class CssClassFaFacetAbstractTest {
         }
 
     }
-}
\ No newline at end of file
+}

http://git-wip-us.apache.org/repos/asf/isis/blob/21170a38/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/object/cssclass/CssClassFacetOnTypeAnnotationFactoryTest.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/object/cssclass/CssClassFacetOnTypeAnnotationFactoryTest.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/object/cssclass/CssClassFacetOnTypeAnnotationFactoryTest.java
index 501d770..f667d13 100644
--- a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/object/cssclass/CssClassFacetOnTypeAnnotationFactoryTest.java
+++ b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/object/cssclass/CssClassFacetOnTypeAnnotationFactoryTest.java
@@ -27,9 +27,14 @@ import org.apache.isis.core.metamodel.facets.members.cssclass.CssClassFacet;
 import org.apache.isis.core.metamodel.facets.members.cssclass.CssClassFacetAbstract;
 import org.apache.isis.core.metamodel.facets.object.cssclass.annotation.CssClassFacetOnTypeAnnotationFactory;
 
-import static org.hamcrest.CoreMatchers.*;
+import static org.hamcrest.Matchers.equalTo;
+import static org.hamcrest.Matchers.instanceOf;
+import static org.hamcrest.Matchers.is;
+import static org.hamcrest.Matchers.not;
+import static org.hamcrest.Matchers.nullValue;
 import static org.junit.Assert.assertThat;
 
+
 public class CssClassFacetOnTypeAnnotationFactoryTest extends AbstractFacetFactoryJUnit4TestCase {
 
     @Test
@@ -48,7 +53,7 @@ public class CssClassFacetOnTypeAnnotationFactoryTest extends AbstractFacetFacto
 
         final Facet facet = facetedMethod.getFacet(CssClassFacet.class);
         assertThat(facet, is(not(nullValue())));
-        assertThat(facet instanceof CssClassFacetAbstract, is(true));
+        assertThat(facet, is(instanceOf(CssClassFacetAbstract.class)));
         final CssClassFacetAbstract cssClassFacetAbstract = (CssClassFacetAbstract) facet;
         assertThat(cssClassFacetAbstract.value(), equalTo("testClass"));
     }

http://git-wip-us.apache.org/repos/asf/isis/blob/21170a38/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/object/cssclassfa/CssClassFaFacetOnTypeAnnotationFactoryTest.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/object/cssclassfa/CssClassFaFacetOnTypeAnnotationFactoryTest.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/object/cssclassfa/CssClassFaFacetOnTypeAnnotationFactoryTest.java
index 1ac7f96..2acfda8 100644
--- a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/object/cssclassfa/CssClassFaFacetOnTypeAnnotationFactoryTest.java
+++ b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/object/cssclassfa/CssClassFaFacetOnTypeAnnotationFactoryTest.java
@@ -19,6 +19,7 @@
 package org.apache.isis.core.metamodel.facets.object.cssclassfa;
 
 import org.junit.Test;
+import org.apache.isis.applib.annotation.ActionLayout;
 import org.apache.isis.applib.annotation.CssClassFa;
 import org.apache.isis.core.metamodel.facetapi.Facet;
 import org.apache.isis.core.metamodel.facets.AbstractFacetFactoryJUnit4TestCase;
@@ -27,7 +28,11 @@ import org.apache.isis.core.metamodel.facets.members.cssclassfa.CssClassFaFacet;
 import org.apache.isis.core.metamodel.facets.members.cssclassfa.CssClassFaFacetAbstract;
 import org.apache.isis.core.metamodel.facets.object.cssclassfa.annotation.annotation.CssClassFaFacetOnTypeAnnotationFactory;
 
-import static org.hamcrest.CoreMatchers.*;
+import static org.hamcrest.Matchers.equalTo;
+import static org.hamcrest.Matchers.instanceOf;
+import static org.hamcrest.Matchers.is;
+import static org.hamcrest.Matchers.not;
+import static org.hamcrest.Matchers.nullValue;
 import static org.junit.Assert.assertThat;
 
 public class CssClassFaFacetOnTypeAnnotationFactoryTest extends AbstractFacetFactoryJUnit4TestCase {
@@ -48,8 +53,31 @@ public class CssClassFaFacetOnTypeAnnotationFactoryTest extends AbstractFacetFac
 
         final Facet facet = facetedMethod.getFacet(CssClassFaFacet.class);
         assertThat(facet, is(not(nullValue())));
-        assertThat(facet instanceof CssClassFaFacetAbstract, is(true));
+        assertThat(facet, is(instanceOf(CssClassFaFacetAbstract.class)));
         final CssClassFaFacetAbstract cssClassFacetAbstract = (CssClassFaFacetAbstract) facet;
         assertThat(cssClassFacetAbstract.value(), equalTo("fa fa-fw fa-foo"));
+        assertThat(cssClassFacetAbstract.getPosition(), equalTo(ActionLayout.CssClassFaPosition.LEFT));
+    }
+
+    @Test
+    public void testCssClassFaAnnotationPickedUpOnClassPositionRight() {
+
+        final CssClassFaFacetOnTypeAnnotationFactory facetFactory = new CssClassFaFacetOnTypeAnnotationFactory();
+        facetFactory.setSpecificationLookup(mockSpecificationLoaderSpi);
+
+        @CssClassFa(value = "fa-foo", position = ActionLayout.CssClassFaPosition.RIGHT)
+        class Customer {
+        }
+
+        expectNoMethodsRemoved();
+
+        facetFactory.process(new FacetFactory.ProcessClassContext(Customer.class, null, mockMethodRemover, facetedMethod));
+
+        final Facet facet = facetedMethod.getFacet(CssClassFaFacet.class);
+        assertThat(facet, is(not(nullValue())));
+        assertThat(facet, is(instanceOf(CssClassFaFacetAbstract.class)));
+        final CssClassFaFacetAbstract cssClassFacetAbstract = (CssClassFaFacetAbstract) facet;
+        assertThat(cssClassFacetAbstract.value(), equalTo("fa fa-fw fa-foo"));
+        assertThat(cssClassFacetAbstract.getPosition(), equalTo(ActionLayout.CssClassFaPosition.RIGHT));
     }
 }

http://git-wip-us.apache.org/repos/asf/isis/blob/21170a38/example/application/todoapp/dom/src/main/java/dom/todo/ToDoItem.layout.json
----------------------------------------------------------------------
diff --git a/example/application/todoapp/dom/src/main/java/dom/todo/ToDoItem.layout.json b/example/application/todoapp/dom/src/main/java/dom/todo/ToDoItem.layout.json
index 5cf21cd..1820be7 100644
--- a/example/application/todoapp/dom/src/main/java/dom/todo/ToDoItem.layout.json
+++ b/example/application/todoapp/dom/src/main/java/dom/todo/ToDoItem.layout.json
@@ -111,7 +111,8 @@
                             },
                             "next": {
                                 "actionLayout": {
-                                    "cssClassFa": "fa fa-step-forward"
+                                    "cssClassFa": "fa fa-step-forward",
+                                    "cssClassFaPosition": "right"
                                 }
                             }
                         }