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 2016/01/31 11:57:17 UTC

[01/18] isis git commit: ISIS-1300: as a temporary measure, just comment out the source plugin.

Repository: isis
Updated Branches:
  refs/heads/ISIS-993 74e5bd0c5 -> 65f7d320f


ISIS-1300: as a temporary measure, just comment out the source plugin.


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

Branch: refs/heads/ISIS-993
Commit: e77ce8525ebe7898878912e88c86cb1edb048ee1
Parents: b674bf5
Author: Dan Haywood <da...@haywood-associates.co.uk>
Authored: Thu Jan 28 08:03:20 2016 +0000
Committer: Dan Haywood <da...@haywood-associates.co.uk>
Committed: Thu Jan 28 08:03:20 2016 +0000

----------------------------------------------------------------------
 .../viewer/wicket/viewer/IsisWicketApplication.java    | 13 ++++++++++++-
 1 file changed, 12 insertions(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/isis/blob/e77ce852/core/viewer-wicket-impl/src/main/java/org/apache/isis/viewer/wicket/viewer/IsisWicketApplication.java
----------------------------------------------------------------------
diff --git a/core/viewer-wicket-impl/src/main/java/org/apache/isis/viewer/wicket/viewer/IsisWicketApplication.java b/core/viewer-wicket-impl/src/main/java/org/apache/isis/viewer/wicket/viewer/IsisWicketApplication.java
index d43027b..4209f38 100644
--- a/core/viewer-wicket-impl/src/main/java/org/apache/isis/viewer/wicket/viewer/IsisWicketApplication.java
+++ b/core/viewer-wicket-impl/src/main/java/org/apache/isis/viewer/wicket/viewer/IsisWicketApplication.java
@@ -321,7 +321,18 @@ public class IsisWicketApplication
         select2Settings.setIncludeJqueryUI(false);
     }
 
-    private void configureWicketSourcePlugin() {
+    /**
+     * as temporary measure, this method now does nothing.
+     *
+     * the original behaviour can be re-enabled by overriding this method and calling doConfigureWicketSourcePlugin();
+     */
+    protected void configureWicketSourcePlugin() {
+        // see Javadoc above.
+        //
+        // doConfigureWicketSourcePlugin();
+    }
+
+    protected void doConfigureWicketSourcePlugin() {
         if(!deploymentType.isProduction()) {
             WicketSource.configure(this);
         }


[12/18] isis git commit: ISIS-993: still sketching out the layout classes for BS3 and FC (fixed col)

Posted by da...@apache.org.
ISIS-993: still sketching out the layout classes for BS3 and FC (fixed col)


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

Branch: refs/heads/ISIS-993
Commit: 10d80f3a850ad602d775b09098405b3b56c2541a
Parents: 517b6cc
Author: Dan Haywood <da...@haywood-associates.co.uk>
Authored: Fri Jan 29 02:25:52 2016 +0000
Committer: Dan Haywood <da...@haywood-associates.co.uk>
Committed: Fri Jan 29 02:25:52 2016 +0000

----------------------------------------------------------------------
 .../isis/applib/annotation/ActionLayout.java    |   4 +-
 .../isis/applib/annotation/BookmarkPolicy.java  |   2 +-
 .../isis/applib/annotation/Contributed.java     |   2 +-
 .../isis/applib/annotation/LabelPosition.java   |   2 +-
 .../isis/applib/annotation/RenderType.java      |   2 +-
 .../apache/isis/applib/annotation/Where.java    |   2 +-
 .../isis/applib/layout/bootstrap3/BS3Col.java   |  84 +++++
 .../applib/layout/bootstrap3/BS3Collection.java |  44 ---
 .../isis/applib/layout/bootstrap3/BS3Page.java  |  63 ++++
 .../applib/layout/bootstrap3/BS3PropGroup.java  |  44 ---
 .../isis/applib/layout/bootstrap3/BS3Row.java   |  52 +++
 .../isis/applib/layout/bootstrap3/BS3Tab.java   |   8 +-
 .../applib/layout/bootstrap3/BS3TabGroup.java   |   8 +-
 .../applib/layout/bootstrap3/DivColumn.java     |  82 -----
 .../applib/layout/bootstrap3/DivContainer.java  |  81 -----
 .../isis/applib/layout/bootstrap3/DivRow.java   |  52 ---
 .../applib/layout/bootstrap3/package-info.java  |  34 ++
 .../applib/layout/fixedcols/ColumnMetadata.java | 153 ---------
 .../isis/applib/layout/fixedcols/FCColumn.java  | 163 ++++++++++
 .../applib/layout/fixedcols/FCColumnOwner.java  |  25 ++
 .../isis/applib/layout/fixedcols/FCPage.java    | 313 +++++++++++++++++++
 .../isis/applib/layout/fixedcols/FCTab.java     | 172 ++++++++++
 .../applib/layout/fixedcols/FCTabGroup.java     | 113 +++++++
 .../layout/fixedcols/FCTabGroupOwner.java       |  25 ++
 .../layout/fixedcols/ObjectLayoutMetadata.java  | 310 ------------------
 .../layout/fixedcols/TabGroupMetadata.java      | 114 -------
 .../applib/layout/fixedcols/TabGroupOwner.java  |  25 --
 .../applib/layout/fixedcols/TabMetadata.java    | 173 ----------
 .../applib/layout/fixedcols/package-info.java   |  35 +++
 .../applib/layout/members/MemberRegion.java     |  33 ++
 .../layout/members/MemberRegionOwner.java       |  23 ++
 .../isis/applib/layout/members/Owned.java       |  23 ++
 .../isis/applib/layout/members/Owner.java       |  24 ++
 .../layout/members/v1/ActionLayoutData.java     | 227 ++++++++++++++
 .../applib/layout/members/v1/ActionOwner.java   |  27 ++
 .../layout/members/v1/CollectionLayoutData.java | 261 ++++++++++++++++
 .../isis/applib/layout/members/v1/FieldSet.java | 152 +++++++++
 .../layout/members/v1/PropertyLayoutData.java   | 246 +++++++++++++++
 .../applib/layout/members/v1/package-info.java  |  36 +++
 .../layout/v1_0/ActionLayoutMetadata.java       | 226 -------------
 .../isis/applib/layout/v1_0/ActionOwner.java    |  25 --
 .../layout/v1_0/CollectionLayoutMetadata.java   | 259 ---------------
 .../isis/applib/layout/v1_0/ColumnOwner.java    |  23 --
 .../layout/v1_0/MemberLayoutMetadata.java       |  24 --
 .../layout/v1_0/MemberLayoutMetadataOwner.java  |  23 --
 .../apache/isis/applib/layout/v1_0/Owned.java   |  23 --
 .../apache/isis/applib/layout/v1_0/Owner.java   |  24 --
 .../layout/v1_0/PropertyGroupMetadata.java      | 145 ---------
 .../layout/v1_0/PropertyLayoutMetadata.java     | 245 ---------------
 .../isis/applib/layout/v1_0/package-info.java   |  25 --
 .../layout/ObjectLayoutMetadataService.java     |  11 +-
 .../layout/Object_downloadLayoutXml.java        |   6 +-
 .../services/layout/Object_viewLayout.java      |   6 +-
 .../layout/ActionPositionFacetForActionXml.java |   4 +-
 .../layout/BookmarkPolicyFacetForActionXml.java |   4 +-
 .../layout/CssClassFaFacetForActionXml.java     |   4 +-
 .../layout/CssClassFacetForActionXml.java       |   4 +-
 .../layout/DescribedAsFacetForActionXml.java    |   4 +-
 .../layout/HiddenFacetForActionLayoutXml.java   |   4 +-
 .../actions/layout/NamedFacetForActionXml.java  |   4 +-
 .../layout/CssClassFacetForCollectionXml.java   |   4 +-
 .../DefaultViewFacetForCollectionXml.java       |   4 +-
 .../DescribedAsFacetForCollectionXml.java       |   4 +-
 .../layout/HiddenFacetForCollectionXml.java     |   4 +-
 .../layout/NamedFacetForCollectionXml.java      |   4 +-
 .../layout/PagedFacetForCollectionXml.java      |   4 +-
 .../layout/SortedByFacetForCollectionXml.java   |   4 +-
 .../ObjectLayoutMetadataFacet.java              |   4 +-
 .../ObjectLayoutMetadataFacetDefault.java       | 214 ++++++-------
 .../CssClassFacetForPropertyXml.java            |   4 +-
 .../DescribedAsFacetForPropertyXml.java         |   4 +-
 .../HiddenFacetForPropertyXml.java              |   4 +-
 .../LabelAtFacetForPropertyXml.java             |   4 +-
 .../MultiLineFacetForPropertyXml.java           |   4 +-
 .../NamedFacetForPropertyXml.java               |   4 +-
 .../RenderedAdjustedFacetForPropertyXml.java    |   4 +-
 .../TypicalLengthFacetForPropertyXml.java       |   4 +-
 .../json/LayoutMetadataReaderFromJson.java      |   2 +-
 .../ObjectLayoutMetadataServiceDefault.java     |  18 +-
 .../services/metamodel/MetadataMenu.java        |   4 +-
 .../metamodel/spec/ObjectSpecifications.java    |   8 +-
 .../layoutxml/FCPageFacetDefaultTest.java       |  60 ++++
 .../ObjectLayoutMetadataFacetDefaultTest.java   |  60 ----
 .../metamodel/layoutxml/v1_0/FCPageTest.java    | 124 ++++++++
 .../v1_0/ObjectLayoutMetadataTest.java          | 124 --------
 .../model/models/EntityCollectionModel.java     |  14 +-
 .../viewer/wicket/model/models/EntityModel.java |  72 ++---
 .../components/entity/EntityPanelFactory.java   |   4 +-
 .../wicket/ui/components/entity/PropUtil.java   |  10 +-
 .../collections/EntityCollectionsPanel.java     |  18 +-
 .../components/entity/column/EntityColumn.java  |  41 ++-
 .../entity/propgroup/PropertyGroup.java         |  14 +-
 .../propsandcolls/EntityPropsAndCollsForm.java  |  30 +-
 .../entity/tabbed/EntityTabbedPanel.java        |  24 +-
 .../entity/tabgroup/TabGroupPanel.java          |  20 +-
 .../entity/tabgrouplist/TabGroupListPanel.java  |  10 +-
 .../ui/components/entity/tabpanel/TabPanel.java |   6 +-
 .../wicket/ui/pages/entity/EntityPage.java      |   4 +-
 98 files changed, 2642 insertions(+), 2635 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/isis/blob/10d80f3a/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 d8255c5..d5428d2 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
@@ -75,7 +75,7 @@ public @interface ActionLayout {
     CssClassFaPosition cssClassFaPosition() default CssClassFaPosition.LEFT;
 
     @XmlType(
-            namespace = "http://isis.apache.org/schema/applib/layout"
+            namespace = "http://isis.apache.org/schema/applib/layout/members/v1"
     )
     enum CssClassFaPosition {
         LEFT, RIGHT
@@ -115,7 +115,7 @@ public @interface ActionLayout {
     Position position() default Position.BELOW;
 
     @XmlType(
-            namespace = "http://isis.apache.org/schema/applib/layout"
+            namespace = "http://isis.apache.org/schema/applib/layout/members/v1"
     )
     enum Position {
         BELOW,

http://git-wip-us.apache.org/repos/asf/isis/blob/10d80f3a/core/applib/src/main/java/org/apache/isis/applib/annotation/BookmarkPolicy.java
----------------------------------------------------------------------
diff --git a/core/applib/src/main/java/org/apache/isis/applib/annotation/BookmarkPolicy.java b/core/applib/src/main/java/org/apache/isis/applib/annotation/BookmarkPolicy.java
index b6b1fb3..2ab7a7c 100644
--- a/core/applib/src/main/java/org/apache/isis/applib/annotation/BookmarkPolicy.java
+++ b/core/applib/src/main/java/org/apache/isis/applib/annotation/BookmarkPolicy.java
@@ -22,7 +22,7 @@ package org.apache.isis.applib.annotation;
 import javax.xml.bind.annotation.XmlType;
 
 @XmlType(
-        namespace = "http://isis.apache.org/schema/applib/layout"
+        namespace = "http://isis.apache.org/schema/applib/layout/members/v1"
 )
 public enum BookmarkPolicy {
     /**

http://git-wip-us.apache.org/repos/asf/isis/blob/10d80f3a/core/applib/src/main/java/org/apache/isis/applib/annotation/Contributed.java
----------------------------------------------------------------------
diff --git a/core/applib/src/main/java/org/apache/isis/applib/annotation/Contributed.java b/core/applib/src/main/java/org/apache/isis/applib/annotation/Contributed.java
index 81821bb..e3fbc14 100644
--- a/core/applib/src/main/java/org/apache/isis/applib/annotation/Contributed.java
+++ b/core/applib/src/main/java/org/apache/isis/applib/annotation/Contributed.java
@@ -25,7 +25,7 @@ import javax.xml.bind.annotation.XmlType;
  * The means by which a domain service action will be contributed to a domain object.
  */
 @XmlType(
-    namespace = "http://isis.apache.org/schema/applib/layout"
+        namespace = "http://isis.apache.org/schema/applib/layout/members/v1"
 )
 public enum Contributed {
     /**

http://git-wip-us.apache.org/repos/asf/isis/blob/10d80f3a/core/applib/src/main/java/org/apache/isis/applib/annotation/LabelPosition.java
----------------------------------------------------------------------
diff --git a/core/applib/src/main/java/org/apache/isis/applib/annotation/LabelPosition.java b/core/applib/src/main/java/org/apache/isis/applib/annotation/LabelPosition.java
index a91d280..5b5873b 100644
--- a/core/applib/src/main/java/org/apache/isis/applib/annotation/LabelPosition.java
+++ b/core/applib/src/main/java/org/apache/isis/applib/annotation/LabelPosition.java
@@ -27,7 +27,7 @@ import javax.xml.bind.annotation.XmlType;
  * @see org.apache.isis.applib.annotation.ParameterLayout
  */
 @XmlType(
-        namespace = "http://isis.apache.org/schema/applib/layout"
+        namespace = "http://isis.apache.org/schema/applib/layout/members/v1"
 )
 public enum LabelPosition {
     DEFAULT,

http://git-wip-us.apache.org/repos/asf/isis/blob/10d80f3a/core/applib/src/main/java/org/apache/isis/applib/annotation/RenderType.java
----------------------------------------------------------------------
diff --git a/core/applib/src/main/java/org/apache/isis/applib/annotation/RenderType.java b/core/applib/src/main/java/org/apache/isis/applib/annotation/RenderType.java
index 5363b38..8af27cb 100644
--- a/core/applib/src/main/java/org/apache/isis/applib/annotation/RenderType.java
+++ b/core/applib/src/main/java/org/apache/isis/applib/annotation/RenderType.java
@@ -21,7 +21,7 @@ package org.apache.isis.applib.annotation;
 import javax.xml.bind.annotation.XmlType;
 
 @XmlType(
-        namespace = "http://isis.apache.org/schema/applib/layout"
+        namespace = "http://isis.apache.org/schema/applib/layout/members/v1"
 )
 public enum RenderType {
     EAGERLY,

http://git-wip-us.apache.org/repos/asf/isis/blob/10d80f3a/core/applib/src/main/java/org/apache/isis/applib/annotation/Where.java
----------------------------------------------------------------------
diff --git a/core/applib/src/main/java/org/apache/isis/applib/annotation/Where.java b/core/applib/src/main/java/org/apache/isis/applib/annotation/Where.java
index e89403d..fe35958 100644
--- a/core/applib/src/main/java/org/apache/isis/applib/annotation/Where.java
+++ b/core/applib/src/main/java/org/apache/isis/applib/annotation/Where.java
@@ -41,7 +41,7 @@ import org.apache.isis.applib.util.Enums;
  * the framework developer should only use those values that represent concrete locations.  
  */
 @XmlType(
-        namespace = "http://isis.apache.org/schema/applib/layout"
+        namespace = "http://isis.apache.org/schema/applib/layout/members/v1"
 )
 public enum Where {
     /**

http://git-wip-us.apache.org/repos/asf/isis/blob/10d80f3a/core/applib/src/main/java/org/apache/isis/applib/layout/bootstrap3/BS3Col.java
----------------------------------------------------------------------
diff --git a/core/applib/src/main/java/org/apache/isis/applib/layout/bootstrap3/BS3Col.java b/core/applib/src/main/java/org/apache/isis/applib/layout/bootstrap3/BS3Col.java
new file mode 100644
index 0000000..4e948be
--- /dev/null
+++ b/core/applib/src/main/java/org/apache/isis/applib/layout/bootstrap3/BS3Col.java
@@ -0,0 +1,84 @@
+/*
+ *  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.applib.layout.bootstrap3;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.xml.bind.annotation.XmlElement;
+import javax.xml.bind.annotation.XmlType;
+
+import org.apache.isis.applib.layout.members.v1.FieldSet;
+
+@XmlType(
+        name = "col"
+        , propOrder = {
+            "rows",
+            "tabGroup",
+            "propGroups",
+            "collections",
+        }
+)
+public class BS3Col {
+
+
+    private List<BS3Row> rows = new ArrayList<BS3Row>();
+
+    // no wrapper
+    @XmlElement(name = "row", required = false)
+    public List<BS3Row> getRows() {
+        return rows;
+    }
+
+    public void setRows(final List<BS3Row> rows) {
+        this.rows = rows;
+    }
+
+
+
+    private BS3TabGroup tabGroup;
+
+    @XmlElement(name="tabGroup", required = false)
+    public BS3TabGroup getTabGroup() {
+        return tabGroup;
+    }
+
+    public void setTabGroup(final BS3TabGroup tabGroup) {
+        this.tabGroup = tabGroup;
+    }
+
+
+
+
+    private List<FieldSet> propGroups = new ArrayList<FieldSet>();
+
+    // no wrapper
+    @XmlElement(name = "propGroup", required = false)
+    public List<FieldSet> getPropGroups() {
+        return propGroups;
+    }
+
+    public void setPropGroups(final List<FieldSet> propGroups) {
+        this.propGroups = propGroups;
+    }
+
+
+
+
+}

http://git-wip-us.apache.org/repos/asf/isis/blob/10d80f3a/core/applib/src/main/java/org/apache/isis/applib/layout/bootstrap3/BS3Collection.java
----------------------------------------------------------------------
diff --git a/core/applib/src/main/java/org/apache/isis/applib/layout/bootstrap3/BS3Collection.java b/core/applib/src/main/java/org/apache/isis/applib/layout/bootstrap3/BS3Collection.java
deleted file mode 100644
index d1cb0b9..0000000
--- a/core/applib/src/main/java/org/apache/isis/applib/layout/bootstrap3/BS3Collection.java
+++ /dev/null
@@ -1,44 +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.applib.layout.bootstrap3;
-
-import javax.xml.bind.annotation.XmlAttribute;
-import javax.xml.bind.annotation.XmlType;
-
-@XmlType(
-        name = "collection"
-        , propOrder = {
-            "name"
-        }
-)
-public class BS3Collection {
-
-
-    private String name;
-
-    @XmlAttribute(required = true)
-    public String getName() {
-        return name;
-    }
-
-    public void setName(final String name) {
-        this.name = name;
-    }
-
-}

http://git-wip-us.apache.org/repos/asf/isis/blob/10d80f3a/core/applib/src/main/java/org/apache/isis/applib/layout/bootstrap3/BS3Page.java
----------------------------------------------------------------------
diff --git a/core/applib/src/main/java/org/apache/isis/applib/layout/bootstrap3/BS3Page.java b/core/applib/src/main/java/org/apache/isis/applib/layout/bootstrap3/BS3Page.java
new file mode 100644
index 0000000..0b81c30
--- /dev/null
+++ b/core/applib/src/main/java/org/apache/isis/applib/layout/bootstrap3/BS3Page.java
@@ -0,0 +1,63 @@
+/*
+ *  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.applib.layout.bootstrap3;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.xml.bind.annotation.XmlElement;
+import javax.xml.bind.annotation.XmlRootElement;
+import javax.xml.bind.annotation.XmlType;
+
+/**
+ * This is the top-level region for the domain object's properties, collections and actions.  It simply consists
+ * of a number of rows.
+ *
+ * <p>
+ *     Note that the title's
+ * </p>
+ */
+@XmlRootElement(
+        name = "page"
+)
+@XmlType(
+        name = "page"
+        , propOrder = {
+            "rows"
+        }
+)
+public class BS3Page {
+
+    private List<BS3Row> rows = new ArrayList<BS3Row>(){{
+        add(new BS3Row());
+    }};
+
+    // no wrapper
+    @XmlElement(name = "row", required = true)
+    public List<BS3Row> getRows() {
+        return rows;
+    }
+
+    public void setRows(final List<BS3Row> rows) {
+        this.rows = rows;
+    }
+
+
+
+}

http://git-wip-us.apache.org/repos/asf/isis/blob/10d80f3a/core/applib/src/main/java/org/apache/isis/applib/layout/bootstrap3/BS3PropGroup.java
----------------------------------------------------------------------
diff --git a/core/applib/src/main/java/org/apache/isis/applib/layout/bootstrap3/BS3PropGroup.java b/core/applib/src/main/java/org/apache/isis/applib/layout/bootstrap3/BS3PropGroup.java
deleted file mode 100644
index b8aa5c9..0000000
--- a/core/applib/src/main/java/org/apache/isis/applib/layout/bootstrap3/BS3PropGroup.java
+++ /dev/null
@@ -1,44 +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.applib.layout.bootstrap3;
-
-import javax.xml.bind.annotation.XmlAttribute;
-import javax.xml.bind.annotation.XmlType;
-
-@XmlType(
-        name = "propGroup"
-        , propOrder = {
-            "name"
-        }
-)
-public class BS3PropGroup {
-
-
-    private String name;
-
-    @XmlAttribute(required = true)
-    public String getName() {
-        return name;
-    }
-
-    public void setName(final String name) {
-        this.name = name;
-    }
-
-}

http://git-wip-us.apache.org/repos/asf/isis/blob/10d80f3a/core/applib/src/main/java/org/apache/isis/applib/layout/bootstrap3/BS3Row.java
----------------------------------------------------------------------
diff --git a/core/applib/src/main/java/org/apache/isis/applib/layout/bootstrap3/BS3Row.java b/core/applib/src/main/java/org/apache/isis/applib/layout/bootstrap3/BS3Row.java
new file mode 100644
index 0000000..ea78d7c
--- /dev/null
+++ b/core/applib/src/main/java/org/apache/isis/applib/layout/bootstrap3/BS3Row.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.applib.layout.bootstrap3;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.xml.bind.annotation.XmlElement;
+import javax.xml.bind.annotation.XmlType;
+
+@XmlType(
+        name = "row"
+        , propOrder = {
+            "columns"
+        }
+)
+public class BS3Row {
+
+
+
+    private List<BS3Col> columns = new ArrayList<BS3Col>(){{
+        add(new BS3Col());
+    }};
+
+    // no wrapper
+    @XmlElement(name = "column", required = true)
+    public List<BS3Col> getColumns() {
+        return columns;
+    }
+
+    public void setColumns(final List<BS3Col> columns) {
+        this.columns = columns;
+    }
+
+
+}

http://git-wip-us.apache.org/repos/asf/isis/blob/10d80f3a/core/applib/src/main/java/org/apache/isis/applib/layout/bootstrap3/BS3Tab.java
----------------------------------------------------------------------
diff --git a/core/applib/src/main/java/org/apache/isis/applib/layout/bootstrap3/BS3Tab.java b/core/applib/src/main/java/org/apache/isis/applib/layout/bootstrap3/BS3Tab.java
index 5520a6f..aea912d 100644
--- a/core/applib/src/main/java/org/apache/isis/applib/layout/bootstrap3/BS3Tab.java
+++ b/core/applib/src/main/java/org/apache/isis/applib/layout/bootstrap3/BS3Tab.java
@@ -35,8 +35,8 @@ import javax.xml.bind.annotation.XmlType;
 public class BS3Tab {
 
     // at least one row
-    private List<DivRow> rows = new ArrayList<DivRow>(){{
-        add(new DivRow());
+    private List<BS3Row> rows = new ArrayList<BS3Row>(){{
+        add(new BS3Row());
     }};
 
 
@@ -53,11 +53,11 @@ public class BS3Tab {
 
     // no wrapper
     @XmlElement(name = "row", required = true)
-    public List<DivRow> getRows() {
+    public List<BS3Row> getRows() {
         return rows;
     }
 
-    public void setRows(final List<DivRow> rows) {
+    public void setRows(final List<BS3Row> rows) {
         this.rows = rows;
     }
 

http://git-wip-us.apache.org/repos/asf/isis/blob/10d80f3a/core/applib/src/main/java/org/apache/isis/applib/layout/bootstrap3/BS3TabGroup.java
----------------------------------------------------------------------
diff --git a/core/applib/src/main/java/org/apache/isis/applib/layout/bootstrap3/BS3TabGroup.java b/core/applib/src/main/java/org/apache/isis/applib/layout/bootstrap3/BS3TabGroup.java
index a561811..8221069 100644
--- a/core/applib/src/main/java/org/apache/isis/applib/layout/bootstrap3/BS3TabGroup.java
+++ b/core/applib/src/main/java/org/apache/isis/applib/layout/bootstrap3/BS3TabGroup.java
@@ -32,17 +32,17 @@ import javax.xml.bind.annotation.XmlType;
 )
 public class BS3TabGroup {
 
-    private List<DivColumn> columns = new ArrayList<DivColumn>(){{
-        add(new DivColumn());
+    private List<BS3Col> columns = new ArrayList<BS3Col>(){{
+        add(new BS3Col());
     }};
 
     // no wrapper
     @XmlElement(name = "column", required = true)
-    public List<DivColumn> getColumns() {
+    public List<BS3Col> getColumns() {
         return columns;
     }
 
-    public void setColumns(final List<DivColumn> columns) {
+    public void setColumns(final List<BS3Col> columns) {
         this.columns = columns;
     }
 

http://git-wip-us.apache.org/repos/asf/isis/blob/10d80f3a/core/applib/src/main/java/org/apache/isis/applib/layout/bootstrap3/DivColumn.java
----------------------------------------------------------------------
diff --git a/core/applib/src/main/java/org/apache/isis/applib/layout/bootstrap3/DivColumn.java b/core/applib/src/main/java/org/apache/isis/applib/layout/bootstrap3/DivColumn.java
deleted file mode 100644
index 2338b84..0000000
--- a/core/applib/src/main/java/org/apache/isis/applib/layout/bootstrap3/DivColumn.java
+++ /dev/null
@@ -1,82 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *        http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- */
-package org.apache.isis.applib.layout.bootstrap3;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import javax.xml.bind.annotation.XmlElement;
-import javax.xml.bind.annotation.XmlType;
-
-@XmlType(
-        name = "div-column"
-        , propOrder = {
-            "rows",
-            "tabGroup",
-            "propGroups",
-            "collections",
-        }
-)
-public class DivColumn {
-
-
-    private List<DivRow> rows = new ArrayList<DivRow>();
-
-    // no wrapper
-    @XmlElement(name = "row", required = false)
-    public List<DivRow> getRows() {
-        return rows;
-    }
-
-    public void setRows(final List<DivRow> rows) {
-        this.rows = rows;
-    }
-
-
-
-    private BS3TabGroup tabGroup;
-
-    @XmlElement(name="tabGroup", required = false)
-    public BS3TabGroup getTabGroup() {
-        return tabGroup;
-    }
-
-    public void setTabGroup(final BS3TabGroup tabGroup) {
-        this.tabGroup = tabGroup;
-    }
-
-
-
-
-    private List<BS3PropGroup> propGroups = new ArrayList<BS3PropGroup>();
-
-    // no wrapper
-    @XmlElement(name = "propGroup", required = false)
-    public List<BS3PropGroup> getPropGroups() {
-        return propGroups;
-    }
-
-    public void setPropGroups(final List<BS3PropGroup> propGroups) {
-        this.propGroups = propGroups;
-    }
-
-
-
-
-}

http://git-wip-us.apache.org/repos/asf/isis/blob/10d80f3a/core/applib/src/main/java/org/apache/isis/applib/layout/bootstrap3/DivContainer.java
----------------------------------------------------------------------
diff --git a/core/applib/src/main/java/org/apache/isis/applib/layout/bootstrap3/DivContainer.java b/core/applib/src/main/java/org/apache/isis/applib/layout/bootstrap3/DivContainer.java
deleted file mode 100644
index fc026f2..0000000
--- a/core/applib/src/main/java/org/apache/isis/applib/layout/bootstrap3/DivContainer.java
+++ /dev/null
@@ -1,81 +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.applib.layout.bootstrap3;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import javax.xml.bind.annotation.XmlAttribute;
-import javax.xml.bind.annotation.XmlElement;
-import javax.xml.bind.annotation.XmlRootElement;
-import javax.xml.bind.annotation.XmlType;
-
-@XmlRootElement(
-        name = "div-container"
-)
-@XmlType(
-        name = "div-container"
-        , propOrder = {
-            "rows"
-        }
-)
-public class DivContainer {
-
-    public enum Width {
-        /**
-         * <code>div class=&quot;container&quot;</code>
-         */
-        FIXED,
-        /**
-         * <code>div class=&quot;container-fluid&quot;</code>
-         */
-        FULL
-    }
-
-    private Width width;
-
-    @XmlAttribute(required = true)
-    public Width getWidth() {
-        return width;
-    }
-
-    public void setWidth(final Width width) {
-        this.width = width;
-    }
-
-
-
-
-    private List<DivRow> rows = new ArrayList<DivRow>(){{
-        add(new DivRow());
-    }};
-
-    // no wrapper
-    @XmlElement(name = "row", required = true)
-    public List<DivRow> getRows() {
-        return rows;
-    }
-
-    public void setRows(final List<DivRow> rows) {
-        this.rows = rows;
-    }
-
-
-
-}

http://git-wip-us.apache.org/repos/asf/isis/blob/10d80f3a/core/applib/src/main/java/org/apache/isis/applib/layout/bootstrap3/DivRow.java
----------------------------------------------------------------------
diff --git a/core/applib/src/main/java/org/apache/isis/applib/layout/bootstrap3/DivRow.java b/core/applib/src/main/java/org/apache/isis/applib/layout/bootstrap3/DivRow.java
deleted file mode 100644
index d39731d..0000000
--- a/core/applib/src/main/java/org/apache/isis/applib/layout/bootstrap3/DivRow.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.applib.layout.bootstrap3;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import javax.xml.bind.annotation.XmlElement;
-import javax.xml.bind.annotation.XmlType;
-
-@XmlType(
-        name = "div-row"
-        , propOrder = {
-            "columns"
-        }
-)
-public class DivRow {
-
-
-
-    private List<DivColumn> columns = new ArrayList<DivColumn>(){{
-        add(new DivColumn());
-    }};
-
-    // no wrapper
-    @XmlElement(name = "column", required = true)
-    public List<DivColumn> getColumns() {
-        return columns;
-    }
-
-    public void setColumns(final List<DivColumn> columns) {
-        this.columns = columns;
-    }
-
-
-}

http://git-wip-us.apache.org/repos/asf/isis/blob/10d80f3a/core/applib/src/main/java/org/apache/isis/applib/layout/bootstrap3/package-info.java
----------------------------------------------------------------------
diff --git a/core/applib/src/main/java/org/apache/isis/applib/layout/bootstrap3/package-info.java b/core/applib/src/main/java/org/apache/isis/applib/layout/bootstrap3/package-info.java
new file mode 100644
index 0000000..751f620
--- /dev/null
+++ b/core/applib/src/main/java/org/apache/isis/applib/layout/bootstrap3/package-info.java
@@ -0,0 +1,34 @@
+/*
+ *  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.
+ */
+
+/**
+ * The classes in this package define how to layout the properties, collections and actions of a domain object - the
+ * building blocks - as defined in the <code>members.v1</code> package.
+ *
+ * <p>
+ *     The layout is modelled closely after <a href="http://getbootstrap.com/">Bootstrap</a>, and is intended to
+ *     support the grid layouts implemented by that CSS framework.  This flexibility comes at the cost of some
+ *     verbosity.
+ * </p>
+ */
+@javax.xml.bind.annotation.XmlSchema(
+        namespace = "http://isis.apache.org/schema/applib/layout/bootstrap3",
+        elementFormDefault = javax.xml.bind.annotation.XmlNsForm.QUALIFIED
+)
+package org.apache.isis.applib.layout.bootstrap3;
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/isis/blob/10d80f3a/core/applib/src/main/java/org/apache/isis/applib/layout/fixedcols/ColumnMetadata.java
----------------------------------------------------------------------
diff --git a/core/applib/src/main/java/org/apache/isis/applib/layout/fixedcols/ColumnMetadata.java b/core/applib/src/main/java/org/apache/isis/applib/layout/fixedcols/ColumnMetadata.java
deleted file mode 100644
index 2897ad8..0000000
--- a/core/applib/src/main/java/org/apache/isis/applib/layout/fixedcols/ColumnMetadata.java
+++ /dev/null
@@ -1,153 +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.applib.layout.fixedcols;
-
-import java.io.Serializable;
-import java.util.List;
-
-import javax.xml.bind.annotation.XmlAttribute;
-import javax.xml.bind.annotation.XmlElement;
-import javax.xml.bind.annotation.XmlTransient;
-import javax.xml.bind.annotation.XmlType;
-
-import com.google.common.collect.Lists;
-
-import org.apache.isis.applib.annotation.MemberGroupLayout;
-import org.apache.isis.applib.annotation.Programmatic;
-import org.apache.isis.applib.layout.v1_0.CollectionLayoutMetadata;
-import org.apache.isis.applib.layout.v1_0.ColumnOwner;
-import org.apache.isis.applib.layout.v1_0.MemberLayoutMetadataOwner;
-import org.apache.isis.applib.layout.v1_0.Owned;
-import org.apache.isis.applib.layout.v1_0.PropertyGroupMetadata;
-
-@XmlType(
-        propOrder = {
-                "propertyGroups"
-                , "collections"
-        }
-)
-public class ColumnMetadata implements Serializable, MemberLayoutMetadataOwner, Owned<ColumnOwner> {
-
-    private static final long serialVersionUID = 1L;
-
-    public ColumnMetadata() {
-    }
-
-    public ColumnMetadata(final int span) {
-        setSpan(span);
-    }
-
-    private int span = 4;
-
-    @XmlAttribute(required = true)
-    public int getSpan() {
-        return span;
-    }
-
-    public void setSpan(final int span) {
-        this.span = span;
-    }
-
-
-
-    private List<PropertyGroupMetadata> propertyGroups = Lists.newArrayList();
-
-    // no wrapper
-    @XmlElement(name = "propertyGroup", required = false)
-    public List<PropertyGroupMetadata> getPropertyGroups() {
-        return propertyGroups;
-    }
-
-    public void setPropertyGroups(final List<PropertyGroupMetadata> propertyGroups) {
-        this.propertyGroups = propertyGroups;
-    }
-
-
-    private List<CollectionLayoutMetadata> collections = Lists.newArrayList();
-
-    // no wrapper
-    @XmlElement(name = "collection", required = false)
-    public List<CollectionLayoutMetadata> getCollections() {
-        return collections;
-    }
-
-    public void setCollections(final List<CollectionLayoutMetadata> collections) {
-        this.collections = collections;
-    }
-
-
-    private ColumnOwner owner;
-    /**
-     * Owner.
-     *
-     * <p>
-     *     Set programmatically by framework after reading in from XML.
-     * </p>
-     */
-    @XmlTransient
-    public ColumnOwner getOwner() {
-        return owner;
-    }
-
-    public void setOwner(final ColumnOwner owner) {
-        this.owner = owner;
-    }
-
-
-
-    private String path;
-
-    @Programmatic
-    @XmlTransient
-    public String getPath() {
-        return path;
-    }
-
-    @Programmatic
-    public void setPath(final String path) {
-        this.path = path;
-    }
-
-
-
-
-    public enum Hint {
-        LEFT,
-        MIDDLE,
-        RIGHT;
-
-        public int from(MemberGroupLayout.ColumnSpans columnSpans) {
-            if(this == LEFT) return columnSpans.getLeft();
-            if(this == MIDDLE) return columnSpans.getMiddle();
-            if(this == RIGHT) return columnSpans.getRight();
-            throw new IllegalStateException();
-        }
-
-        public ColumnMetadata from(final TabMetadata tabMetadata) {
-            if(tabMetadata == null) {
-                return null;
-            }
-            if(this == LEFT) return tabMetadata.getLeft();
-            if(this == MIDDLE) return tabMetadata.getMiddle();
-            if(this == RIGHT) return tabMetadata.getRight();
-            throw new IllegalStateException();
-        }
-
-    }
-}

http://git-wip-us.apache.org/repos/asf/isis/blob/10d80f3a/core/applib/src/main/java/org/apache/isis/applib/layout/fixedcols/FCColumn.java
----------------------------------------------------------------------
diff --git a/core/applib/src/main/java/org/apache/isis/applib/layout/fixedcols/FCColumn.java b/core/applib/src/main/java/org/apache/isis/applib/layout/fixedcols/FCColumn.java
new file mode 100644
index 0000000..830b21d
--- /dev/null
+++ b/core/applib/src/main/java/org/apache/isis/applib/layout/fixedcols/FCColumn.java
@@ -0,0 +1,163 @@
+/*
+ *  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.applib.layout.fixedcols;
+
+import java.io.Serializable;
+import java.util.List;
+
+import javax.xml.bind.annotation.XmlAttribute;
+import javax.xml.bind.annotation.XmlElement;
+import javax.xml.bind.annotation.XmlTransient;
+import javax.xml.bind.annotation.XmlType;
+
+import com.google.common.collect.Lists;
+
+import org.apache.isis.applib.annotation.MemberGroupLayout;
+import org.apache.isis.applib.annotation.Programmatic;
+import org.apache.isis.applib.layout.members.v1.CollectionLayoutData;
+import org.apache.isis.applib.layout.members.MemberRegionOwner;
+import org.apache.isis.applib.layout.members.Owned;
+import org.apache.isis.applib.layout.members.v1.FieldSet;
+import org.apache.isis.applib.layout.members.v1.PropertyLayoutData;
+
+/**
+ * The column contains a mixture of {@link FieldSet}s (of {@link PropertyLayoutData properties}) and also
+ * {@link CollectionLayoutData collection}s.
+ *
+ * <p>
+ * A column generally is used within a {@link FCTab}; there can be up to three such (left, middle and right).  It is
+ * also possible for their to be a column far-left on the top-level {@link FCPage page}, and another far-right.
+ * </p>
+ *
+ */
+@XmlType(
+        propOrder = {
+                "propertyGroups"
+                , "collections"
+        }
+)
+public class FCColumn implements Serializable, MemberRegionOwner, Owned<FCColumnOwner> {
+
+    private static final long serialVersionUID = 1L;
+
+    public FCColumn() {
+    }
+
+    public FCColumn(final int span) {
+        setSpan(span);
+    }
+
+    private int span = 4;
+
+    @XmlAttribute(required = true)
+    public int getSpan() {
+        return span;
+    }
+
+    public void setSpan(final int span) {
+        this.span = span;
+    }
+
+
+
+    private List<FieldSet> fieldSets = Lists.newArrayList();
+
+    // no wrapper
+    @XmlElement(name = "propertyGroup", required = false)
+    public List<FieldSet> getFieldSets() {
+        return fieldSets;
+    }
+
+    public void setFieldSets(final List<FieldSet> fieldSets) {
+        this.fieldSets = fieldSets;
+    }
+
+
+    private List<CollectionLayoutData> collections = Lists.newArrayList();
+
+    // no wrapper
+    @XmlElement(name = "collection", required = false)
+    public List<CollectionLayoutData> getCollections() {
+        return collections;
+    }
+
+    public void setCollections(final List<CollectionLayoutData> collections) {
+        this.collections = collections;
+    }
+
+
+    private FCColumnOwner owner;
+    /**
+     * Owner.
+     *
+     * <p>
+     *     Set programmatically by framework after reading in from XML.
+     * </p>
+     */
+    @XmlTransient
+    public FCColumnOwner getOwner() {
+        return owner;
+    }
+
+    public void setOwner(final FCColumnOwner owner) {
+        this.owner = owner;
+    }
+
+
+
+    private String path;
+
+    @Programmatic
+    @XmlTransient
+    public String getPath() {
+        return path;
+    }
+
+    @Programmatic
+    public void setPath(final String path) {
+        this.path = path;
+    }
+
+
+
+
+    public enum Hint {
+        LEFT,
+        MIDDLE,
+        RIGHT;
+
+        public int from(MemberGroupLayout.ColumnSpans columnSpans) {
+            if(this == LEFT) return columnSpans.getLeft();
+            if(this == MIDDLE) return columnSpans.getMiddle();
+            if(this == RIGHT) return columnSpans.getRight();
+            throw new IllegalStateException();
+        }
+
+        public FCColumn from(final FCTab FCTab) {
+            if(FCTab == null) {
+                return null;
+            }
+            if(this == LEFT) return FCTab.getLeft();
+            if(this == MIDDLE) return FCTab.getMiddle();
+            if(this == RIGHT) return FCTab.getRight();
+            throw new IllegalStateException();
+        }
+
+    }
+}

http://git-wip-us.apache.org/repos/asf/isis/blob/10d80f3a/core/applib/src/main/java/org/apache/isis/applib/layout/fixedcols/FCColumnOwner.java
----------------------------------------------------------------------
diff --git a/core/applib/src/main/java/org/apache/isis/applib/layout/fixedcols/FCColumnOwner.java b/core/applib/src/main/java/org/apache/isis/applib/layout/fixedcols/FCColumnOwner.java
new file mode 100644
index 0000000..dfdf8a5
--- /dev/null
+++ b/core/applib/src/main/java/org/apache/isis/applib/layout/fixedcols/FCColumnOwner.java
@@ -0,0 +1,25 @@
+/*
+ *  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.applib.layout.fixedcols;
+
+import org.apache.isis.applib.layout.members.Owner;
+
+public interface FCColumnOwner extends Owner {
+
+}

http://git-wip-us.apache.org/repos/asf/isis/blob/10d80f3a/core/applib/src/main/java/org/apache/isis/applib/layout/fixedcols/FCPage.java
----------------------------------------------------------------------
diff --git a/core/applib/src/main/java/org/apache/isis/applib/layout/fixedcols/FCPage.java b/core/applib/src/main/java/org/apache/isis/applib/layout/fixedcols/FCPage.java
new file mode 100644
index 0000000..c5ff91c
--- /dev/null
+++ b/core/applib/src/main/java/org/apache/isis/applib/layout/fixedcols/FCPage.java
@@ -0,0 +1,313 @@
+/*
+ *  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.applib.layout.fixedcols;
+
+import java.io.Serializable;
+import java.util.LinkedHashMap;
+import java.util.List;
+
+import javax.xml.bind.annotation.XmlElement;
+import javax.xml.bind.annotation.XmlElementWrapper;
+import javax.xml.bind.annotation.XmlRootElement;
+import javax.xml.bind.annotation.XmlTransient;
+import javax.xml.bind.annotation.XmlType;
+
+import com.google.common.collect.Maps;
+
+import org.apache.isis.applib.annotation.Programmatic;
+import org.apache.isis.applib.layout.members.v1.ActionLayoutData;
+import org.apache.isis.applib.layout.members.v1.ActionOwner;
+import org.apache.isis.applib.layout.members.v1.CollectionLayoutData;
+import org.apache.isis.applib.layout.members.v1.FieldSet;
+import org.apache.isis.applib.layout.members.v1.PropertyLayoutData;
+import org.apache.isis.applib.services.dto.Dto;
+
+/**
+ * Top-level page, consisting of an optional {@link FCColumn column} on the far left and another (also optional) on the
+ * far right, with the middle consisting of a number of {@link FCTabGroup tabgroup}s, stacked vertically.
+ */
+@XmlRootElement(
+        name = "objectLayout"
+)
+@XmlType(
+        name = "objectLayout"
+        , propOrder = {
+                "actions"
+                , "left"
+                , "tabGroups"
+                , "right"
+        }
+)
+public class FCPage implements Dto, ActionOwner, Serializable, FCColumnOwner, FCTabGroupOwner {
+
+    private static final long serialVersionUID = 1L;
+
+    private List<ActionLayoutData> actions;
+
+    @XmlElementWrapper(name = "actions", required = false)
+    @XmlElement(name = "action", required = false)
+    public List<ActionLayoutData> getActions() {
+        return actions;
+    }
+
+    public void setActions(List<ActionLayoutData> actionLayoutDatas) {
+        this.actions = actionLayoutDatas;
+    }
+
+
+
+    private FCColumn left;
+
+    @XmlElement(required = false)
+    public FCColumn getLeft() {
+        return left;
+    }
+
+    public void setLeft(final FCColumn left) {
+        this.left = left;
+    }
+
+
+
+    private List<FCTabGroup> tabGroups;
+
+    // no wrapper
+    @XmlElement(name = "tabGroup", required = true)
+    public List<FCTabGroup> getTabGroups() {
+        return tabGroups;
+    }
+
+    public void setTabGroups(List<FCTabGroup> tabGroups) {
+        this.tabGroups = tabGroups;
+    }
+
+
+
+    private FCColumn right;
+
+    @XmlElement(required = false)
+    public FCColumn getRight() {
+        return right;
+    }
+
+    public void setRight(final FCColumn right) {
+        this.right = right;
+    }
+    
+
+    public interface Visitor {
+        void visit(final FCPage FCPage);
+        void visit(final FCTabGroup tabGroup);
+        void visit(final FCTab FCTab);
+        void visit(final FCColumn FCColumn);
+        void visit(final FieldSet fieldSet);
+        void visit(final PropertyLayoutData propertyLayoutData);
+        void visit(final CollectionLayoutData collectionLayoutData);
+        void visit(final ActionLayoutData actionLayoutData);
+    }
+
+    public static class VisitorAdapter implements Visitor {
+        @Override
+        public void visit(final FCPage FCPage) { }
+        @Override
+        public void visit(final FCTabGroup tabGroup) { }
+        @Override
+        public void visit(final FCTab FCTab) { }
+        @Override
+        public void visit(final FCColumn FCColumn) { }
+        @Override
+        public void visit(final FieldSet fieldSet) {}
+        @Override
+        public void visit(final PropertyLayoutData propertyLayoutData) {}
+        @Override
+        public void visit(final CollectionLayoutData collectionLayoutData) {}
+        @Override
+        public void visit(final ActionLayoutData actionLayoutData) { }
+    }
+
+
+    /**
+     * Visits all elements of the graph.  The {@link Visitor} implementation
+     * can assume that all "owner" references are populated.
+     */
+    public void visit(final Visitor visitor) {
+        visitor.visit(this);
+        traverseActions(this, visitor);
+        traverseColumn(getLeft(), this, visitor);
+        final List<FCTabGroup> tabGroups = getTabGroups();
+        for (final FCTabGroup tabGroup : tabGroups) {
+            tabGroup.setOwner(this);
+            visitor.visit(tabGroup);
+            final List<FCTab> tabs = tabGroup.getTabs();
+            for (final FCTab FCTab : tabs) {
+                FCTab.setOwner(tabGroup);
+                visitor.visit(FCTab);
+                traverseColumn(FCTab.getLeft(), FCTab, visitor);
+                traverseColumn(FCTab.getMiddle(), FCTab, visitor);
+                traverseColumn(FCTab.getRight(), FCTab, visitor);
+            }
+        }
+        traverseColumn(getRight(), this, visitor);
+    }
+
+    private void traverseColumn(final FCColumn FCColumn, final FCColumnOwner FCColumnOwner, final Visitor visitor) {
+        if(FCColumn == null) {
+            return;
+        }
+        FCColumn.setOwner(FCColumnOwner);
+        visitor.visit(FCColumn);
+        traversePropertyGroups(FCColumn, visitor);
+        traverseCollections(FCColumn, visitor);
+    }
+
+    private void traversePropertyGroups(final FCColumn FCColumn, final Visitor visitor) {
+        for (final FieldSet fieldSet : FCColumn.getFieldSets()) {
+            fieldSet.setOwner(FCColumn);
+            visitor.visit(fieldSet);
+            traverseActions(fieldSet, visitor);
+            final List<PropertyLayoutData> properties = fieldSet.getProperties();
+            for (final PropertyLayoutData propertyLayoutData : properties) {
+                propertyLayoutData.setOwner(fieldSet);
+                visitor.visit(propertyLayoutData);
+                traverseActions(propertyLayoutData, visitor);
+            }
+        }
+    }
+
+    private void traverseCollections(final FCColumn FCColumn, final Visitor visitor) {
+        for (final CollectionLayoutData collectionLayoutData : FCColumn.getCollections()) {
+            collectionLayoutData.setOwner(FCColumn);
+            visitor.visit(collectionLayoutData);
+            traverseActions(collectionLayoutData, visitor);
+        }
+    }
+
+    private void traverseActions(final ActionOwner actionOwner, final Visitor visitor) {
+        final List<ActionLayoutData> actionLayoutDatas = actionOwner.getActions();
+        if(actionLayoutDatas == null) {
+            return;
+        }
+        for (final ActionLayoutData actionLayoutData : actionLayoutDatas) {
+            actionLayoutData.setOwner(actionOwner);
+            visitor.visit(actionLayoutData);
+        }
+    }
+
+
+    @Programmatic
+    @XmlTransient
+    public LinkedHashMap<String, PropertyLayoutData> getAllPropertiesById() {
+        final LinkedHashMap<String, PropertyLayoutData> propertiesById = Maps.newLinkedHashMap();
+        visit(new FCPage.VisitorAdapter() {
+            public void visit(final PropertyLayoutData propertyLayoutData) {
+                propertiesById.put(propertyLayoutData.getId(), propertyLayoutData);
+            }
+        });
+        return propertiesById;
+    }
+
+
+    @Programmatic
+    @XmlTransient
+    public LinkedHashMap<String, CollectionLayoutData> getAllCollectionsById() {
+        final LinkedHashMap<String, CollectionLayoutData> collectionsById = Maps.newLinkedHashMap();
+
+        visit(new FCPage.VisitorAdapter() {
+            @Override
+            public void visit(final CollectionLayoutData collectionLayoutData) {
+                collectionsById.put(collectionLayoutData.getId(), collectionLayoutData);
+            }
+        });
+        return collectionsById;
+    }
+
+
+    @Programmatic
+    @XmlTransient
+    public LinkedHashMap<String, ActionLayoutData> getAllActionsById() {
+        final LinkedHashMap<String, ActionLayoutData> actionsById = Maps.newLinkedHashMap();
+
+        visit(new FCPage.VisitorAdapter() {
+            @Override
+            public void visit(final ActionLayoutData actionLayoutData) {
+                actionsById.put(actionLayoutData.getId(), actionLayoutData);
+            }
+        });
+        return actionsById;
+    }
+
+
+    @Programmatic
+    @XmlTransient
+    public LinkedHashMap<String, FCTab> getAllTabsByName() {
+        final LinkedHashMap<String, FCTab> tabsByName = Maps.newLinkedHashMap();
+
+        visit(new FCPage.VisitorAdapter() {
+            @Override
+            public void visit(final FCTab FCTab) {
+                tabsByName.put(FCTab.getName(), FCTab);
+            }
+        });
+        return tabsByName;
+    }
+
+
+    @Programmatic
+    @XmlTransient
+    public LinkedHashMap<String, FieldSet> getAllPropertyGroupsByName() {
+        final LinkedHashMap<String, FieldSet> propertyGroupsByName = Maps.newLinkedHashMap();
+
+        visit(new FCPage.VisitorAdapter() {
+            @Override
+            public void visit(final FieldSet fieldSet) {
+                propertyGroupsByName.put(fieldSet.getName(), fieldSet);
+            }
+        });
+        return propertyGroupsByName;
+    }
+
+
+    private String path;
+
+    @Programmatic
+    @XmlTransient
+    public String getPath() {
+        return path;
+    }
+
+    @Programmatic
+    public void setPath(final String path) {
+        this.path = path;
+    }
+
+
+    private boolean normalized;
+
+    @Programmatic
+    @XmlTransient
+    public boolean isNormalized() {
+        return normalized;
+    }
+
+    @Programmatic
+    public void setNormalized(final boolean normalized) {
+        this.normalized = normalized;
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/isis/blob/10d80f3a/core/applib/src/main/java/org/apache/isis/applib/layout/fixedcols/FCTab.java
----------------------------------------------------------------------
diff --git a/core/applib/src/main/java/org/apache/isis/applib/layout/fixedcols/FCTab.java b/core/applib/src/main/java/org/apache/isis/applib/layout/fixedcols/FCTab.java
new file mode 100644
index 0000000..eb6b35d
--- /dev/null
+++ b/core/applib/src/main/java/org/apache/isis/applib/layout/fixedcols/FCTab.java
@@ -0,0 +1,172 @@
+/*
+ *  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.applib.layout.fixedcols;
+
+import java.io.Serializable;
+import java.util.List;
+
+import javax.xml.bind.annotation.XmlAttribute;
+import javax.xml.bind.annotation.XmlElement;
+import javax.xml.bind.annotation.XmlTransient;
+import javax.xml.bind.annotation.XmlType;
+
+import com.google.common.base.Predicate;
+import com.google.common.collect.Lists;
+
+import org.apache.isis.applib.annotation.Programmatic;
+import org.apache.isis.applib.layout.members.v1.CollectionLayoutData;
+import org.apache.isis.applib.layout.members.MemberRegion;
+import org.apache.isis.applib.layout.members.Owned;
+import org.apache.isis.applib.layout.members.v1.FieldSet;
+
+@XmlType(
+        name="tab"
+        , propOrder = {
+                "name"
+                , "left"
+                , "middle"
+                , "right"
+        }
+)
+public class FCTab implements FCColumnOwner, Serializable, Owned<FCTabGroup> {
+
+    private static final long serialVersionUID = 1L;
+
+    private String name;
+
+    @XmlAttribute(required = true)
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+
+
+    private FCColumn left = new FCColumn();
+
+    @XmlElement(required = true)
+    public FCColumn getLeft() {
+        return left;
+    }
+
+    public void setLeft(final FCColumn left) {
+        this.left = left;
+    }
+
+
+    private FCColumn middle;
+
+    @XmlElement(required = false)
+    public FCColumn getMiddle() {
+        return middle;
+    }
+
+    public void setMiddle(final FCColumn middle) {
+        this.middle = middle;
+    }
+
+
+    private FCColumn right;
+
+    @XmlElement(required = false)
+    public FCColumn getRight() {
+        return right;
+    }
+
+    public void setRight(final FCColumn right) {
+        this.right = right;
+    }
+
+
+
+    private FCTabGroup owner;
+    /**
+     * Owner.
+     *
+     * <p>
+     *     Set programmatically by framework after reading in from XML.
+     * </p>
+     */
+    @XmlTransient
+    public FCTabGroup getOwner() {
+        return owner;
+    }
+
+    public void setOwner(final FCTabGroup owner) {
+        this.owner = owner;
+    }
+
+    /**
+     * Aggregates the contents of all collections on this tab.
+     */
+    @Programmatic
+    public List<MemberRegion> getContents() {
+        final List<MemberRegion> contents = Lists.newArrayList();
+        appendContent(contents, getLeft());
+        appendContent(contents, getMiddle());
+        appendContent(contents, getRight());
+        return contents;
+    }
+
+
+
+
+    private String path;
+
+    @Programmatic
+    @XmlTransient
+    public String getPath() {
+        return path;
+    }
+
+    @Programmatic
+    public void setPath(final String path) {
+        this.path = path;
+    }
+
+
+
+    private static void appendContent(final List<MemberRegion> contents, final FCColumn FCColumn) {
+        if(FCColumn == null) {
+            return;
+        }
+        final List<FieldSet> fieldSets = FCColumn.getFieldSets();
+        if(fieldSets != null) {
+            contents.addAll(fieldSets);
+        }
+        final List<CollectionLayoutData> collectionLayoutDatas = FCColumn.getCollections();
+        if(collectionLayoutDatas != null) {
+            contents.addAll(collectionLayoutDatas);
+        }
+    }
+
+    public static class Predicates {
+        public static Predicate<FCTab> notEmpty() {
+            return new Predicate<FCTab>() {
+                @Override
+                public boolean apply(final FCTab FCTab) {
+                    return !FCTab.getContents().isEmpty();
+                }
+            };
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/isis/blob/10d80f3a/core/applib/src/main/java/org/apache/isis/applib/layout/fixedcols/FCTabGroup.java
----------------------------------------------------------------------
diff --git a/core/applib/src/main/java/org/apache/isis/applib/layout/fixedcols/FCTabGroup.java b/core/applib/src/main/java/org/apache/isis/applib/layout/fixedcols/FCTabGroup.java
new file mode 100644
index 0000000..2d6328a
--- /dev/null
+++ b/core/applib/src/main/java/org/apache/isis/applib/layout/fixedcols/FCTabGroup.java
@@ -0,0 +1,113 @@
+/*
+ *  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.applib.layout.fixedcols;
+
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.xml.bind.annotation.XmlElement;
+import javax.xml.bind.annotation.XmlTransient;
+import javax.xml.bind.annotation.XmlType;
+
+import com.google.common.base.Predicate;
+import com.google.common.collect.FluentIterable;
+
+import org.apache.isis.applib.annotation.Programmatic;
+import org.apache.isis.applib.layout.members.Owned;
+
+@XmlType(
+        propOrder = {
+                "tabs"
+        }
+
+)
+public class FCTabGroup implements FCColumnOwner, Serializable, Owned<FCTabGroupOwner> {
+
+    private static final long serialVersionUID = 1L;
+
+    // must be at least one tab.
+    private List<FCTab> tabs = new ArrayList<FCTab>(){{
+        add(new FCTab());
+    }};
+
+
+
+    // no wrapper
+    @XmlElement(name = "tab", required = true)
+    public List<FCTab> getTabs() {
+        return tabs;
+    }
+
+    public void setTabs(List<FCTab> tabs) {
+        this.tabs = tabs;
+    }
+
+
+
+    private FCTabGroupOwner owner;
+
+    /**
+     * Owner.
+     *
+     * <p>
+     *     Set programmatically by framework after reading in from XML.
+     * </p>
+     */
+    @XmlTransient
+    public FCTabGroupOwner getOwner() {
+        return owner;
+    }
+
+    public void setOwner(final FCTabGroupOwner owner) {
+        this.owner = owner;
+    }
+
+
+
+
+    private String path;
+
+    @Programmatic
+    @XmlTransient
+    public String getPath() {
+        return path;
+    }
+
+    @Programmatic
+    public void setPath(final String path) {
+        this.path = path;
+    }
+
+
+
+    public static class Predicates {
+        public static Predicate<FCTabGroup> notEmpty() {
+            return new Predicate<FCTabGroup>() {
+                @Override
+                public boolean apply(final FCTabGroup tabGroup) {
+                    return FluentIterable
+                            .from(tabGroup.getTabs())
+                            .anyMatch(FCTab.Predicates.notEmpty());
+                }
+            };
+        }
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/isis/blob/10d80f3a/core/applib/src/main/java/org/apache/isis/applib/layout/fixedcols/FCTabGroupOwner.java
----------------------------------------------------------------------
diff --git a/core/applib/src/main/java/org/apache/isis/applib/layout/fixedcols/FCTabGroupOwner.java b/core/applib/src/main/java/org/apache/isis/applib/layout/fixedcols/FCTabGroupOwner.java
new file mode 100644
index 0000000..2fb6431
--- /dev/null
+++ b/core/applib/src/main/java/org/apache/isis/applib/layout/fixedcols/FCTabGroupOwner.java
@@ -0,0 +1,25 @@
+/*
+ *  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.applib.layout.fixedcols;
+
+import org.apache.isis.applib.layout.members.Owner;
+
+public interface FCTabGroupOwner extends Owner {
+
+}

http://git-wip-us.apache.org/repos/asf/isis/blob/10d80f3a/core/applib/src/main/java/org/apache/isis/applib/layout/fixedcols/ObjectLayoutMetadata.java
----------------------------------------------------------------------
diff --git a/core/applib/src/main/java/org/apache/isis/applib/layout/fixedcols/ObjectLayoutMetadata.java b/core/applib/src/main/java/org/apache/isis/applib/layout/fixedcols/ObjectLayoutMetadata.java
deleted file mode 100644
index 87566af..0000000
--- a/core/applib/src/main/java/org/apache/isis/applib/layout/fixedcols/ObjectLayoutMetadata.java
+++ /dev/null
@@ -1,310 +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.applib.layout.fixedcols;
-
-import java.io.Serializable;
-import java.util.LinkedHashMap;
-import java.util.List;
-
-import javax.xml.bind.annotation.XmlElement;
-import javax.xml.bind.annotation.XmlElementWrapper;
-import javax.xml.bind.annotation.XmlRootElement;
-import javax.xml.bind.annotation.XmlTransient;
-import javax.xml.bind.annotation.XmlType;
-
-import com.google.common.collect.Maps;
-
-import org.apache.isis.applib.annotation.Programmatic;
-import org.apache.isis.applib.layout.v1_0.ActionLayoutMetadata;
-import org.apache.isis.applib.layout.v1_0.ActionOwner;
-import org.apache.isis.applib.layout.v1_0.CollectionLayoutMetadata;
-import org.apache.isis.applib.layout.v1_0.ColumnOwner;
-import org.apache.isis.applib.layout.v1_0.PropertyGroupMetadata;
-import org.apache.isis.applib.layout.v1_0.PropertyLayoutMetadata;
-import org.apache.isis.applib.services.dto.Dto;
-
-@XmlRootElement(
-        name = "objectLayout"
-)
-@XmlType(
-        name = "objectLayout"
-        , propOrder = {
-                "actions"
-                , "left"
-                , "tabGroups"
-                , "right"
-        }
-)
-public class ObjectLayoutMetadata implements Dto, ActionOwner, Serializable, ColumnOwner, TabGroupOwner {
-
-    private static final long serialVersionUID = 1L;
-
-    private List<ActionLayoutMetadata> actions;
-
-    @XmlElementWrapper(name = "actions", required = false)
-    @XmlElement(name = "action", required = false)
-    public List<ActionLayoutMetadata> getActions() {
-        return actions;
-    }
-
-    public void setActions(List<ActionLayoutMetadata> actionLayoutMetadatas) {
-        this.actions = actionLayoutMetadatas;
-    }
-
-
-
-    private ColumnMetadata left;
-
-    @XmlElement(required = false)
-    public ColumnMetadata getLeft() {
-        return left;
-    }
-
-    public void setLeft(final ColumnMetadata left) {
-        this.left = left;
-    }
-
-
-
-    private List<TabGroupMetadata> tabGroups;
-
-    // no wrapper
-    @XmlElement(name = "tabGroup", required = true)
-    public List<TabGroupMetadata> getTabGroups() {
-        return tabGroups;
-    }
-
-    public void setTabGroups(List<TabGroupMetadata> tabGroups) {
-        this.tabGroups = tabGroups;
-    }
-
-
-
-    private ColumnMetadata right;
-
-    @XmlElement(required = false)
-    public ColumnMetadata getRight() {
-        return right;
-    }
-
-    public void setRight(final ColumnMetadata right) {
-        this.right = right;
-    }
-    
-
-    public interface Visitor {
-        void visit(final ObjectLayoutMetadata objectLayoutMetadata);
-        void visit(final TabGroupMetadata tabGroup);
-        void visit(final TabMetadata tabMetadata);
-        void visit(final ColumnMetadata columnMetadata);
-        void visit(final PropertyGroupMetadata propertyGroupMetadata);
-        void visit(final PropertyLayoutMetadata propertyLayoutMetadata);
-        void visit(final CollectionLayoutMetadata collectionLayoutMetadata);
-        void visit(final ActionLayoutMetadata actionLayoutMetadata);
-    }
-
-    public static class VisitorAdapter implements Visitor {
-        @Override
-        public void visit(final ObjectLayoutMetadata objectLayoutMetadata) { }
-        @Override
-        public void visit(final TabGroupMetadata tabGroup) { }
-        @Override
-        public void visit(final TabMetadata tabMetadata) { }
-        @Override
-        public void visit(final ColumnMetadata columnMetadata) { }
-        @Override
-        public void visit(final PropertyGroupMetadata propertyGroupMetadata) {}
-        @Override
-        public void visit(final PropertyLayoutMetadata propertyLayoutMetadata) {}
-        @Override
-        public void visit(final CollectionLayoutMetadata collectionLayoutMetadata) {}
-        @Override
-        public void visit(final ActionLayoutMetadata actionLayoutMetadata) { }
-    }
-
-
-    /**
-     * Visits all elements of the graph.  The {@link Visitor} implementation
-     * can assume that all "owner" references are populated.
-     */
-    public void visit(final Visitor visitor) {
-        visitor.visit(this);
-        traverseActions(this, visitor);
-        traverseColumn(getLeft(), this, visitor);
-        final List<TabGroupMetadata> tabGroups = getTabGroups();
-        for (final TabGroupMetadata tabGroup : tabGroups) {
-            tabGroup.setOwner(this);
-            visitor.visit(tabGroup);
-            final List<TabMetadata> tabs = tabGroup.getTabs();
-            for (final TabMetadata tabMetadata : tabs) {
-                tabMetadata.setOwner(tabGroup);
-                visitor.visit(tabMetadata);
-                traverseColumn(tabMetadata.getLeft(), tabMetadata, visitor);
-                traverseColumn(tabMetadata.getMiddle(), tabMetadata, visitor);
-                traverseColumn(tabMetadata.getRight(), tabMetadata, visitor);
-            }
-        }
-        traverseColumn(getRight(), this, visitor);
-    }
-
-    private void traverseColumn(final ColumnMetadata columnMetadata, final ColumnOwner columnOwner, final Visitor visitor) {
-        if(columnMetadata == null) {
-            return;
-        }
-        columnMetadata.setOwner(columnOwner);
-        visitor.visit(columnMetadata);
-        traversePropertyGroups(columnMetadata, visitor);
-        traverseCollections(columnMetadata, visitor);
-    }
-
-    private void traversePropertyGroups(final ColumnMetadata columnMetadata, final Visitor visitor) {
-        for (final PropertyGroupMetadata propertyGroupMetadata : columnMetadata.getPropertyGroups()) {
-            propertyGroupMetadata.setOwner(columnMetadata);
-            visitor.visit(propertyGroupMetadata);
-            traverseActions(propertyGroupMetadata, visitor);
-            final List<PropertyLayoutMetadata> properties = propertyGroupMetadata.getProperties();
-            for (final PropertyLayoutMetadata propertyLayoutMetadata : properties) {
-                propertyLayoutMetadata.setOwner(propertyGroupMetadata);
-                visitor.visit(propertyLayoutMetadata);
-                traverseActions(propertyLayoutMetadata, visitor);
-            }
-        }
-    }
-
-    private void traverseCollections(final ColumnMetadata columnMetadata, final Visitor visitor) {
-        for (final CollectionLayoutMetadata collectionLayoutMetadata : columnMetadata.getCollections()) {
-            collectionLayoutMetadata.setOwner(columnMetadata);
-            visitor.visit(collectionLayoutMetadata);
-            traverseActions(collectionLayoutMetadata, visitor);
-        }
-    }
-
-    private void traverseActions(final ActionOwner actionOwner, final Visitor visitor) {
-        final List<ActionLayoutMetadata> actionLayoutMetadatas = actionOwner.getActions();
-        if(actionLayoutMetadatas == null) {
-            return;
-        }
-        for (final ActionLayoutMetadata actionLayoutMetadata : actionLayoutMetadatas) {
-            actionLayoutMetadata.setOwner(actionOwner);
-            visitor.visit(actionLayoutMetadata);
-        }
-    }
-
-
-    @Programmatic
-    @XmlTransient
-    public LinkedHashMap<String, PropertyLayoutMetadata> getAllPropertiesById() {
-        final LinkedHashMap<String, PropertyLayoutMetadata> propertiesById = Maps.newLinkedHashMap();
-        visit(new ObjectLayoutMetadata.VisitorAdapter() {
-            public void visit(final PropertyLayoutMetadata propertyLayoutMetadata) {
-                propertiesById.put(propertyLayoutMetadata.getId(), propertyLayoutMetadata);
-            }
-        });
-        return propertiesById;
-    }
-
-
-    @Programmatic
-    @XmlTransient
-    public LinkedHashMap<String, CollectionLayoutMetadata> getAllCollectionsById() {
-        final LinkedHashMap<String, CollectionLayoutMetadata> collectionsById = Maps.newLinkedHashMap();
-
-        visit(new ObjectLayoutMetadata.VisitorAdapter() {
-            @Override
-            public void visit(final CollectionLayoutMetadata collectionLayoutMetadata) {
-                collectionsById.put(collectionLayoutMetadata.getId(), collectionLayoutMetadata);
-            }
-        });
-        return collectionsById;
-    }
-
-
-    @Programmatic
-    @XmlTransient
-    public LinkedHashMap<String, ActionLayoutMetadata> getAllActionsById() {
-        final LinkedHashMap<String, ActionLayoutMetadata> actionsById = Maps.newLinkedHashMap();
-
-        visit(new ObjectLayoutMetadata.VisitorAdapter() {
-            @Override
-            public void visit(final ActionLayoutMetadata actionLayoutMetadata) {
-                actionsById.put(actionLayoutMetadata.getId(), actionLayoutMetadata);
-            }
-        });
-        return actionsById;
-    }
-
-
-    @Programmatic
-    @XmlTransient
-    public LinkedHashMap<String, TabMetadata> getAllTabsByName() {
-        final LinkedHashMap<String, TabMetadata> tabsByName = Maps.newLinkedHashMap();
-
-        visit(new ObjectLayoutMetadata.VisitorAdapter() {
-            @Override
-            public void visit(final TabMetadata tabMetadata) {
-                tabsByName.put(tabMetadata.getName(), tabMetadata);
-            }
-        });
-        return tabsByName;
-    }
-
-
-    @Programmatic
-    @XmlTransient
-    public LinkedHashMap<String, PropertyGroupMetadata> getAllPropertyGroupsByName() {
-        final LinkedHashMap<String, PropertyGroupMetadata> propertyGroupsByName = Maps.newLinkedHashMap();
-
-        visit(new ObjectLayoutMetadata.VisitorAdapter() {
-            @Override
-            public void visit(final PropertyGroupMetadata propertyGroupMetadata) {
-                propertyGroupsByName.put(propertyGroupMetadata.getName(), propertyGroupMetadata);
-            }
-        });
-        return propertyGroupsByName;
-    }
-
-
-    private String path;
-
-    @Programmatic
-    @XmlTransient
-    public String getPath() {
-        return path;
-    }
-
-    @Programmatic
-    public void setPath(final String path) {
-        this.path = path;
-    }
-
-
-    private boolean normalized;
-
-    @Programmatic
-    @XmlTransient
-    public boolean isNormalized() {
-        return normalized;
-    }
-
-    @Programmatic
-    public void setNormalized(final boolean normalized) {
-        this.normalized = normalized;
-    }
-
-}

http://git-wip-us.apache.org/repos/asf/isis/blob/10d80f3a/core/applib/src/main/java/org/apache/isis/applib/layout/fixedcols/TabGroupMetadata.java
----------------------------------------------------------------------
diff --git a/core/applib/src/main/java/org/apache/isis/applib/layout/fixedcols/TabGroupMetadata.java b/core/applib/src/main/java/org/apache/isis/applib/layout/fixedcols/TabGroupMetadata.java
deleted file mode 100644
index 2e95386..0000000
--- a/core/applib/src/main/java/org/apache/isis/applib/layout/fixedcols/TabGroupMetadata.java
+++ /dev/null
@@ -1,114 +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.applib.layout.fixedcols;
-
-import java.io.Serializable;
-import java.util.ArrayList;
-import java.util.List;
-
-import javax.xml.bind.annotation.XmlElement;
-import javax.xml.bind.annotation.XmlTransient;
-import javax.xml.bind.annotation.XmlType;
-
-import com.google.common.base.Predicate;
-import com.google.common.collect.FluentIterable;
-
-import org.apache.isis.applib.annotation.Programmatic;
-import org.apache.isis.applib.layout.v1_0.ColumnOwner;
-import org.apache.isis.applib.layout.v1_0.Owned;
-
-@XmlType(
-        propOrder = {
-                "tabs"
-        }
-
-)
-public class TabGroupMetadata implements ColumnOwner, Serializable, Owned<TabGroupOwner> {
-
-    private static final long serialVersionUID = 1L;
-
-    // must be at least one tab.
-    private List<TabMetadata> tabs = new ArrayList<TabMetadata>(){{
-        add(new TabMetadata());
-    }};
-
-
-
-    // no wrapper
-    @XmlElement(name = "tab", required = true)
-    public List<TabMetadata> getTabs() {
-        return tabs;
-    }
-
-    public void setTabs(List<TabMetadata> tabs) {
-        this.tabs = tabs;
-    }
-
-
-
-    private TabGroupOwner owner;
-
-    /**
-     * Owner.
-     *
-     * <p>
-     *     Set programmatically by framework after reading in from XML.
-     * </p>
-     */
-    @XmlTransient
-    public TabGroupOwner getOwner() {
-        return owner;
-    }
-
-    public void setOwner(final TabGroupOwner owner) {
-        this.owner = owner;
-    }
-
-
-
-
-    private String path;
-
-    @Programmatic
-    @XmlTransient
-    public String getPath() {
-        return path;
-    }
-
-    @Programmatic
-    public void setPath(final String path) {
-        this.path = path;
-    }
-
-
-
-    public static class Predicates {
-        public static Predicate<TabGroupMetadata> notEmpty() {
-            return new Predicate<TabGroupMetadata>() {
-                @Override
-                public boolean apply(final TabGroupMetadata tabGroup) {
-                    return FluentIterable
-                            .from(tabGroup.getTabs())
-                            .anyMatch(TabMetadata.Predicates.notEmpty());
-                }
-            };
-        }
-    }
-
-}

http://git-wip-us.apache.org/repos/asf/isis/blob/10d80f3a/core/applib/src/main/java/org/apache/isis/applib/layout/fixedcols/TabGroupOwner.java
----------------------------------------------------------------------
diff --git a/core/applib/src/main/java/org/apache/isis/applib/layout/fixedcols/TabGroupOwner.java b/core/applib/src/main/java/org/apache/isis/applib/layout/fixedcols/TabGroupOwner.java
deleted file mode 100644
index ab118c8..0000000
--- a/core/applib/src/main/java/org/apache/isis/applib/layout/fixedcols/TabGroupOwner.java
+++ /dev/null
@@ -1,25 +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.applib.layout.fixedcols;
-
-import org.apache.isis.applib.layout.v1_0.Owner;
-
-public interface TabGroupOwner extends Owner {
-
-}


[17/18] isis git commit: ISIS-993: bootstrap3 schema now properly defined and serializing ok. Also juggling around with the common (nee members)

Posted by da...@apache.org.
http://git-wip-us.apache.org/repos/asf/isis/blob/65f7d320/core/applib/src/main/java/org/apache/isis/applib/layout/fixedcols/FCColumn.java
----------------------------------------------------------------------
diff --git a/core/applib/src/main/java/org/apache/isis/applib/layout/fixedcols/FCColumn.java b/core/applib/src/main/java/org/apache/isis/applib/layout/fixedcols/FCColumn.java
index b0b369e..47d7812 100644
--- a/core/applib/src/main/java/org/apache/isis/applib/layout/fixedcols/FCColumn.java
+++ b/core/applib/src/main/java/org/apache/isis/applib/layout/fixedcols/FCColumn.java
@@ -22,7 +22,7 @@ import java.io.Serializable;
 import java.util.List;
 
 import javax.xml.bind.annotation.XmlAttribute;
-import javax.xml.bind.annotation.XmlElement;
+import javax.xml.bind.annotation.XmlElementRef;
 import javax.xml.bind.annotation.XmlTransient;
 import javax.xml.bind.annotation.XmlType;
 
@@ -30,11 +30,11 @@ import com.google.common.collect.Lists;
 
 import org.apache.isis.applib.annotation.MemberGroupLayout;
 import org.apache.isis.applib.annotation.Programmatic;
-import org.apache.isis.applib.layout.members.v1.CollectionLayoutData;
-import org.apache.isis.applib.layout.members.MemberRegionOwner;
-import org.apache.isis.applib.layout.members.Owned;
-import org.apache.isis.applib.layout.members.v1.FieldSet;
-import org.apache.isis.applib.layout.members.v1.PropertyLayoutData;
+import org.apache.isis.applib.layout.common.CollectionLayoutData;
+import org.apache.isis.applib.layout.common.FieldSet;
+import org.apache.isis.applib.layout.common.PropertyLayoutData;
+import org.apache.isis.applib.layout.common.MemberRegionOwner;
+import org.apache.isis.applib.layout.common.Owned;
 
 /**
  * The column contains a mixture of {@link FieldSet}s (of {@link PropertyLayoutData properties}) and also
@@ -79,7 +79,7 @@ public class FCColumn implements Serializable, MemberRegionOwner, Owned<FCColumn
     private List<FieldSet> fieldSets = Lists.newArrayList();
 
     // no wrapper
-    @XmlElement(name = "fieldSet", required = false)
+    @XmlElementRef(type = FieldSet.class, name = "fieldSet", required = false)
     public List<FieldSet> getFieldSets() {
         return fieldSets;
     }
@@ -92,7 +92,7 @@ public class FCColumn implements Serializable, MemberRegionOwner, Owned<FCColumn
     private List<CollectionLayoutData> collections = Lists.newArrayList();
 
     // no wrapper
-    @XmlElement(name = "collection", required = false)
+    @XmlElementRef(type = CollectionLayoutData.class, name = "collection", required = false)
     public List<CollectionLayoutData> getCollections() {
         return collections;
     }

http://git-wip-us.apache.org/repos/asf/isis/blob/65f7d320/core/applib/src/main/java/org/apache/isis/applib/layout/fixedcols/FCColumnOwner.java
----------------------------------------------------------------------
diff --git a/core/applib/src/main/java/org/apache/isis/applib/layout/fixedcols/FCColumnOwner.java b/core/applib/src/main/java/org/apache/isis/applib/layout/fixedcols/FCColumnOwner.java
index dfdf8a5..fe2ea76 100644
--- a/core/applib/src/main/java/org/apache/isis/applib/layout/fixedcols/FCColumnOwner.java
+++ b/core/applib/src/main/java/org/apache/isis/applib/layout/fixedcols/FCColumnOwner.java
@@ -18,7 +18,7 @@
  */
 package org.apache.isis.applib.layout.fixedcols;
 
-import org.apache.isis.applib.layout.members.Owner;
+import org.apache.isis.applib.layout.common.Owner;
 
 public interface FCColumnOwner extends Owner {
 

http://git-wip-us.apache.org/repos/asf/isis/blob/65f7d320/core/applib/src/main/java/org/apache/isis/applib/layout/fixedcols/FCPage.java
----------------------------------------------------------------------
diff --git a/core/applib/src/main/java/org/apache/isis/applib/layout/fixedcols/FCPage.java b/core/applib/src/main/java/org/apache/isis/applib/layout/fixedcols/FCPage.java
index a5f6708..1b50e8d 100644
--- a/core/applib/src/main/java/org/apache/isis/applib/layout/fixedcols/FCPage.java
+++ b/core/applib/src/main/java/org/apache/isis/applib/layout/fixedcols/FCPage.java
@@ -23,6 +23,7 @@ import java.util.LinkedHashMap;
 import java.util.List;
 
 import javax.xml.bind.annotation.XmlElement;
+import javax.xml.bind.annotation.XmlElementRef;
 import javax.xml.bind.annotation.XmlRootElement;
 import javax.xml.bind.annotation.XmlTransient;
 import javax.xml.bind.annotation.XmlType;
@@ -30,12 +31,12 @@ import javax.xml.bind.annotation.XmlType;
 import com.google.common.collect.Maps;
 
 import org.apache.isis.applib.annotation.Programmatic;
-import org.apache.isis.applib.layout.members.v1.ActionLayoutData;
-import org.apache.isis.applib.layout.members.v1.ActionOwner;
-import org.apache.isis.applib.layout.members.v1.CollectionLayoutData;
-import org.apache.isis.applib.layout.members.v1.FieldSet;
-import org.apache.isis.applib.layout.members.v1.Page;
-import org.apache.isis.applib.layout.members.v1.PropertyLayoutData;
+import org.apache.isis.applib.layout.common.ActionLayoutData;
+import org.apache.isis.applib.layout.common.ActionOwner;
+import org.apache.isis.applib.layout.common.CollectionLayoutData;
+import org.apache.isis.applib.layout.common.FieldSet;
+import org.apache.isis.applib.layout.common.Page;
+import org.apache.isis.applib.layout.common.PropertyLayoutData;
 import org.apache.isis.applib.services.dto.Dto;
 
 /**
@@ -61,7 +62,7 @@ public class FCPage implements Page, Dto, ActionOwner, Serializable, FCColumnOwn
     private List<ActionLayoutData> actions;
 
     // no wrapper
-    @XmlElement(name = "action", required = false)
+    @XmlElementRef(type = ActionLayoutData.class, name="action", required = false)
     public List<ActionLayoutData> getActions() {
         return actions;
     }

http://git-wip-us.apache.org/repos/asf/isis/blob/65f7d320/core/applib/src/main/java/org/apache/isis/applib/layout/fixedcols/FCTab.java
----------------------------------------------------------------------
diff --git a/core/applib/src/main/java/org/apache/isis/applib/layout/fixedcols/FCTab.java b/core/applib/src/main/java/org/apache/isis/applib/layout/fixedcols/FCTab.java
index eb6b35d..9475929 100644
--- a/core/applib/src/main/java/org/apache/isis/applib/layout/fixedcols/FCTab.java
+++ b/core/applib/src/main/java/org/apache/isis/applib/layout/fixedcols/FCTab.java
@@ -30,10 +30,10 @@ import com.google.common.base.Predicate;
 import com.google.common.collect.Lists;
 
 import org.apache.isis.applib.annotation.Programmatic;
-import org.apache.isis.applib.layout.members.v1.CollectionLayoutData;
-import org.apache.isis.applib.layout.members.MemberRegion;
-import org.apache.isis.applib.layout.members.Owned;
-import org.apache.isis.applib.layout.members.v1.FieldSet;
+import org.apache.isis.applib.layout.common.CollectionLayoutData;
+import org.apache.isis.applib.layout.common.MemberRegion;
+import org.apache.isis.applib.layout.common.Owned;
+import org.apache.isis.applib.layout.common.FieldSet;
 
 @XmlType(
         name="tab"

http://git-wip-us.apache.org/repos/asf/isis/blob/65f7d320/core/applib/src/main/java/org/apache/isis/applib/layout/fixedcols/FCTabGroup.java
----------------------------------------------------------------------
diff --git a/core/applib/src/main/java/org/apache/isis/applib/layout/fixedcols/FCTabGroup.java b/core/applib/src/main/java/org/apache/isis/applib/layout/fixedcols/FCTabGroup.java
index 2d6328a..567f278 100644
--- a/core/applib/src/main/java/org/apache/isis/applib/layout/fixedcols/FCTabGroup.java
+++ b/core/applib/src/main/java/org/apache/isis/applib/layout/fixedcols/FCTabGroup.java
@@ -30,7 +30,7 @@ import com.google.common.base.Predicate;
 import com.google.common.collect.FluentIterable;
 
 import org.apache.isis.applib.annotation.Programmatic;
-import org.apache.isis.applib.layout.members.Owned;
+import org.apache.isis.applib.layout.common.Owned;
 
 @XmlType(
         propOrder = {
@@ -47,8 +47,6 @@ public class FCTabGroup implements FCColumnOwner, Serializable, Owned<FCTabGroup
         add(new FCTab());
     }};
 
-
-
     // no wrapper
     @XmlElement(name = "tab", required = true)
     public List<FCTab> getTabs() {

http://git-wip-us.apache.org/repos/asf/isis/blob/65f7d320/core/applib/src/main/java/org/apache/isis/applib/layout/fixedcols/FCTabGroupOwner.java
----------------------------------------------------------------------
diff --git a/core/applib/src/main/java/org/apache/isis/applib/layout/fixedcols/FCTabGroupOwner.java b/core/applib/src/main/java/org/apache/isis/applib/layout/fixedcols/FCTabGroupOwner.java
index 2fb6431..2b37c0f 100644
--- a/core/applib/src/main/java/org/apache/isis/applib/layout/fixedcols/FCTabGroupOwner.java
+++ b/core/applib/src/main/java/org/apache/isis/applib/layout/fixedcols/FCTabGroupOwner.java
@@ -18,7 +18,7 @@
  */
 package org.apache.isis.applib.layout.fixedcols;
 
-import org.apache.isis.applib.layout.members.Owner;
+import org.apache.isis.applib.layout.common.Owner;
 
 public interface FCTabGroupOwner extends Owner {
 

http://git-wip-us.apache.org/repos/asf/isis/blob/65f7d320/core/applib/src/main/java/org/apache/isis/applib/layout/members/MemberRegion.java
----------------------------------------------------------------------
diff --git a/core/applib/src/main/java/org/apache/isis/applib/layout/members/MemberRegion.java b/core/applib/src/main/java/org/apache/isis/applib/layout/members/MemberRegion.java
deleted file mode 100644
index b4caf6f..0000000
--- a/core/applib/src/main/java/org/apache/isis/applib/layout/members/MemberRegion.java
+++ /dev/null
@@ -1,33 +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.applib.layout.members;
-
-/**
- * Represents an area on the page containing one or several related members.
- *
- * <p>
- *     Implementations include a <code>FieldSet</code> (containing a number
- *     of properties and their actions), and a <code>CollectionLayoutData</code>
- *     (containing a single collection and associated actions)
- * </p>
- */
-public interface MemberRegion extends Owned<MemberRegionOwner> {
-
-
-}

http://git-wip-us.apache.org/repos/asf/isis/blob/65f7d320/core/applib/src/main/java/org/apache/isis/applib/layout/members/MemberRegionOwner.java
----------------------------------------------------------------------
diff --git a/core/applib/src/main/java/org/apache/isis/applib/layout/members/MemberRegionOwner.java b/core/applib/src/main/java/org/apache/isis/applib/layout/members/MemberRegionOwner.java
deleted file mode 100644
index 174bfb1..0000000
--- a/core/applib/src/main/java/org/apache/isis/applib/layout/members/MemberRegionOwner.java
+++ /dev/null
@@ -1,23 +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.applib.layout.members;
-
-public interface MemberRegionOwner extends Owner {
-
-}

http://git-wip-us.apache.org/repos/asf/isis/blob/65f7d320/core/applib/src/main/java/org/apache/isis/applib/layout/members/Owned.java
----------------------------------------------------------------------
diff --git a/core/applib/src/main/java/org/apache/isis/applib/layout/members/Owned.java b/core/applib/src/main/java/org/apache/isis/applib/layout/members/Owned.java
deleted file mode 100644
index 54ef692..0000000
--- a/core/applib/src/main/java/org/apache/isis/applib/layout/members/Owned.java
+++ /dev/null
@@ -1,23 +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.applib.layout.members;
-
-public interface Owned<T extends Owner> {
-    T getOwner();
-}

http://git-wip-us.apache.org/repos/asf/isis/blob/65f7d320/core/applib/src/main/java/org/apache/isis/applib/layout/members/Owner.java
----------------------------------------------------------------------
diff --git a/core/applib/src/main/java/org/apache/isis/applib/layout/members/Owner.java b/core/applib/src/main/java/org/apache/isis/applib/layout/members/Owner.java
deleted file mode 100644
index b0f9dd2..0000000
--- a/core/applib/src/main/java/org/apache/isis/applib/layout/members/Owner.java
+++ /dev/null
@@ -1,24 +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.applib.layout.members;
-
-public interface Owner {
-
-
-}

http://git-wip-us.apache.org/repos/asf/isis/blob/65f7d320/core/applib/src/main/java/org/apache/isis/applib/layout/members/v1/ActionLayoutData.java
----------------------------------------------------------------------
diff --git a/core/applib/src/main/java/org/apache/isis/applib/layout/members/v1/ActionLayoutData.java b/core/applib/src/main/java/org/apache/isis/applib/layout/members/v1/ActionLayoutData.java
deleted file mode 100644
index 6e15728..0000000
--- a/core/applib/src/main/java/org/apache/isis/applib/layout/members/v1/ActionLayoutData.java
+++ /dev/null
@@ -1,227 +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.applib.layout.members.v1;
-
-import java.io.Serializable;
-
-import javax.xml.bind.annotation.XmlAttribute;
-import javax.xml.bind.annotation.XmlElement;
-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.Where;
-import org.apache.isis.applib.layout.members.Owned;
-
-/**
- * Describes the layout of a single action, broadly corresponding to {@link org.apache.isis.applib.annotation.ActionLayout}.
- *
- * <p>
- *  Note that {@link org.apache.isis.applib.annotation.ActionLayout#contributed()} is omitted because this only applies
- *  to domain services.
- * </p>
- */
-@XmlType(
-    name = "actionLayout"
-    , propOrder = {
-        "named"
-        , "describedAs"
-        , "metadataError"
-    }
-)
-public class ActionLayoutData implements Serializable, Owned<ActionOwner> {
-
-    private static final long serialVersionUID = 1L;
-
-    public ActionLayoutData() {
-    }
-    public ActionLayoutData(final String id) {
-        setId(id);
-    }
-
-    private String id;
-    /**
-     * Method name.
-     *
-     * <p>
-     *     Overloaded methods are not supported.
-     * </p>
-     */
-    @XmlAttribute(name="id", required = true)
-    public String getId() {
-        return id;
-    }
-
-    public void setId(String id) {
-        this.id = id;
-    }
-
-
-
-    private BookmarkPolicy bookmarking;
-
-    @XmlAttribute(required = false)
-    public BookmarkPolicy getBookmarking() {
-        return bookmarking;
-    }
-
-    public void setBookmarking(BookmarkPolicy bookmarking) {
-        this.bookmarking = bookmarking;
-    }
-
-
-    private String cssClass;
-
-    @XmlAttribute(required = false)
-    public String getCssClass() {
-        return cssClass;
-    }
-
-    public void setCssClass(String cssClass) {
-        this.cssClass = cssClass;
-    }
-
-
-    private String cssClassFa;
-
-    @XmlAttribute(required = false)
-    public String getCssClassFa() {
-        return cssClassFa;
-    }
-
-    public void setCssClassFa(String cssClassFa) {
-        this.cssClassFa = cssClassFa;
-    }
-
-
-
-    private org.apache.isis.applib.annotation.ActionLayout.CssClassFaPosition cssClassFaPosition;
-
-    @XmlAttribute(required = false)
-    public org.apache.isis.applib.annotation.ActionLayout.CssClassFaPosition getCssClassFaPosition() {
-        return cssClassFaPosition;
-    }
-
-    public void setCssClassFaPosition(org.apache.isis.applib.annotation.ActionLayout.CssClassFaPosition cssClassFaPosition) {
-        this.cssClassFaPosition = cssClassFaPosition;
-    }
-
-
-    private String describedAs;
-
-    @XmlElement(required = false)
-    public String getDescribedAs() {
-        return describedAs;
-    }
-
-    public void setDescribedAs(String describedAs) {
-        this.describedAs = describedAs;
-    }
-
-
-
-    private Where hidden;
-
-    @XmlAttribute(required = false)
-    public Where getHidden() {
-        return hidden;
-    }
-
-    public void setHidden(Where hidden) {
-        this.hidden = hidden;
-    }
-
-
-
-    private String named;
-
-    @XmlElement(required = false)
-    public String getNamed() {
-        return named;
-    }
-
-    public void setNamed(String named) {
-        this.named = named;
-    }
-
-
-
-    private Boolean namedEscaped;
-
-    @XmlAttribute(required = false)
-    public Boolean getNamedEscaped() {
-        return namedEscaped;
-    }
-
-    public void setNamedEscaped(Boolean namedEscaped) {
-        this.namedEscaped = namedEscaped;
-    }
-
-
-
-    private org.apache.isis.applib.annotation.ActionLayout.Position position;
-
-    @XmlAttribute(required = false)
-    public org.apache.isis.applib.annotation.ActionLayout.Position getPosition() {
-        return position;
-    }
-
-    public void setPosition(org.apache.isis.applib.annotation.ActionLayout.Position position) {
-        this.position = position;
-    }
-
-
-
-
-    private ActionOwner owner;
-    /**
-     * Owner.
-     *
-     * <p>
-     *     Set programmatically by framework after reading in from XML.
-     * </p>
-     */
-    @XmlTransient
-    public ActionOwner getOwner() {
-        return owner;
-    }
-
-    public void setOwner(final ActionOwner owner) {
-        this.owner = owner;
-    }
-
-
-    private String metadataError;
-
-    /**
-     * For diagnostics; populated by the framework if and only if a metadata error.
-     */
-    @XmlElement(required = false)
-    public String getMetadataError() {
-        return metadataError;
-    }
-
-    public void setMetadataError(final String metadataError) {
-        this.metadataError = metadataError;
-    }
-
-
-
-
-}

http://git-wip-us.apache.org/repos/asf/isis/blob/65f7d320/core/applib/src/main/java/org/apache/isis/applib/layout/members/v1/ActionOwner.java
----------------------------------------------------------------------
diff --git a/core/applib/src/main/java/org/apache/isis/applib/layout/members/v1/ActionOwner.java b/core/applib/src/main/java/org/apache/isis/applib/layout/members/v1/ActionOwner.java
deleted file mode 100644
index 2e604d2..0000000
--- a/core/applib/src/main/java/org/apache/isis/applib/layout/members/v1/ActionOwner.java
+++ /dev/null
@@ -1,27 +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.applib.layout.members.v1;
-
-import java.util.List;
-
-import org.apache.isis.applib.layout.members.Owner;
-
-public interface ActionOwner extends Owner {
-    List<ActionLayoutData> getActions();
-}

http://git-wip-us.apache.org/repos/asf/isis/blob/65f7d320/core/applib/src/main/java/org/apache/isis/applib/layout/members/v1/CollectionLayoutData.java
----------------------------------------------------------------------
diff --git a/core/applib/src/main/java/org/apache/isis/applib/layout/members/v1/CollectionLayoutData.java b/core/applib/src/main/java/org/apache/isis/applib/layout/members/v1/CollectionLayoutData.java
deleted file mode 100644
index a9723c6..0000000
--- a/core/applib/src/main/java/org/apache/isis/applib/layout/members/v1/CollectionLayoutData.java
+++ /dev/null
@@ -1,260 +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.applib.layout.members.v1;
-
-import java.io.Serializable;
-import java.util.List;
-
-import javax.xml.bind.annotation.XmlAttribute;
-import javax.xml.bind.annotation.XmlElement;
-import javax.xml.bind.annotation.XmlTransient;
-import javax.xml.bind.annotation.XmlType;
-
-import com.google.common.base.Function;
-
-import org.apache.isis.applib.annotation.Programmatic;
-import org.apache.isis.applib.annotation.Where;
-import org.apache.isis.applib.layout.members.MemberRegion;
-import org.apache.isis.applib.layout.members.MemberRegionOwner;
-
-/**
- * Describes the layout of a single collection, broadly corresponds to the {@link org.apache.isis.applib.annotation.CollectionLayout} annotation.
- *
- * <p>
- *     Note that {@link org.apache.isis.applib.annotation.CollectionLayout#render()} is omitted because
- *     {@link #defaultView} is its replacement.
- * </p>
- */
-@XmlType(
-        propOrder = {
-                "named"
-                ,"describedAs"
-                ,"sortedBy"
-                , "actions"
-                , "metadataError"
-        }
-)
-public class CollectionLayoutData implements MemberRegion, ActionOwner, Serializable {
-
-    private static final long serialVersionUID = 1L;
-
-    public CollectionLayoutData() {
-    }
-    public CollectionLayoutData(final String id) {
-        setId(id);
-    }
-
-
-    private String id;
-
-    /**
-     * Collection identifier, being the getter method without "get" prefix, first letter lower cased.
-     */
-    @XmlAttribute(required = true)
-    public String getId() {
-        return id;
-    }
-
-    public void setId(String id) {
-        this.id = id;
-    }
-
-
-
-    private String cssClass;
-
-    @XmlAttribute(required = false)
-    public String getCssClass() {
-        return cssClass;
-    }
-
-    public void setCssClass(String cssClass) {
-        this.cssClass = cssClass;
-    }
-
-
-
-    private String describedAs;
-
-    @XmlElement(required = false)
-    public String getDescribedAs() {
-        return describedAs;
-    }
-
-    public void setDescribedAs(String describedAs) {
-        this.describedAs = describedAs;
-    }
-
-
-
-    private String defaultView;
-
-    /**
-     * Typically <code>table</code> or <code>hidden</code>, but could be any other named view that is configured and
-     * appropriate, eg <code>gmap3</code> or <code>fullcalendar2</code>.
-     */
-    @XmlAttribute(required = false)
-    public String getDefaultView() {
-        return defaultView;
-    }
-
-    public void setDefaultView(String defaultView) {
-        this.defaultView = defaultView;
-    }
-
-
-    private Where hidden;
-
-    @XmlAttribute(required = false)
-    public Where getHidden() {
-        return hidden;
-    }
-
-    public void setHidden(Where hidden) {
-        this.hidden = hidden;
-    }
-
-
-    private String named;
-
-    @XmlElement(required = false)
-    public String getNamed() {
-        return named;
-    }
-
-    public void setNamed(String named) {
-        this.named = named;
-    }
-
-
-    private Boolean namedEscaped;
-
-    @XmlAttribute(required = false)
-    public Boolean getNamedEscaped() {
-        return namedEscaped;
-    }
-
-    public void setNamedEscaped(Boolean namedEscaped) {
-        this.namedEscaped = namedEscaped;
-    }
-
-
-    private Integer paged;
-
-    @XmlAttribute(required = false)
-    public Integer getPaged() {
-        return paged;
-    }
-
-    public void setPaged(Integer paged) {
-        this.paged = paged;
-    }
-
-
-
-    private String sortedBy;
-
-    @XmlElement(required = false)
-    public String getSortedBy() {
-        return sortedBy;
-    }
-
-    public void setSortedBy(String sortedBy) {
-        this.sortedBy = sortedBy;
-    }
-
-
-
-    private List<ActionLayoutData> actions;
-
-    // no wrapper
-    @XmlElement(name = "action", required = false)
-    public List<ActionLayoutData> getActions() {
-        return actions;
-    }
-
-    public void setActions(List<ActionLayoutData> actionLayoutDatas) {
-        this.actions = actionLayoutDatas;
-    }
-
-
-
-    private MemberRegionOwner owner;
-    /**
-     * Owner.
-     *
-     * <p>
-     *     Set programmatically by framework after reading in from XML.
-     * </p>
-     */
-    @XmlTransient
-    public MemberRegionOwner getOwner() {
-        return owner;
-    }
-
-    public void setOwner(final MemberRegionOwner owner) {
-        this.owner = owner;
-    }
-
-
-    private String metadataError;
-
-    /**
-     * For diagnostics; populated by the framework if and only if a metadata error.
-     */
-    @XmlElement(required = false)
-    public String getMetadataError() {
-        return metadataError;
-    }
-
-    public void setMetadataError(final String metadataError) {
-        this.metadataError = metadataError;
-    }
-
-
-
-
-    private String path;
-
-    @Programmatic
-    @XmlTransient
-    public String getPath() {
-        return path;
-    }
-
-    @Programmatic
-    public void setPath(final String path) {
-        this.path = path;
-    }
-
-
-
-    public static class Functions {
-        private Functions(){}
-
-        public static Function<CollectionLayoutData, String> id() {
-            return new Function<CollectionLayoutData, String>() {
-                @Override
-                public String apply(final CollectionLayoutData metadata) {
-                    return metadata.getId();
-                }
-            };
-        }
-    }
-}

http://git-wip-us.apache.org/repos/asf/isis/blob/65f7d320/core/applib/src/main/java/org/apache/isis/applib/layout/members/v1/DomainObjectLayoutData.java
----------------------------------------------------------------------
diff --git a/core/applib/src/main/java/org/apache/isis/applib/layout/members/v1/DomainObjectLayoutData.java b/core/applib/src/main/java/org/apache/isis/applib/layout/members/v1/DomainObjectLayoutData.java
deleted file mode 100644
index 29807a2..0000000
--- a/core/applib/src/main/java/org/apache/isis/applib/layout/members/v1/DomainObjectLayoutData.java
+++ /dev/null
@@ -1,158 +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.applib.layout.members.v1;
-
-import java.io.Serializable;
-
-import javax.xml.bind.annotation.XmlAttribute;
-import javax.xml.bind.annotation.XmlElement;
-import javax.xml.bind.annotation.XmlType;
-
-import org.apache.isis.applib.annotation.BookmarkPolicy;
-
-/**
- * Describes the layout of the title and icon of a domain object, broadly corresponding to {@link org.apache.isis.applib.annotation.DomainObjectLayout}.
- */
-@XmlType(
-    name = "domainObjectLayout"
-    , propOrder = {
-        "named"
-        , "describedAs"
-        , "plural"
-        , "metadataError"
-    }
-)
-public class DomainObjectLayoutData implements Serializable {
-
-    private static final long serialVersionUID = 1L;
-
-    public DomainObjectLayoutData() {
-    }
-
-
-    private BookmarkPolicy bookmarking;
-
-    @XmlAttribute(required = false)
-    public BookmarkPolicy getBookmarking() {
-        return bookmarking;
-    }
-
-    public void setBookmarking(BookmarkPolicy bookmarking) {
-        this.bookmarking = bookmarking;
-    }
-
-
-
-    private String cssClass;
-
-    @XmlAttribute(required = false)
-    public String getCssClass() {
-        return cssClass;
-    }
-
-    public void setCssClass(String cssClass) {
-        this.cssClass = cssClass;
-    }
-
-
-    private String cssClassFa;
-
-    @XmlAttribute(required = false)
-    public String getCssClassFa() {
-        return cssClassFa;
-    }
-
-    public void setCssClassFa(String cssClassFa) {
-        this.cssClassFa = cssClassFa;
-    }
-
-
-
-    private org.apache.isis.applib.annotation.ActionLayout.CssClassFaPosition cssClassFaPosition;
-
-    @XmlAttribute(required = false)
-    public org.apache.isis.applib.annotation.ActionLayout.CssClassFaPosition getCssClassFaPosition() {
-        return cssClassFaPosition;
-    }
-
-    public void setCssClassFaPosition(org.apache.isis.applib.annotation.ActionLayout.CssClassFaPosition cssClassFaPosition) {
-        this.cssClassFaPosition = cssClassFaPosition;
-    }
-
-
-    private String describedAs;
-
-    @XmlElement(required = false)
-    public String getDescribedAs() {
-        return describedAs;
-    }
-
-    public void setDescribedAs(String describedAs) {
-        this.describedAs = describedAs;
-    }
-
-
-
-    private String named;
-
-    @XmlElement(required = false)
-    public String getNamed() {
-        return named;
-    }
-
-    public void setNamed(String named) {
-        this.named = named;
-    }
-
-
-
-
-    private String plural;
-
-    @XmlElement(required = false)
-    public String getPlural() {
-        return plural;
-    }
-
-    public void setPlural(String plural) {
-        this.plural = plural;
-    }
-
-
-
-
-
-    private String metadataError;
-
-    /**
-     * For diagnostics; populated by the framework if and only if a metadata error.
-     */
-    @XmlElement(required = false)
-    public String getMetadataError() {
-        return metadataError;
-    }
-
-    public void setMetadataError(final String metadataError) {
-        this.metadataError = metadataError;
-    }
-
-
-
-
-}

http://git-wip-us.apache.org/repos/asf/isis/blob/65f7d320/core/applib/src/main/java/org/apache/isis/applib/layout/members/v1/FieldSet.java
----------------------------------------------------------------------
diff --git a/core/applib/src/main/java/org/apache/isis/applib/layout/members/v1/FieldSet.java b/core/applib/src/main/java/org/apache/isis/applib/layout/members/v1/FieldSet.java
deleted file mode 100644
index 13faf9d..0000000
--- a/core/applib/src/main/java/org/apache/isis/applib/layout/members/v1/FieldSet.java
+++ /dev/null
@@ -1,151 +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.applib.layout.members.v1;
-
-import java.io.Serializable;
-import java.util.List;
-
-import javax.annotation.Nullable;
-import javax.xml.bind.annotation.XmlAttribute;
-import javax.xml.bind.annotation.XmlElement;
-import javax.xml.bind.annotation.XmlTransient;
-import javax.xml.bind.annotation.XmlType;
-
-import com.google.common.base.Function;
-import com.google.common.collect.Lists;
-
-import org.apache.isis.applib.annotation.MemberOrder;
-import org.apache.isis.applib.annotation.Programmatic;
-import org.apache.isis.applib.layout.members.MemberRegion;
-import org.apache.isis.applib.layout.members.MemberRegionOwner;
-
-/**
- * A {@link MemberRegion region} of the page containing a set of
- * related {@link PropertyLayoutData properties} and associated
- * {@link ActionLayoutData actions}.
- */
-@XmlType(
-        propOrder = {
-                "name"
-                , "actions"
-                , "properties"
-        }
-)
-public class FieldSet implements MemberRegion, ActionOwner, Serializable {
-
-    private static final long serialVersionUID = 1L;
-
-    public FieldSet() {
-    }
-
-    public FieldSet(final String name) {
-        setName(name);
-    }
-
-    private String name;
-
-    /**
-     * Corresponds to the {@link MemberOrder#name()} (when applied to properties).
-     */
-    @XmlAttribute(required = true)
-    public String getName() {
-        return name;
-    }
-
-    public void setName(String name) {
-        this.name = name;
-    }
-
-
-
-    private List<ActionLayoutData> actions = Lists.newArrayList();
-
-    // no wrapper
-    @XmlElement(name = "action", required = false)
-    public List<ActionLayoutData> getActions() {
-        return actions;
-    }
-
-    public void setActions(List<ActionLayoutData> actionLayoutDatas) {
-        this.actions = actionLayoutDatas;
-    }
-
-
-
-    private List<PropertyLayoutData> properties = Lists.newArrayList();
-
-    @XmlElement(name = "property", required = true)
-    public List<PropertyLayoutData> getProperties() {
-        return properties;
-    }
-
-    public void setProperties(List<PropertyLayoutData> properties) {
-        this.properties = properties;
-    }
-
-
-    private MemberRegionOwner owner;
-    /**
-     * Owner.
-     *
-     * <p>
-     *     Set programmatically by framework after reading in from XML.
-     * </p>
-     */
-    @XmlTransient
-    public MemberRegionOwner getOwner() {
-        return owner;
-    }
-
-    public void setOwner(final MemberRegionOwner owner) {
-        this.owner = owner;
-    }
-
-
-
-
-    private String path;
-
-    @Programmatic
-    @XmlTransient
-    public String getPath() {
-        return path;
-    }
-
-    @Programmatic
-    public void setPath(final String path) {
-        this.path = path;
-    }
-
-
-
-
-    public static class Util {
-        private Util(){}
-        public static Function<? super FieldSet, String> nameOf() {
-            return new Function<FieldSet, String>() {
-                @Nullable @Override
-                public String apply(@Nullable final FieldSet fieldSet) {
-                    return fieldSet.getName();
-                }
-            };
-        }
-    }
-
-}

http://git-wip-us.apache.org/repos/asf/isis/blob/65f7d320/core/applib/src/main/java/org/apache/isis/applib/layout/members/v1/Page.java
----------------------------------------------------------------------
diff --git a/core/applib/src/main/java/org/apache/isis/applib/layout/members/v1/Page.java b/core/applib/src/main/java/org/apache/isis/applib/layout/members/v1/Page.java
deleted file mode 100644
index 6e07332..0000000
--- a/core/applib/src/main/java/org/apache/isis/applib/layout/members/v1/Page.java
+++ /dev/null
@@ -1,38 +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.applib.layout.members.v1;
-
-import org.apache.isis.applib.services.layout.PageService;
-
-/**
- * All top-level page layout classes should implement this interface.
- *
- * <p>
- *     It is used by the {@link PageService} as a common based type for any layouts read in from XML.
- * </p>
- */
-public interface Page {
-
-
-    boolean isNormalized();
-
-    void setNormalized(final boolean normalized);
-
-
-}

http://git-wip-us.apache.org/repos/asf/isis/blob/65f7d320/core/applib/src/main/java/org/apache/isis/applib/layout/members/v1/PropertyLayoutData.java
----------------------------------------------------------------------
diff --git a/core/applib/src/main/java/org/apache/isis/applib/layout/members/v1/PropertyLayoutData.java b/core/applib/src/main/java/org/apache/isis/applib/layout/members/v1/PropertyLayoutData.java
deleted file mode 100644
index d1eb092..0000000
--- a/core/applib/src/main/java/org/apache/isis/applib/layout/members/v1/PropertyLayoutData.java
+++ /dev/null
@@ -1,245 +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.applib.layout.members.v1;
-
-import java.io.Serializable;
-import java.util.List;
-
-import javax.xml.bind.annotation.XmlAttribute;
-import javax.xml.bind.annotation.XmlElement;
-import javax.xml.bind.annotation.XmlTransient;
-import javax.xml.bind.annotation.XmlType;
-
-import org.apache.isis.applib.annotation.LabelPosition;
-import org.apache.isis.applib.annotation.Programmatic;
-import org.apache.isis.applib.annotation.Where;
-import org.apache.isis.applib.layout.members.Owned;
-
-/**
- * Describes the layout of a single property, broadly corresponds to the {@link org.apache.isis.applib.annotation.PropertyLayout} annotation.
- */
-@XmlType(
-        name = "propertyLayout"
-        , propOrder = {
-                "named"
-                , "describedAs"
-                , "actions"
-                , "metadataError"
-        }
-)
-public class PropertyLayoutData implements ActionOwner, Serializable, Owned<FieldSet> {
-
-    private static final long serialVersionUID = 1L;
-
-    public PropertyLayoutData() {
-    }
-
-    public PropertyLayoutData(final String id) {
-        this.id = id;
-    }
-
-    private String id;
-
-    /**
-     * Property identifier, being the getter method without "get" or "is" prefix, first letter lower cased.
-     */
-    @XmlAttribute(required = true)
-    public String getId() {
-        return id;
-    }
-
-    public void setId(String id) {
-        this.id = id;
-    }
-
-
-
-    private String cssClass;
-
-    @XmlAttribute(required = false)
-    public String getCssClass() {
-        return cssClass;
-    }
-
-    public void setCssClass(String cssClass) {
-        this.cssClass = cssClass;
-    }
-
-
-    private String describedAs;
-
-    @XmlElement(required = false)
-    public String getDescribedAs() {
-        return describedAs;
-    }
-
-    public void setDescribedAs(String describedAs) {
-        this.describedAs = describedAs;
-    }
-
-
-    private Where hidden;
-
-    @XmlAttribute(required = false)
-    public Where getHidden() {
-        return hidden;
-    }
-
-    public void setHidden(Where hidden) {
-        this.hidden = hidden;
-    }
-
-
-    private LabelPosition labelPosition;
-
-    @XmlAttribute(required = false)
-    public LabelPosition getLabelPosition() {
-        return labelPosition;
-    }
-
-    public void setLabelPosition(LabelPosition labelPosition) {
-        this.labelPosition = labelPosition;
-    }
-
-
-    private Integer multiLine;
-
-    @XmlAttribute(required = false)
-    public Integer getMultiLine() {
-        return multiLine;
-    }
-
-    public void setMultiLine(Integer multiLine) {
-        this.multiLine = multiLine;
-    }
-
-
-    private String named;
-
-    @XmlElement(required = false)
-    public String getNamed() {
-        return named;
-    }
-
-    public void setNamed(String named) {
-        this.named = named;
-    }
-
-
-    private Boolean namedEscaped;
-
-    @XmlAttribute(required = false)
-    public Boolean getNamedEscaped() {
-        return namedEscaped;
-    }
-
-    public void setNamedEscaped(Boolean namedEscaped) {
-        this.namedEscaped = namedEscaped;
-    }
-
-
-    private Boolean renderedAsDayBefore;
-
-    @XmlAttribute(required = false)
-    public Boolean getRenderedAsDayBefore() {
-        return renderedAsDayBefore;
-    }
-
-    public void setRenderedAsDayBefore(Boolean renderedAsDayBefore) {
-        this.renderedAsDayBefore = renderedAsDayBefore;
-    }
-
-
-    private Integer typicalLength;
-
-    @XmlAttribute(required = false)
-    public Integer getTypicalLength() {
-        return typicalLength;
-    }
-
-    public void setTypicalLength(Integer typicalLength) {
-        this.typicalLength = typicalLength;
-    }
-
-
-
-    private List<ActionLayoutData> actions;
-
-    // no wrapper
-    @XmlElement(name = "action", required = false)
-    public List<ActionLayoutData> getActions() {
-        return actions;
-    }
-
-    public void setActions(List<ActionLayoutData> actionLayoutDatas) {
-        this.actions = actionLayoutDatas;
-    }
-
-
-    private FieldSet owner;
-    /**
-     * Owner.
-     *
-     * <p>
-     *     Set programmatically by framework after reading in from XML.
-     * </p>
-     */
-    @XmlTransient
-    public FieldSet getOwner() {
-        return owner;
-    }
-
-    public void setOwner(final FieldSet owner) {
-        this.owner = owner;
-    }
-
-
-
-    private String metadataError;
-
-    /**
-     * For diagnostics; populated by the framework if and only if a metadata error.
-     */
-    @XmlElement(required = false)
-    public String getMetadataError() {
-        return metadataError;
-    }
-
-    public void setMetadataError(final String metadataError) {
-        this.metadataError = metadataError;
-    }
-
-
-
-
-    private String path;
-
-    @Programmatic
-    @XmlTransient
-    public String getPath() {
-        return path;
-    }
-
-    @Programmatic
-    public void setPath(final String path) {
-        this.path = path;
-    }
-
-
-}

http://git-wip-us.apache.org/repos/asf/isis/blob/65f7d320/core/applib/src/main/java/org/apache/isis/applib/layout/members/v1/package-info.java
----------------------------------------------------------------------
diff --git a/core/applib/src/main/java/org/apache/isis/applib/layout/members/v1/package-info.java b/core/applib/src/main/java/org/apache/isis/applib/layout/members/v1/package-info.java
deleted file mode 100644
index d3e2c19..0000000
--- a/core/applib/src/main/java/org/apache/isis/applib/layout/members/v1/package-info.java
+++ /dev/null
@@ -1,36 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *        http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- */
-
-/**
- * The classes in this package provide layout metadata for a domain object's properties, collections and actions - the
- * &quot;building blocks&quot; which then must be arranged into some sort of layout.
- *
- * <p>
- *     The <code>bootstrap3</code> and <code>fixedcols</code> packages both provide different ways of doing the layout,
- *     and both reference the classes in this package.
- * </p>
- *
- */
-@javax.xml.bind.annotation.XmlSchema(
-        namespace = "http://isis.apache.org/schema/applib/layout/members/v1",
-        elementFormDefault = javax.xml.bind.annotation.XmlNsForm.QUALIFIED
-        // specifying the location seems to cause JaxbService#toXsd() to not generate the schema; not sure why...
-        //, location = ..."http://isis.apache.org/schema/metamodel/layout/members/v1/members-1.0.xsd"
-)
-package org.apache.isis.applib.layout.members.v1;
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/isis/blob/65f7d320/core/applib/src/main/java/org/apache/isis/applib/services/layout/Object_downloadLayoutXml.java
----------------------------------------------------------------------
diff --git a/core/applib/src/main/java/org/apache/isis/applib/services/layout/Object_downloadLayoutXml.java b/core/applib/src/main/java/org/apache/isis/applib/services/layout/Object_downloadLayoutXml.java
index 10bfa19..5416d1d 100644
--- a/core/applib/src/main/java/org/apache/isis/applib/services/layout/Object_downloadLayoutXml.java
+++ b/core/applib/src/main/java/org/apache/isis/applib/services/layout/Object_downloadLayoutXml.java
@@ -28,7 +28,7 @@ import org.apache.isis.applib.annotation.Mixin;
 import org.apache.isis.applib.annotation.ParameterLayout;
 import org.apache.isis.applib.annotation.RestrictTo;
 import org.apache.isis.applib.annotation.SemanticsOf;
-import org.apache.isis.applib.layout.members.v1.Page;
+import org.apache.isis.applib.layout.common.Page;
 import org.apache.isis.applib.services.jaxb.JaxbService;
 import org.apache.isis.applib.value.Clob;
 

http://git-wip-us.apache.org/repos/asf/isis/blob/65f7d320/core/applib/src/main/java/org/apache/isis/applib/services/layout/Object_viewLayout.java
----------------------------------------------------------------------
diff --git a/core/applib/src/main/java/org/apache/isis/applib/services/layout/Object_viewLayout.java b/core/applib/src/main/java/org/apache/isis/applib/services/layout/Object_viewLayout.java
index b8f128e..0576476 100644
--- a/core/applib/src/main/java/org/apache/isis/applib/services/layout/Object_viewLayout.java
+++ b/core/applib/src/main/java/org/apache/isis/applib/services/layout/Object_viewLayout.java
@@ -25,7 +25,7 @@ import org.apache.isis.applib.annotation.Mixin;
 import org.apache.isis.applib.annotation.Programmatic;
 import org.apache.isis.applib.annotation.RestrictTo;
 import org.apache.isis.applib.annotation.SemanticsOf;
-import org.apache.isis.applib.layout.members.v1.Page;
+import org.apache.isis.applib.layout.common.Page;
 
 @Mixin
 public class Object_viewLayout {

http://git-wip-us.apache.org/repos/asf/isis/blob/65f7d320/core/applib/src/main/java/org/apache/isis/applib/services/layout/PageService.java
----------------------------------------------------------------------
diff --git a/core/applib/src/main/java/org/apache/isis/applib/services/layout/PageService.java b/core/applib/src/main/java/org/apache/isis/applib/services/layout/PageService.java
index b0fb237..d8948eb 100644
--- a/core/applib/src/main/java/org/apache/isis/applib/services/layout/PageService.java
+++ b/core/applib/src/main/java/org/apache/isis/applib/services/layout/PageService.java
@@ -17,7 +17,7 @@
 package org.apache.isis.applib.services.layout;
 
 import org.apache.isis.applib.annotation.Programmatic;
-import org.apache.isis.applib.layout.members.v1.Page;
+import org.apache.isis.applib.layout.common.Page;
 
 public interface PageService {
 

http://git-wip-us.apache.org/repos/asf/isis/blob/65f7d320/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/layout/ActionPositionFacetForActionXml.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/layout/ActionPositionFacetForActionXml.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/layout/ActionPositionFacetForActionXml.java
index daf84d1..0997821 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/layout/ActionPositionFacetForActionXml.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/layout/ActionPositionFacetForActionXml.java
@@ -19,7 +19,7 @@
 
 package org.apache.isis.core.metamodel.facets.actions.layout;
 
-import org.apache.isis.applib.layout.members.v1.ActionLayoutData;
+import org.apache.isis.applib.layout.common.ActionLayoutData;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 import org.apache.isis.core.metamodel.facets.actions.position.ActionPositionFacet;
 import org.apache.isis.core.metamodel.facets.actions.position.ActionPositionFacetAbstract;

http://git-wip-us.apache.org/repos/asf/isis/blob/65f7d320/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/layout/BookmarkPolicyFacetForActionXml.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/layout/BookmarkPolicyFacetForActionXml.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/layout/BookmarkPolicyFacetForActionXml.java
index 6cee700..73ddb4b 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/layout/BookmarkPolicyFacetForActionXml.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/layout/BookmarkPolicyFacetForActionXml.java
@@ -20,7 +20,7 @@
 package org.apache.isis.core.metamodel.facets.actions.layout;
 
 import org.apache.isis.applib.annotation.BookmarkPolicy;
-import org.apache.isis.applib.layout.members.v1.ActionLayoutData;
+import org.apache.isis.applib.layout.common.ActionLayoutData;
 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.bookmarkpolicy.BookmarkPolicyFacetAbstract;

http://git-wip-us.apache.org/repos/asf/isis/blob/65f7d320/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/layout/CssClassFaFacetForActionXml.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/layout/CssClassFaFacetForActionXml.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/layout/CssClassFaFacetForActionXml.java
index 95a62a2..3435bf3 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/layout/CssClassFaFacetForActionXml.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/layout/CssClassFaFacetForActionXml.java
@@ -21,7 +21,7 @@ package org.apache.isis.core.metamodel.facets.actions.layout;
 
 import com.google.common.base.Strings;
 
-import org.apache.isis.applib.layout.members.v1.ActionLayoutData;
+import org.apache.isis.applib.layout.common.ActionLayoutData;
 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;

http://git-wip-us.apache.org/repos/asf/isis/blob/65f7d320/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/layout/CssClassFacetForActionXml.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/layout/CssClassFacetForActionXml.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/layout/CssClassFacetForActionXml.java
index f845680..b26feb5 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/layout/CssClassFacetForActionXml.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/layout/CssClassFacetForActionXml.java
@@ -21,7 +21,7 @@ package org.apache.isis.core.metamodel.facets.actions.layout;
 
 import com.google.common.base.Strings;
 
-import org.apache.isis.applib.layout.members.v1.ActionLayoutData;
+import org.apache.isis.applib.layout.common.ActionLayoutData;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 import org.apache.isis.core.metamodel.facets.members.cssclass.CssClassFacet;
 import org.apache.isis.core.metamodel.facets.members.cssclass.CssClassFacetAbstract;

http://git-wip-us.apache.org/repos/asf/isis/blob/65f7d320/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/layout/DescribedAsFacetForActionXml.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/layout/DescribedAsFacetForActionXml.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/layout/DescribedAsFacetForActionXml.java
index 9dd795b..644dd1d 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/layout/DescribedAsFacetForActionXml.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/layout/DescribedAsFacetForActionXml.java
@@ -21,7 +21,7 @@ package org.apache.isis.core.metamodel.facets.actions.layout;
 
 import com.google.common.base.Strings;
 
-import org.apache.isis.applib.layout.members.v1.ActionLayoutData;
+import org.apache.isis.applib.layout.common.ActionLayoutData;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 import org.apache.isis.core.metamodel.facets.all.describedas.DescribedAsFacet;
 import org.apache.isis.core.metamodel.facets.all.describedas.DescribedAsFacetAbstract;

http://git-wip-us.apache.org/repos/asf/isis/blob/65f7d320/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
index c5f9c88..e2b66f1 100644
--- 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
@@ -21,7 +21,7 @@ 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.members.v1.ActionLayoutData;
+import org.apache.isis.applib.layout.common.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;

http://git-wip-us.apache.org/repos/asf/isis/blob/65f7d320/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/layout/NamedFacetForActionXml.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/layout/NamedFacetForActionXml.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/layout/NamedFacetForActionXml.java
index af7a819..96ad7d6 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/layout/NamedFacetForActionXml.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/layout/NamedFacetForActionXml.java
@@ -21,7 +21,7 @@ package org.apache.isis.core.metamodel.facets.actions.layout;
 
 import com.google.common.base.Strings;
 
-import org.apache.isis.applib.layout.members.v1.ActionLayoutData;
+import org.apache.isis.applib.layout.common.ActionLayoutData;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 import org.apache.isis.core.metamodel.facets.all.named.NamedFacet;
 import org.apache.isis.core.metamodel.facets.all.named.NamedFacetAbstract;

http://git-wip-us.apache.org/repos/asf/isis/blob/65f7d320/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/layout/CssClassFacetForCollectionXml.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/layout/CssClassFacetForCollectionXml.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/layout/CssClassFacetForCollectionXml.java
index 2e4e871..ed258d7 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/layout/CssClassFacetForCollectionXml.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/layout/CssClassFacetForCollectionXml.java
@@ -21,7 +21,7 @@ package org.apache.isis.core.metamodel.facets.collections.layout;
 
 import com.google.common.base.Strings;
 
-import org.apache.isis.applib.layout.members.v1.CollectionLayoutData;
+import org.apache.isis.applib.layout.common.CollectionLayoutData;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 import org.apache.isis.core.metamodel.facets.members.cssclass.CssClassFacet;
 import org.apache.isis.core.metamodel.facets.members.cssclass.CssClassFacetAbstract;

http://git-wip-us.apache.org/repos/asf/isis/blob/65f7d320/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/layout/DefaultViewFacetForCollectionXml.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/layout/DefaultViewFacetForCollectionXml.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/layout/DefaultViewFacetForCollectionXml.java
index dfab483..9fce33d 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/layout/DefaultViewFacetForCollectionXml.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/layout/DefaultViewFacetForCollectionXml.java
@@ -21,7 +21,7 @@ package org.apache.isis.core.metamodel.facets.collections.layout;
 
 import com.google.common.base.Strings;
 
-import org.apache.isis.applib.layout.members.v1.CollectionLayoutData;
+import org.apache.isis.applib.layout.common.CollectionLayoutData;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 import org.apache.isis.core.metamodel.facets.collections.collection.defaultview.DefaultViewFacet;
 import org.apache.isis.core.metamodel.facets.collections.collection.defaultview.DefaultViewFacetAbstract;

http://git-wip-us.apache.org/repos/asf/isis/blob/65f7d320/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/layout/DescribedAsFacetForCollectionXml.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/layout/DescribedAsFacetForCollectionXml.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/layout/DescribedAsFacetForCollectionXml.java
index ff2e2a4..818419b 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/layout/DescribedAsFacetForCollectionXml.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/layout/DescribedAsFacetForCollectionXml.java
@@ -21,7 +21,7 @@ package org.apache.isis.core.metamodel.facets.collections.layout;
 
 import com.google.common.base.Strings;
 
-import org.apache.isis.applib.layout.members.v1.CollectionLayoutData;
+import org.apache.isis.applib.layout.common.CollectionLayoutData;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 import org.apache.isis.core.metamodel.facets.all.describedas.DescribedAsFacet;
 import org.apache.isis.core.metamodel.facets.all.describedas.DescribedAsFacetAbstract;

http://git-wip-us.apache.org/repos/asf/isis/blob/65f7d320/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/layout/HiddenFacetForCollectionXml.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/layout/HiddenFacetForCollectionXml.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/layout/HiddenFacetForCollectionXml.java
index c24a7fb..3ef846b 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/layout/HiddenFacetForCollectionXml.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/layout/HiddenFacetForCollectionXml.java
@@ -21,7 +21,7 @@ package org.apache.isis.core.metamodel.facets.collections.layout;
 
 import org.apache.isis.applib.annotation.When;
 import org.apache.isis.applib.annotation.Where;
-import org.apache.isis.applib.layout.members.v1.CollectionLayoutData;
+import org.apache.isis.applib.layout.common.CollectionLayoutData;
 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;

http://git-wip-us.apache.org/repos/asf/isis/blob/65f7d320/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/layout/NamedFacetForCollectionXml.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/layout/NamedFacetForCollectionXml.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/layout/NamedFacetForCollectionXml.java
index 6422bf3..8283f4e 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/layout/NamedFacetForCollectionXml.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/layout/NamedFacetForCollectionXml.java
@@ -21,7 +21,7 @@ package org.apache.isis.core.metamodel.facets.collections.layout;
 
 import com.google.common.base.Strings;
 
-import org.apache.isis.applib.layout.members.v1.CollectionLayoutData;
+import org.apache.isis.applib.layout.common.CollectionLayoutData;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 import org.apache.isis.core.metamodel.facets.all.named.NamedFacet;
 import org.apache.isis.core.metamodel.facets.all.named.NamedFacetAbstract;

http://git-wip-us.apache.org/repos/asf/isis/blob/65f7d320/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/layout/PagedFacetForCollectionXml.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/layout/PagedFacetForCollectionXml.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/layout/PagedFacetForCollectionXml.java
index 334b7d6..78932b9 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/layout/PagedFacetForCollectionXml.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/layout/PagedFacetForCollectionXml.java
@@ -19,7 +19,7 @@
 
 package org.apache.isis.core.metamodel.facets.collections.layout;
 
-import org.apache.isis.applib.layout.members.v1.CollectionLayoutData;
+import org.apache.isis.applib.layout.common.CollectionLayoutData;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 import org.apache.isis.core.metamodel.facets.object.paged.PagedFacet;
 import org.apache.isis.core.metamodel.facets.object.paged.PagedFacetAbstract;

http://git-wip-us.apache.org/repos/asf/isis/blob/65f7d320/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/layout/SortedByFacetForCollectionXml.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/layout/SortedByFacetForCollectionXml.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/layout/SortedByFacetForCollectionXml.java
index 2710640..9f5da94 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/layout/SortedByFacetForCollectionXml.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/layout/SortedByFacetForCollectionXml.java
@@ -21,7 +21,7 @@ package org.apache.isis.core.metamodel.facets.collections.layout;
 
 import java.util.Comparator;
 
-import org.apache.isis.applib.layout.members.v1.CollectionLayoutData;
+import org.apache.isis.applib.layout.common.CollectionLayoutData;
 import org.apache.isis.core.commons.lang.ClassUtil;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 import org.apache.isis.core.metamodel.facets.collections.sortedby.SortedByFacet;

http://git-wip-us.apache.org/repos/asf/isis/blob/65f7d320/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/layoutmetadata/PageFacet.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/layoutmetadata/PageFacet.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/layoutmetadata/PageFacet.java
index 40c5139..c0439af 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/layoutmetadata/PageFacet.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/layoutmetadata/PageFacet.java
@@ -19,7 +19,7 @@
 package org.apache.isis.core.metamodel.facets.object.layoutmetadata;
 
 
-import org.apache.isis.applib.layout.members.v1.Page;
+import org.apache.isis.applib.layout.common.Page;
 import org.apache.isis.core.metamodel.facetapi.Facet;
 
 /**

http://git-wip-us.apache.org/repos/asf/isis/blob/65f7d320/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/layoutmetadata/PageFacetDefault.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/layoutmetadata/PageFacetDefault.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/layoutmetadata/PageFacetDefault.java
index 3c29e8c..f8772ce 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/layoutmetadata/PageFacetDefault.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/layoutmetadata/PageFacetDefault.java
@@ -21,7 +21,7 @@ package org.apache.isis.core.metamodel.facets.object.layoutmetadata;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import org.apache.isis.applib.layout.members.v1.Page;
+import org.apache.isis.applib.layout.common.Page;
 import org.apache.isis.applib.services.i18n.TranslationService;
 import org.apache.isis.applib.services.layout.PageService;
 import org.apache.isis.core.metamodel.deployment.DeploymentCategory;

http://git-wip-us.apache.org/repos/asf/isis/blob/65f7d320/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/propertylayout/CssClassFacetForPropertyXml.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/propertylayout/CssClassFacetForPropertyXml.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/propertylayout/CssClassFacetForPropertyXml.java
index 53a9021..41e03e9 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/propertylayout/CssClassFacetForPropertyXml.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/propertylayout/CssClassFacetForPropertyXml.java
@@ -21,7 +21,7 @@ package org.apache.isis.core.metamodel.facets.properties.propertylayout;
 
 import com.google.common.base.Strings;
 
-import org.apache.isis.applib.layout.members.v1.PropertyLayoutData;
+import org.apache.isis.applib.layout.common.PropertyLayoutData;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 import org.apache.isis.core.metamodel.facets.members.cssclass.CssClassFacet;
 import org.apache.isis.core.metamodel.facets.members.cssclass.CssClassFacetAbstract;

http://git-wip-us.apache.org/repos/asf/isis/blob/65f7d320/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/propertylayout/DescribedAsFacetForPropertyXml.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/propertylayout/DescribedAsFacetForPropertyXml.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/propertylayout/DescribedAsFacetForPropertyXml.java
index d9268f7..f1bac93 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/propertylayout/DescribedAsFacetForPropertyXml.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/propertylayout/DescribedAsFacetForPropertyXml.java
@@ -21,7 +21,7 @@ package org.apache.isis.core.metamodel.facets.properties.propertylayout;
 
 import com.google.common.base.Strings;
 
-import org.apache.isis.applib.layout.members.v1.PropertyLayoutData;
+import org.apache.isis.applib.layout.common.PropertyLayoutData;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 import org.apache.isis.core.metamodel.facets.all.describedas.DescribedAsFacet;
 import org.apache.isis.core.metamodel.facets.all.describedas.DescribedAsFacetAbstract;

http://git-wip-us.apache.org/repos/asf/isis/blob/65f7d320/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/propertylayout/HiddenFacetForPropertyXml.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/propertylayout/HiddenFacetForPropertyXml.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/propertylayout/HiddenFacetForPropertyXml.java
index bc75795..481f815 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/propertylayout/HiddenFacetForPropertyXml.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/propertylayout/HiddenFacetForPropertyXml.java
@@ -21,7 +21,7 @@ package org.apache.isis.core.metamodel.facets.properties.propertylayout;
 
 import org.apache.isis.applib.annotation.When;
 import org.apache.isis.applib.annotation.Where;
-import org.apache.isis.applib.layout.members.v1.PropertyLayoutData;
+import org.apache.isis.applib.layout.common.PropertyLayoutData;
 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;

http://git-wip-us.apache.org/repos/asf/isis/blob/65f7d320/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/propertylayout/LabelAtFacetForPropertyXml.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/propertylayout/LabelAtFacetForPropertyXml.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/propertylayout/LabelAtFacetForPropertyXml.java
index b26c1a5..11fbe7f 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/propertylayout/LabelAtFacetForPropertyXml.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/propertylayout/LabelAtFacetForPropertyXml.java
@@ -20,7 +20,7 @@
 package org.apache.isis.core.metamodel.facets.properties.propertylayout;
 
 import org.apache.isis.applib.annotation.LabelPosition;
-import org.apache.isis.applib.layout.members.v1.PropertyLayoutData;
+import org.apache.isis.applib.layout.common.PropertyLayoutData;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 import org.apache.isis.core.metamodel.facets.objectvalue.labelat.LabelAtFacet;
 import org.apache.isis.core.metamodel.facets.objectvalue.labelat.LabelAtFacetAbstract;

http://git-wip-us.apache.org/repos/asf/isis/blob/65f7d320/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/propertylayout/MultiLineFacetForPropertyXml.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/propertylayout/MultiLineFacetForPropertyXml.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/propertylayout/MultiLineFacetForPropertyXml.java
index 71db6ea..1fca4d7 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/propertylayout/MultiLineFacetForPropertyXml.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/propertylayout/MultiLineFacetForPropertyXml.java
@@ -19,7 +19,7 @@
 
 package org.apache.isis.core.metamodel.facets.properties.propertylayout;
 
-import org.apache.isis.applib.layout.members.v1.PropertyLayoutData;
+import org.apache.isis.applib.layout.common.PropertyLayoutData;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 import org.apache.isis.core.metamodel.facets.objectvalue.multiline.MultiLineFacet;
 import org.apache.isis.core.metamodel.facets.objectvalue.multiline.MultiLineFacetAbstract;

http://git-wip-us.apache.org/repos/asf/isis/blob/65f7d320/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/propertylayout/NamedFacetForPropertyXml.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/propertylayout/NamedFacetForPropertyXml.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/propertylayout/NamedFacetForPropertyXml.java
index 447e5fd..d93fe64 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/propertylayout/NamedFacetForPropertyXml.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/propertylayout/NamedFacetForPropertyXml.java
@@ -21,7 +21,7 @@ package org.apache.isis.core.metamodel.facets.properties.propertylayout;
 
 import com.google.common.base.Strings;
 
-import org.apache.isis.applib.layout.members.v1.PropertyLayoutData;
+import org.apache.isis.applib.layout.common.PropertyLayoutData;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 import org.apache.isis.core.metamodel.facets.all.named.NamedFacet;
 import org.apache.isis.core.metamodel.facets.all.named.NamedFacetAbstract;

http://git-wip-us.apache.org/repos/asf/isis/blob/65f7d320/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/propertylayout/RenderedAdjustedFacetForPropertyXml.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/propertylayout/RenderedAdjustedFacetForPropertyXml.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/propertylayout/RenderedAdjustedFacetForPropertyXml.java
index 7c5055b..16ea651 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/propertylayout/RenderedAdjustedFacetForPropertyXml.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/propertylayout/RenderedAdjustedFacetForPropertyXml.java
@@ -19,7 +19,7 @@
 
 package org.apache.isis.core.metamodel.facets.properties.propertylayout;
 
-import org.apache.isis.applib.layout.members.v1.PropertyLayoutData;
+import org.apache.isis.applib.layout.common.PropertyLayoutData;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 import org.apache.isis.core.metamodel.facets.objectvalue.renderedadjusted.RenderedAdjustedFacet;
 import org.apache.isis.core.metamodel.facets.objectvalue.renderedadjusted.RenderedAdjustedFacetAbstract;

http://git-wip-us.apache.org/repos/asf/isis/blob/65f7d320/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/propertylayout/TypicalLengthFacetForPropertyXml.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/propertylayout/TypicalLengthFacetForPropertyXml.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/propertylayout/TypicalLengthFacetForPropertyXml.java
index a43255d..e55d867 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/propertylayout/TypicalLengthFacetForPropertyXml.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/propertylayout/TypicalLengthFacetForPropertyXml.java
@@ -19,7 +19,7 @@
 
 package org.apache.isis.core.metamodel.facets.properties.propertylayout;
 
-import org.apache.isis.applib.layout.members.v1.PropertyLayoutData;
+import org.apache.isis.applib.layout.common.PropertyLayoutData;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 import org.apache.isis.core.metamodel.facets.objectvalue.typicallen.TypicalLengthFacet;
 import org.apache.isis.core.metamodel.facets.objectvalue.typicallen.TypicalLengthFacetAbstract;

http://git-wip-us.apache.org/repos/asf/isis/blob/65f7d320/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/layout/PageServiceDefault.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/layout/PageServiceDefault.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/layout/PageServiceDefault.java
index b72534d..6978bc0 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/layout/PageServiceDefault.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/layout/PageServiceDefault.java
@@ -35,7 +35,7 @@ import org.slf4j.LoggerFactory;
 import org.apache.isis.applib.annotation.DomainService;
 import org.apache.isis.applib.annotation.NatureOfService;
 import org.apache.isis.applib.annotation.Programmatic;
-import org.apache.isis.applib.layout.members.v1.Page;
+import org.apache.isis.applib.layout.common.Page;
 import org.apache.isis.applib.services.jaxb.JaxbService;
 import org.apache.isis.applib.services.layout.PageService;
 import org.apache.isis.core.metamodel.deployment.DeploymentCategory;

http://git-wip-us.apache.org/repos/asf/isis/blob/65f7d320/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/layout/provider/PageNormalizer.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/layout/provider/PageNormalizer.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/layout/provider/PageNormalizer.java
index 4978f66..2cc4e62 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/layout/provider/PageNormalizer.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/layout/provider/PageNormalizer.java
@@ -16,7 +16,7 @@
  */
 package org.apache.isis.core.metamodel.services.layout.provider;
 
-import org.apache.isis.applib.layout.members.v1.Page;
+import org.apache.isis.applib.layout.common.Page;
 
 public interface PageNormalizer<P extends Page> {
 

http://git-wip-us.apache.org/repos/asf/isis/blob/65f7d320/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/layout/provider/PageNormalizerAbstract.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/layout/provider/PageNormalizerAbstract.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/layout/provider/PageNormalizerAbstract.java
index ad65e5b..df32cdb 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/layout/provider/PageNormalizerAbstract.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/layout/provider/PageNormalizerAbstract.java
@@ -16,7 +16,7 @@
  */
 package org.apache.isis.core.metamodel.services.layout.provider;
 
-import org.apache.isis.applib.layout.members.v1.Page;
+import org.apache.isis.applib.layout.common.Page;
 import org.apache.isis.applib.services.i18n.TranslationService;
 import org.apache.isis.core.metamodel.spec.SpecificationLoader;
 

http://git-wip-us.apache.org/repos/asf/isis/blob/65f7d320/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/layout/provider/PageNormalizerFC.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/layout/provider/PageNormalizerFC.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/layout/provider/PageNormalizerFC.java
index 7b4caed..813fb37 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/layout/provider/PageNormalizerFC.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/layout/provider/PageNormalizerFC.java
@@ -31,12 +31,12 @@ import org.apache.isis.applib.layout.fixedcols.FCColumnOwner;
 import org.apache.isis.applib.layout.fixedcols.FCPage;
 import org.apache.isis.applib.layout.fixedcols.FCTab;
 import org.apache.isis.applib.layout.fixedcols.FCTabGroup;
-import org.apache.isis.applib.layout.members.MemberRegionOwner;
-import org.apache.isis.applib.layout.members.v1.ActionLayoutData;
-import org.apache.isis.applib.layout.members.v1.ActionOwner;
-import org.apache.isis.applib.layout.members.v1.CollectionLayoutData;
-import org.apache.isis.applib.layout.members.v1.FieldSet;
-import org.apache.isis.applib.layout.members.v1.PropertyLayoutData;
+import org.apache.isis.applib.layout.common.MemberRegionOwner;
+import org.apache.isis.applib.layout.common.ActionLayoutData;
+import org.apache.isis.applib.layout.common.ActionOwner;
+import org.apache.isis.applib.layout.common.CollectionLayoutData;
+import org.apache.isis.applib.layout.common.FieldSet;
+import org.apache.isis.applib.layout.common.PropertyLayoutData;
 import org.apache.isis.applib.services.i18n.TranslationService;
 import org.apache.isis.core.metamodel.facetapi.FacetUtil;
 import org.apache.isis.core.metamodel.facets.actions.layout.ActionPositionFacetForActionXml;

http://git-wip-us.apache.org/repos/asf/isis/blob/65f7d320/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/layout/provider/PageNormalizerService.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/layout/provider/PageNormalizerService.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/layout/provider/PageNormalizerService.java
index dbc4013..c0939f8 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/layout/provider/PageNormalizerService.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/layout/provider/PageNormalizerService.java
@@ -19,7 +19,7 @@ package org.apache.isis.core.metamodel.services.layout.provider;
 import java.util.List;
 
 import org.apache.isis.applib.annotation.Programmatic;
-import org.apache.isis.applib.layout.members.v1.Page;
+import org.apache.isis.applib.layout.common.Page;
 import org.apache.isis.core.metamodel.services.layout.PageServiceDefault;
 
 /**


[05/18] isis git commit: ISIS-1300: rename of private method.

Posted by da...@apache.org.
ISIS-1300: rename of private method.


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

Branch: refs/heads/ISIS-993
Commit: a195f62f32edeee52a3a15b4670be92ce6b40bc9
Parents: dbfa9e2
Author: Dan Haywood <da...@haywood-associates.co.uk>
Authored: Thu Jan 28 08:42:56 2016 +0000
Committer: Dan Haywood <da...@haywood-associates.co.uk>
Committed: Thu Jan 28 08:42:56 2016 +0000

----------------------------------------------------------------------
 .../apache/isis/viewer/wicket/viewer/IsisWicketApplication.java  | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/isis/blob/a195f62f/core/viewer-wicket-impl/src/main/java/org/apache/isis/viewer/wicket/viewer/IsisWicketApplication.java
----------------------------------------------------------------------
diff --git a/core/viewer-wicket-impl/src/main/java/org/apache/isis/viewer/wicket/viewer/IsisWicketApplication.java b/core/viewer-wicket-impl/src/main/java/org/apache/isis/viewer/wicket/viewer/IsisWicketApplication.java
index fb0cc96..9f712c6 100644
--- a/core/viewer-wicket-impl/src/main/java/org/apache/isis/viewer/wicket/viewer/IsisWicketApplication.java
+++ b/core/viewer-wicket-impl/src/main/java/org/apache/isis/viewer/wicket/viewer/IsisWicketApplication.java
@@ -324,7 +324,7 @@ public class IsisWicketApplication
     }
 
     protected void configureWicketSourcePluginIfNecessary(final IsisConfiguration configuration) {
-        if(isEnabledWicketSourcePluginEnabled(configuration)) {
+        if(isWicketSourcePluginEnabled(configuration)) {
             configureWicketSourcePlugin();
         }
     }
@@ -668,7 +668,7 @@ public class IsisWicketApplication
      * <p>
      * If the <tt>isis.viewer.wicket.wicketSourcePlugin</tt> is set, then this is used, otherwise the default is to disable.
      */
-    private boolean isEnabledWicketSourcePluginEnabled(IsisConfiguration configuration) {
+    private boolean isWicketSourcePluginEnabled(IsisConfiguration configuration) {
         final boolean pluginEnabled = configuration.getBoolean(WICKET_SOURCE_PLUGIN_KEY, WICKET_SOURCE_PLUGIN_DEFAULT);
         return pluginEnabled;
     }


[13/18] isis git commit: ISIS-993: introduction of the PageNormalizerService as an internal SPI which keeps track of the different Page implementations and their algorithms for normalizing themselves. The original FixedCol layout is now working again a

Posted by da...@apache.org.
http://git-wip-us.apache.org/repos/asf/isis/blob/8f0abcdb/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/layout/provider/PageNormalizerServiceDefault.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/layout/provider/PageNormalizerServiceDefault.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/layout/provider/PageNormalizerServiceDefault.java
new file mode 100644
index 0000000..789821b
--- /dev/null
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/layout/provider/PageNormalizerServiceDefault.java
@@ -0,0 +1,110 @@
+/**
+ *  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.services.layout.provider;
+
+import java.util.List;
+
+import javax.annotation.PostConstruct;
+import javax.inject.Inject;
+
+import com.google.common.base.Joiner;
+import com.google.common.collect.Lists;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import org.apache.isis.applib.annotation.DomainService;
+import org.apache.isis.applib.annotation.NatureOfService;
+import org.apache.isis.applib.annotation.Programmatic;
+import org.apache.isis.applib.layout.bootstrap3.BS3Page;
+import org.apache.isis.applib.layout.fixedcols.FCPage;
+import org.apache.isis.applib.layout.members.v1.Page;
+import org.apache.isis.applib.services.i18n.TranslationService;
+import org.apache.isis.core.metamodel.spec.SpecificationLoader;
+import org.apache.isis.core.metamodel.spec.SpecificationLoaderAware;
+
+@DomainService(
+        nature = NatureOfService.DOMAIN
+)
+public class PageNormalizerServiceDefault implements PageNormalizerService, SpecificationLoaderAware {
+
+    public static final String MEMBERS_TNS = "http://isis.apache.org/schema/applib/layout/members/v1";
+    public static final String MEMBERS_SCHEMA_LOCATION = "http://isis.apache.org/schema/applib/layout/members/v1/members.xsd";
+
+
+    private static final Logger LOG = LoggerFactory.getLogger(PageNormalizerServiceDefault.class);
+    private SpecificationLoader specificationLookup;
+
+    private PageNormalizerFC pageNormalizerFC;
+    private PageNormalizerBS3 pageNormalizerBS3;
+
+    @PostConstruct
+    @Programmatic
+    public void init() {
+        pageNormalizerFC = new PageNormalizerFC(translationService, specificationLookup);
+        pageNormalizerBS3 = new PageNormalizerBS3(translationService, specificationLookup);
+    }
+
+    @Programmatic
+    @Override
+    public List<Class<? extends Page>> pageImplementations() {
+        List<Class<? extends Page>> ar = Lists.newArrayList();
+        ar.add(FCPage.class);
+        ar.add(BS3Page.class);
+        return ar;
+    }
+
+    @Override
+    public void normalize(final Page page, final Class<?> domainClass) {
+
+        if(page instanceof FCPage) {
+            final FCPage fcPage = (FCPage) page;
+            pageNormalizerFC.normalize(fcPage, domainClass);
+        } else
+        if(page instanceof BS3Page) {
+            final BS3Page bs3Page = (BS3Page) page;
+            pageNormalizerBS3.normalize(bs3Page, domainClass);
+        }
+
+        page.setNormalized(true);
+    }
+
+    @Override
+    public String schemaLocationsFor(final Page page) {
+        final List<String> parts = Lists.newArrayList();
+        parts.add(MEMBERS_TNS);
+        parts.add(MEMBERS_SCHEMA_LOCATION);
+        if(page instanceof FCPage) {
+            parts.add(PageNormalizerFC.TNS);
+            parts.add(PageNormalizerFC.SCHEMA_LOCATION);
+        }
+        if(page instanceof BS3Page) {
+            parts.add(PageNormalizerBS3.TNS);
+            parts.add(PageNormalizerBS3.SCHEMA_LOCATION);
+        }
+        return Joiner.on(" ").join(parts);
+    }
+
+    @Override
+    public void setSpecificationLoader(final SpecificationLoader specificationLookup) {
+        this.specificationLookup = specificationLookup;
+    }
+
+    @Inject
+    TranslationService translationService;
+
+}

http://git-wip-us.apache.org/repos/asf/isis/blob/8f0abcdb/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/metamodel/MetadataMenu.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/metamodel/MetadataMenu.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/metamodel/MetadataMenu.java
index 3066232..6f307f7 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/metamodel/MetadataMenu.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/metamodel/MetadataMenu.java
@@ -42,9 +42,9 @@ import org.apache.isis.applib.annotation.NatureOfService;
 import org.apache.isis.applib.annotation.Programmatic;
 import org.apache.isis.applib.annotation.RestrictTo;
 import org.apache.isis.applib.annotation.SemanticsOf;
-import org.apache.isis.applib.layout.fixedcols.FCPage;
+import org.apache.isis.applib.layout.members.v1.Page;
 import org.apache.isis.applib.services.jaxb.JaxbService;
-import org.apache.isis.applib.services.layout.ObjectLayoutMetadataService;
+import org.apache.isis.applib.services.layout.PageService;
 import org.apache.isis.applib.value.Blob;
 import org.apache.isis.core.metamodel.spec.ObjectSpecification;
 import org.apache.isis.core.metamodel.spec.SpecificationLoaderSpi;
@@ -108,10 +108,10 @@ public class MetadataMenu implements SpecificationLoaderSpiAware {
             final OutputStreamWriter writer = new OutputStreamWriter(zos);
             for (final ObjectSpecification objectSpec : domainObjectSpecs) {
                 final Class<?> domainClass = objectSpec.getCorrespondingClass();
-                final FCPage metadata = objectLayoutMetadataService.toMetadata(domainClass);
-                if(metadata != null) {
+                final Page page = pageService.toPage(domainClass);
+                if(page != null) {
                     zos.putNextEntry(new ZipEntry(zipEntryNameFor(objectSpec)));
-                    String xml = jaxbService.toXml(metadata);
+                    String xml = jaxbService.toXml(page);
                     writer.write(xml);
                     writer.flush();
                     zos.closeEntry();
@@ -134,7 +134,7 @@ public class MetadataMenu implements SpecificationLoaderSpiAware {
     // //////////////////////////////////////
 
     @Inject
-    ObjectLayoutMetadataService objectLayoutMetadataService;
+    PageService pageService;
 
     @Inject
     JaxbService jaxbService;

http://git-wip-us.apache.org/repos/asf/isis/blob/8f0abcdb/core/metamodel/src/main/java/org/apache/isis/progmodels/dflt/ProgrammingModelFacetsJava5.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/progmodels/dflt/ProgrammingModelFacetsJava5.java b/core/metamodel/src/main/java/org/apache/isis/progmodels/dflt/ProgrammingModelFacetsJava5.java
index b17cebe..02b20b9 100644
--- a/core/metamodel/src/main/java/org/apache/isis/progmodels/dflt/ProgrammingModelFacetsJava5.java
+++ b/core/metamodel/src/main/java/org/apache/isis/progmodels/dflt/ProgrammingModelFacetsJava5.java
@@ -108,7 +108,7 @@ import org.apache.isis.core.metamodel.facets.object.ignore.jdo.RemoveJdoEnhancem
 import org.apache.isis.core.metamodel.facets.object.ignore.jdo.RemoveJdoPrefixedMethodsFacetFactory;
 import org.apache.isis.core.metamodel.facets.object.immutable.immutableannot.CopyImmutableFacetOntoMembersFactory;
 import org.apache.isis.core.metamodel.facets.object.immutable.immutablemarkerifc.ImmutableFacetMarkerInterfaceFactory;
-import org.apache.isis.core.metamodel.facets.object.layoutmetadata.ObjectLayoutMetadataFacetFactory;
+import org.apache.isis.core.metamodel.facets.object.layoutmetadata.PageFacetFactory;
 import org.apache.isis.core.metamodel.facets.object.mask.annotation.MaskFacetOnTypeAnnotationFactory;
 import org.apache.isis.core.metamodel.facets.object.maxlen.annotation.MaxLengthFacetOnTypeAnnotationFactory;
 import org.apache.isis.core.metamodel.facets.object.membergroups.annotprop.MemberGroupLayoutFacetFactory;
@@ -391,7 +391,7 @@ public final class ProgrammingModelFacetsJava5 extends ProgrammingModelAbstract
         // must come after DomainObjectAnnotationFacetFactory & MixinFacetFactory
         addFactory(NotContributedFacetDerivedFromMixinFacetFactory.class);
 
-        addFactory(ObjectLayoutMetadataFacetFactory.class);
+        addFactory(PageFacetFactory.class);
 
         addFactory(DomainServiceLayoutFacetFactory.class);
         addFactory(DomainObjectLayoutFacetFactory.class);

http://git-wip-us.apache.org/repos/asf/isis/blob/8f0abcdb/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/object/layoutxml/FCPageFacetDefaultTest.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/object/layoutxml/FCPageFacetDefaultTest.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/object/layoutxml/FCPageFacetDefaultTest.java
deleted file mode 100644
index 1f45123..0000000
--- a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/object/layoutxml/FCPageFacetDefaultTest.java
+++ /dev/null
@@ -1,60 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *        http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- */
-package org.apache.isis.core.metamodel.facets.object.layoutxml;
-
-import java.util.concurrent.atomic.AtomicReference;
-
-import org.junit.Test;
-
-import org.apache.isis.applib.layout.members.v1.FieldSet;
-
-import static org.hamcrest.CoreMatchers.is;
-import static org.hamcrest.CoreMatchers.nullValue;
-import static org.junit.Assert.assertThat;
-
-public class FCPageFacetDefaultTest {
-
-    @Test
-    public void xxx() throws Exception {
-
-        final AtomicReference<FieldSet> x = new AtomicReference<>();
-
-        FieldSet firstValue = new FieldSet();
-        FieldSet otherValue = new FieldSet();
-
-        assertThat(x.get(), is(nullValue()));
-
-        boolean b = x.compareAndSet(null, firstValue);
-        assertThat(b, is(true));
-        assertThat(x.get(), is(firstValue));
-
-        boolean b2 = x.compareAndSet(null, firstValue);
-        assertThat(b2, is(false));
-        assertThat(x.get(), is(firstValue));
-
-        boolean b3 = x.compareAndSet(null, otherValue);
-        assertThat(b3, is(false));
-        assertThat(x.get(), is(firstValue));
-
-        boolean b4 = x.compareAndSet(firstValue, otherValue);
-        assertThat(b4, is(true));
-        assertThat(x.get(), is(otherValue));
-
-    }
-}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/isis/blob/8f0abcdb/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/object/layoutxml/PageFacetDefaultTest.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/object/layoutxml/PageFacetDefaultTest.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/object/layoutxml/PageFacetDefaultTest.java
new file mode 100644
index 0000000..ca65e96
--- /dev/null
+++ b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/object/layoutxml/PageFacetDefaultTest.java
@@ -0,0 +1,60 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
+package org.apache.isis.core.metamodel.facets.object.layoutxml;
+
+import java.util.concurrent.atomic.AtomicReference;
+
+import org.junit.Test;
+
+import org.apache.isis.applib.layout.members.v1.FieldSet;
+
+import static org.hamcrest.CoreMatchers.is;
+import static org.hamcrest.CoreMatchers.nullValue;
+import static org.junit.Assert.assertThat;
+
+public class PageFacetDefaultTest {
+
+    @Test
+    public void xxx() throws Exception {
+
+        final AtomicReference<FieldSet> x = new AtomicReference<>();
+
+        FieldSet firstValue = new FieldSet();
+        FieldSet otherValue = new FieldSet();
+
+        assertThat(x.get(), is(nullValue()));
+
+        boolean b = x.compareAndSet(null, firstValue);
+        assertThat(b, is(true));
+        assertThat(x.get(), is(firstValue));
+
+        boolean b2 = x.compareAndSet(null, firstValue);
+        assertThat(b2, is(false));
+        assertThat(x.get(), is(firstValue));
+
+        boolean b3 = x.compareAndSet(null, otherValue);
+        assertThat(b3, is(false));
+        assertThat(x.get(), is(firstValue));
+
+        boolean b4 = x.compareAndSet(firstValue, otherValue);
+        assertThat(b4, is(true));
+        assertThat(x.get(), is(otherValue));
+
+    }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/isis/blob/8f0abcdb/core/metamodel/src/test/java/org/apache/isis/core/metamodel/layoutxml/v1_0/FCPageTest.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/layoutxml/v1_0/FCPageTest.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/layoutxml/v1_0/FCPageTest.java
index 88fcc50..29bd0c4 100644
--- a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/layoutxml/v1_0/FCPageTest.java
+++ b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/layoutxml/v1_0/FCPageTest.java
@@ -38,6 +38,7 @@ import org.apache.isis.applib.layout.members.v1.FieldSet;
 import org.apache.isis.applib.layout.fixedcols.FCTab;
 import org.apache.isis.applib.layout.fixedcols.FCTabGroup;
 import org.apache.isis.applib.services.jaxb.JaxbService;
+import org.apache.isis.core.metamodel.services.layout.provider.PageNormalizerServiceDefault;
 
 import static org.hamcrest.CoreMatchers.equalTo;
 import static org.hamcrest.CoreMatchers.is;
@@ -60,11 +61,11 @@ public class FCPageTest {
     @Test
     public void xxx() throws Exception {
 
-        final FCPage FCPage = new FCPage();
+        final FCPage fcPage = new FCPage();
 
-        FCPage.setTabGroups(Lists.<FCTabGroup>newArrayList());
-        FCPage.getTabGroups().add(new FCTabGroup());
-        FCTabGroup tabGroup = FCPage.getTabGroups().get(0);
+        fcPage.setTabGroups(Lists.<FCTabGroup>newArrayList());
+        fcPage.getTabGroups().add(new FCTabGroup());
+        FCTabGroup tabGroup = fcPage.getTabGroups().get(0);
         FCTab FCTab = tabGroup.getTabs().get(0);
         FCTab.setName("Common");
         FCColumn left = FCTab.getLeft();
@@ -90,34 +91,29 @@ public class FCPageTest {
 
         ActionLayoutData deleteActionLayoutData = new ActionLayoutData();
         deleteActionLayoutData.setId("delete");
-        FCPage.setActions(Lists.<ActionLayoutData>newArrayList());
-        FCPage.getActions().add(deleteActionLayoutData);
-
-        String xml = jaxbService.toXml(FCPage,
-                ImmutableMap.<String,Object>of(
-                        Marshaller.JAXB_SCHEMA_LOCATION,
-                        "http://isis.apache.org/schema/applib/layout http://isis.apache.org/schema/applib/layout/layout-1.0.xsd"
-                ));
+        fcPage.setActions(Lists.<ActionLayoutData>newArrayList());
+        fcPage.getActions().add(deleteActionLayoutData);
+
+        final String schemaLocations = new PageNormalizerServiceDefault().schemaLocationsFor(fcPage);
+        String xml = jaxbService.toXml(fcPage,
+                ImmutableMap.<String,Object>of(Marshaller.JAXB_SCHEMA_LOCATION, schemaLocations));
         System.out.println(xml);
 
         FCPage FCPageRoundtripped = jaxbService.fromXml(FCPage.class, xml);
         String xmlRoundtripped = jaxbService.toXml(FCPageRoundtripped,
-                ImmutableMap.<String,Object>of(
-                        Marshaller.JAXB_SCHEMA_LOCATION,
-                        "http://isis.apache.org/schema/applib/layout http://isis.apache.org/schema/applib/layout/layout-1.0.xsd"
-                ));
+                ImmutableMap.<String,Object>of(Marshaller.JAXB_SCHEMA_LOCATION, schemaLocations));
         assertThat(xml, is(equalTo(xmlRoundtripped)));
 
 
         System.out.println("==========");
 
-        dumpXsd(FCPage);
+        dumpXsd(fcPage);
     }
 
     protected void dumpXsd(final FCPage FCPage) {
         Map<String, String> schemas = jaxbService.toXsd(FCPage, JaxbService.IsisSchemas.INCLUDE);
         for (Map.Entry<String, String> entry : schemas.entrySet()) {
-            //System.out.println(entry.getKey() + ":");
+            System.out.println(entry.getKey() + ":");
             System.out.println(entry.getValue());
         }
     }

http://git-wip-us.apache.org/repos/asf/isis/blob/8f0abcdb/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/EntityPanelFactory.java
----------------------------------------------------------------------
diff --git a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/EntityPanelFactory.java b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/EntityPanelFactory.java
index d779a5c..0430f42 100644
--- a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/EntityPanelFactory.java
+++ b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/EntityPanelFactory.java
@@ -23,7 +23,8 @@ import org.apache.wicket.Component;
 import org.apache.wicket.model.IModel;
 
 import org.apache.isis.applib.layout.fixedcols.FCPage;
-import org.apache.isis.core.metamodel.facets.object.layoutmetadata.ObjectLayoutMetadataFacet;
+import org.apache.isis.applib.layout.members.v1.Page;
+import org.apache.isis.core.metamodel.facets.object.layoutmetadata.PageFacet;
 import org.apache.isis.core.metamodel.spec.ObjectSpecification;
 import org.apache.isis.viewer.wicket.model.models.EntityModel;
 import org.apache.isis.viewer.wicket.ui.ComponentFactory;
@@ -50,11 +51,15 @@ public class EntityPanelFactory extends EntityComponentFactoryAbstract {
         final EntityModel entityModel = (EntityModel) model;
 
         final ObjectSpecification specification = entityModel.getTypeOfSpecification();
-        final ObjectLayoutMetadataFacet facet = specification.getFacet(ObjectLayoutMetadataFacet.class);
-        final FCPage layoutMetadata = facet.getMetadata();
-        final boolean hasLayout = layoutMetadata != null;
-        return hasLayout
-                ? new EntityTabbedPanel(id, entityModel)
-                : new EntityEditablePanel(id, entityModel);
+        final PageFacet facet = specification.getFacet(PageFacet.class);
+        final Page page = facet.getPage();
+        if (page != null) {
+            if(page instanceof FCPage) {
+                return new EntityTabbedPanel(id, entityModel);
+            }
+            // TODO: support BS3Page here...
+        }
+        // fallback
+        return new EntityEditablePanel(id, entityModel);
     }
 }

http://git-wip-us.apache.org/repos/asf/isis/blob/8f0abcdb/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/tabbed/EntityTabbedPanel.java
----------------------------------------------------------------------
diff --git a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/tabbed/EntityTabbedPanel.java b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/tabbed/EntityTabbedPanel.java
index 40ec6e3..56a346a 100644
--- a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/tabbed/EntityTabbedPanel.java
+++ b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/tabbed/EntityTabbedPanel.java
@@ -28,7 +28,7 @@ import org.apache.isis.applib.layout.fixedcols.FCPage;
 import org.apache.isis.applib.layout.fixedcols.FCTabGroup;
 import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
 import org.apache.isis.core.metamodel.facets.members.cssclass.CssClassFacet;
-import org.apache.isis.core.metamodel.facets.object.layoutmetadata.ObjectLayoutMetadataFacet;
+import org.apache.isis.core.metamodel.facets.object.layoutmetadata.PageFacet;
 import org.apache.isis.viewer.wicket.model.models.EntityModel;
 import org.apache.isis.viewer.wicket.ui.ComponentType;
 import org.apache.isis.viewer.wicket.ui.components.entity.column.EntityColumn;
@@ -63,17 +63,17 @@ public class EntityTabbedPanel extends PanelAbstract<EntityModel> {
         }
 
         // forces metadata to be derived && synced
-        final ObjectLayoutMetadataFacet objectLayoutMetadataFacet = model.getTypeOfSpecification().getFacet(ObjectLayoutMetadataFacet.class);
-        final FCPage FCPage = objectLayoutMetadataFacet.getMetadata();
+        final PageFacet PageFacet = model.getTypeOfSpecification().getFacet(PageFacet.class);
+        final FCPage page = (FCPage) PageFacet.getPage();
 
 
         addOrReplace(ComponentType.ENTITY_SUMMARY, model);
 
-        final int leftSpan = addColumnIfRequired(ID_LEFT_COLUMN, FCPage.getLeft(), FCColumn.Hint.LEFT);
+        final int leftSpan = addColumnIfRequired(ID_LEFT_COLUMN, page.getLeft(), FCColumn.Hint.LEFT);
 
-        final TabGroupListPanel middleTabs = addTabGroups(ID_MIDDLE_COLUMN, FCPage.getTabGroups());
+        final TabGroupListPanel middleTabs = addTabGroups(ID_MIDDLE_COLUMN, page.getTabGroups());
 
-        final int rightSpan = addColumnIfRequired(ID_RIGHT_COLUMN, FCPage.getRight(), FCColumn.Hint.RIGHT);
+        final int rightSpan = addColumnIfRequired(ID_RIGHT_COLUMN, page.getRight(), FCColumn.Hint.RIGHT);
 
         final int columnSpans = leftSpan + rightSpan;
         int tabGroupSpan = columnSpans < 12 ? 12 - (columnSpans) : 12;

http://git-wip-us.apache.org/repos/asf/isis/blob/8f0abcdb/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/entity/EntityPage.java
----------------------------------------------------------------------
diff --git a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/entity/EntityPage.java b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/entity/EntityPage.java
index 51c222c..563434a 100644
--- a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/entity/EntityPage.java
+++ b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/entity/EntityPage.java
@@ -29,13 +29,13 @@ import org.apache.wicket.model.AbstractReadOnlyModel;
 import org.apache.wicket.request.mapper.parameter.PageParameters;
 import org.apache.wicket.util.string.Strings;
 
-import org.apache.isis.applib.layout.fixedcols.FCPage;
+import org.apache.isis.applib.layout.members.v1.Page;
 import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
 import org.apache.isis.core.metamodel.adapter.mgr.AdapterManager.ConcurrencyChecking;
 import org.apache.isis.core.metamodel.adapter.version.ConcurrencyException;
 import org.apache.isis.core.metamodel.consent.InteractionInitiatedBy;
 import org.apache.isis.core.metamodel.deployment.DeploymentCategory;
-import org.apache.isis.core.metamodel.facets.object.layoutmetadata.ObjectLayoutMetadataFacet;
+import org.apache.isis.core.metamodel.facets.object.layoutmetadata.PageFacet;
 import org.apache.isis.core.metamodel.spec.feature.ObjectMember;
 import org.apache.isis.core.runtime.system.DeploymentType;
 import org.apache.isis.core.runtime.system.context.IsisContext;
@@ -136,17 +136,17 @@ public class EntityPage extends PageAbstract {
         //
         // invalidate the cache so that can do dynamic reloading of layout metadata etc.
         //
-        final ObjectLayoutMetadataFacet facet = entityModel.getTypeOfSpecification()
-                .getFacet(ObjectLayoutMetadataFacet.class);
+        final PageFacet facet = entityModel.getTypeOfSpecification()
+                .getFacet(PageFacet.class);
         if(facet != null) {
             // the facet should always exist, in fact
             // just enough to ask for the metadata.
             // This will cause the current ObjectSpec to be updated as a side effect.
-            final FCPage metadata = facet.getMetadata();
+            final Page page = facet.getPage();
 
             // if none, then fallback to invalidating entire cache
             // (this is the original LayoutMetadataFromJson behaviour)
-            if(metadata == null && !getDeploymentType().isProduction()) {
+            if(page == null && !getDeploymentType().isProduction()) {
                 getSpecificationLoader().invalidateCacheFor(objectAdapter.getObject());
             }
         }

http://git-wip-us.apache.org/repos/asf/isis/blob/8f0abcdb/example/application/simpleapp/dom/src/main/java/domainapp/dom/simple/SimpleObject.layout.xml
----------------------------------------------------------------------
diff --git a/example/application/simpleapp/dom/src/main/java/domainapp/dom/simple/SimpleObject.layout.xml b/example/application/simpleapp/dom/src/main/java/domainapp/dom/simple/SimpleObject.layout.xml
index 6e89498..4284f73 100644
--- a/example/application/simpleapp/dom/src/main/java/domainapp/dom/simple/SimpleObject.layout.xml
+++ b/example/application/simpleapp/dom/src/main/java/domainapp/dom/simple/SimpleObject.layout.xml
@@ -1,33 +1,29 @@
 <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
-<objectLayout xsi:schemaLocation="http://isis.apache.org/schema/applib/layout http://isis.apache.org/schema/applib/layout/layout-1.0.xsd" xmlns="http://isis.apache.org/schema/applib/layout" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
-    <actions>
-        <action id="delete"/>
-    </actions>
+<page xsi:schemaLocation="http://isis.apache.org/schema/applib/layout/members/v1 http://isis.apache.org/schema/applib/layout/members/v1/members.xsd http://isis.apache.org/schema/applib/layout/fixedcols http://isis.apache.org/schema/applib/layout/fixedcols/fixedcols.xsd" xmlns="http://isis.apache.org/schema/applib/layout/fixedcols" xmlns:ns2="http://isis.apache.org/schema/applib/layout/members/v1" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+
+    <action id="delete"/>
+
     <left span="0">
     </left>
     <tabGroup>
         <tab name="Metadata">
             <left span="12">
-                <propertyGroup name="Foo">
-                    <property id="versionSequence"/>
-                </propertyGroup>
+                <fieldSet name="Foo">
+                    <ns2:property id="versionSequence"/>
+                </fieldSet>
             </left>
         </tab>
         <tab name="General">
             <left span="12">
-                <propertyGroup name="General">
-                    <actions>
-                        <action id="downloadJdoMetadata" position="PANEL"/>
-                        <action id="downloadLayoutXml" position="PANEL_DROPDOWN"/>
-                    </actions>
-                    <property id="name" labelPosition="TOP">
-                        <actions>
-                            <action id="updateName">
-                                <describedAs>This allows the name to be updated</describedAs>
-                            </action>
-                        </actions>
-                    </property>
-                </propertyGroup>
+                <fieldSet name="General">
+                    <ns2:action id="downloadJdoMetadata" position="PANEL"/>
+                    <ns2:action id="downloadLayoutXml" position="PANEL_DROPDOWN"/>
+                    <ns2:property id="name" labelPosition="TOP">
+                        <ns2:action id="updateName">
+                            <ns2:describedAs>This allows the name to be updated</ns2:describedAs>
+                        </ns2:action>
+                    </ns2:property>
+                </fieldSet>
             </left>
         </tab>
     </tabGroup>
@@ -39,4 +35,4 @@
             </left>
         </tab>
     </tabGroup>
-</objectLayout>
\ No newline at end of file
+</page>
\ No newline at end of file


[03/18] isis git commit: ISIS-1287: fixing tiny errors in live template and in JAXB file template

Posted by da...@apache.org.
ISIS-1287: fixing tiny errors in live template and in JAXB file template


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

Branch: refs/heads/ISIS-993
Commit: 5de42bbd377651239faf142cc38e0f517edff8d4
Parents: 271f967
Author: Dan Haywood <da...@haywood-associates.co.uk>
Authored: Thu Jan 28 08:23:34 2016 +0000
Committer: Dan Haywood <da...@haywood-associates.co.uk>
Committed: Thu Jan 28 08:23:34 2016 +0000

----------------------------------------------------------------------
 ...j-settings-file-templates-for-apache-isis.jar | Bin 9104 -> 9105 bytes
 .../resources/templates/isis-templates-idea.xml  |   2 +-
 2 files changed, 1 insertion(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/isis/blob/5de42bbd/adocs/documentation/src/main/asciidoc/resources/templates/intellij-settings-file-templates-for-apache-isis.jar
----------------------------------------------------------------------
diff --git a/adocs/documentation/src/main/asciidoc/resources/templates/intellij-settings-file-templates-for-apache-isis.jar b/adocs/documentation/src/main/asciidoc/resources/templates/intellij-settings-file-templates-for-apache-isis.jar
index 93d1345..2d6771c 100644
Binary files a/adocs/documentation/src/main/asciidoc/resources/templates/intellij-settings-file-templates-for-apache-isis.jar and b/adocs/documentation/src/main/asciidoc/resources/templates/intellij-settings-file-templates-for-apache-isis.jar differ

http://git-wip-us.apache.org/repos/asf/isis/blob/5de42bbd/adocs/documentation/src/main/asciidoc/resources/templates/isis-templates-idea.xml
----------------------------------------------------------------------
diff --git a/adocs/documentation/src/main/asciidoc/resources/templates/isis-templates-idea.xml b/adocs/documentation/src/main/asciidoc/resources/templates/isis-templates-idea.xml
index 916bceb..6b6f195 100644
--- a/adocs/documentation/src/main/asciidoc/resources/templates/isis-templates-idea.xml
+++ b/adocs/documentation/src/main/asciidoc/resources/templates/isis-templates-idea.xml
@@ -60,7 +60,7 @@
       <option name="OTHER" value="false" />
     </context>
   </template>
-  <template name="isa-p-val" value="public String validate$ParamNum}$ActionName$(final $ParameterType$ $parameterType$) {&#10;    return $END$null; // TODO: return reason why action argument are invalid, null if ok&#10;}" description="Apache Isis Action parameter validation" toReformat="true" toShortenFQNames="true">
+  <template name="isa-p-val" value="public String validate$ParamNum$$ActionName$(final $ParameterType$ $parameterType$) {&#10;    return $END$null; // TODO: return reason why action argument are invalid, null if ok&#10;}" description="Apache Isis Action parameter validation" toReformat="true" toShortenFQNames="true">
     <variable name="ActionName" expression="&quot;ActionName&quot;" defaultValue="" alwaysStopAt="true" />
     <variable name="ParameterType" expression="className()" defaultValue="" alwaysStopAt="true" />
     <variable name="parameterType" expression="suggestVariableName()" defaultValue="" alwaysStopAt="true" />


[10/18] isis git commit: ISIS-993: still sketching out the layout classes for BS3 and FC (fixed col)

Posted by da...@apache.org.
http://git-wip-us.apache.org/repos/asf/isis/blob/10d80f3a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/layout/DescribedAsFacetForActionXml.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/layout/DescribedAsFacetForActionXml.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/layout/DescribedAsFacetForActionXml.java
index ee81891..9dd795b 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/layout/DescribedAsFacetForActionXml.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/layout/DescribedAsFacetForActionXml.java
@@ -21,14 +21,14 @@ package org.apache.isis.core.metamodel.facets.actions.layout;
 
 import com.google.common.base.Strings;
 
-import org.apache.isis.applib.layout.v1_0.ActionLayoutMetadata;
+import org.apache.isis.applib.layout.members.v1.ActionLayoutData;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 import org.apache.isis.core.metamodel.facets.all.describedas.DescribedAsFacet;
 import org.apache.isis.core.metamodel.facets.all.describedas.DescribedAsFacetAbstract;
 
 public class DescribedAsFacetForActionXml extends DescribedAsFacetAbstract {
 
-    public static DescribedAsFacet create(ActionLayoutMetadata actionLayout, FacetHolder holder) {
+    public static DescribedAsFacet create(ActionLayoutData actionLayout, FacetHolder holder) {
         if(actionLayout == null) {
             return null;
         }

http://git-wip-us.apache.org/repos/asf/isis/blob/10d80f3a/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
index 05ffb10..c5f9c88 100644
--- 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
@@ -21,7 +21,7 @@ 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.v1_0.ActionLayoutMetadata;
+import org.apache.isis.applib.layout.members.v1.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;
@@ -29,7 +29,7 @@ import org.apache.isis.core.metamodel.facets.members.hidden.HiddenFacetAbstract;
 
 public class HiddenFacetForActionLayoutXml extends HiddenFacetAbstract {
 
-    public static HiddenFacet create(final ActionLayoutMetadata actionLayout, final FacetHolder holder) {
+    public static HiddenFacet create(final ActionLayoutData actionLayout, final FacetHolder holder) {
         if (actionLayout == null) {
             return null;
         }

http://git-wip-us.apache.org/repos/asf/isis/blob/10d80f3a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/layout/NamedFacetForActionXml.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/layout/NamedFacetForActionXml.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/layout/NamedFacetForActionXml.java
index efa4191..af7a819 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/layout/NamedFacetForActionXml.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/layout/NamedFacetForActionXml.java
@@ -21,14 +21,14 @@ package org.apache.isis.core.metamodel.facets.actions.layout;
 
 import com.google.common.base.Strings;
 
-import org.apache.isis.applib.layout.v1_0.ActionLayoutMetadata;
+import org.apache.isis.applib.layout.members.v1.ActionLayoutData;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 import org.apache.isis.core.metamodel.facets.all.named.NamedFacet;
 import org.apache.isis.core.metamodel.facets.all.named.NamedFacetAbstract;
 
 public class NamedFacetForActionXml extends NamedFacetAbstract {
 
-    public static NamedFacet create(final ActionLayoutMetadata actionLayout, final FacetHolder holder) {
+    public static NamedFacet create(final ActionLayoutData actionLayout, final FacetHolder holder) {
         if(actionLayout == null) {
             return null;
         }

http://git-wip-us.apache.org/repos/asf/isis/blob/10d80f3a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/layout/CssClassFacetForCollectionXml.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/layout/CssClassFacetForCollectionXml.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/layout/CssClassFacetForCollectionXml.java
index c2ffd02..2e4e871 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/layout/CssClassFacetForCollectionXml.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/layout/CssClassFacetForCollectionXml.java
@@ -21,14 +21,14 @@ package org.apache.isis.core.metamodel.facets.collections.layout;
 
 import com.google.common.base.Strings;
 
-import org.apache.isis.applib.layout.v1_0.CollectionLayoutMetadata;
+import org.apache.isis.applib.layout.members.v1.CollectionLayoutData;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 import org.apache.isis.core.metamodel.facets.members.cssclass.CssClassFacet;
 import org.apache.isis.core.metamodel.facets.members.cssclass.CssClassFacetAbstract;
 
 public class CssClassFacetForCollectionXml extends CssClassFacetAbstract {
 
-    public static CssClassFacet create(CollectionLayoutMetadata collectionLayout, FacetHolder holder) {
+    public static CssClassFacet create(CollectionLayoutData collectionLayout, FacetHolder holder) {
         if(collectionLayout == null) {
             return null;
         }

http://git-wip-us.apache.org/repos/asf/isis/blob/10d80f3a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/layout/DefaultViewFacetForCollectionXml.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/layout/DefaultViewFacetForCollectionXml.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/layout/DefaultViewFacetForCollectionXml.java
index 5802d5d..dfab483 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/layout/DefaultViewFacetForCollectionXml.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/layout/DefaultViewFacetForCollectionXml.java
@@ -21,7 +21,7 @@ package org.apache.isis.core.metamodel.facets.collections.layout;
 
 import com.google.common.base.Strings;
 
-import org.apache.isis.applib.layout.v1_0.CollectionLayoutMetadata;
+import org.apache.isis.applib.layout.members.v1.CollectionLayoutData;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 import org.apache.isis.core.metamodel.facets.collections.collection.defaultview.DefaultViewFacet;
 import org.apache.isis.core.metamodel.facets.collections.collection.defaultview.DefaultViewFacetAbstract;
@@ -32,7 +32,7 @@ public class DefaultViewFacetForCollectionXml extends DefaultViewFacetAbstract {
         super(value, holder);
     }
 
-    public static DefaultViewFacet create(CollectionLayoutMetadata collectionLayout, FacetHolder holder) {
+    public static DefaultViewFacet create(CollectionLayoutData collectionLayout, FacetHolder holder) {
         if (collectionLayout == null) {
             return null;
         }

http://git-wip-us.apache.org/repos/asf/isis/blob/10d80f3a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/layout/DescribedAsFacetForCollectionXml.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/layout/DescribedAsFacetForCollectionXml.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/layout/DescribedAsFacetForCollectionXml.java
index b9561f4..ff2e2a4 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/layout/DescribedAsFacetForCollectionXml.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/layout/DescribedAsFacetForCollectionXml.java
@@ -21,14 +21,14 @@ package org.apache.isis.core.metamodel.facets.collections.layout;
 
 import com.google.common.base.Strings;
 
-import org.apache.isis.applib.layout.v1_0.CollectionLayoutMetadata;
+import org.apache.isis.applib.layout.members.v1.CollectionLayoutData;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 import org.apache.isis.core.metamodel.facets.all.describedas.DescribedAsFacet;
 import org.apache.isis.core.metamodel.facets.all.describedas.DescribedAsFacetAbstract;
 
 public class DescribedAsFacetForCollectionXml extends DescribedAsFacetAbstract {
 
-    public static DescribedAsFacet create(CollectionLayoutMetadata collectionLayout, FacetHolder holder) {
+    public static DescribedAsFacet create(CollectionLayoutData collectionLayout, FacetHolder holder) {
         if(collectionLayout == null) {
             return null;
         }

http://git-wip-us.apache.org/repos/asf/isis/blob/10d80f3a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/layout/HiddenFacetForCollectionXml.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/layout/HiddenFacetForCollectionXml.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/layout/HiddenFacetForCollectionXml.java
index a76ab13..c24a7fb 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/layout/HiddenFacetForCollectionXml.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/layout/HiddenFacetForCollectionXml.java
@@ -21,7 +21,7 @@ package org.apache.isis.core.metamodel.facets.collections.layout;
 
 import org.apache.isis.applib.annotation.When;
 import org.apache.isis.applib.annotation.Where;
-import org.apache.isis.applib.layout.v1_0.CollectionLayoutMetadata;
+import org.apache.isis.applib.layout.members.v1.CollectionLayoutData;
 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;
@@ -29,7 +29,7 @@ import org.apache.isis.core.metamodel.facets.members.hidden.HiddenFacetAbstract;
 
 public class HiddenFacetForCollectionXml extends HiddenFacetAbstract {
 
-    public static HiddenFacet create(final CollectionLayoutMetadata collectionLayout, final FacetHolder holder) {
+    public static HiddenFacet create(final CollectionLayoutData collectionLayout, final FacetHolder holder) {
         if (collectionLayout == null) {
             return null;
         }

http://git-wip-us.apache.org/repos/asf/isis/blob/10d80f3a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/layout/NamedFacetForCollectionXml.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/layout/NamedFacetForCollectionXml.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/layout/NamedFacetForCollectionXml.java
index 9509253..6422bf3 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/layout/NamedFacetForCollectionXml.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/layout/NamedFacetForCollectionXml.java
@@ -21,14 +21,14 @@ package org.apache.isis.core.metamodel.facets.collections.layout;
 
 import com.google.common.base.Strings;
 
-import org.apache.isis.applib.layout.v1_0.CollectionLayoutMetadata;
+import org.apache.isis.applib.layout.members.v1.CollectionLayoutData;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 import org.apache.isis.core.metamodel.facets.all.named.NamedFacet;
 import org.apache.isis.core.metamodel.facets.all.named.NamedFacetAbstract;
 
 public class NamedFacetForCollectionXml extends NamedFacetAbstract {
 
-    public static NamedFacet create(CollectionLayoutMetadata collectionLayout, FacetHolder holder) {
+    public static NamedFacet create(CollectionLayoutData collectionLayout, FacetHolder holder) {
         if(collectionLayout == null) {
             return null;
         }

http://git-wip-us.apache.org/repos/asf/isis/blob/10d80f3a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/layout/PagedFacetForCollectionXml.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/layout/PagedFacetForCollectionXml.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/layout/PagedFacetForCollectionXml.java
index 6b577c0..334b7d6 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/layout/PagedFacetForCollectionXml.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/layout/PagedFacetForCollectionXml.java
@@ -19,14 +19,14 @@
 
 package org.apache.isis.core.metamodel.facets.collections.layout;
 
-import org.apache.isis.applib.layout.v1_0.CollectionLayoutMetadata;
+import org.apache.isis.applib.layout.members.v1.CollectionLayoutData;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 import org.apache.isis.core.metamodel.facets.object.paged.PagedFacet;
 import org.apache.isis.core.metamodel.facets.object.paged.PagedFacetAbstract;
 
 public class PagedFacetForCollectionXml extends PagedFacetAbstract {
 
-    public static PagedFacet create(CollectionLayoutMetadata collectionLayout, FacetHolder holder) {
+    public static PagedFacet create(CollectionLayoutData collectionLayout, FacetHolder holder) {
         if(collectionLayout == null) {
             return null;
         }

http://git-wip-us.apache.org/repos/asf/isis/blob/10d80f3a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/layout/SortedByFacetForCollectionXml.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/layout/SortedByFacetForCollectionXml.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/layout/SortedByFacetForCollectionXml.java
index 72410ce..2710640 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/layout/SortedByFacetForCollectionXml.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/layout/SortedByFacetForCollectionXml.java
@@ -21,7 +21,7 @@ package org.apache.isis.core.metamodel.facets.collections.layout;
 
 import java.util.Comparator;
 
-import org.apache.isis.applib.layout.v1_0.CollectionLayoutMetadata;
+import org.apache.isis.applib.layout.members.v1.CollectionLayoutData;
 import org.apache.isis.core.commons.lang.ClassUtil;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 import org.apache.isis.core.metamodel.facets.collections.sortedby.SortedByFacet;
@@ -29,7 +29,7 @@ import org.apache.isis.core.metamodel.facets.collections.sortedby.SortedByFacetA
 
 public class SortedByFacetForCollectionXml extends SortedByFacetAbstract {
 
-    public static SortedByFacet create(CollectionLayoutMetadata collectionLayout, FacetHolder holder) {
+    public static SortedByFacet create(CollectionLayoutData collectionLayout, FacetHolder holder) {
         if(collectionLayout == null) {
             return null;
         }

http://git-wip-us.apache.org/repos/asf/isis/blob/10d80f3a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/layoutmetadata/ObjectLayoutMetadataFacet.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/layoutmetadata/ObjectLayoutMetadataFacet.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/layoutmetadata/ObjectLayoutMetadataFacet.java
index c3b8830..72b937e 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/layoutmetadata/ObjectLayoutMetadataFacet.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/layoutmetadata/ObjectLayoutMetadataFacet.java
@@ -19,7 +19,7 @@
 package org.apache.isis.core.metamodel.facets.object.layoutmetadata;
 
 
-import org.apache.isis.applib.layout.fixedcols.ObjectLayoutMetadata;
+import org.apache.isis.applib.layout.fixedcols.FCPage;
 import org.apache.isis.core.metamodel.facetapi.Facet;
 
 /**
@@ -27,7 +27,7 @@ import org.apache.isis.core.metamodel.facetapi.Facet;
  */
 public interface ObjectLayoutMetadataFacet extends Facet {
 
-    ObjectLayoutMetadata getMetadata();
+    FCPage getMetadata();
 
 
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/isis/blob/10d80f3a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/layoutmetadata/ObjectLayoutMetadataFacetDefault.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/layoutmetadata/ObjectLayoutMetadataFacetDefault.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/layoutmetadata/ObjectLayoutMetadataFacetDefault.java
index e188f85..2123bac 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/layoutmetadata/ObjectLayoutMetadataFacetDefault.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/layoutmetadata/ObjectLayoutMetadataFacetDefault.java
@@ -31,17 +31,17 @@ import com.google.common.collect.Maps;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import org.apache.isis.applib.layout.v1_0.ActionLayoutMetadata;
-import org.apache.isis.applib.layout.v1_0.ActionOwner;
-import org.apache.isis.applib.layout.v1_0.CollectionLayoutMetadata;
-import org.apache.isis.applib.layout.fixedcols.ColumnMetadata;
-import org.apache.isis.applib.layout.v1_0.ColumnOwner;
-import org.apache.isis.applib.layout.fixedcols.ObjectLayoutMetadata;
-import org.apache.isis.applib.layout.v1_0.MemberLayoutMetadataOwner;
-import org.apache.isis.applib.layout.v1_0.PropertyGroupMetadata;
-import org.apache.isis.applib.layout.v1_0.PropertyLayoutMetadata;
-import org.apache.isis.applib.layout.fixedcols.TabMetadata;
-import org.apache.isis.applib.layout.fixedcols.TabGroupMetadata;
+import org.apache.isis.applib.layout.members.v1.ActionLayoutData;
+import org.apache.isis.applib.layout.members.v1.ActionOwner;
+import org.apache.isis.applib.layout.members.v1.CollectionLayoutData;
+import org.apache.isis.applib.layout.fixedcols.FCColumn;
+import org.apache.isis.applib.layout.fixedcols.FCColumnOwner;
+import org.apache.isis.applib.layout.fixedcols.FCPage;
+import org.apache.isis.applib.layout.members.MemberRegionOwner;
+import org.apache.isis.applib.layout.members.v1.FieldSet;
+import org.apache.isis.applib.layout.members.v1.PropertyLayoutData;
+import org.apache.isis.applib.layout.fixedcols.FCTab;
+import org.apache.isis.applib.layout.fixedcols.FCTabGroup;
 import org.apache.isis.applib.services.i18n.TranslationService;
 import org.apache.isis.applib.services.layout.ObjectLayoutMetadataService;
 import org.apache.isis.core.metamodel.deployment.DeploymentCategory;
@@ -105,7 +105,7 @@ public class ObjectLayoutMetadataFacetDefault
     private final DeploymentCategory deploymentCategory;
     private final ObjectLayoutMetadataService objectLayoutMetadataService;
 
-    private ObjectLayoutMetadata metadata;
+    private FCPage metadata;
     private boolean blacklisted;
 
     private ObjectLayoutMetadataFacetDefault(
@@ -123,12 +123,12 @@ public class ObjectLayoutMetadataFacetDefault
      * Blacklisting only occurs if running in production mode.
      */
     @Override
-    public ObjectLayoutMetadata getMetadata() {
+    public FCPage getMetadata() {
         if (deploymentCategory.isProduction() || blacklisted) {
             return metadata;
         }
         final Class<?> domainClass = getSpecification().getCorrespondingClass();
-        final ObjectLayoutMetadata metadata = objectLayoutMetadataService.fromXml(domainClass);
+        final FCPage metadata = objectLayoutMetadataService.fromXml(domainClass);
         if(deploymentCategory.isProduction() && metadata == null) {
             blacklisted = true;
         }
@@ -136,7 +136,7 @@ public class ObjectLayoutMetadataFacetDefault
         return this.metadata;
     }
 
-    private ObjectLayoutMetadata normalize(final ObjectLayoutMetadata metadata) {
+    private FCPage normalize(final FCPage metadata) {
         if(metadata == null) {
             return null;
         }
@@ -153,7 +153,7 @@ public class ObjectLayoutMetadataFacetDefault
         return metadata;
     }
 
-    private void doNormalize(final ObjectLayoutMetadata metadata, final ObjectSpecification objectSpec) {
+    private void doNormalize(final FCPage metadata, final ObjectSpecification objectSpec) {
 
         final Map<String, OneToOneAssociation> oneToOneAssociationById =
                 ObjectMember.Util.mapById(getOneToOneAssociations(objectSpec));
@@ -174,34 +174,34 @@ public class ObjectLayoutMetadataFacetDefault
      * </p>
      */
     private static void derive(
-            final ObjectLayoutMetadata metadata,
+            final FCPage metadata,
             final Map<String, OneToOneAssociation> oneToOneAssociationById,
             final Map<String, OneToManyAssociation> oneToManyAssociationById,
             final Map<String, ObjectAction> objectActionById) {
 
-        final LinkedHashMap<String, PropertyLayoutMetadata> propertyIds = metadata.getAllPropertiesById();
-        final LinkedHashMap<String, CollectionLayoutMetadata> collectionIds = metadata.getAllCollectionsById();
-        final LinkedHashMap<String, ActionLayoutMetadata> actionIds = metadata.getAllActionsById();
+        final LinkedHashMap<String, PropertyLayoutData> propertyIds = metadata.getAllPropertiesById();
+        final LinkedHashMap<String, CollectionLayoutData> collectionIds = metadata.getAllCollectionsById();
+        final LinkedHashMap<String, ActionLayoutData> actionIds = metadata.getAllActionsById();
 
-        final AtomicReference<PropertyGroupMetadata> defaultPropertyGroupRef = new AtomicReference<>();
-        final AtomicReference<ColumnMetadata> firstColumnRef = new AtomicReference<>();
-        final AtomicReference<TabGroupMetadata> lastTabGroupRef = new AtomicReference<>();
+        final AtomicReference<FieldSet> defaultPropertyGroupRef = new AtomicReference<>();
+        final AtomicReference<FCColumn> firstColumnRef = new AtomicReference<>();
+        final AtomicReference<FCTabGroup> lastTabGroupRef = new AtomicReference<>();
 
         // capture the first column, and also
         // capture the first property group (if any) with the default name ('General')
-        metadata.visit(new ObjectLayoutMetadata.VisitorAdapter() {
+        metadata.visit(new FCPage.VisitorAdapter() {
             @Override
-            public void visit(final ColumnMetadata columnMetadata) {
-                firstColumnRef.compareAndSet(null, columnMetadata);
+            public void visit(final FCColumn FCColumn) {
+                firstColumnRef.compareAndSet(null, FCColumn);
             }
             @Override
-            public void visit(final PropertyGroupMetadata propertyGroupMetadata) {
-                if(MemberGroupLayoutFacet.DEFAULT_GROUP.equals(propertyGroupMetadata.getName())) {
-                    defaultPropertyGroupRef.compareAndSet(null, propertyGroupMetadata);
+            public void visit(final FieldSet fieldSet) {
+                if(MemberGroupLayoutFacet.DEFAULT_GROUP.equals(fieldSet.getName())) {
+                    defaultPropertyGroupRef.compareAndSet(null, fieldSet);
                 }
             }
             @Override
-            public void visit(final TabGroupMetadata tabGroup) {
+            public void visit(final FCTabGroup tabGroup) {
                 lastTabGroupRef.set(tabGroup);
             }
         });
@@ -219,13 +219,13 @@ public class ObjectLayoutMetadataFacetDefault
 
         if(!missingPropertyIds.isEmpty()) {
             // ensure that there is a property group to use
-            boolean wasSet = defaultPropertyGroupRef.compareAndSet(null, new PropertyGroupMetadata(MemberGroupLayoutFacet.DEFAULT_GROUP));
-            final PropertyGroupMetadata defaultPropertyGroupMetadata = defaultPropertyGroupRef.get();
+            boolean wasSet = defaultPropertyGroupRef.compareAndSet(null, new FieldSet(MemberGroupLayoutFacet.DEFAULT_GROUP));
+            final FieldSet defaultFieldSet = defaultPropertyGroupRef.get();
             if(wasSet) {
-                firstColumnRef.get().getPropertyGroups().add(defaultPropertyGroupMetadata);
+                firstColumnRef.get().getFieldSets().add(defaultFieldSet);
             }
             for (final String propertyId : missingPropertyIds) {
-                defaultPropertyGroupMetadata.getProperties().add(new PropertyLayoutMetadata(propertyId));
+                defaultFieldSet.getProperties().add(new PropertyLayoutData(propertyId));
             }
         }
 
@@ -242,17 +242,17 @@ public class ObjectLayoutMetadataFacetDefault
 
         if(!missingCollectionIds.isEmpty()) {
             while(metadata.getTabGroups().size() < 2) {
-                final TabGroupMetadata tabGroup = new TabGroupMetadata();
+                final FCTabGroup tabGroup = new FCTabGroup();
                 metadata.getTabGroups().add(tabGroup);
                 lastTabGroupRef.set(tabGroup);
             }
-            final TabGroupMetadata lastTabGroup = lastTabGroupRef.get();
+            final FCTabGroup lastTabGroup = lastTabGroupRef.get();
             for (final String collectionId : missingCollectionIds) {
-                final TabMetadata tabMetadata = new TabMetadata();
-                lastTabGroup.getTabs().add(tabMetadata);
-                ColumnMetadata left = new ColumnMetadata(12);
-                tabMetadata.setLeft(left);
-                final CollectionLayoutMetadata layoutMetadata = new CollectionLayoutMetadata(collectionId);
+                final FCTab FCTab = new FCTab();
+                lastTabGroup.getTabs().add(FCTab);
+                FCColumn left = new FCColumn(12);
+                FCTab.setLeft(left);
+                final CollectionLayoutData layoutMetadata = new CollectionLayoutData(collectionId);
                 layoutMetadata.setDefaultView("table");
                 left.getCollections().add(layoutMetadata);
             }
@@ -269,12 +269,12 @@ public class ObjectLayoutMetadataFacetDefault
 
         if(!missingActionIds.isEmpty()) {
             for (String actionId : missingActionIds) {
-                List<ActionLayoutMetadata> actions = metadata.getActions();
+                List<ActionLayoutData> actions = metadata.getActions();
                 if(actions == null) {
                     actions = Lists.newArrayList();
                     metadata.setActions(actions);
                 }
-                actions.add(new ActionLayoutMetadata(actionId));
+                actions.add(new ActionLayoutData(actionId));
             }
         }
     }
@@ -302,14 +302,14 @@ public class ObjectLayoutMetadataFacetDefault
     }
 
     private void overwrite(
-            final ObjectLayoutMetadata metadata,
+            final FCPage metadata,
             final Map<String, OneToOneAssociation> oneToOneAssociationById,
             final Map<String, OneToManyAssociation> oneToManyAssociationById,
             final Map<String, ObjectAction> objectActionById) {
 
         final Map<String, int[]> propertySequenceByGroup = Maps.newHashMap();
 
-        metadata.visit(new ObjectLayoutMetadata.VisitorAdapter() {
+        metadata.visit(new FCPage.VisitorAdapter() {
             private int collectionSequence = 1;
             private int actionDomainObjectSequence = 1;
             private int actionPropertyGroupSequence = 1;
@@ -317,28 +317,28 @@ public class ObjectLayoutMetadataFacetDefault
             private int actionCollectionSequence = 1;
 
             @Override
-            public void visit(final ActionLayoutMetadata actionLayoutMetadata) {
-                final ActionOwner actionOwner = actionLayoutMetadata.getOwner();
-                final ObjectAction objectAction = objectActionById.get(actionLayoutMetadata.getId());
+            public void visit(final ActionLayoutData actionLayoutData) {
+                final ActionOwner actionOwner = actionLayoutData.getOwner();
+                final ObjectAction objectAction = objectActionById.get(actionLayoutData.getId());
                 if(objectAction == null) {
                     return;
                 }
 
                 final String memberOrderName;
                 final int memberOrderSequence;
-                if(actionOwner instanceof PropertyGroupMetadata) {
-                    final PropertyGroupMetadata propertyGroupMetadata = (PropertyGroupMetadata) actionOwner;
-                    final List<PropertyLayoutMetadata> properties = propertyGroupMetadata.getProperties();
-                    final PropertyLayoutMetadata propertyLayoutMetadata = properties.get(0); // any will do
-                    memberOrderName = propertyLayoutMetadata.getId();
+                if(actionOwner instanceof FieldSet) {
+                    final FieldSet fieldSet = (FieldSet) actionOwner;
+                    final List<PropertyLayoutData> properties = fieldSet.getProperties();
+                    final PropertyLayoutData propertyLayoutData = properties.get(0); // any will do
+                    memberOrderName = propertyLayoutData.getId();
                     memberOrderSequence = actionPropertyGroupSequence++;
-                } else if(actionOwner instanceof PropertyLayoutMetadata) {
-                    final PropertyLayoutMetadata propertyLayoutMetadata = (PropertyLayoutMetadata) actionOwner;
-                    memberOrderName = propertyLayoutMetadata.getId();
+                } else if(actionOwner instanceof PropertyLayoutData) {
+                    final PropertyLayoutData propertyLayoutData = (PropertyLayoutData) actionOwner;
+                    memberOrderName = propertyLayoutData.getId();
                     memberOrderSequence = actionPropertySequence++;
-                } else if(actionOwner instanceof CollectionLayoutMetadata) {
-                    final CollectionLayoutMetadata collectionLayoutMetadata = (CollectionLayoutMetadata) actionOwner;
-                    memberOrderName = collectionLayoutMetadata.getId();
+                } else if(actionOwner instanceof CollectionLayoutData) {
+                    final CollectionLayoutData collectionLayoutData = (CollectionLayoutData) actionOwner;
+                    memberOrderName = collectionLayoutData.getId();
                     memberOrderSequence = actionCollectionSequence++;
                 } else {
                     // DomainObject
@@ -349,90 +349,90 @@ public class ObjectLayoutMetadataFacetDefault
                         new MemberOrderFacetXml(memberOrderName, ""+memberOrderSequence, translationService, objectAction));
 
 
-                if(actionOwner instanceof PropertyGroupMetadata) {
-                    if(actionLayoutMetadata.getPosition() == null ||
-                            actionLayoutMetadata.getPosition() == org.apache.isis.applib.annotation.ActionLayout.Position.BELOW ||
-                            actionLayoutMetadata.getPosition() == org.apache.isis.applib.annotation.ActionLayout.Position.RIGHT) {
-                        actionLayoutMetadata.setPosition(org.apache.isis.applib.annotation.ActionLayout.Position.PANEL);
+                if(actionOwner instanceof FieldSet) {
+                    if(actionLayoutData.getPosition() == null ||
+                            actionLayoutData.getPosition() == org.apache.isis.applib.annotation.ActionLayout.Position.BELOW ||
+                            actionLayoutData.getPosition() == org.apache.isis.applib.annotation.ActionLayout.Position.RIGHT) {
+                        actionLayoutData.setPosition(org.apache.isis.applib.annotation.ActionLayout.Position.PANEL);
                     }
-                } else if(actionOwner instanceof PropertyLayoutMetadata) {
-                    if(actionLayoutMetadata.getPosition() == null ||
-                            actionLayoutMetadata.getPosition() == org.apache.isis.applib.annotation.ActionLayout.Position.PANEL_DROPDOWN ||
-                            actionLayoutMetadata.getPosition() == org.apache.isis.applib.annotation.ActionLayout.Position.PANEL) {
-                        actionLayoutMetadata.setPosition(org.apache.isis.applib.annotation.ActionLayout.Position.BELOW);
+                } else if(actionOwner instanceof PropertyLayoutData) {
+                    if(actionLayoutData.getPosition() == null ||
+                            actionLayoutData.getPosition() == org.apache.isis.applib.annotation.ActionLayout.Position.PANEL_DROPDOWN ||
+                            actionLayoutData.getPosition() == org.apache.isis.applib.annotation.ActionLayout.Position.PANEL) {
+                        actionLayoutData.setPosition(org.apache.isis.applib.annotation.ActionLayout.Position.BELOW);
                     }
                 } else {
                     // doesn't do anything for DomainObject or Collection
-                    actionLayoutMetadata.setPosition(null);
+                    actionLayoutData.setPosition(null);
                 }
 
-                FacetUtil.addFacet(ActionPositionFacetForActionXml.create(actionLayoutMetadata, objectAction));
-                FacetUtil.addFacet(BookmarkPolicyFacetForActionXml.create(actionLayoutMetadata, objectAction));
-                FacetUtil.addFacet(CssClassFacetForActionXml.create(actionLayoutMetadata, objectAction));
-                FacetUtil.addFacet(CssClassFaFacetForActionXml.create(actionLayoutMetadata, objectAction));
-                FacetUtil.addFacet(DescribedAsFacetForActionXml.create(actionLayoutMetadata, objectAction));
-                FacetUtil.addFacet(HiddenFacetForActionLayoutXml.create(actionLayoutMetadata, objectAction));
-                FacetUtil.addFacet(NamedFacetForActionXml.create(actionLayoutMetadata, objectAction));
+                FacetUtil.addFacet(ActionPositionFacetForActionXml.create(actionLayoutData, objectAction));
+                FacetUtil.addFacet(BookmarkPolicyFacetForActionXml.create(actionLayoutData, objectAction));
+                FacetUtil.addFacet(CssClassFacetForActionXml.create(actionLayoutData, objectAction));
+                FacetUtil.addFacet(CssClassFaFacetForActionXml.create(actionLayoutData, objectAction));
+                FacetUtil.addFacet(DescribedAsFacetForActionXml.create(actionLayoutData, objectAction));
+                FacetUtil.addFacet(HiddenFacetForActionLayoutXml.create(actionLayoutData, objectAction));
+                FacetUtil.addFacet(NamedFacetForActionXml.create(actionLayoutData, objectAction));
             }
 
             @Override
-            public void visit(final PropertyLayoutMetadata propertyLayoutMetadata) {
-                final OneToOneAssociation oneToOneAssociation = oneToOneAssociationById.get(propertyLayoutMetadata.getId());
+            public void visit(final PropertyLayoutData propertyLayoutData) {
+                final OneToOneAssociation oneToOneAssociation = oneToOneAssociationById.get(propertyLayoutData.getId());
                 if(oneToOneAssociation == null) {
                     return;
                 }
 
-                FacetUtil.addFacet(CssClassFacetForPropertyXml.create(propertyLayoutMetadata, oneToOneAssociation));
-                FacetUtil.addFacet(DescribedAsFacetForPropertyXml.create(propertyLayoutMetadata, oneToOneAssociation));
-                FacetUtil.addFacet(HiddenFacetForPropertyXml.create(propertyLayoutMetadata, oneToOneAssociation));
-                FacetUtil.addFacet(LabelAtFacetForPropertyXml.create(propertyLayoutMetadata, oneToOneAssociation));
-                FacetUtil.addFacet(MultiLineFacetForPropertyXml.create(propertyLayoutMetadata, oneToOneAssociation));
-                FacetUtil.addFacet(NamedFacetForPropertyXml.create(propertyLayoutMetadata, oneToOneAssociation));
+                FacetUtil.addFacet(CssClassFacetForPropertyXml.create(propertyLayoutData, oneToOneAssociation));
+                FacetUtil.addFacet(DescribedAsFacetForPropertyXml.create(propertyLayoutData, oneToOneAssociation));
+                FacetUtil.addFacet(HiddenFacetForPropertyXml.create(propertyLayoutData, oneToOneAssociation));
+                FacetUtil.addFacet(LabelAtFacetForPropertyXml.create(propertyLayoutData, oneToOneAssociation));
+                FacetUtil.addFacet(MultiLineFacetForPropertyXml.create(propertyLayoutData, oneToOneAssociation));
+                FacetUtil.addFacet(NamedFacetForPropertyXml.create(propertyLayoutData, oneToOneAssociation));
                 FacetUtil.addFacet(
-                        RenderedAdjustedFacetForPropertyXml.create(propertyLayoutMetadata, oneToOneAssociation));
-                FacetUtil.addFacet(TypicalLengthFacetForPropertyXml.create(propertyLayoutMetadata, oneToOneAssociation));
+                        RenderedAdjustedFacetForPropertyXml.create(propertyLayoutData, oneToOneAssociation));
+                FacetUtil.addFacet(TypicalLengthFacetForPropertyXml.create(propertyLayoutData, oneToOneAssociation));
 
                 // @MemberOrder#name based on owning property group, @MemberOrder#sequence monotonically increasing
-                final PropertyGroupMetadata propertyGroupMetadata = propertyLayoutMetadata.getOwner();
-                final String groupName = propertyGroupMetadata.getName();
+                final FieldSet fieldSet = propertyLayoutData.getOwner();
+                final String groupName = fieldSet.getName();
                 final String sequence = nextInSequenceFor(groupName, propertySequenceByGroup);
                 FacetUtil.addFacet(
                         new MemberOrderFacetXml(groupName, sequence, translationService, oneToOneAssociation));
             }
 
             @Override
-            public void visit(final CollectionLayoutMetadata collectionLayoutMetadata) {
-                final OneToManyAssociation oneToManyAssociation = oneToManyAssociationById.get(collectionLayoutMetadata.getId());
+            public void visit(final CollectionLayoutData collectionLayoutData) {
+                final OneToManyAssociation oneToManyAssociation = oneToManyAssociationById.get(collectionLayoutData.getId());
                 if(oneToManyAssociation == null) {
                     return;
                 }
 
-                FacetUtil.addFacet(CssClassFacetForCollectionXml.create(collectionLayoutMetadata, oneToManyAssociation));
+                FacetUtil.addFacet(CssClassFacetForCollectionXml.create(collectionLayoutData, oneToManyAssociation));
                 FacetUtil.addFacet(
-                        DefaultViewFacetForCollectionXml.create(collectionLayoutMetadata, oneToManyAssociation));
+                        DefaultViewFacetForCollectionXml.create(collectionLayoutData, oneToManyAssociation));
                 FacetUtil.addFacet(
-                        DescribedAsFacetForCollectionXml.create(collectionLayoutMetadata, oneToManyAssociation));
-                FacetUtil.addFacet(HiddenFacetForCollectionXml.create(collectionLayoutMetadata, oneToManyAssociation));
-                FacetUtil.addFacet(NamedFacetForCollectionXml.create(collectionLayoutMetadata, oneToManyAssociation));
-                FacetUtil.addFacet(PagedFacetForCollectionXml.create(collectionLayoutMetadata, oneToManyAssociation));
-                FacetUtil.addFacet(SortedByFacetForCollectionXml.create(collectionLayoutMetadata, oneToManyAssociation));
+                        DescribedAsFacetForCollectionXml.create(collectionLayoutData, oneToManyAssociation));
+                FacetUtil.addFacet(HiddenFacetForCollectionXml.create(collectionLayoutData, oneToManyAssociation));
+                FacetUtil.addFacet(NamedFacetForCollectionXml.create(collectionLayoutData, oneToManyAssociation));
+                FacetUtil.addFacet(PagedFacetForCollectionXml.create(collectionLayoutData, oneToManyAssociation));
+                FacetUtil.addFacet(SortedByFacetForCollectionXml.create(collectionLayoutData, oneToManyAssociation));
 
                 // @MemberOrder#name based on the collection's id (so that each has a single "member group")
-                final String groupName = collectionLayoutMetadata.getId();
+                final String groupName = collectionLayoutData.getId();
                 final String sequence = "" + collectionSequence++;
                 FacetUtil.addFacet(
                         new MemberOrderFacetXml(groupName, sequence, translationService, oneToManyAssociation));
 
                 // if there is only a single column and no other contents, then copy the collection Id onto the tab'
-                final MemberLayoutMetadataOwner memberLayoutMetadataOwner = collectionLayoutMetadata.getOwner();
-                if(memberLayoutMetadataOwner instanceof ColumnMetadata) {
-                    final ColumnMetadata columnMetadata = (ColumnMetadata) memberLayoutMetadataOwner;
-                    final ColumnOwner holder = columnMetadata.getOwner();
-                    if(holder instanceof TabMetadata) {
-                        final TabMetadata tabMetadata = (TabMetadata) holder;
-                        if(tabMetadata.getContents().size() == 1 && Strings.isNullOrEmpty(tabMetadata.getName()) ) {
+                final MemberRegionOwner memberRegionOwner = collectionLayoutData.getOwner();
+                if(memberRegionOwner instanceof FCColumn) {
+                    final FCColumn FCColumn = (FCColumn) memberRegionOwner;
+                    final FCColumnOwner holder = FCColumn.getOwner();
+                    if(holder instanceof FCTab) {
+                        final FCTab FCTab = (FCTab) holder;
+                        if(FCTab.getContents().size() == 1 && Strings.isNullOrEmpty(FCTab.getName()) ) {
                             final String collectionName = oneToManyAssociation.getName();
-                            tabMetadata.setName(collectionName);
+                            FCTab.setName(collectionName);
                         }
                     }
                 }

http://git-wip-us.apache.org/repos/asf/isis/blob/10d80f3a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/propertylayout/CssClassFacetForPropertyXml.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/propertylayout/CssClassFacetForPropertyXml.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/propertylayout/CssClassFacetForPropertyXml.java
index e16cad5..53a9021 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/propertylayout/CssClassFacetForPropertyXml.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/propertylayout/CssClassFacetForPropertyXml.java
@@ -21,14 +21,14 @@ package org.apache.isis.core.metamodel.facets.properties.propertylayout;
 
 import com.google.common.base.Strings;
 
-import org.apache.isis.applib.layout.v1_0.PropertyLayoutMetadata;
+import org.apache.isis.applib.layout.members.v1.PropertyLayoutData;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 import org.apache.isis.core.metamodel.facets.members.cssclass.CssClassFacet;
 import org.apache.isis.core.metamodel.facets.members.cssclass.CssClassFacetAbstract;
 
 public class CssClassFacetForPropertyXml extends CssClassFacetAbstract {
 
-    public static CssClassFacet create(PropertyLayoutMetadata propertyLayout, FacetHolder holder) {
+    public static CssClassFacet create(PropertyLayoutData propertyLayout, FacetHolder holder) {
         if(propertyLayout == null) {
             return null;
         }

http://git-wip-us.apache.org/repos/asf/isis/blob/10d80f3a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/propertylayout/DescribedAsFacetForPropertyXml.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/propertylayout/DescribedAsFacetForPropertyXml.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/propertylayout/DescribedAsFacetForPropertyXml.java
index e2c6bb6..d9268f7 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/propertylayout/DescribedAsFacetForPropertyXml.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/propertylayout/DescribedAsFacetForPropertyXml.java
@@ -21,14 +21,14 @@ package org.apache.isis.core.metamodel.facets.properties.propertylayout;
 
 import com.google.common.base.Strings;
 
-import org.apache.isis.applib.layout.v1_0.PropertyLayoutMetadata;
+import org.apache.isis.applib.layout.members.v1.PropertyLayoutData;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 import org.apache.isis.core.metamodel.facets.all.describedas.DescribedAsFacet;
 import org.apache.isis.core.metamodel.facets.all.describedas.DescribedAsFacetAbstract;
 
 public class DescribedAsFacetForPropertyXml extends DescribedAsFacetAbstract {
 
-    public static DescribedAsFacet create(PropertyLayoutMetadata propertyLayout, FacetHolder holder) {
+    public static DescribedAsFacet create(PropertyLayoutData propertyLayout, FacetHolder holder) {
         if(propertyLayout == null) {
             return null;
         }

http://git-wip-us.apache.org/repos/asf/isis/blob/10d80f3a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/propertylayout/HiddenFacetForPropertyXml.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/propertylayout/HiddenFacetForPropertyXml.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/propertylayout/HiddenFacetForPropertyXml.java
index 83d15ab..bc75795 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/propertylayout/HiddenFacetForPropertyXml.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/propertylayout/HiddenFacetForPropertyXml.java
@@ -21,7 +21,7 @@ package org.apache.isis.core.metamodel.facets.properties.propertylayout;
 
 import org.apache.isis.applib.annotation.When;
 import org.apache.isis.applib.annotation.Where;
-import org.apache.isis.applib.layout.v1_0.PropertyLayoutMetadata;
+import org.apache.isis.applib.layout.members.v1.PropertyLayoutData;
 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;
@@ -29,7 +29,7 @@ import org.apache.isis.core.metamodel.facets.members.hidden.HiddenFacetAbstract;
 
 public class HiddenFacetForPropertyXml extends HiddenFacetAbstract {
 
-    public static HiddenFacet create(final PropertyLayoutMetadata propertyLayout, final FacetHolder holder) {
+    public static HiddenFacet create(final PropertyLayoutData propertyLayout, final FacetHolder holder) {
         if (propertyLayout == null) {
             return null;
         }

http://git-wip-us.apache.org/repos/asf/isis/blob/10d80f3a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/propertylayout/LabelAtFacetForPropertyXml.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/propertylayout/LabelAtFacetForPropertyXml.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/propertylayout/LabelAtFacetForPropertyXml.java
index fc55c5d..b26c1a5 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/propertylayout/LabelAtFacetForPropertyXml.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/propertylayout/LabelAtFacetForPropertyXml.java
@@ -20,14 +20,14 @@
 package org.apache.isis.core.metamodel.facets.properties.propertylayout;
 
 import org.apache.isis.applib.annotation.LabelPosition;
-import org.apache.isis.applib.layout.v1_0.PropertyLayoutMetadata;
+import org.apache.isis.applib.layout.members.v1.PropertyLayoutData;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 import org.apache.isis.core.metamodel.facets.objectvalue.labelat.LabelAtFacet;
 import org.apache.isis.core.metamodel.facets.objectvalue.labelat.LabelAtFacetAbstract;
 
 public class LabelAtFacetForPropertyXml extends LabelAtFacetAbstract {
 
-    public static LabelAtFacet create(final PropertyLayoutMetadata propertyLayout, FacetHolder holder) {
+    public static LabelAtFacet create(final PropertyLayoutData propertyLayout, FacetHolder holder) {
         if (propertyLayout == null) {
             return null;
         }

http://git-wip-us.apache.org/repos/asf/isis/blob/10d80f3a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/propertylayout/MultiLineFacetForPropertyXml.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/propertylayout/MultiLineFacetForPropertyXml.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/propertylayout/MultiLineFacetForPropertyXml.java
index 599ceba..71db6ea 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/propertylayout/MultiLineFacetForPropertyXml.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/propertylayout/MultiLineFacetForPropertyXml.java
@@ -19,14 +19,14 @@
 
 package org.apache.isis.core.metamodel.facets.properties.propertylayout;
 
-import org.apache.isis.applib.layout.v1_0.PropertyLayoutMetadata;
+import org.apache.isis.applib.layout.members.v1.PropertyLayoutData;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 import org.apache.isis.core.metamodel.facets.objectvalue.multiline.MultiLineFacet;
 import org.apache.isis.core.metamodel.facets.objectvalue.multiline.MultiLineFacetAbstract;
 
 public class MultiLineFacetForPropertyXml extends MultiLineFacetAbstract {
 
-    public static MultiLineFacet create(PropertyLayoutMetadata propertyLayout, FacetHolder holder) {
+    public static MultiLineFacet create(PropertyLayoutData propertyLayout, FacetHolder holder) {
         if(propertyLayout == null) {
             return null;
         }

http://git-wip-us.apache.org/repos/asf/isis/blob/10d80f3a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/propertylayout/NamedFacetForPropertyXml.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/propertylayout/NamedFacetForPropertyXml.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/propertylayout/NamedFacetForPropertyXml.java
index 8f2ea3a..447e5fd 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/propertylayout/NamedFacetForPropertyXml.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/propertylayout/NamedFacetForPropertyXml.java
@@ -21,14 +21,14 @@ package org.apache.isis.core.metamodel.facets.properties.propertylayout;
 
 import com.google.common.base.Strings;
 
-import org.apache.isis.applib.layout.v1_0.PropertyLayoutMetadata;
+import org.apache.isis.applib.layout.members.v1.PropertyLayoutData;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 import org.apache.isis.core.metamodel.facets.all.named.NamedFacet;
 import org.apache.isis.core.metamodel.facets.all.named.NamedFacetAbstract;
 
 public class NamedFacetForPropertyXml extends NamedFacetAbstract {
 
-    public static NamedFacet create(PropertyLayoutMetadata propertyLayout, FacetHolder holder) {
+    public static NamedFacet create(PropertyLayoutData propertyLayout, FacetHolder holder) {
         if(propertyLayout == null) {
             return null;
         }

http://git-wip-us.apache.org/repos/asf/isis/blob/10d80f3a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/propertylayout/RenderedAdjustedFacetForPropertyXml.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/propertylayout/RenderedAdjustedFacetForPropertyXml.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/propertylayout/RenderedAdjustedFacetForPropertyXml.java
index 1947070..7c5055b 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/propertylayout/RenderedAdjustedFacetForPropertyXml.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/propertylayout/RenderedAdjustedFacetForPropertyXml.java
@@ -19,14 +19,14 @@
 
 package org.apache.isis.core.metamodel.facets.properties.propertylayout;
 
-import org.apache.isis.applib.layout.v1_0.PropertyLayoutMetadata;
+import org.apache.isis.applib.layout.members.v1.PropertyLayoutData;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 import org.apache.isis.core.metamodel.facets.objectvalue.renderedadjusted.RenderedAdjustedFacet;
 import org.apache.isis.core.metamodel.facets.objectvalue.renderedadjusted.RenderedAdjustedFacetAbstract;
 
 public class RenderedAdjustedFacetForPropertyXml extends RenderedAdjustedFacetAbstract {
 
-    public static RenderedAdjustedFacet create(final PropertyLayoutMetadata propertyLayout, FacetHolder holder) {
+    public static RenderedAdjustedFacet create(final PropertyLayoutData propertyLayout, FacetHolder holder) {
         if(propertyLayout == null) {
             return null;
         }

http://git-wip-us.apache.org/repos/asf/isis/blob/10d80f3a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/propertylayout/TypicalLengthFacetForPropertyXml.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/propertylayout/TypicalLengthFacetForPropertyXml.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/propertylayout/TypicalLengthFacetForPropertyXml.java
index dfbfb79..a43255d 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/propertylayout/TypicalLengthFacetForPropertyXml.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/propertylayout/TypicalLengthFacetForPropertyXml.java
@@ -19,14 +19,14 @@
 
 package org.apache.isis.core.metamodel.facets.properties.propertylayout;
 
-import org.apache.isis.applib.layout.v1_0.PropertyLayoutMetadata;
+import org.apache.isis.applib.layout.members.v1.PropertyLayoutData;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 import org.apache.isis.core.metamodel.facets.objectvalue.typicallen.TypicalLengthFacet;
 import org.apache.isis.core.metamodel.facets.objectvalue.typicallen.TypicalLengthFacetAbstract;
 
 public class TypicalLengthFacetForPropertyXml extends TypicalLengthFacetAbstract {
 
-    public static TypicalLengthFacet create(PropertyLayoutMetadata propertyLayout, FacetHolder holder) {
+    public static TypicalLengthFacet create(PropertyLayoutData propertyLayout, FacetHolder holder) {
         if(propertyLayout == null) {
             return null;
         }

http://git-wip-us.apache.org/repos/asf/isis/blob/10d80f3a/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 9f761c6..e460e07 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
@@ -84,7 +84,7 @@ import org.apache.isis.core.metamodel.runtimecontext.ServicesInjectorAware;
 import org.apache.isis.core.metamodel.spec.ActionType;
 import org.apache.isis.core.metamodel.spec.ObjectSpecification;
 import org.apache.isis.core.metamodel.spec.ObjectSpecifications;
-import org.apache.isis.applib.layout.fixedcols.ColumnMetadata.Hint;
+import org.apache.isis.applib.layout.fixedcols.FCColumn.Hint;
 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;

http://git-wip-us.apache.org/repos/asf/isis/blob/10d80f3a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/layout/ObjectLayoutMetadataServiceDefault.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/layout/ObjectLayoutMetadataServiceDefault.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/layout/ObjectLayoutMetadataServiceDefault.java
index 446abae..d37b145 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/layout/ObjectLayoutMetadataServiceDefault.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/layout/ObjectLayoutMetadataServiceDefault.java
@@ -33,7 +33,7 @@ import org.slf4j.LoggerFactory;
 import org.apache.isis.applib.annotation.DomainService;
 import org.apache.isis.applib.annotation.NatureOfService;
 import org.apache.isis.applib.annotation.Programmatic;
-import org.apache.isis.applib.layout.fixedcols.ObjectLayoutMetadata;
+import org.apache.isis.applib.layout.fixedcols.FCPage;
 import org.apache.isis.applib.services.jaxb.JaxbService;
 import org.apache.isis.applib.services.layout.ObjectLayoutMetadataService;
 import org.apache.isis.core.metamodel.deployment.DeploymentCategory;
@@ -53,7 +53,7 @@ public class ObjectLayoutMetadataServiceDefault
     private final Map<Class<?>, String> badXmlByClass = Maps.newHashMap();
 
     // cache (used only in prototyping mode)
-    private final Map<String, ObjectLayoutMetadata> metadataByXml = Maps.newHashMap();
+    private final Map<String, FCPage> metadataByXml = Maps.newHashMap();
 
     @Override
     @Programmatic
@@ -64,7 +64,7 @@ public class ObjectLayoutMetadataServiceDefault
 
     @Override
     @Programmatic
-    public ObjectLayoutMetadata fromXml(Class<?> domainClass) {
+    public FCPage fromXml(Class<?> domainClass) {
 
         final String resourceName = resourceNameFor(domainClass);
         final String xml;
@@ -82,9 +82,9 @@ public class ObjectLayoutMetadataServiceDefault
 
 
         if(!deploymentCategory.isProduction()) {
-            final ObjectLayoutMetadata objectLayoutMetadata = metadataByXml.get(xml);
-            if(objectLayoutMetadata != null) {
-                return objectLayoutMetadata;
+            final FCPage FCPage = metadataByXml.get(xml);
+            if(FCPage != null) {
+                return FCPage;
             }
 
             final String badXml = badXmlByClass.get(domainClass);
@@ -101,7 +101,7 @@ public class ObjectLayoutMetadataServiceDefault
         }
 
         try {
-            final ObjectLayoutMetadata metadata = jaxbService.fromXml(ObjectLayoutMetadata.class, xml);
+            final FCPage metadata = jaxbService.fromXml(FCPage.class, xml);
             if(!deploymentCategory.isProduction()) {
                 metadataByXml.put(xml, metadata);
             }
@@ -134,12 +134,12 @@ public class ObjectLayoutMetadataServiceDefault
 
     @Override
     @Programmatic
-    public ObjectLayoutMetadata toMetadata(final Object domainObject) {
+    public FCPage toMetadata(final Object domainObject) {
         return toMetadata(domainObject.getClass());
     }
 
     @Override
-    public ObjectLayoutMetadata toMetadata(final Class<?> domainClass) {
+    public FCPage toMetadata(final Class<?> domainClass) {
         final ObjectSpecification objectSpec = specificationLookup.loadSpecification(domainClass);
         final ObjectLayoutMetadataFacet facet = objectSpec.getFacet(ObjectLayoutMetadataFacet.class);
         return facet != null? facet.getMetadata(): null;

http://git-wip-us.apache.org/repos/asf/isis/blob/10d80f3a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/metamodel/MetadataMenu.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/metamodel/MetadataMenu.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/metamodel/MetadataMenu.java
index db40223..3066232 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/metamodel/MetadataMenu.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/metamodel/MetadataMenu.java
@@ -42,7 +42,7 @@ import org.apache.isis.applib.annotation.NatureOfService;
 import org.apache.isis.applib.annotation.Programmatic;
 import org.apache.isis.applib.annotation.RestrictTo;
 import org.apache.isis.applib.annotation.SemanticsOf;
-import org.apache.isis.applib.layout.fixedcols.ObjectLayoutMetadata;
+import org.apache.isis.applib.layout.fixedcols.FCPage;
 import org.apache.isis.applib.services.jaxb.JaxbService;
 import org.apache.isis.applib.services.layout.ObjectLayoutMetadataService;
 import org.apache.isis.applib.value.Blob;
@@ -108,7 +108,7 @@ public class MetadataMenu implements SpecificationLoaderSpiAware {
             final OutputStreamWriter writer = new OutputStreamWriter(zos);
             for (final ObjectSpecification objectSpec : domainObjectSpecs) {
                 final Class<?> domainClass = objectSpec.getCorrespondingClass();
-                final ObjectLayoutMetadata metadata = objectLayoutMetadataService.toMetadata(domainClass);
+                final FCPage metadata = objectLayoutMetadataService.toMetadata(domainClass);
                 if(metadata != null) {
                     zos.putNextEntry(new ZipEntry(zipEntryNameFor(objectSpec)));
                     String xml = jaxbService.toXml(metadata);

http://git-wip-us.apache.org/repos/asf/isis/blob/10d80f3a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/ObjectSpecifications.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/ObjectSpecifications.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/ObjectSpecifications.java
index 209b105..686ab7c 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/ObjectSpecifications.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/ObjectSpecifications.java
@@ -25,7 +25,7 @@ import java.util.Set;
 
 import com.google.common.collect.Lists;
 
-import org.apache.isis.applib.layout.fixedcols.ColumnMetadata;
+import org.apache.isis.applib.layout.fixedcols.FCColumn;
 import org.apache.isis.core.metamodel.facets.object.membergroups.MemberGroupLayoutFacet;
 
 
@@ -37,7 +37,7 @@ public final class ObjectSpecifications {
     public static List<String> orderByMemberGroups(
             final ObjectSpecification objSpec,
             final Set<String> groupNamesToOrder,
-            final ColumnMetadata.Hint hint) {
+            final FCColumn.Hint hint) {
 
         final MemberGroupLayoutFacet facet = objSpec.getFacet(MemberGroupLayoutFacet.class);
         final List<String> leftColumnGroupNames = Lists.newArrayList(groupNamesToOrder);
@@ -47,10 +47,10 @@ public final class ObjectSpecifications {
             return leftColumnGroupNames;
         }
         
-        if(hint == ColumnMetadata.Hint.MIDDLE) {
+        if(hint == FCColumn.Hint.MIDDLE) {
             return facet.getColumnSpans().getMiddle()>0? facet.getMiddle(): Collections.<String>emptyList();
         }
-        if(hint == ColumnMetadata.Hint.RIGHT) {
+        if(hint == FCColumn.Hint.RIGHT) {
             return facet.getColumnSpans().getRight()>0? facet.getRight(): Collections.<String>emptyList();
         }
         

http://git-wip-us.apache.org/repos/asf/isis/blob/10d80f3a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/object/layoutxml/FCPageFacetDefaultTest.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/object/layoutxml/FCPageFacetDefaultTest.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/object/layoutxml/FCPageFacetDefaultTest.java
new file mode 100644
index 0000000..1f45123
--- /dev/null
+++ b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/object/layoutxml/FCPageFacetDefaultTest.java
@@ -0,0 +1,60 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
+package org.apache.isis.core.metamodel.facets.object.layoutxml;
+
+import java.util.concurrent.atomic.AtomicReference;
+
+import org.junit.Test;
+
+import org.apache.isis.applib.layout.members.v1.FieldSet;
+
+import static org.hamcrest.CoreMatchers.is;
+import static org.hamcrest.CoreMatchers.nullValue;
+import static org.junit.Assert.assertThat;
+
+public class FCPageFacetDefaultTest {
+
+    @Test
+    public void xxx() throws Exception {
+
+        final AtomicReference<FieldSet> x = new AtomicReference<>();
+
+        FieldSet firstValue = new FieldSet();
+        FieldSet otherValue = new FieldSet();
+
+        assertThat(x.get(), is(nullValue()));
+
+        boolean b = x.compareAndSet(null, firstValue);
+        assertThat(b, is(true));
+        assertThat(x.get(), is(firstValue));
+
+        boolean b2 = x.compareAndSet(null, firstValue);
+        assertThat(b2, is(false));
+        assertThat(x.get(), is(firstValue));
+
+        boolean b3 = x.compareAndSet(null, otherValue);
+        assertThat(b3, is(false));
+        assertThat(x.get(), is(firstValue));
+
+        boolean b4 = x.compareAndSet(firstValue, otherValue);
+        assertThat(b4, is(true));
+        assertThat(x.get(), is(otherValue));
+
+    }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/isis/blob/10d80f3a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/object/layoutxml/ObjectLayoutMetadataFacetDefaultTest.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/object/layoutxml/ObjectLayoutMetadataFacetDefaultTest.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/object/layoutxml/ObjectLayoutMetadataFacetDefaultTest.java
deleted file mode 100644
index 42fa829..0000000
--- a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/object/layoutxml/ObjectLayoutMetadataFacetDefaultTest.java
+++ /dev/null
@@ -1,60 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *        http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- */
-package org.apache.isis.core.metamodel.facets.object.layoutxml;
-
-import java.util.concurrent.atomic.AtomicReference;
-
-import org.junit.Test;
-
-import org.apache.isis.applib.layout.v1_0.PropertyGroupMetadata;
-
-import static org.hamcrest.CoreMatchers.is;
-import static org.hamcrest.CoreMatchers.nullValue;
-import static org.junit.Assert.assertThat;
-
-public class ObjectLayoutMetadataFacetDefaultTest {
-
-    @Test
-    public void xxx() throws Exception {
-
-        final AtomicReference<PropertyGroupMetadata> x = new AtomicReference<>();
-
-        PropertyGroupMetadata firstValue = new PropertyGroupMetadata();
-        PropertyGroupMetadata otherValue = new PropertyGroupMetadata();
-
-        assertThat(x.get(), is(nullValue()));
-
-        boolean b = x.compareAndSet(null, firstValue);
-        assertThat(b, is(true));
-        assertThat(x.get(), is(firstValue));
-
-        boolean b2 = x.compareAndSet(null, firstValue);
-        assertThat(b2, is(false));
-        assertThat(x.get(), is(firstValue));
-
-        boolean b3 = x.compareAndSet(null, otherValue);
-        assertThat(b3, is(false));
-        assertThat(x.get(), is(firstValue));
-
-        boolean b4 = x.compareAndSet(firstValue, otherValue);
-        assertThat(b4, is(true));
-        assertThat(x.get(), is(otherValue));
-
-    }
-}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/isis/blob/10d80f3a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/layoutxml/v1_0/FCPageTest.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/layoutxml/v1_0/FCPageTest.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/layoutxml/v1_0/FCPageTest.java
new file mode 100644
index 0000000..88fcc50
--- /dev/null
+++ b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/layoutxml/v1_0/FCPageTest.java
@@ -0,0 +1,124 @@
+/*
+ *  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.layoutxml.v1_0;
+
+import java.util.Map;
+
+import javax.xml.bind.Marshaller;
+
+import com.google.common.collect.ImmutableMap;
+import com.google.common.collect.Lists;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+
+import org.apache.isis.applib.layout.members.v1.ActionLayoutData;
+import org.apache.isis.applib.layout.members.v1.CollectionLayoutData;
+import org.apache.isis.applib.layout.fixedcols.FCColumn;
+import org.apache.isis.applib.layout.fixedcols.FCPage;
+import org.apache.isis.applib.layout.members.v1.PropertyLayoutData;
+import org.apache.isis.applib.layout.members.v1.FieldSet;
+import org.apache.isis.applib.layout.fixedcols.FCTab;
+import org.apache.isis.applib.layout.fixedcols.FCTabGroup;
+import org.apache.isis.applib.services.jaxb.JaxbService;
+
+import static org.hamcrest.CoreMatchers.equalTo;
+import static org.hamcrest.CoreMatchers.is;
+import static org.junit.Assert.assertThat;
+
+public class FCPageTest {
+
+    private JaxbService jaxbService;
+
+    @Before
+    public void setUp() throws Exception {
+        jaxbService = new JaxbService.Simple();
+    }
+
+    @After
+    public void tearDown() throws Exception {
+
+    }
+
+    @Test
+    public void xxx() throws Exception {
+
+        final FCPage FCPage = new FCPage();
+
+        FCPage.setTabGroups(Lists.<FCTabGroup>newArrayList());
+        FCPage.getTabGroups().add(new FCTabGroup());
+        FCTabGroup tabGroup = FCPage.getTabGroups().get(0);
+        FCTab FCTab = tabGroup.getTabs().get(0);
+        FCTab.setName("Common");
+        FCColumn left = FCTab.getLeft();
+
+        FieldSet leftPropGroup = new FieldSet();
+        left.setFieldSets(Lists.<FieldSet>newArrayList());
+        left.getFieldSets().add(leftPropGroup);
+        leftPropGroup.setName("General");
+
+        CollectionLayoutData similarToColl = new CollectionLayoutData();
+        left.setCollections(Lists.<CollectionLayoutData>newArrayList());
+        left.getCollections().add(similarToColl);
+        similarToColl.setId("similarTo");
+
+        left.getFieldSets().add(new FieldSet("General"));
+        PropertyLayoutData namePropertyLayoutData = new PropertyLayoutData("name");
+        left.getFieldSets().get(0).getProperties().add(namePropertyLayoutData);
+
+        ActionLayoutData updateNameActionLayoutData = new ActionLayoutData();
+        updateNameActionLayoutData.setId("updateName");
+        namePropertyLayoutData.setActions(Lists.<ActionLayoutData>newArrayList());
+        namePropertyLayoutData.getActions().add(updateNameActionLayoutData);
+
+        ActionLayoutData deleteActionLayoutData = new ActionLayoutData();
+        deleteActionLayoutData.setId("delete");
+        FCPage.setActions(Lists.<ActionLayoutData>newArrayList());
+        FCPage.getActions().add(deleteActionLayoutData);
+
+        String xml = jaxbService.toXml(FCPage,
+                ImmutableMap.<String,Object>of(
+                        Marshaller.JAXB_SCHEMA_LOCATION,
+                        "http://isis.apache.org/schema/applib/layout http://isis.apache.org/schema/applib/layout/layout-1.0.xsd"
+                ));
+        System.out.println(xml);
+
+        FCPage FCPageRoundtripped = jaxbService.fromXml(FCPage.class, xml);
+        String xmlRoundtripped = jaxbService.toXml(FCPageRoundtripped,
+                ImmutableMap.<String,Object>of(
+                        Marshaller.JAXB_SCHEMA_LOCATION,
+                        "http://isis.apache.org/schema/applib/layout http://isis.apache.org/schema/applib/layout/layout-1.0.xsd"
+                ));
+        assertThat(xml, is(equalTo(xmlRoundtripped)));
+
+
+        System.out.println("==========");
+
+        dumpXsd(FCPage);
+    }
+
+    protected void dumpXsd(final FCPage FCPage) {
+        Map<String, String> schemas = jaxbService.toXsd(FCPage, JaxbService.IsisSchemas.INCLUDE);
+        for (Map.Entry<String, String> entry : schemas.entrySet()) {
+            //System.out.println(entry.getKey() + ":");
+            System.out.println(entry.getValue());
+        }
+    }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/isis/blob/10d80f3a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/layoutxml/v1_0/ObjectLayoutMetadataTest.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/layoutxml/v1_0/ObjectLayoutMetadataTest.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/layoutxml/v1_0/ObjectLayoutMetadataTest.java
deleted file mode 100644
index e0f9737..0000000
--- a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/layoutxml/v1_0/ObjectLayoutMetadataTest.java
+++ /dev/null
@@ -1,124 +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.layoutxml.v1_0;
-
-import java.util.Map;
-
-import javax.xml.bind.Marshaller;
-
-import com.google.common.collect.ImmutableMap;
-import com.google.common.collect.Lists;
-
-import org.junit.After;
-import org.junit.Before;
-import org.junit.Test;
-
-import org.apache.isis.applib.layout.v1_0.ActionLayoutMetadata;
-import org.apache.isis.applib.layout.v1_0.CollectionLayoutMetadata;
-import org.apache.isis.applib.layout.fixedcols.ColumnMetadata;
-import org.apache.isis.applib.layout.fixedcols.ObjectLayoutMetadata;
-import org.apache.isis.applib.layout.v1_0.PropertyLayoutMetadata;
-import org.apache.isis.applib.layout.v1_0.PropertyGroupMetadata;
-import org.apache.isis.applib.layout.fixedcols.TabMetadata;
-import org.apache.isis.applib.layout.fixedcols.TabGroupMetadata;
-import org.apache.isis.applib.services.jaxb.JaxbService;
-
-import static org.hamcrest.CoreMatchers.equalTo;
-import static org.hamcrest.CoreMatchers.is;
-import static org.junit.Assert.assertThat;
-
-public class ObjectLayoutMetadataTest {
-
-    private JaxbService jaxbService;
-
-    @Before
-    public void setUp() throws Exception {
-        jaxbService = new JaxbService.Simple();
-    }
-
-    @After
-    public void tearDown() throws Exception {
-
-    }
-
-    @Test
-    public void xxx() throws Exception {
-
-        final ObjectLayoutMetadata objectLayoutMetadata = new ObjectLayoutMetadata();
-
-        objectLayoutMetadata.setTabGroups(Lists.<TabGroupMetadata>newArrayList());
-        objectLayoutMetadata.getTabGroups().add(new TabGroupMetadata());
-        TabGroupMetadata tabGroup = objectLayoutMetadata.getTabGroups().get(0);
-        TabMetadata tabMetadata = tabGroup.getTabs().get(0);
-        tabMetadata.setName("Common");
-        ColumnMetadata left = tabMetadata.getLeft();
-
-        PropertyGroupMetadata leftPropGroup = new PropertyGroupMetadata();
-        left.setPropertyGroups(Lists.<PropertyGroupMetadata>newArrayList());
-        left.getPropertyGroups().add(leftPropGroup);
-        leftPropGroup.setName("General");
-
-        CollectionLayoutMetadata similarToColl = new CollectionLayoutMetadata();
-        left.setCollections(Lists.<CollectionLayoutMetadata>newArrayList());
-        left.getCollections().add(similarToColl);
-        similarToColl.setId("similarTo");
-
-        left.getPropertyGroups().add(new PropertyGroupMetadata("General"));
-        PropertyLayoutMetadata namePropertyLayoutMetadata = new PropertyLayoutMetadata("name");
-        left.getPropertyGroups().get(0).getProperties().add(namePropertyLayoutMetadata);
-
-        ActionLayoutMetadata updateNameActionLayoutMetadata = new ActionLayoutMetadata();
-        updateNameActionLayoutMetadata.setId("updateName");
-        namePropertyLayoutMetadata.setActions(Lists.<ActionLayoutMetadata>newArrayList());
-        namePropertyLayoutMetadata.getActions().add(updateNameActionLayoutMetadata);
-
-        ActionLayoutMetadata deleteActionLayoutMetadata = new ActionLayoutMetadata();
-        deleteActionLayoutMetadata.setId("delete");
-        objectLayoutMetadata.setActions(Lists.<ActionLayoutMetadata>newArrayList());
-        objectLayoutMetadata.getActions().add(deleteActionLayoutMetadata);
-
-        String xml = jaxbService.toXml(objectLayoutMetadata,
-                ImmutableMap.<String,Object>of(
-                        Marshaller.JAXB_SCHEMA_LOCATION,
-                        "http://isis.apache.org/schema/applib/layout http://isis.apache.org/schema/applib/layout/layout-1.0.xsd"
-                ));
-        System.out.println(xml);
-
-        ObjectLayoutMetadata objectLayoutMetadataRoundtripped = jaxbService.fromXml(ObjectLayoutMetadata.class, xml);
-        String xmlRoundtripped = jaxbService.toXml(objectLayoutMetadataRoundtripped,
-                ImmutableMap.<String,Object>of(
-                        Marshaller.JAXB_SCHEMA_LOCATION,
-                        "http://isis.apache.org/schema/applib/layout http://isis.apache.org/schema/applib/layout/layout-1.0.xsd"
-                ));
-        assertThat(xml, is(equalTo(xmlRoundtripped)));
-
-
-        System.out.println("==========");
-
-        dumpXsd(objectLayoutMetadata);
-    }
-
-    protected void dumpXsd(final ObjectLayoutMetadata objectLayoutMetadata) {
-        Map<String, String> schemas = jaxbService.toXsd(objectLayoutMetadata, JaxbService.IsisSchemas.INCLUDE);
-        for (Map.Entry<String, String> entry : schemas.entrySet()) {
-            //System.out.println(entry.getKey() + ":");
-            System.out.println(entry.getValue());
-        }
-    }
-}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/isis/blob/10d80f3a/core/viewer-wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/models/EntityCollectionModel.java
----------------------------------------------------------------------
diff --git a/core/viewer-wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/models/EntityCollectionModel.java b/core/viewer-wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/models/EntityCollectionModel.java
index 463c124..6f39c53 100644
--- a/core/viewer-wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/models/EntityCollectionModel.java
+++ b/core/viewer-wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/models/EntityCollectionModel.java
@@ -31,7 +31,7 @@ import com.google.common.collect.Iterables;
 import com.google.common.collect.Lists;
 import com.google.common.collect.Maps;
 
-import org.apache.isis.applib.layout.v1_0.CollectionLayoutMetadata;
+import org.apache.isis.applib.layout.members.v1.CollectionLayoutData;
 import org.apache.isis.core.commons.factory.InstanceUtil;
 import org.apache.isis.core.commons.lang.ClassUtil;
 import org.apache.isis.core.commons.lang.Closure;
@@ -325,19 +325,19 @@ public class EntityCollectionModel extends ModelAbstract<List<ObjectAdapter>> im
     }
     
     private EntityCollectionModel(final EntityModel entityModel) {
-        this(entityModel.getObjectAdapterMemento(), entityModel.getCollectionLayoutMetadata());
+        this(entityModel.getObjectAdapterMemento(), entityModel.getCollectionLayoutData());
     }
 
-    private EntityCollectionModel(final ObjectAdapterMemento parentObjectAdapterMemento, final CollectionLayoutMetadata collectionLayoutMetadata) {
-        this(parentObjectAdapterMemento, collectionFor(parentObjectAdapterMemento, collectionLayoutMetadata));
+    private EntityCollectionModel(final ObjectAdapterMemento parentObjectAdapterMemento, final CollectionLayoutData collectionLayoutData) {
+        this(parentObjectAdapterMemento, collectionFor(parentObjectAdapterMemento, collectionLayoutData));
     }
 
     private static OneToManyAssociation collectionFor(
-            final ObjectAdapterMemento parentObjectAdapterMemento, final CollectionLayoutMetadata collectionLayoutMetadata) {
-        if(collectionLayoutMetadata == null) {
+            final ObjectAdapterMemento parentObjectAdapterMemento, final CollectionLayoutData collectionLayoutData) {
+        if(collectionLayoutData == null) {
             throw new IllegalArgumentException("EntityModel must have a CollectionLayoutMetadata");
         }
-        final String collectionId = collectionLayoutMetadata.getId();
+        final String collectionId = collectionLayoutData.getId();
         final ObjectSpecId objectSpecId = parentObjectAdapterMemento.getObjectSpecId();
         final ObjectSpecification objectSpec = getSpecificationLoaderStatic().lookupBySpecId(objectSpecId);
         final OneToManyAssociation otma = (OneToManyAssociation) objectSpec.getAssociation(collectionId);


[06/18] isis git commit: Merge branch 'master' into ISIS-993

Posted by da...@apache.org.
Merge branch 'master' into ISIS-993


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

Branch: refs/heads/ISIS-993
Commit: b72bce9050b3bc34c32b8a1902fbb7be7789de23
Parents: 74e5bd0 a195f62
Author: Dan Haywood <da...@haywood-associates.co.uk>
Authored: Thu Jan 28 17:11:49 2016 +0000
Committer: Dan Haywood <da...@haywood-associates.co.uk>
Committed: Thu Jan 28 17:11:49 2016 +0000

----------------------------------------------------------------------
 .../guides/_rgcfg_configuring-core.adoc         |   2 +-
 .../guides/_ugvw_configuration-properties.adoc  |  13 +++++++++
 ...-settings-file-templates-for-apache-isis.jar | Bin 9104 -> 9105 bytes
 .../resources/templates/isis-templates-idea.xml |   2 +-
 .../wicket/viewer/IsisWicketApplication.java    |  27 ++++++++++++++++---
 5 files changed, 38 insertions(+), 6 deletions(-)
----------------------------------------------------------------------



[18/18] isis git commit: ISIS-993: bootstrap3 schema now properly defined and serializing ok. Also juggling around with the common (nee members)

Posted by da...@apache.org.
ISIS-993: bootstrap3 schema now properly defined and serializing ok.  Also juggling around with the common (nee members)


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

Branch: refs/heads/ISIS-993
Commit: 65f7d320fa95cf45aa6db99f66e1165b2ba4f5d8
Parents: 8f0abcd
Author: Dan Haywood <da...@haywood-associates.co.uk>
Authored: Sun Jan 31 10:56:33 2016 +0000
Committer: Dan Haywood <da...@haywood-associates.co.uk>
Committed: Sun Jan 31 10:56:33 2016 +0000

----------------------------------------------------------------------
 .../applib/layout/bootstrap3/bootstrap3.xsd     | 134 ++++++++++
 .../schema/applib/layout/common/common.xsd      | 132 ++++++++++
 .../applib/layout/fixedcols/fixedcols.xsd       |  12 +-
 .../schema/applib/layout/members/v1/members.xsd | 109 --------
 .../isis/applib/annotation/ActionLayout.java    |   4 +-
 .../isis/applib/annotation/BookmarkPolicy.java  |   2 +-
 .../isis/applib/annotation/Contributed.java     |   2 +-
 .../isis/applib/annotation/LabelPosition.java   |   2 +-
 .../isis/applib/annotation/RenderType.java      |   2 +-
 .../apache/isis/applib/annotation/Where.java    |   2 +-
 .../layout/bootstrap3/BS3ClearFixHidden.java    |   4 +
 .../layout/bootstrap3/BS3ClearFixVisible.java   |   4 +
 .../isis/applib/layout/bootstrap3/BS3Col.java   | 137 +++++++---
 .../isis/applib/layout/bootstrap3/BS3Page.java  |  60 ++---
 .../isis/applib/layout/bootstrap3/BS3Row.java   |   9 +-
 .../applib/layout/common/ActionLayoutData.java  | 230 ++++++++++++++++
 .../isis/applib/layout/common/ActionOwner.java  |  25 ++
 .../layout/common/CollectionLayoutData.java     | 263 +++++++++++++++++++
 .../layout/common/DomainObjectLayoutData.java   | 162 ++++++++++++
 .../isis/applib/layout/common/FieldSet.java     | 157 +++++++++++
 .../isis/applib/layout/common/MemberRegion.java |  33 +++
 .../applib/layout/common/MemberRegionOwner.java |  23 ++
 .../apache/isis/applib/layout/common/Owned.java |  23 ++
 .../apache/isis/applib/layout/common/Owner.java |  24 ++
 .../apache/isis/applib/layout/common/Page.java  |  38 +++
 .../layout/common/PropertyLayoutData.java       | 248 +++++++++++++++++
 .../isis/applib/layout/common/package-info.java |  36 +++
 .../isis/applib/layout/fixedcols/FCColumn.java  |  16 +-
 .../applib/layout/fixedcols/FCColumnOwner.java  |   2 +-
 .../isis/applib/layout/fixedcols/FCPage.java    |  15 +-
 .../isis/applib/layout/fixedcols/FCTab.java     |   8 +-
 .../applib/layout/fixedcols/FCTabGroup.java     |   4 +-
 .../layout/fixedcols/FCTabGroupOwner.java       |   2 +-
 .../applib/layout/members/MemberRegion.java     |  33 ---
 .../layout/members/MemberRegionOwner.java       |  23 --
 .../isis/applib/layout/members/Owned.java       |  23 --
 .../isis/applib/layout/members/Owner.java       |  24 --
 .../layout/members/v1/ActionLayoutData.java     | 227 ----------------
 .../applib/layout/members/v1/ActionOwner.java   |  27 --
 .../layout/members/v1/CollectionLayoutData.java | 260 ------------------
 .../members/v1/DomainObjectLayoutData.java      | 158 -----------
 .../isis/applib/layout/members/v1/FieldSet.java | 151 -----------
 .../isis/applib/layout/members/v1/Page.java     |  38 ---
 .../layout/members/v1/PropertyLayoutData.java   | 245 -----------------
 .../applib/layout/members/v1/package-info.java  |  36 ---
 .../layout/Object_downloadLayoutXml.java        |   2 +-
 .../services/layout/Object_viewLayout.java      |   2 +-
 .../applib/services/layout/PageService.java     |   2 +-
 .../layout/ActionPositionFacetForActionXml.java |   2 +-
 .../layout/BookmarkPolicyFacetForActionXml.java |   2 +-
 .../layout/CssClassFaFacetForActionXml.java     |   2 +-
 .../layout/CssClassFacetForActionXml.java       |   2 +-
 .../layout/DescribedAsFacetForActionXml.java    |   2 +-
 .../layout/HiddenFacetForActionLayoutXml.java   |   2 +-
 .../actions/layout/NamedFacetForActionXml.java  |   2 +-
 .../layout/CssClassFacetForCollectionXml.java   |   2 +-
 .../DefaultViewFacetForCollectionXml.java       |   2 +-
 .../DescribedAsFacetForCollectionXml.java       |   2 +-
 .../layout/HiddenFacetForCollectionXml.java     |   2 +-
 .../layout/NamedFacetForCollectionXml.java      |   2 +-
 .../layout/PagedFacetForCollectionXml.java      |   2 +-
 .../layout/SortedByFacetForCollectionXml.java   |   2 +-
 .../facets/object/layoutmetadata/PageFacet.java |   2 +-
 .../object/layoutmetadata/PageFacetDefault.java |   2 +-
 .../CssClassFacetForPropertyXml.java            |   2 +-
 .../DescribedAsFacetForPropertyXml.java         |   2 +-
 .../HiddenFacetForPropertyXml.java              |   2 +-
 .../LabelAtFacetForPropertyXml.java             |   2 +-
 .../MultiLineFacetForPropertyXml.java           |   2 +-
 .../NamedFacetForPropertyXml.java               |   2 +-
 .../RenderedAdjustedFacetForPropertyXml.java    |   2 +-
 .../TypicalLengthFacetForPropertyXml.java       |   2 +-
 .../services/layout/PageServiceDefault.java     |   2 +-
 .../layout/provider/PageNormalizer.java         |   2 +-
 .../layout/provider/PageNormalizerAbstract.java |   2 +-
 .../layout/provider/PageNormalizerFC.java       |  12 +-
 .../layout/provider/PageNormalizerService.java  |   2 +-
 .../provider/PageNormalizerServiceDefault.java  |  12 +-
 .../services/metamodel/MetadataMenu.java        |   2 +-
 .../object/layoutxml/PageFacetDefaultTest.java  |   2 +-
 .../layout/bootstrap3/BS3PageTest.java          | 149 +++++++++++
 .../metamodel/layout/fixedcols/FCPageTest.java  | 120 +++++++++
 .../metamodel/layoutxml/v1_0/FCPageTest.java    | 120 ---------
 .../model/models/EntityCollectionModel.java     |   2 +-
 .../viewer/wicket/model/models/EntityModel.java |   4 +-
 .../components/entity/EntityPanelFactory.java   |   2 +-
 .../wicket/ui/components/entity/PropUtil.java   |   2 +-
 .../collections/EntityCollectionsPanel.java     |   2 +-
 .../components/entity/column/EntityColumn.java  |   4 +-
 .../entity/propgroup/PropertyGroup.java         |   4 +-
 .../wicket/ui/pages/bootstrap-overrides.css     |   4 +
 .../wicket/ui/pages/entity/EntityPage.java      |   2 +-
 .../dom/simple/SimpleObject.layout-BS3.xml      |  42 +++
 .../dom/simple/SimpleObject.layout.xml          |  50 ++--
 94 files changed, 2104 insertions(+), 1662 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/isis/blob/65f7d320/adocs/documentation/src/main/asciidoc/schema/applib/layout/bootstrap3/bootstrap3.xsd
----------------------------------------------------------------------
diff --git a/adocs/documentation/src/main/asciidoc/schema/applib/layout/bootstrap3/bootstrap3.xsd b/adocs/documentation/src/main/asciidoc/schema/applib/layout/bootstrap3/bootstrap3.xsd
new file mode 100644
index 0000000..0505e4d
--- /dev/null
+++ b/adocs/documentation/src/main/asciidoc/schema/applib/layout/bootstrap3/bootstrap3.xsd
@@ -0,0 +1,134 @@
+<?xml version="1.0" standalone="yes"?>
+<xs:schema elementFormDefault="qualified" version="1.0" targetNamespace="http://isis.apache.org/schema/applib/layout/bootstrap3" xmlns:tns="http://isis.apache.org/schema/applib/layout/bootstrap3" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:ns1="http://isis.apache.org/schema/applib/layout/common">
+
+    <xs:import namespace="http://isis.apache.org/schema/applib/layout/common" schemaLocation="../common"/>
+
+    <xs:element name="clearFixHidden" type="tns:clearFixHidden"/>
+
+    <xs:element name="clearFixVisible" type="tns:clearFixVisible"/>
+
+    <xs:element name="col" type="tns:col"/>
+
+    <xs:element name="page" type="tns:page"/>
+
+    <xs:complexType name="page">
+        <xs:complexContent>
+            <xs:extension base="tns:bs3ElementAbstract">
+                <xs:sequence>
+                    <xs:element name="row" type="tns:row" maxOccurs="unbounded"/>
+                    <xs:element name="metadataErrors" type="xs:string" minOccurs="0" maxOccurs="unbounded"/>
+                </xs:sequence>
+            </xs:extension>
+        </xs:complexContent>
+    </xs:complexType>
+
+    <xs:complexType name="bs3ElementAbstract" abstract="true">
+        <xs:sequence/>
+        <xs:attribute name="cssClass" type="xs:string"/>
+    </xs:complexType>
+
+    <xs:complexType name="row">
+        <xs:complexContent>
+            <xs:extension base="tns:bs3ElementAbstract">
+                <xs:sequence>
+                    <xs:choice minOccurs="0" maxOccurs="unbounded">
+                        <xs:element ref="tns:col"/>
+                        <xs:element ref="tns:clearFixVisible"/>
+                        <xs:element ref="tns:clearFixHidden"/>
+                    </xs:choice>
+                </xs:sequence>
+            </xs:extension>
+        </xs:complexContent>
+    </xs:complexType>
+
+    <xs:complexType name="col">
+        <xs:complexContent>
+            <xs:extension base="tns:bs3RowContent">
+                <xs:sequence>
+                    <xs:element ref="ns1:domainObject" minOccurs="0"/>
+                    <xs:element ref="ns1:action" minOccurs="0" maxOccurs="unbounded"/>
+                    <xs:element name="row" type="tns:row" minOccurs="0" maxOccurs="unbounded"/>
+                    <xs:element name="tabGroup" type="tns:tabGroup" minOccurs="0" maxOccurs="unbounded"/>
+                    <xs:element ref="ns1:fieldSet" minOccurs="0" maxOccurs="unbounded"/>
+                    <xs:element ref="ns1:collection" minOccurs="0" maxOccurs="unbounded"/>
+                </xs:sequence>
+                <xs:attribute name="span" type="xs:int" use="required"/>
+                <xs:attribute name="unreferencedActions" type="xs:boolean" use="required"/>
+                <xs:attribute name="unreferencedCollections" type="xs:boolean" use="required"/>
+                <xs:attribute name="unreferencedProperties" type="xs:boolean" use="required"/>
+            </xs:extension>
+        </xs:complexContent>
+    </xs:complexType>
+
+    <xs:complexType name="bs3RowContent" abstract="true">
+        <xs:complexContent>
+            <xs:extension base="tns:bs3ElementAbstract">
+                <xs:sequence/>
+                <xs:attribute name="size" type="tns:size"/>
+            </xs:extension>
+        </xs:complexContent>
+    </xs:complexType>
+
+    <xs:complexType name="tabGroup">
+        <xs:complexContent>
+            <xs:extension base="tns:bs3ElementAbstract">
+                <xs:sequence>
+                    <xs:element name="tab" type="tns:tab" maxOccurs="unbounded"/>
+                </xs:sequence>
+            </xs:extension>
+        </xs:complexContent>
+    </xs:complexType>
+
+    <xs:complexType name="tab">
+        <xs:complexContent>
+            <xs:extension base="tns:bs3ElementAbstract">
+                <xs:sequence>
+                    <xs:element name="row" type="tns:row" maxOccurs="unbounded"/>
+                </xs:sequence>
+                <xs:attribute name="name" type="xs:string" use="required"/>
+            </xs:extension>
+        </xs:complexContent>
+    </xs:complexType>
+
+    <xs:complexType name="clearFixVisible">
+        <xs:complexContent>
+            <xs:extension base="tns:bs3ClearFix">
+                <xs:sequence/>
+                <xs:attribute name="cssDisplay" type="tns:cssDisplay" use="required"/>
+            </xs:extension>
+        </xs:complexContent>
+    </xs:complexType>
+
+    <xs:complexType name="bs3ClearFix" abstract="true">
+        <xs:complexContent>
+            <xs:extension base="tns:bs3RowContent">
+                <xs:sequence/>
+            </xs:extension>
+        </xs:complexContent>
+    </xs:complexType>
+
+    <xs:complexType name="clearFixHidden">
+        <xs:complexContent>
+            <xs:extension base="tns:bs3ClearFix">
+                <xs:sequence/>
+            </xs:extension>
+        </xs:complexContent>
+    </xs:complexType>
+
+    <xs:simpleType name="size">
+        <xs:restriction base="xs:string">
+            <xs:enumeration value="XS"/>
+            <xs:enumeration value="SM"/>
+            <xs:enumeration value="MD"/>
+            <xs:enumeration value="LG"/>
+        </xs:restriction>
+    </xs:simpleType>
+
+    <xs:simpleType name="cssDisplay">
+        <xs:restriction base="xs:string">
+            <xs:enumeration value="BLOCK"/>
+            <xs:enumeration value="INLINE"/>
+            <xs:enumeration value="INLINE_BLOCK"/>
+        </xs:restriction>
+    </xs:simpleType>
+</xs:schema>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/isis/blob/65f7d320/adocs/documentation/src/main/asciidoc/schema/applib/layout/common/common.xsd
----------------------------------------------------------------------
diff --git a/adocs/documentation/src/main/asciidoc/schema/applib/layout/common/common.xsd b/adocs/documentation/src/main/asciidoc/schema/applib/layout/common/common.xsd
new file mode 100644
index 0000000..992a378
--- /dev/null
+++ b/adocs/documentation/src/main/asciidoc/schema/applib/layout/common/common.xsd
@@ -0,0 +1,132 @@
+<?xml version="1.0" standalone="yes"?>
+<xs:schema elementFormDefault="qualified" version="1.0" targetNamespace="http://isis.apache.org/schema/applib/layout/common" xmlns:tns="http://isis.apache.org/schema/applib/layout/common" xmlns:xs="http://www.w3.org/2001/XMLSchema">
+
+  <xs:element name="action" type="tns:action"/>
+
+  <xs:element name="collection" type="tns:collection"/>
+
+  <xs:element name="domainObject" type="tns:domainObject"/>
+
+  <xs:element name="fieldSet" type="tns:fieldSet"/>
+
+  <xs:element name="property" type="tns:property"/>
+
+  <xs:complexType name="domainObject">
+    <xs:sequence>
+      <xs:element name="named" type="xs:string" minOccurs="0"/>
+      <xs:element name="describedAs" type="xs:string" minOccurs="0"/>
+      <xs:element name="plural" type="xs:string" minOccurs="0"/>
+      <xs:element name="metadataError" type="xs:string" minOccurs="0"/>
+    </xs:sequence>
+    <xs:attribute name="bookmarking" type="tns:bookmarkPolicy"/>
+    <xs:attribute name="cssClass" type="xs:string"/>
+    <xs:attribute name="cssClassFa" type="xs:string"/>
+    <xs:attribute name="cssClassFaPosition" type="tns:cssClassFaPosition"/>
+  </xs:complexType>
+
+  <xs:complexType name="action">
+    <xs:sequence>
+      <xs:element name="named" type="xs:string" minOccurs="0"/>
+      <xs:element name="describedAs" type="xs:string" minOccurs="0"/>
+      <xs:element name="metadataError" type="xs:string" minOccurs="0"/>
+    </xs:sequence>
+    <xs:attribute name="bookmarking" type="tns:bookmarkPolicy"/>
+    <xs:attribute name="cssClass" type="xs:string"/>
+    <xs:attribute name="cssClassFa" type="xs:string"/>
+    <xs:attribute name="cssClassFaPosition" type="tns:cssClassFaPosition"/>
+    <xs:attribute name="hidden" type="tns:where"/>
+    <xs:attribute name="id" type="xs:string" use="required"/>
+    <xs:attribute name="namedEscaped" type="xs:boolean"/>
+    <xs:attribute name="position" type="tns:position"/>
+  </xs:complexType>
+
+  <xs:complexType name="fieldSet">
+    <xs:sequence>
+      <xs:element ref="tns:action" minOccurs="0" maxOccurs="unbounded"/>
+      <xs:element ref="tns:property" maxOccurs="unbounded"/>
+    </xs:sequence>
+    <xs:attribute name="name" type="xs:string" use="required"/>
+  </xs:complexType>
+
+  <xs:complexType name="property">
+    <xs:sequence>
+      <xs:element name="named" type="xs:string" minOccurs="0"/>
+      <xs:element name="describedAs" type="xs:string" minOccurs="0"/>
+      <xs:element ref="tns:action" minOccurs="0" maxOccurs="unbounded"/>
+      <xs:element name="metadataError" type="xs:string" minOccurs="0"/>
+    </xs:sequence>
+    <xs:attribute name="cssClass" type="xs:string"/>
+    <xs:attribute name="hidden" type="tns:where"/>
+    <xs:attribute name="id" type="xs:string" use="required"/>
+    <xs:attribute name="labelPosition" type="tns:labelPosition"/>
+    <xs:attribute name="multiLine" type="xs:int"/>
+    <xs:attribute name="namedEscaped" type="xs:boolean"/>
+    <xs:attribute name="renderedAsDayBefore" type="xs:boolean"/>
+    <xs:attribute name="typicalLength" type="xs:int"/>
+  </xs:complexType>
+
+  <xs:complexType name="collection">
+    <xs:sequence>
+      <xs:element name="named" type="xs:string" minOccurs="0"/>
+      <xs:element name="describedAs" type="xs:string" minOccurs="0"/>
+      <xs:element name="sortedBy" type="xs:string" minOccurs="0"/>
+      <xs:element ref="tns:action" minOccurs="0" maxOccurs="unbounded"/>
+      <xs:element name="metadataError" type="xs:string" minOccurs="0"/>
+    </xs:sequence>
+    <xs:attribute name="cssClass" type="xs:string"/>
+    <xs:attribute name="defaultView" type="xs:string"/>
+    <xs:attribute name="hidden" type="tns:where"/>
+    <xs:attribute name="id" type="xs:string" use="required"/>
+    <xs:attribute name="namedEscaped" type="xs:boolean"/>
+    <xs:attribute name="paged" type="xs:int"/>
+  </xs:complexType>
+
+  <xs:simpleType name="bookmarkPolicy">
+    <xs:restriction base="xs:string">
+      <xs:enumeration value="AS_ROOT"/>
+      <xs:enumeration value="AS_CHILD"/>
+      <xs:enumeration value="NEVER"/>
+    </xs:restriction>
+  </xs:simpleType>
+
+  <xs:simpleType name="cssClassFaPosition">
+    <xs:restriction base="xs:string">
+      <xs:enumeration value="LEFT"/>
+      <xs:enumeration value="RIGHT"/>
+    </xs:restriction>
+  </xs:simpleType>
+
+  <xs:simpleType name="where">
+    <xs:restriction base="xs:string">
+      <xs:enumeration value="EVERYWHERE"/>
+      <xs:enumeration value="ANYWHERE"/>
+      <xs:enumeration value="OBJECT_FORMS"/>
+      <xs:enumeration value="REFERENCES_PARENT"/>
+      <xs:enumeration value="PARENTED_TABLES"/>
+      <xs:enumeration value="STANDALONE_TABLES"/>
+      <xs:enumeration value="ALL_TABLES"/>
+      <xs:enumeration value="ALL_EXCEPT_STANDALONE_TABLES"/>
+      <xs:enumeration value="NOWHERE"/>
+      <xs:enumeration value="NOT_SPECIFIED"/>
+    </xs:restriction>
+  </xs:simpleType>
+
+  <xs:simpleType name="position">
+    <xs:restriction base="xs:string">
+      <xs:enumeration value="BELOW"/>
+      <xs:enumeration value="RIGHT"/>
+      <xs:enumeration value="PANEL"/>
+      <xs:enumeration value="PANEL_DROPDOWN"/>
+    </xs:restriction>
+  </xs:simpleType>
+
+  <xs:simpleType name="labelPosition">
+    <xs:restriction base="xs:string">
+      <xs:enumeration value="DEFAULT"/>
+      <xs:enumeration value="LEFT"/>
+      <xs:enumeration value="RIGHT"/>
+      <xs:enumeration value="TOP"/>
+      <xs:enumeration value="NONE"/>
+    </xs:restriction>
+  </xs:simpleType>
+</xs:schema>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/isis/blob/65f7d320/adocs/documentation/src/main/asciidoc/schema/applib/layout/fixedcols/fixedcols.xsd
----------------------------------------------------------------------
diff --git a/adocs/documentation/src/main/asciidoc/schema/applib/layout/fixedcols/fixedcols.xsd b/adocs/documentation/src/main/asciidoc/schema/applib/layout/fixedcols/fixedcols.xsd
index bc3a648..5934983 100644
--- a/adocs/documentation/src/main/asciidoc/schema/applib/layout/fixedcols/fixedcols.xsd
+++ b/adocs/documentation/src/main/asciidoc/schema/applib/layout/fixedcols/fixedcols.xsd
@@ -1,13 +1,13 @@
 <?xml version="1.0" standalone="yes"?>
-<xs:schema elementFormDefault="qualified" version="1.0" targetNamespace="http://isis.apache.org/schema/applib/layout/fixedcols" xmlns:tns="http://isis.apache.org/schema/applib/layout/fixedcols" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:ns1="http://isis.apache.org/schema/applib/layout/members/v1">
+<xs:schema elementFormDefault="qualified" version="1.0" targetNamespace="http://isis.apache.org/schema/applib/layout/fixedcols" xmlns:tns="http://isis.apache.org/schema/applib/layout/fixedcols" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:ns1="http://isis.apache.org/schema/applib/layout/common">
 
-    <xs:import namespace="http://isis.apache.org/schema/applib/layout/members/v1" schemaLocation="../members/v1"/>
+    <xs:import namespace="http://isis.apache.org/schema/applib/layout/common" schemaLocation="../common"/>
 
     <xs:element name="page" type="tns:page"/>
 
     <xs:complexType name="page">
         <xs:sequence>
-            <xs:element name="action" type="ns1:actionLayout" minOccurs="0" maxOccurs="unbounded"/>
+            <xs:element ref="ns1:action" minOccurs="0" maxOccurs="unbounded"/>
             <xs:element name="left" type="tns:fcColumn" minOccurs="0"/>
             <xs:element name="tabGroup" type="tns:fcTabGroup" maxOccurs="unbounded"/>
             <xs:element name="right" type="tns:fcColumn" minOccurs="0"/>
@@ -16,8 +16,8 @@
 
     <xs:complexType name="fcColumn">
         <xs:sequence>
-            <xs:element name="fieldSet" type="ns1:fieldSet" minOccurs="0" maxOccurs="unbounded"/>
-            <xs:element name="collection" type="ns1:collectionLayoutData" minOccurs="0" maxOccurs="unbounded"/>
+            <xs:element ref="ns1:fieldSet" minOccurs="0" maxOccurs="unbounded"/>
+            <xs:element ref="ns1:collection" minOccurs="0" maxOccurs="unbounded"/>
         </xs:sequence>
         <xs:attribute name="span" type="xs:int" use="required"/>
     </xs:complexType>
@@ -36,4 +36,4 @@
         </xs:sequence>
         <xs:attribute name="name" type="xs:string" use="required"/>
     </xs:complexType>
-</xs:schema>
\ No newline at end of file
+</xs:schema>

http://git-wip-us.apache.org/repos/asf/isis/blob/65f7d320/adocs/documentation/src/main/asciidoc/schema/applib/layout/members/v1/members.xsd
----------------------------------------------------------------------
diff --git a/adocs/documentation/src/main/asciidoc/schema/applib/layout/members/v1/members.xsd b/adocs/documentation/src/main/asciidoc/schema/applib/layout/members/v1/members.xsd
deleted file mode 100644
index c5940b4..0000000
--- a/adocs/documentation/src/main/asciidoc/schema/applib/layout/members/v1/members.xsd
+++ /dev/null
@@ -1,109 +0,0 @@
-<?xml version="1.0" standalone="yes"?>
-<xs:schema elementFormDefault="qualified" version="1.0" targetNamespace="http://isis.apache.org/schema/applib/layout/members/v1" xmlns:tns="http://isis.apache.org/schema/applib/layout/members/v1" xmlns:xs="http://www.w3.org/2001/XMLSchema">
-
-  <xs:complexType name="actionLayout">
-    <xs:sequence>
-      <xs:element name="named" type="xs:string" minOccurs="0"/>
-      <xs:element name="describedAs" type="xs:string" minOccurs="0"/>
-      <xs:element name="metadataError" type="xs:string" minOccurs="0"/>
-    </xs:sequence>
-    <xs:attribute name="bookmarking" type="tns:bookmarkPolicy"/>
-    <xs:attribute name="cssClass" type="xs:string"/>
-    <xs:attribute name="cssClassFa" type="xs:string"/>
-    <xs:attribute name="cssClassFaPosition" type="tns:cssClassFaPosition"/>
-    <xs:attribute name="hidden" type="tns:where"/>
-    <xs:attribute name="id" type="xs:string" use="required"/>
-    <xs:attribute name="namedEscaped" type="xs:boolean"/>
-    <xs:attribute name="position" type="tns:position"/>
-  </xs:complexType>
-
-  <xs:complexType name="fieldSet">
-    <xs:sequence>
-      <xs:element name="action" type="tns:actionLayout" minOccurs="0" maxOccurs="unbounded"/>
-      <xs:element name="property" type="tns:propertyLayout" maxOccurs="unbounded"/>
-    </xs:sequence>
-    <xs:attribute name="name" type="xs:string" use="required"/>
-  </xs:complexType>
-
-  <xs:complexType name="propertyLayout">
-    <xs:sequence>
-      <xs:element name="named" type="xs:string" minOccurs="0"/>
-      <xs:element name="describedAs" type="xs:string" minOccurs="0"/>
-      <xs:element name="action" type="tns:actionLayout" minOccurs="0" maxOccurs="unbounded"/>
-      <xs:element name="metadataError" type="xs:string" minOccurs="0"/>
-    </xs:sequence>
-    <xs:attribute name="cssClass" type="xs:string"/>
-    <xs:attribute name="hidden" type="tns:where"/>
-    <xs:attribute name="id" type="xs:string" use="required"/>
-    <xs:attribute name="labelPosition" type="tns:labelPosition"/>
-    <xs:attribute name="multiLine" type="xs:int"/>
-    <xs:attribute name="namedEscaped" type="xs:boolean"/>
-    <xs:attribute name="renderedAsDayBefore" type="xs:boolean"/>
-    <xs:attribute name="typicalLength" type="xs:int"/>
-  </xs:complexType>
-
-  <xs:complexType name="collectionLayoutData">
-    <xs:sequence>
-      <xs:element name="named" type="xs:string" minOccurs="0"/>
-      <xs:element name="describedAs" type="xs:string" minOccurs="0"/>
-      <xs:element name="sortedBy" type="xs:string" minOccurs="0"/>
-      <xs:element name="action" type="tns:actionLayout" minOccurs="0" maxOccurs="unbounded"/>
-      <xs:element name="metadataError" type="xs:string" minOccurs="0"/>
-    </xs:sequence>
-    <xs:attribute name="cssClass" type="xs:string"/>
-    <xs:attribute name="defaultView" type="xs:string"/>
-    <xs:attribute name="hidden" type="tns:where"/>
-    <xs:attribute name="id" type="xs:string" use="required"/>
-    <xs:attribute name="namedEscaped" type="xs:boolean"/>
-    <xs:attribute name="paged" type="xs:int"/>
-  </xs:complexType>
-
-  <xs:simpleType name="bookmarkPolicy">
-    <xs:restriction base="xs:string">
-      <xs:enumeration value="AS_ROOT"/>
-      <xs:enumeration value="AS_CHILD"/>
-      <xs:enumeration value="NEVER"/>
-    </xs:restriction>
-  </xs:simpleType>
-
-  <xs:simpleType name="cssClassFaPosition">
-    <xs:restriction base="xs:string">
-      <xs:enumeration value="LEFT"/>
-      <xs:enumeration value="RIGHT"/>
-    </xs:restriction>
-  </xs:simpleType>
-
-  <xs:simpleType name="where">
-    <xs:restriction base="xs:string">
-      <xs:enumeration value="EVERYWHERE"/>
-      <xs:enumeration value="ANYWHERE"/>
-      <xs:enumeration value="OBJECT_FORMS"/>
-      <xs:enumeration value="REFERENCES_PARENT"/>
-      <xs:enumeration value="PARENTED_TABLES"/>
-      <xs:enumeration value="STANDALONE_TABLES"/>
-      <xs:enumeration value="ALL_TABLES"/>
-      <xs:enumeration value="ALL_EXCEPT_STANDALONE_TABLES"/>
-      <xs:enumeration value="NOWHERE"/>
-      <xs:enumeration value="NOT_SPECIFIED"/>
-    </xs:restriction>
-  </xs:simpleType>
-
-  <xs:simpleType name="position">
-    <xs:restriction base="xs:string">
-      <xs:enumeration value="BELOW"/>
-      <xs:enumeration value="RIGHT"/>
-      <xs:enumeration value="PANEL"/>
-      <xs:enumeration value="PANEL_DROPDOWN"/>
-    </xs:restriction>
-  </xs:simpleType>
-
-  <xs:simpleType name="labelPosition">
-    <xs:restriction base="xs:string">
-      <xs:enumeration value="DEFAULT"/>
-      <xs:enumeration value="LEFT"/>
-      <xs:enumeration value="RIGHT"/>
-      <xs:enumeration value="TOP"/>
-      <xs:enumeration value="NONE"/>
-    </xs:restriction>
-  </xs:simpleType>
-</xs:schema>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/isis/blob/65f7d320/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 d5428d2..5aaf4ce 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
@@ -75,7 +75,7 @@ public @interface ActionLayout {
     CssClassFaPosition cssClassFaPosition() default CssClassFaPosition.LEFT;
 
     @XmlType(
-            namespace = "http://isis.apache.org/schema/applib/layout/members/v1"
+            namespace = "http://isis.apache.org/schema/applib/layout/common"
     )
     enum CssClassFaPosition {
         LEFT, RIGHT
@@ -115,7 +115,7 @@ public @interface ActionLayout {
     Position position() default Position.BELOW;
 
     @XmlType(
-            namespace = "http://isis.apache.org/schema/applib/layout/members/v1"
+            namespace = "http://isis.apache.org/schema/applib/layout/common"
     )
     enum Position {
         BELOW,

http://git-wip-us.apache.org/repos/asf/isis/blob/65f7d320/core/applib/src/main/java/org/apache/isis/applib/annotation/BookmarkPolicy.java
----------------------------------------------------------------------
diff --git a/core/applib/src/main/java/org/apache/isis/applib/annotation/BookmarkPolicy.java b/core/applib/src/main/java/org/apache/isis/applib/annotation/BookmarkPolicy.java
index 2ab7a7c..483e4f1 100644
--- a/core/applib/src/main/java/org/apache/isis/applib/annotation/BookmarkPolicy.java
+++ b/core/applib/src/main/java/org/apache/isis/applib/annotation/BookmarkPolicy.java
@@ -22,7 +22,7 @@ package org.apache.isis.applib.annotation;
 import javax.xml.bind.annotation.XmlType;
 
 @XmlType(
-        namespace = "http://isis.apache.org/schema/applib/layout/members/v1"
+        namespace = "http://isis.apache.org/schema/applib/layout/common"
 )
 public enum BookmarkPolicy {
     /**

http://git-wip-us.apache.org/repos/asf/isis/blob/65f7d320/core/applib/src/main/java/org/apache/isis/applib/annotation/Contributed.java
----------------------------------------------------------------------
diff --git a/core/applib/src/main/java/org/apache/isis/applib/annotation/Contributed.java b/core/applib/src/main/java/org/apache/isis/applib/annotation/Contributed.java
index e3fbc14..cabb920 100644
--- a/core/applib/src/main/java/org/apache/isis/applib/annotation/Contributed.java
+++ b/core/applib/src/main/java/org/apache/isis/applib/annotation/Contributed.java
@@ -25,7 +25,7 @@ import javax.xml.bind.annotation.XmlType;
  * The means by which a domain service action will be contributed to a domain object.
  */
 @XmlType(
-        namespace = "http://isis.apache.org/schema/applib/layout/members/v1"
+        namespace = "http://isis.apache.org/schema/applib/layout/common"
 )
 public enum Contributed {
     /**

http://git-wip-us.apache.org/repos/asf/isis/blob/65f7d320/core/applib/src/main/java/org/apache/isis/applib/annotation/LabelPosition.java
----------------------------------------------------------------------
diff --git a/core/applib/src/main/java/org/apache/isis/applib/annotation/LabelPosition.java b/core/applib/src/main/java/org/apache/isis/applib/annotation/LabelPosition.java
index 5b5873b..e43dc31 100644
--- a/core/applib/src/main/java/org/apache/isis/applib/annotation/LabelPosition.java
+++ b/core/applib/src/main/java/org/apache/isis/applib/annotation/LabelPosition.java
@@ -27,7 +27,7 @@ import javax.xml.bind.annotation.XmlType;
  * @see org.apache.isis.applib.annotation.ParameterLayout
  */
 @XmlType(
-        namespace = "http://isis.apache.org/schema/applib/layout/members/v1"
+        namespace = "http://isis.apache.org/schema/applib/layout/common"
 )
 public enum LabelPosition {
     DEFAULT,

http://git-wip-us.apache.org/repos/asf/isis/blob/65f7d320/core/applib/src/main/java/org/apache/isis/applib/annotation/RenderType.java
----------------------------------------------------------------------
diff --git a/core/applib/src/main/java/org/apache/isis/applib/annotation/RenderType.java b/core/applib/src/main/java/org/apache/isis/applib/annotation/RenderType.java
index 8af27cb..d1205fa 100644
--- a/core/applib/src/main/java/org/apache/isis/applib/annotation/RenderType.java
+++ b/core/applib/src/main/java/org/apache/isis/applib/annotation/RenderType.java
@@ -21,7 +21,7 @@ package org.apache.isis.applib.annotation;
 import javax.xml.bind.annotation.XmlType;
 
 @XmlType(
-        namespace = "http://isis.apache.org/schema/applib/layout/members/v1"
+        namespace = "http://isis.apache.org/schema/applib/layout/common"
 )
 public enum RenderType {
     EAGERLY,

http://git-wip-us.apache.org/repos/asf/isis/blob/65f7d320/core/applib/src/main/java/org/apache/isis/applib/annotation/Where.java
----------------------------------------------------------------------
diff --git a/core/applib/src/main/java/org/apache/isis/applib/annotation/Where.java b/core/applib/src/main/java/org/apache/isis/applib/annotation/Where.java
index fe35958..ae072d2 100644
--- a/core/applib/src/main/java/org/apache/isis/applib/annotation/Where.java
+++ b/core/applib/src/main/java/org/apache/isis/applib/annotation/Where.java
@@ -41,7 +41,7 @@ import org.apache.isis.applib.util.Enums;
  * the framework developer should only use those values that represent concrete locations.  
  */
 @XmlType(
-        namespace = "http://isis.apache.org/schema/applib/layout/members/v1"
+        namespace = "http://isis.apache.org/schema/applib/layout/common"
 )
 public enum Where {
     /**

http://git-wip-us.apache.org/repos/asf/isis/blob/65f7d320/core/applib/src/main/java/org/apache/isis/applib/layout/bootstrap3/BS3ClearFixHidden.java
----------------------------------------------------------------------
diff --git a/core/applib/src/main/java/org/apache/isis/applib/layout/bootstrap3/BS3ClearFixHidden.java b/core/applib/src/main/java/org/apache/isis/applib/layout/bootstrap3/BS3ClearFixHidden.java
index dd7a33c..4590d1b 100644
--- a/core/applib/src/main/java/org/apache/isis/applib/layout/bootstrap3/BS3ClearFixHidden.java
+++ b/core/applib/src/main/java/org/apache/isis/applib/layout/bootstrap3/BS3ClearFixHidden.java
@@ -18,8 +18,12 @@
  */
 package org.apache.isis.applib.layout.bootstrap3;
 
+import javax.xml.bind.annotation.XmlRootElement;
 import javax.xml.bind.annotation.XmlType;
 
+@XmlRootElement(
+        name = "clearFixHidden"
+)
 @XmlType(
         name = "clearFixHidden"
 )

http://git-wip-us.apache.org/repos/asf/isis/blob/65f7d320/core/applib/src/main/java/org/apache/isis/applib/layout/bootstrap3/BS3ClearFixVisible.java
----------------------------------------------------------------------
diff --git a/core/applib/src/main/java/org/apache/isis/applib/layout/bootstrap3/BS3ClearFixVisible.java b/core/applib/src/main/java/org/apache/isis/applib/layout/bootstrap3/BS3ClearFixVisible.java
index 644d6b6..903a180 100644
--- a/core/applib/src/main/java/org/apache/isis/applib/layout/bootstrap3/BS3ClearFixVisible.java
+++ b/core/applib/src/main/java/org/apache/isis/applib/layout/bootstrap3/BS3ClearFixVisible.java
@@ -19,8 +19,12 @@
 package org.apache.isis.applib.layout.bootstrap3;
 
 import javax.xml.bind.annotation.XmlAttribute;
+import javax.xml.bind.annotation.XmlRootElement;
 import javax.xml.bind.annotation.XmlType;
 
+@XmlRootElement(
+        name = "clearFixVisible"
+)
 @XmlType(
         name = "clearFixVisible"
 )

http://git-wip-us.apache.org/repos/asf/isis/blob/65f7d320/core/applib/src/main/java/org/apache/isis/applib/layout/bootstrap3/BS3Col.java
----------------------------------------------------------------------
diff --git a/core/applib/src/main/java/org/apache/isis/applib/layout/bootstrap3/BS3Col.java b/core/applib/src/main/java/org/apache/isis/applib/layout/bootstrap3/BS3Col.java
index e4cde55..5f687c8 100644
--- a/core/applib/src/main/java/org/apache/isis/applib/layout/bootstrap3/BS3Col.java
+++ b/core/applib/src/main/java/org/apache/isis/applib/layout/bootstrap3/BS3Col.java
@@ -18,18 +18,20 @@
  */
 package org.apache.isis.applib.layout.bootstrap3;
 
-import java.util.ArrayList;
 import java.util.List;
 
 import javax.xml.bind.annotation.XmlAttribute;
 import javax.xml.bind.annotation.XmlElement;
-import javax.xml.bind.annotation.XmlElementWrapper;
+import javax.xml.bind.annotation.XmlElementRef;
+import javax.xml.bind.annotation.XmlRootElement;
 import javax.xml.bind.annotation.XmlType;
 
-import org.apache.isis.applib.layout.members.v1.ActionLayoutData;
-import org.apache.isis.applib.layout.members.v1.CollectionLayoutData;
-import org.apache.isis.applib.layout.members.v1.DomainObjectLayoutData;
-import org.apache.isis.applib.layout.members.v1.FieldSet;
+import com.google.common.collect.Lists;
+
+import org.apache.isis.applib.layout.common.ActionLayoutData;
+import org.apache.isis.applib.layout.common.CollectionLayoutData;
+import org.apache.isis.applib.layout.common.DomainObjectLayoutData;
+import org.apache.isis.applib.layout.common.FieldSet;
 
 /**
  * A column within a row which, depending on its {@link #getSpan()}, could be as narrow as 1/12th of the page's width, all the way up to spanning the entire page.
@@ -41,7 +43,7 @@ import org.apache.isis.applib.layout.members.v1.FieldSet;
  * </p>
  *
  * <p>
- *     It is also possible for them to contain specifically identified {@link org.apache.isis.applib.layout.members.v1.ActionLayoutData action}s and even the domain object's
+ *     It is also possible for them to contain specifically identified {@link ActionLayoutData action}s and even the domain object's
  *     {@link DomainObjectLayoutData title and icon}.  Most pages however tend to show these elements in a top-level
  *     header, and so if that's the case then use the page's {@link BS3Page#setHeader(boolean) header} attribute that
  *     is provided as a convenience.
@@ -51,13 +53,16 @@ import org.apache.isis.applib.layout.members.v1.FieldSet;
  *     It is rendered as a (eg) &lt;div class=&quot;col-md-4 ...&quot;&gt;
  * </p>
  */
+@XmlRootElement(
+        name = "col"
+)
 @XmlType(
         name = "col"
         , propOrder = {
-            "domainObjectLayout",
+            "domainObject",
             "actions",
             "rows",
-            "tabGroup",
+            "tabGroups",
             "fieldSets",
             "collections",
         }
@@ -79,31 +84,83 @@ public class BS3Col extends BS3RowContent {
     }
 
 
+    private boolean unreferencedActions;
+
+    /**
+     * Whether this column should be used to hold any unreferenced actions (contributed or &quot;native&quot;).
+     *
+     * <p>
+     *     Any layout must have precisely one column that has this attribute set.
+     * </p>
+     */
+    @XmlAttribute(required = false)
+    public boolean isUnreferencedActions() {
+        return unreferencedActions;
+    }
+
+    public void setUnreferencedActions(final boolean unreferencedActions) {
+        this.unreferencedActions = unreferencedActions;
+    }
 
-    private DomainObjectLayoutData domainObjectLayoutData;
 
+    private boolean unreferencedProperties;
     /**
-     * Whether to show the object's icon and title.
+     * Whether the first fieldset in this column should be used to hold any unreferenced properties (contributed or &quot;native&quot;).
      *
      * <p>
-     *     Generally speaking it is easier
+     *     Any layout must have precisely one column that has this attribute set, and that column must have at least one {@link FieldSet}.
      * </p>
      */
-    @XmlElement(name = "domainObjectLayout", required = false)
-    public DomainObjectLayoutData getDomainObjectLayoutData() {
-        return domainObjectLayoutData;
+    @XmlAttribute(required = false)
+    public boolean isUnreferencedProperties() {
+        return unreferencedProperties;
     }
 
-    public void setDomainObjectLayoutData(final DomainObjectLayoutData domainObjectLayoutData) {
-        this.domainObjectLayoutData = domainObjectLayoutData;
+    public void setUnreferencedProperties(final boolean unreferencedProperties) {
+        this.unreferencedProperties = unreferencedProperties;
     }
 
 
+    private boolean unreferencedCollections;
+    /**
+     * Whether this column should be used to hold any unreferenced collections (contributed or &quot;native&quot;).
+     *
+     * <p>
+     *     Any layout must have precisely one column that has this attribute set.
+     * </p>
+     */
+    @XmlAttribute(required = false)
+    public boolean isUnreferencedCollections() {
+        return unreferencedCollections;
+    }
+
+    public void setUnreferencedCollections(final boolean unreferencedCollections) {
+        this.unreferencedCollections = unreferencedCollections;
+    }
+
 
-    private List<ActionLayoutData> actions = new ArrayList<ActionLayoutData>();
 
-    @XmlElementWrapper(required = false)
-    @XmlElement(name = "action", required = false)
+
+    private DomainObjectLayoutData domainObject;
+
+    /**
+     * Whether to show the object's icon and title.
+     */
+    @XmlElementRef(type=DomainObjectLayoutData.class, name="domainObject", required = false)
+    public DomainObjectLayoutData getDomainObject() {
+        return domainObject;
+    }
+
+    public void setDomainObject(final DomainObjectLayoutData domainObjectLayoutData) {
+        this.domainObject = domainObjectLayoutData;
+    }
+
+
+
+    private List<ActionLayoutData> actions = Lists.newArrayList();
+
+    // no wrapper
+    @XmlElementRef(type = ActionLayoutData.class, name = "action", required = false)
     public List<ActionLayoutData> getActions() {
         return actions;
     }
@@ -114,7 +171,7 @@ public class BS3Col extends BS3RowContent {
 
 
 
-    private List<BS3Row> rows = new ArrayList<BS3Row>();
+    private List<BS3Row> rows = Lists.newArrayList();
 
     // no wrapper
     @XmlElement(name = "row", required = false)
@@ -128,30 +185,44 @@ public class BS3Col extends BS3RowContent {
 
 
 
-    private BS3TabGroup tabGroup;
+    private List<BS3TabGroup> tabGroups = Lists.newArrayList();
+
+    // no wrapper
+    @XmlElement(name = "tabGroup", required = false)
+    public List<BS3TabGroup> getTabGroups() {
+        return tabGroups;
+    }
 
-    @XmlElement(name="tabGroup", required = false)
-    public BS3TabGroup getTabGroup() {
-        return tabGroup;
+    public void setTabGroups(final List<BS3TabGroup> tabGroups) {
+        this.tabGroups = tabGroups;
     }
 
-    public void setTabGroup(final BS3TabGroup tabGroup) {
-        this.tabGroup = tabGroup;
+
+
+    private List<FieldSet> fieldSets = Lists.newArrayList();
+
+    // no wrapper
+    @XmlElementRef(type=FieldSet.class, name = "fieldSet", required = false)
+    public List<FieldSet> getFieldSets() {
+        return fieldSets;
     }
 
+    public void setFieldSets(final List<FieldSet> fieldSets) {
+        this.fieldSets = fieldSets;
+    }
 
 
 
-    private List<FieldSet> propGroups = new ArrayList<FieldSet>();
+    private List<CollectionLayoutData> collections = Lists.newArrayList();
 
     // no wrapper
-    @XmlElement(name = "propGroup", required = false)
-    public List<FieldSet> getPropGroups() {
-        return propGroups;
+    @XmlElementRef(type=CollectionLayoutData.class, name = "collection", required = false)
+    public List<CollectionLayoutData> getCollections() {
+        return collections;
     }
 
-    public void setPropGroups(final List<FieldSet> propGroups) {
-        this.propGroups = propGroups;
+    public void setCollections(final List<CollectionLayoutData> collections) {
+        this.collections = collections;
     }
 
 

http://git-wip-us.apache.org/repos/asf/isis/blob/65f7d320/core/applib/src/main/java/org/apache/isis/applib/layout/bootstrap3/BS3Page.java
----------------------------------------------------------------------
diff --git a/core/applib/src/main/java/org/apache/isis/applib/layout/bootstrap3/BS3Page.java b/core/applib/src/main/java/org/apache/isis/applib/layout/bootstrap3/BS3Page.java
index 22b7c5a..7796500 100644
--- a/core/applib/src/main/java/org/apache/isis/applib/layout/bootstrap3/BS3Page.java
+++ b/core/applib/src/main/java/org/apache/isis/applib/layout/bootstrap3/BS3Page.java
@@ -21,16 +21,15 @@ package org.apache.isis.applib.layout.bootstrap3;
 import java.util.ArrayList;
 import java.util.List;
 
-import javax.xml.bind.annotation.XmlAttribute;
 import javax.xml.bind.annotation.XmlElement;
 import javax.xml.bind.annotation.XmlRootElement;
 import javax.xml.bind.annotation.XmlTransient;
 import javax.xml.bind.annotation.XmlType;
 
+import com.google.common.collect.Lists;
+
 import org.apache.isis.applib.annotation.Programmatic;
-import org.apache.isis.applib.layout.members.v1.ActionLayoutData;
-import org.apache.isis.applib.layout.members.v1.DomainObjectLayoutData;
-import org.apache.isis.applib.layout.members.v1.Page;
+import org.apache.isis.applib.layout.common.Page;
 import org.apache.isis.applib.services.dto.Dto;
 
 /**
@@ -38,14 +37,6 @@ import org.apache.isis.applib.services.dto.Dto;
  * of a number of rows.
  *
  * <p>
- *     The {@link #isHeader()} is intended as a convenience to automatically render the object's icon/title and any
- *     {@link ActionLayoutData action}s not otherwise associated with object members.  It is required to be
- *     specified and will be set to <code>true</code> for the vast majority of domain object.  If set to 
- *     <code>false</code> then the icon/title and actions can instead be rendered within a {@link BS3Col col}umn, at
- *     anywhere on the page.
- * </p>
- *
- * <p>
  *     The element is rendered as a &lt;div class=&quot;...&quot;&gt;
  * </p>
  */
@@ -56,34 +47,13 @@ import org.apache.isis.applib.services.dto.Dto;
         name = "page"
         , propOrder = {
             "rows"
+            , "metadataErrors"
         }
 )
 public class BS3Page extends BS3ElementAbstract implements Page, Dto {
 
     private static final long serialVersionUID = 1L;
 
-
-    private boolean header;
-
-    /**
-     * Whether to render the top-level header (consisting of {@link DomainObjectLayoutData icon/title} and any
-     * not-otherwise-identified {@link ActionLayoutData action}s.
-     *
-     * <p>
-     *     Most pages will have this set.  Note that it is possible however to leave this unset and then to manually
-     *     construct the header (or some other arrangement) using {@link BS3Col col}.
-     * </p>
-     */
-    @XmlAttribute(required = true)
-    public boolean isHeader() {
-        return header;
-    }
-
-    public void setHeader(final boolean header) {
-        this.header = header;
-    }
-
-
     private List<BS3Row> rows = new ArrayList<BS3Row>(){{
         add(new BS3Row());
     }};
@@ -114,4 +84,26 @@ public class BS3Page extends BS3ElementAbstract implements Page, Dto {
     }
 
 
+
+
+    private List<String> metadataErrors = Lists.newArrayList();
+
+    /**
+     * For diagnostics; populated by the framework if and only if a metadata error.
+     * 
+     * <p>
+     *     For example, if there is not exactly one {@link BS3Col} with the
+     *     {@link BS3Col#isUnreferencedActions()} attribute set, then this is an error.  Ditto for
+     *     {@link BS3Col#isUnreferencedCollections() collections}
+     *     and {@link BS3Col#isUnreferencedProperties() properties}.
+     * </p>
+     */
+    @XmlElement(required = false)
+    public List<String> getMetadataErrors() {
+        return metadataErrors;
+    }
+
+    public void setMetadataErrors(final List<String> metadataErrors) {
+        this.metadataErrors = metadataErrors;
+    }
 }

http://git-wip-us.apache.org/repos/asf/isis/blob/65f7d320/core/applib/src/main/java/org/apache/isis/applib/layout/bootstrap3/BS3Row.java
----------------------------------------------------------------------
diff --git a/core/applib/src/main/java/org/apache/isis/applib/layout/bootstrap3/BS3Row.java b/core/applib/src/main/java/org/apache/isis/applib/layout/bootstrap3/BS3Row.java
index 370c5bf..821db69 100644
--- a/core/applib/src/main/java/org/apache/isis/applib/layout/bootstrap3/BS3Row.java
+++ b/core/applib/src/main/java/org/apache/isis/applib/layout/bootstrap3/BS3Row.java
@@ -21,7 +21,8 @@ package org.apache.isis.applib.layout.bootstrap3;
 import java.util.ArrayList;
 import java.util.List;
 
-import javax.xml.bind.annotation.XmlElement;
+import javax.xml.bind.annotation.XmlElementRef;
+import javax.xml.bind.annotation.XmlElementRefs;
 import javax.xml.bind.annotation.XmlType;
 
 /**
@@ -47,7 +48,11 @@ public class BS3Row extends BS3ElementAbstract {
     }};
 
     // no wrapper
-    @XmlElement(name = "col", required = true)
+    @XmlElementRefs({
+            @XmlElementRef(type = BS3Col.class, name="col", required = true),
+            @XmlElementRef(type = BS3ClearFixVisible.class,  name="clearFixVisible", required = false),
+            @XmlElementRef(type = BS3ClearFixHidden.class,  name="clearFixHidden", required = false)
+    })
     public List<BS3RowContent> getCols() {
         return cols;
     }

http://git-wip-us.apache.org/repos/asf/isis/blob/65f7d320/core/applib/src/main/java/org/apache/isis/applib/layout/common/ActionLayoutData.java
----------------------------------------------------------------------
diff --git a/core/applib/src/main/java/org/apache/isis/applib/layout/common/ActionLayoutData.java b/core/applib/src/main/java/org/apache/isis/applib/layout/common/ActionLayoutData.java
new file mode 100644
index 0000000..f8088fc
--- /dev/null
+++ b/core/applib/src/main/java/org/apache/isis/applib/layout/common/ActionLayoutData.java
@@ -0,0 +1,230 @@
+/*
+ *  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.applib.layout.common;
+
+import java.io.Serializable;
+
+import javax.xml.bind.annotation.XmlAttribute;
+import javax.xml.bind.annotation.XmlElement;
+import javax.xml.bind.annotation.XmlRootElement;
+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.Where;
+
+/**
+ * Describes the layout of a single action, broadly corresponding to {@link org.apache.isis.applib.annotation.ActionLayout}.
+ *
+ * <p>
+ *  Note that {@link org.apache.isis.applib.annotation.ActionLayout#contributed()} is omitted because this only applies
+ *  to domain services.
+ * </p>
+ */
+@XmlRootElement(
+        name = "action"
+)
+@XmlType(
+    name = "action"
+    , propOrder = {
+        "named"
+        , "describedAs"
+        , "metadataError"
+    }
+)
+public class ActionLayoutData implements Serializable, Owned<ActionOwner> {
+
+    private static final long serialVersionUID = 1L;
+
+    public ActionLayoutData() {
+    }
+    public ActionLayoutData(final String id) {
+        setId(id);
+    }
+
+    private String id;
+    /**
+     * Method name.
+     *
+     * <p>
+     *     Overloaded methods are not supported.
+     * </p>
+     */
+    @XmlAttribute(name="id", required = true)
+    public String getId() {
+        return id;
+    }
+
+    public void setId(String id) {
+        this.id = id;
+    }
+
+
+
+    private BookmarkPolicy bookmarking;
+
+    @XmlAttribute(required = false)
+    public BookmarkPolicy getBookmarking() {
+        return bookmarking;
+    }
+
+    public void setBookmarking(BookmarkPolicy bookmarking) {
+        this.bookmarking = bookmarking;
+    }
+
+
+    private String cssClass;
+
+    @XmlAttribute(required = false)
+    public String getCssClass() {
+        return cssClass;
+    }
+
+    public void setCssClass(String cssClass) {
+        this.cssClass = cssClass;
+    }
+
+
+    private String cssClassFa;
+
+    @XmlAttribute(required = false)
+    public String getCssClassFa() {
+        return cssClassFa;
+    }
+
+    public void setCssClassFa(String cssClassFa) {
+        this.cssClassFa = cssClassFa;
+    }
+
+
+
+    private org.apache.isis.applib.annotation.ActionLayout.CssClassFaPosition cssClassFaPosition;
+
+    @XmlAttribute(required = false)
+    public org.apache.isis.applib.annotation.ActionLayout.CssClassFaPosition getCssClassFaPosition() {
+        return cssClassFaPosition;
+    }
+
+    public void setCssClassFaPosition(org.apache.isis.applib.annotation.ActionLayout.CssClassFaPosition cssClassFaPosition) {
+        this.cssClassFaPosition = cssClassFaPosition;
+    }
+
+
+    private String describedAs;
+
+    @XmlElement(required = false)
+    public String getDescribedAs() {
+        return describedAs;
+    }
+
+    public void setDescribedAs(String describedAs) {
+        this.describedAs = describedAs;
+    }
+
+
+
+    private Where hidden;
+
+    @XmlAttribute(required = false)
+    public Where getHidden() {
+        return hidden;
+    }
+
+    public void setHidden(Where hidden) {
+        this.hidden = hidden;
+    }
+
+
+
+    private String named;
+
+    @XmlElement(required = false)
+    public String getNamed() {
+        return named;
+    }
+
+    public void setNamed(String named) {
+        this.named = named;
+    }
+
+
+
+    private Boolean namedEscaped;
+
+    @XmlAttribute(required = false)
+    public Boolean getNamedEscaped() {
+        return namedEscaped;
+    }
+
+    public void setNamedEscaped(Boolean namedEscaped) {
+        this.namedEscaped = namedEscaped;
+    }
+
+
+
+    private org.apache.isis.applib.annotation.ActionLayout.Position position;
+
+    @XmlAttribute(required = false)
+    public org.apache.isis.applib.annotation.ActionLayout.Position getPosition() {
+        return position;
+    }
+
+    public void setPosition(org.apache.isis.applib.annotation.ActionLayout.Position position) {
+        this.position = position;
+    }
+
+
+
+
+    private ActionOwner owner;
+    /**
+     * Owner.
+     *
+     * <p>
+     *     Set programmatically by framework after reading in from XML.
+     * </p>
+     */
+    @XmlTransient
+    public ActionOwner getOwner() {
+        return owner;
+    }
+
+    public void setOwner(final ActionOwner owner) {
+        this.owner = owner;
+    }
+
+
+    private String metadataError;
+
+    /**
+     * For diagnostics; populated by the framework if and only if a metadata error.
+     */
+    @XmlElement(required = false)
+    public String getMetadataError() {
+        return metadataError;
+    }
+
+    public void setMetadataError(final String metadataError) {
+        this.metadataError = metadataError;
+    }
+
+
+
+
+}

http://git-wip-us.apache.org/repos/asf/isis/blob/65f7d320/core/applib/src/main/java/org/apache/isis/applib/layout/common/ActionOwner.java
----------------------------------------------------------------------
diff --git a/core/applib/src/main/java/org/apache/isis/applib/layout/common/ActionOwner.java b/core/applib/src/main/java/org/apache/isis/applib/layout/common/ActionOwner.java
new file mode 100644
index 0000000..71ce307
--- /dev/null
+++ b/core/applib/src/main/java/org/apache/isis/applib/layout/common/ActionOwner.java
@@ -0,0 +1,25 @@
+/*
+ *  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.applib.layout.common;
+
+import java.util.List;
+
+public interface ActionOwner extends Owner {
+    List<ActionLayoutData> getActions();
+}

http://git-wip-us.apache.org/repos/asf/isis/blob/65f7d320/core/applib/src/main/java/org/apache/isis/applib/layout/common/CollectionLayoutData.java
----------------------------------------------------------------------
diff --git a/core/applib/src/main/java/org/apache/isis/applib/layout/common/CollectionLayoutData.java b/core/applib/src/main/java/org/apache/isis/applib/layout/common/CollectionLayoutData.java
new file mode 100644
index 0000000..e3b53cb
--- /dev/null
+++ b/core/applib/src/main/java/org/apache/isis/applib/layout/common/CollectionLayoutData.java
@@ -0,0 +1,263 @@
+/*
+ *  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.applib.layout.common;
+
+import java.io.Serializable;
+import java.util.List;
+
+import javax.xml.bind.annotation.XmlAttribute;
+import javax.xml.bind.annotation.XmlElement;
+import javax.xml.bind.annotation.XmlRootElement;
+import javax.xml.bind.annotation.XmlTransient;
+import javax.xml.bind.annotation.XmlType;
+
+import com.google.common.base.Function;
+
+import org.apache.isis.applib.annotation.Programmatic;
+import org.apache.isis.applib.annotation.Where;
+
+/**
+ * Describes the layout of a single collection, broadly corresponds to the {@link org.apache.isis.applib.annotation.CollectionLayout} annotation.
+ *
+ * <p>
+ *     Note that {@link org.apache.isis.applib.annotation.CollectionLayout#render()} is omitted because
+ *     {@link #defaultView} is its replacement.
+ * </p>
+ */
+@XmlRootElement(
+        name = "collection"
+)
+@XmlType(
+        name = "collection"
+        , propOrder = {
+                "named"
+                ,"describedAs"
+                ,"sortedBy"
+                , "actions"
+                , "metadataError"
+        }
+)
+public class CollectionLayoutData implements MemberRegion, ActionOwner, Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    public CollectionLayoutData() {
+    }
+    public CollectionLayoutData(final String id) {
+        setId(id);
+    }
+
+
+    private String id;
+
+    /**
+     * Collection identifier, being the getter method without "get" prefix, first letter lower cased.
+     */
+    @XmlAttribute(required = true)
+    public String getId() {
+        return id;
+    }
+
+    public void setId(String id) {
+        this.id = id;
+    }
+
+
+
+    private String cssClass;
+
+    @XmlAttribute(required = false)
+    public String getCssClass() {
+        return cssClass;
+    }
+
+    public void setCssClass(String cssClass) {
+        this.cssClass = cssClass;
+    }
+
+
+
+    private String describedAs;
+
+    @XmlElement(required = false)
+    public String getDescribedAs() {
+        return describedAs;
+    }
+
+    public void setDescribedAs(String describedAs) {
+        this.describedAs = describedAs;
+    }
+
+
+
+    private String defaultView;
+
+    /**
+     * Typically <code>table</code> or <code>hidden</code>, but could be any other named view that is configured and
+     * appropriate, eg <code>gmap3</code> or <code>fullcalendar2</code>.
+     */
+    @XmlAttribute(required = false)
+    public String getDefaultView() {
+        return defaultView;
+    }
+
+    public void setDefaultView(String defaultView) {
+        this.defaultView = defaultView;
+    }
+
+
+    private Where hidden;
+
+    @XmlAttribute(required = false)
+    public Where getHidden() {
+        return hidden;
+    }
+
+    public void setHidden(Where hidden) {
+        this.hidden = hidden;
+    }
+
+
+    private String named;
+
+    @XmlElement(required = false)
+    public String getNamed() {
+        return named;
+    }
+
+    public void setNamed(String named) {
+        this.named = named;
+    }
+
+
+    private Boolean namedEscaped;
+
+    @XmlAttribute(required = false)
+    public Boolean getNamedEscaped() {
+        return namedEscaped;
+    }
+
+    public void setNamedEscaped(Boolean namedEscaped) {
+        this.namedEscaped = namedEscaped;
+    }
+
+
+    private Integer paged;
+
+    @XmlAttribute(required = false)
+    public Integer getPaged() {
+        return paged;
+    }
+
+    public void setPaged(Integer paged) {
+        this.paged = paged;
+    }
+
+
+
+    private String sortedBy;
+
+    @XmlElement(required = false)
+    public String getSortedBy() {
+        return sortedBy;
+    }
+
+    public void setSortedBy(String sortedBy) {
+        this.sortedBy = sortedBy;
+    }
+
+
+
+    private List<ActionLayoutData> actions;
+
+    // no wrapper
+    @XmlElement(name = "action", required = false)
+    public List<ActionLayoutData> getActions() {
+        return actions;
+    }
+
+    public void setActions(List<ActionLayoutData> actionLayoutDatas) {
+        this.actions = actionLayoutDatas;
+    }
+
+
+
+    private MemberRegionOwner owner;
+    /**
+     * Owner.
+     *
+     * <p>
+     *     Set programmatically by framework after reading in from XML.
+     * </p>
+     */
+    @XmlTransient
+    public MemberRegionOwner getOwner() {
+        return owner;
+    }
+
+    public void setOwner(final MemberRegionOwner owner) {
+        this.owner = owner;
+    }
+
+
+    private String metadataError;
+
+    /**
+     * For diagnostics; populated by the framework if and only if a metadata error.
+     */
+    @XmlElement(required = false)
+    public String getMetadataError() {
+        return metadataError;
+    }
+
+    public void setMetadataError(final String metadataError) {
+        this.metadataError = metadataError;
+    }
+
+
+
+
+    private String path;
+
+    @Programmatic
+    @XmlTransient
+    public String getPath() {
+        return path;
+    }
+
+    @Programmatic
+    public void setPath(final String path) {
+        this.path = path;
+    }
+
+
+
+    public static class Functions {
+        private Functions(){}
+
+        public static Function<CollectionLayoutData, String> id() {
+            return new Function<CollectionLayoutData, String>() {
+                @Override
+                public String apply(final CollectionLayoutData metadata) {
+                    return metadata.getId();
+                }
+            };
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/isis/blob/65f7d320/core/applib/src/main/java/org/apache/isis/applib/layout/common/DomainObjectLayoutData.java
----------------------------------------------------------------------
diff --git a/core/applib/src/main/java/org/apache/isis/applib/layout/common/DomainObjectLayoutData.java b/core/applib/src/main/java/org/apache/isis/applib/layout/common/DomainObjectLayoutData.java
new file mode 100644
index 0000000..764d7d6
--- /dev/null
+++ b/core/applib/src/main/java/org/apache/isis/applib/layout/common/DomainObjectLayoutData.java
@@ -0,0 +1,162 @@
+/*
+ *  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.applib.layout.common;
+
+import java.io.Serializable;
+
+import javax.xml.bind.annotation.XmlAttribute;
+import javax.xml.bind.annotation.XmlElement;
+import javax.xml.bind.annotation.XmlRootElement;
+import javax.xml.bind.annotation.XmlType;
+
+import org.apache.isis.applib.annotation.BookmarkPolicy;
+
+/**
+ * Describes the layout of the title and icon of a domain object, broadly corresponding to {@link org.apache.isis.applib.annotation.DomainObjectLayout}.
+ */
+@XmlRootElement(
+        name = "domainObject"
+)
+@XmlType(
+        name = "domainObject"
+        , propOrder = {
+            "named"
+            , "describedAs"
+            , "plural"
+            , "metadataError"
+        }
+)
+public class DomainObjectLayoutData implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    public DomainObjectLayoutData() {
+    }
+
+
+    private BookmarkPolicy bookmarking;
+
+    @XmlAttribute(required = false)
+    public BookmarkPolicy getBookmarking() {
+        return bookmarking;
+    }
+
+    public void setBookmarking(BookmarkPolicy bookmarking) {
+        this.bookmarking = bookmarking;
+    }
+
+
+
+    private String cssClass;
+
+    @XmlAttribute(required = false)
+    public String getCssClass() {
+        return cssClass;
+    }
+
+    public void setCssClass(String cssClass) {
+        this.cssClass = cssClass;
+    }
+
+
+    private String cssClassFa;
+
+    @XmlAttribute(required = false)
+    public String getCssClassFa() {
+        return cssClassFa;
+    }
+
+    public void setCssClassFa(String cssClassFa) {
+        this.cssClassFa = cssClassFa;
+    }
+
+
+
+    private org.apache.isis.applib.annotation.ActionLayout.CssClassFaPosition cssClassFaPosition;
+
+    @XmlAttribute(required = false)
+    public org.apache.isis.applib.annotation.ActionLayout.CssClassFaPosition getCssClassFaPosition() {
+        return cssClassFaPosition;
+    }
+
+    public void setCssClassFaPosition(org.apache.isis.applib.annotation.ActionLayout.CssClassFaPosition cssClassFaPosition) {
+        this.cssClassFaPosition = cssClassFaPosition;
+    }
+
+
+    private String describedAs;
+
+    @XmlElement(required = false)
+    public String getDescribedAs() {
+        return describedAs;
+    }
+
+    public void setDescribedAs(String describedAs) {
+        this.describedAs = describedAs;
+    }
+
+
+
+    private String named;
+
+    @XmlElement(required = false)
+    public String getNamed() {
+        return named;
+    }
+
+    public void setNamed(String named) {
+        this.named = named;
+    }
+
+
+
+
+    private String plural;
+
+    @XmlElement(required = false)
+    public String getPlural() {
+        return plural;
+    }
+
+    public void setPlural(String plural) {
+        this.plural = plural;
+    }
+
+
+
+
+
+    private String metadataError;
+
+    /**
+     * For diagnostics; populated by the framework if and only if a metadata error.
+     */
+    @XmlElement(required = false)
+    public String getMetadataError() {
+        return metadataError;
+    }
+
+    public void setMetadataError(final String metadataError) {
+        this.metadataError = metadataError;
+    }
+
+
+
+
+}

http://git-wip-us.apache.org/repos/asf/isis/blob/65f7d320/core/applib/src/main/java/org/apache/isis/applib/layout/common/FieldSet.java
----------------------------------------------------------------------
diff --git a/core/applib/src/main/java/org/apache/isis/applib/layout/common/FieldSet.java b/core/applib/src/main/java/org/apache/isis/applib/layout/common/FieldSet.java
new file mode 100644
index 0000000..d6e56ba
--- /dev/null
+++ b/core/applib/src/main/java/org/apache/isis/applib/layout/common/FieldSet.java
@@ -0,0 +1,157 @@
+/*
+ *  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.applib.layout.common;
+
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.annotation.Nullable;
+import javax.xml.bind.annotation.XmlAttribute;
+import javax.xml.bind.annotation.XmlElement;
+import javax.xml.bind.annotation.XmlRootElement;
+import javax.xml.bind.annotation.XmlTransient;
+import javax.xml.bind.annotation.XmlType;
+
+import com.google.common.base.Function;
+import com.google.common.collect.Lists;
+
+import org.apache.isis.applib.annotation.MemberOrder;
+import org.apache.isis.applib.annotation.Programmatic;
+
+/**
+ * A {@link MemberRegion region} of the page containing a set of
+ * related {@link PropertyLayoutData properties} and associated
+ * {@link ActionLayoutData actions}.
+ */
+@XmlRootElement(
+        name = "fieldSet"
+)
+@XmlType(
+        name = "fieldSet"
+        , propOrder = {
+                "name"
+                , "actions"
+                , "properties"
+        }
+)
+public class FieldSet implements MemberRegion, ActionOwner, Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    public FieldSet() {
+    }
+
+    public FieldSet(final String name) {
+        setName(name);
+    }
+
+    private String name;
+
+    /**
+     * Corresponds to the {@link MemberOrder#name()} (when applied to properties).
+     */
+    @XmlAttribute(required = true)
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+
+
+    private List<ActionLayoutData> actions = Lists.newArrayList();
+
+    // no wrapper
+    @XmlElement(name = "action", required = false)
+    public List<ActionLayoutData> getActions() {
+        return actions;
+    }
+
+    public void setActions(List<ActionLayoutData> actionLayoutDatas) {
+        this.actions = actionLayoutDatas;
+    }
+
+
+
+    private List<PropertyLayoutData> properties = new ArrayList<PropertyLayoutData>() {{
+        add(new PropertyLayoutData());
+    }};
+
+    @XmlElement(name = "property", required = true)
+    public List<PropertyLayoutData> getProperties() {
+        return properties;
+    }
+
+    public void setProperties(List<PropertyLayoutData> properties) {
+        this.properties = properties;
+    }
+
+
+    private MemberRegionOwner owner;
+    /**
+     * Owner.
+     *
+     * <p>
+     *     Set programmatically by framework after reading in from XML.
+     * </p>
+     */
+    @XmlTransient
+    public MemberRegionOwner getOwner() {
+        return owner;
+    }
+
+    public void setOwner(final MemberRegionOwner owner) {
+        this.owner = owner;
+    }
+
+
+
+
+    private String path;
+
+    @Programmatic
+    @XmlTransient
+    public String getPath() {
+        return path;
+    }
+
+    @Programmatic
+    public void setPath(final String path) {
+        this.path = path;
+    }
+
+
+
+
+    public static class Util {
+        private Util(){}
+        public static Function<? super FieldSet, String> nameOf() {
+            return new Function<FieldSet, String>() {
+                @Nullable @Override
+                public String apply(@Nullable final FieldSet fieldSet) {
+                    return fieldSet.getName();
+                }
+            };
+        }
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/isis/blob/65f7d320/core/applib/src/main/java/org/apache/isis/applib/layout/common/MemberRegion.java
----------------------------------------------------------------------
diff --git a/core/applib/src/main/java/org/apache/isis/applib/layout/common/MemberRegion.java b/core/applib/src/main/java/org/apache/isis/applib/layout/common/MemberRegion.java
new file mode 100644
index 0000000..daf4aed4
--- /dev/null
+++ b/core/applib/src/main/java/org/apache/isis/applib/layout/common/MemberRegion.java
@@ -0,0 +1,33 @@
+/*
+ *  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.applib.layout.common;
+
+/**
+ * Represents an area on the page containing one or several related members.
+ *
+ * <p>
+ *     Implementations include a <code>FieldSet</code> (containing a number
+ *     of properties and their actions), and a <code>CollectionLayoutData</code>
+ *     (containing a single collection and associated actions)
+ * </p>
+ */
+public interface MemberRegion extends Owned<MemberRegionOwner> {
+
+
+}

http://git-wip-us.apache.org/repos/asf/isis/blob/65f7d320/core/applib/src/main/java/org/apache/isis/applib/layout/common/MemberRegionOwner.java
----------------------------------------------------------------------
diff --git a/core/applib/src/main/java/org/apache/isis/applib/layout/common/MemberRegionOwner.java b/core/applib/src/main/java/org/apache/isis/applib/layout/common/MemberRegionOwner.java
new file mode 100644
index 0000000..7bab3ef
--- /dev/null
+++ b/core/applib/src/main/java/org/apache/isis/applib/layout/common/MemberRegionOwner.java
@@ -0,0 +1,23 @@
+/*
+ *  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.applib.layout.common;
+
+public interface MemberRegionOwner extends Owner {
+
+}

http://git-wip-us.apache.org/repos/asf/isis/blob/65f7d320/core/applib/src/main/java/org/apache/isis/applib/layout/common/Owned.java
----------------------------------------------------------------------
diff --git a/core/applib/src/main/java/org/apache/isis/applib/layout/common/Owned.java b/core/applib/src/main/java/org/apache/isis/applib/layout/common/Owned.java
new file mode 100644
index 0000000..c00d795
--- /dev/null
+++ b/core/applib/src/main/java/org/apache/isis/applib/layout/common/Owned.java
@@ -0,0 +1,23 @@
+/*
+ *  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.applib.layout.common;
+
+public interface Owned<T extends Owner> {
+    T getOwner();
+}

http://git-wip-us.apache.org/repos/asf/isis/blob/65f7d320/core/applib/src/main/java/org/apache/isis/applib/layout/common/Owner.java
----------------------------------------------------------------------
diff --git a/core/applib/src/main/java/org/apache/isis/applib/layout/common/Owner.java b/core/applib/src/main/java/org/apache/isis/applib/layout/common/Owner.java
new file mode 100644
index 0000000..239aa32
--- /dev/null
+++ b/core/applib/src/main/java/org/apache/isis/applib/layout/common/Owner.java
@@ -0,0 +1,24 @@
+/*
+ *  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.applib.layout.common;
+
+public interface Owner {
+
+
+}

http://git-wip-us.apache.org/repos/asf/isis/blob/65f7d320/core/applib/src/main/java/org/apache/isis/applib/layout/common/Page.java
----------------------------------------------------------------------
diff --git a/core/applib/src/main/java/org/apache/isis/applib/layout/common/Page.java b/core/applib/src/main/java/org/apache/isis/applib/layout/common/Page.java
new file mode 100644
index 0000000..7034321
--- /dev/null
+++ b/core/applib/src/main/java/org/apache/isis/applib/layout/common/Page.java
@@ -0,0 +1,38 @@
+/*
+ *  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.applib.layout.common;
+
+import org.apache.isis.applib.services.layout.PageService;
+
+/**
+ * All top-level page layout classes should implement this interface.
+ *
+ * <p>
+ *     It is used by the {@link PageService} as a common based type for any layouts read in from XML.
+ * </p>
+ */
+public interface Page {
+
+
+    boolean isNormalized();
+
+    void setNormalized(final boolean normalized);
+
+
+}

http://git-wip-us.apache.org/repos/asf/isis/blob/65f7d320/core/applib/src/main/java/org/apache/isis/applib/layout/common/PropertyLayoutData.java
----------------------------------------------------------------------
diff --git a/core/applib/src/main/java/org/apache/isis/applib/layout/common/PropertyLayoutData.java b/core/applib/src/main/java/org/apache/isis/applib/layout/common/PropertyLayoutData.java
new file mode 100644
index 0000000..fdc57e0
--- /dev/null
+++ b/core/applib/src/main/java/org/apache/isis/applib/layout/common/PropertyLayoutData.java
@@ -0,0 +1,248 @@
+/*
+ *  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.applib.layout.common;
+
+import java.io.Serializable;
+import java.util.List;
+
+import javax.xml.bind.annotation.XmlAttribute;
+import javax.xml.bind.annotation.XmlElement;
+import javax.xml.bind.annotation.XmlRootElement;
+import javax.xml.bind.annotation.XmlTransient;
+import javax.xml.bind.annotation.XmlType;
+
+import org.apache.isis.applib.annotation.LabelPosition;
+import org.apache.isis.applib.annotation.Programmatic;
+import org.apache.isis.applib.annotation.Where;
+
+/**
+ * Describes the layout of a single property, broadly corresponds to the {@link org.apache.isis.applib.annotation.PropertyLayout} annotation.
+ */
+@XmlRootElement(
+        name = "property"
+)
+@XmlType(
+        name = "property"
+        , propOrder = {
+                "named"
+                , "describedAs"
+                , "actions"
+                , "metadataError"
+        }
+)
+public class PropertyLayoutData implements ActionOwner, Serializable, Owned<FieldSet> {
+
+    private static final long serialVersionUID = 1L;
+
+    public PropertyLayoutData() {
+    }
+
+    public PropertyLayoutData(final String id) {
+        this.id = id;
+    }
+
+    private String id;
+
+    /**
+     * Property identifier, being the getter method without "get" or "is" prefix, first letter lower cased.
+     */
+    @XmlAttribute(required = true)
+    public String getId() {
+        return id;
+    }
+
+    public void setId(String id) {
+        this.id = id;
+    }
+
+
+
+    private String cssClass;
+
+    @XmlAttribute(required = false)
+    public String getCssClass() {
+        return cssClass;
+    }
+
+    public void setCssClass(String cssClass) {
+        this.cssClass = cssClass;
+    }
+
+
+    private String describedAs;
+
+    @XmlElement(required = false)
+    public String getDescribedAs() {
+        return describedAs;
+    }
+
+    public void setDescribedAs(String describedAs) {
+        this.describedAs = describedAs;
+    }
+
+
+    private Where hidden;
+
+    @XmlAttribute(required = false)
+    public Where getHidden() {
+        return hidden;
+    }
+
+    public void setHidden(Where hidden) {
+        this.hidden = hidden;
+    }
+
+
+    private LabelPosition labelPosition;
+
+    @XmlAttribute(required = false)
+    public LabelPosition getLabelPosition() {
+        return labelPosition;
+    }
+
+    public void setLabelPosition(LabelPosition labelPosition) {
+        this.labelPosition = labelPosition;
+    }
+
+
+    private Integer multiLine;
+
+    @XmlAttribute(required = false)
+    public Integer getMultiLine() {
+        return multiLine;
+    }
+
+    public void setMultiLine(Integer multiLine) {
+        this.multiLine = multiLine;
+    }
+
+
+    private String named;
+
+    @XmlElement(required = false)
+    public String getNamed() {
+        return named;
+    }
+
+    public void setNamed(String named) {
+        this.named = named;
+    }
+
+
+    private Boolean namedEscaped;
+
+    @XmlAttribute(required = false)
+    public Boolean getNamedEscaped() {
+        return namedEscaped;
+    }
+
+    public void setNamedEscaped(Boolean namedEscaped) {
+        this.namedEscaped = namedEscaped;
+    }
+
+
+    private Boolean renderedAsDayBefore;
+
+    @XmlAttribute(required = false)
+    public Boolean getRenderedAsDayBefore() {
+        return renderedAsDayBefore;
+    }
+
+    public void setRenderedAsDayBefore(Boolean renderedAsDayBefore) {
+        this.renderedAsDayBefore = renderedAsDayBefore;
+    }
+
+
+    private Integer typicalLength;
+
+    @XmlAttribute(required = false)
+    public Integer getTypicalLength() {
+        return typicalLength;
+    }
+
+    public void setTypicalLength(Integer typicalLength) {
+        this.typicalLength = typicalLength;
+    }
+
+
+
+    private List<ActionLayoutData> actions;
+
+    // no wrapper
+    @XmlElement(name = "action", required = false)
+    public List<ActionLayoutData> getActions() {
+        return actions;
+    }
+
+    public void setActions(List<ActionLayoutData> actionLayoutDatas) {
+        this.actions = actionLayoutDatas;
+    }
+
+
+    private FieldSet owner;
+    /**
+     * Owner.
+     *
+     * <p>
+     *     Set programmatically by framework after reading in from XML.
+     * </p>
+     */
+    @XmlTransient
+    public FieldSet getOwner() {
+        return owner;
+    }
+
+    public void setOwner(final FieldSet owner) {
+        this.owner = owner;
+    }
+
+
+
+    private String metadataError;
+
+    /**
+     * For diagnostics; populated by the framework if and only if a metadata error.
+     */
+    @XmlElement(required = false)
+    public String getMetadataError() {
+        return metadataError;
+    }
+
+    public void setMetadataError(final String metadataError) {
+        this.metadataError = metadataError;
+    }
+
+
+
+
+    private String path;
+
+    @Programmatic
+    @XmlTransient
+    public String getPath() {
+        return path;
+    }
+
+    @Programmatic
+    public void setPath(final String path) {
+        this.path = path;
+    }
+
+
+}

http://git-wip-us.apache.org/repos/asf/isis/blob/65f7d320/core/applib/src/main/java/org/apache/isis/applib/layout/common/package-info.java
----------------------------------------------------------------------
diff --git a/core/applib/src/main/java/org/apache/isis/applib/layout/common/package-info.java b/core/applib/src/main/java/org/apache/isis/applib/layout/common/package-info.java
new file mode 100644
index 0000000..e5e02d9
--- /dev/null
+++ b/core/applib/src/main/java/org/apache/isis/applib/layout/common/package-info.java
@@ -0,0 +1,36 @@
+/*
+ *  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.
+ */
+
+/**
+ * The classes in this package provide layout metadata for a domain object's properties, collections and actions - the
+ * &quot;building blocks&quot; which then must be arranged into some sort of layout.
+ *
+ * <p>
+ *     The <code>bootstrap3</code> and <code>fixedcols</code> packages both provide different ways of doing the layout,
+ *     and both reference the classes in this package.
+ * </p>
+ *
+ */
+@javax.xml.bind.annotation.XmlSchema(
+        namespace = "http://isis.apache.org/schema/applib/layout/common",
+        elementFormDefault = javax.xml.bind.annotation.XmlNsForm.QUALIFIED
+        // specifying the location seems to cause JaxbService#toXsd() to not generate the schema; not sure why...
+        //, location = ..."http://isis.apache.org/schema/metamodel/layout/common/common.xsd"
+)
+package org.apache.isis.applib.layout.common;
\ No newline at end of file


[14/18] isis git commit: ISIS-993: introduction of the PageNormalizerService as an internal SPI which keeps track of the different Page implementations and their algorithms for normalizing themselves. The original FixedCol layout is now working again a

Posted by da...@apache.org.
http://git-wip-us.apache.org/repos/asf/isis/blob/8f0abcdb/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/layoutmetadata/ObjectLayoutMetadataFacetDefault.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/layoutmetadata/ObjectLayoutMetadataFacetDefault.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/layoutmetadata/ObjectLayoutMetadataFacetDefault.java
deleted file mode 100644
index 2123bac..0000000
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/layoutmetadata/ObjectLayoutMetadataFacetDefault.java
+++ /dev/null
@@ -1,473 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *        http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- */
-package org.apache.isis.core.metamodel.facets.object.layoutmetadata;
-
-import java.util.Collection;
-import java.util.LinkedHashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.concurrent.atomic.AtomicReference;
-
-import com.google.common.base.Strings;
-import com.google.common.collect.Lists;
-import com.google.common.collect.Maps;
-
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import org.apache.isis.applib.layout.members.v1.ActionLayoutData;
-import org.apache.isis.applib.layout.members.v1.ActionOwner;
-import org.apache.isis.applib.layout.members.v1.CollectionLayoutData;
-import org.apache.isis.applib.layout.fixedcols.FCColumn;
-import org.apache.isis.applib.layout.fixedcols.FCColumnOwner;
-import org.apache.isis.applib.layout.fixedcols.FCPage;
-import org.apache.isis.applib.layout.members.MemberRegionOwner;
-import org.apache.isis.applib.layout.members.v1.FieldSet;
-import org.apache.isis.applib.layout.members.v1.PropertyLayoutData;
-import org.apache.isis.applib.layout.fixedcols.FCTab;
-import org.apache.isis.applib.layout.fixedcols.FCTabGroup;
-import org.apache.isis.applib.services.i18n.TranslationService;
-import org.apache.isis.applib.services.layout.ObjectLayoutMetadataService;
-import org.apache.isis.core.metamodel.deployment.DeploymentCategory;
-import org.apache.isis.core.metamodel.facetapi.Facet;
-import org.apache.isis.core.metamodel.facetapi.FacetAbstract;
-import org.apache.isis.core.metamodel.facetapi.FacetHolder;
-import org.apache.isis.core.metamodel.facetapi.FacetUtil;
-import org.apache.isis.core.metamodel.facets.actions.layout.ActionPositionFacetForActionXml;
-import org.apache.isis.core.metamodel.facets.actions.layout.BookmarkPolicyFacetForActionXml;
-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.NamedFacetForActionXml;
-import org.apache.isis.core.metamodel.facets.collections.layout.CssClassFacetForCollectionXml;
-import org.apache.isis.core.metamodel.facets.collections.layout.DefaultViewFacetForCollectionXml;
-import org.apache.isis.core.metamodel.facets.collections.layout.DescribedAsFacetForCollectionXml;
-import org.apache.isis.core.metamodel.facets.collections.layout.HiddenFacetForCollectionXml;
-import org.apache.isis.core.metamodel.facets.collections.layout.NamedFacetForCollectionXml;
-import org.apache.isis.core.metamodel.facets.collections.layout.PagedFacetForCollectionXml;
-import org.apache.isis.core.metamodel.facets.collections.layout.SortedByFacetForCollectionXml;
-import org.apache.isis.core.metamodel.facets.members.order.annotprop.MemberOrderFacetXml;
-import org.apache.isis.core.metamodel.facets.object.membergroups.MemberGroupLayoutFacet;
-import org.apache.isis.core.metamodel.facets.properties.propertylayout.CssClassFacetForPropertyXml;
-import org.apache.isis.core.metamodel.facets.properties.propertylayout.DescribedAsFacetForPropertyXml;
-import org.apache.isis.core.metamodel.facets.properties.propertylayout.HiddenFacetForPropertyXml;
-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.RenderedAdjustedFacetForPropertyXml;
-import org.apache.isis.core.metamodel.facets.properties.propertylayout.TypicalLengthFacetForPropertyXml;
-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.ObjectMember;
-import org.apache.isis.core.metamodel.spec.feature.OneToManyAssociation;
-import org.apache.isis.core.metamodel.spec.feature.OneToOneAssociation;
-
-public class ObjectLayoutMetadataFacetDefault
-            extends FacetAbstract
-            implements ObjectLayoutMetadataFacet {
-
-    private static final Logger LOG = LoggerFactory.getLogger(ObjectLayoutMetadataFacetDefault.class);
-
-
-    public static Class<? extends Facet> type() {
-        return ObjectLayoutMetadataFacet.class;
-    }
-
-
-    public static ObjectLayoutMetadataFacet create(
-            final FacetHolder facetHolder,
-            final TranslationService translationService,
-            final ObjectLayoutMetadataService objectLayoutMetadataService,
-            final DeploymentCategory deploymentCategory) {
-        return new ObjectLayoutMetadataFacetDefault(facetHolder, translationService, objectLayoutMetadataService, deploymentCategory);
-    }
-
-    private final TranslationService translationService;
-    private final DeploymentCategory deploymentCategory;
-    private final ObjectLayoutMetadataService objectLayoutMetadataService;
-
-    private FCPage metadata;
-    private boolean blacklisted;
-
-    private ObjectLayoutMetadataFacetDefault(
-            final FacetHolder facetHolder,
-            final TranslationService translationService,
-            final ObjectLayoutMetadataService objectLayoutMetadataService,
-            final DeploymentCategory deploymentCategory) {
-        super(ObjectLayoutMetadataFacetDefault.type(), facetHolder, Derivation.NOT_DERIVED);
-        this.objectLayoutMetadataService = objectLayoutMetadataService;
-        this.translationService = translationService;
-        this.deploymentCategory = deploymentCategory;
-    }
-
-    /**
-     * Blacklisting only occurs if running in production mode.
-     */
-    @Override
-    public FCPage getMetadata() {
-        if (deploymentCategory.isProduction() || blacklisted) {
-            return metadata;
-        }
-        final Class<?> domainClass = getSpecification().getCorrespondingClass();
-        final FCPage metadata = objectLayoutMetadataService.fromXml(domainClass);
-        if(deploymentCategory.isProduction() && metadata == null) {
-            blacklisted = true;
-        }
-        this.metadata = normalize(metadata);
-        return this.metadata;
-    }
-
-    private FCPage normalize(final FCPage metadata) {
-        if(metadata == null) {
-            return null;
-        }
-
-        // if have .layout.json and then add a .layout.xml without restarting, then note that
-        // the changes won't be picked up.  Normalizing would be required
-        // in order to trample over the .layout.json's original facets
-        if(metadata.isNormalized()) {
-            return metadata;
-        }
-        
-        doNormalize(metadata, getSpecification());
-        metadata.setNormalized(true);
-        return metadata;
-    }
-
-    private void doNormalize(final FCPage metadata, final ObjectSpecification objectSpec) {
-
-        final Map<String, OneToOneAssociation> oneToOneAssociationById =
-                ObjectMember.Util.mapById(getOneToOneAssociations(objectSpec));
-        final Map<String, OneToManyAssociation> oneToManyAssociationById =
-                ObjectMember.Util.mapById(getOneToManyAssociations(objectSpec));
-        final Map<String, ObjectAction> objectActionById =
-                ObjectMember.Util.mapById(objectSpec.getObjectActions(Contributed.INCLUDED));
-
-        derive(metadata, oneToOneAssociationById, oneToManyAssociationById, objectActionById);
-        overwrite(metadata, oneToOneAssociationById, oneToManyAssociationById, objectActionById);
-    }
-
-    /**
-     * Ensures that all object members (properties, collections and actions) are in the metadata.
-     *
-     * <p>
-     *     If they are missing then they will be added to default tabs (created on the fly if need be).
-     * </p>
-     */
-    private static void derive(
-            final FCPage metadata,
-            final Map<String, OneToOneAssociation> oneToOneAssociationById,
-            final Map<String, OneToManyAssociation> oneToManyAssociationById,
-            final Map<String, ObjectAction> objectActionById) {
-
-        final LinkedHashMap<String, PropertyLayoutData> propertyIds = metadata.getAllPropertiesById();
-        final LinkedHashMap<String, CollectionLayoutData> collectionIds = metadata.getAllCollectionsById();
-        final LinkedHashMap<String, ActionLayoutData> actionIds = metadata.getAllActionsById();
-
-        final AtomicReference<FieldSet> defaultPropertyGroupRef = new AtomicReference<>();
-        final AtomicReference<FCColumn> firstColumnRef = new AtomicReference<>();
-        final AtomicReference<FCTabGroup> lastTabGroupRef = new AtomicReference<>();
-
-        // capture the first column, and also
-        // capture the first property group (if any) with the default name ('General')
-        metadata.visit(new FCPage.VisitorAdapter() {
-            @Override
-            public void visit(final FCColumn FCColumn) {
-                firstColumnRef.compareAndSet(null, FCColumn);
-            }
-            @Override
-            public void visit(final FieldSet fieldSet) {
-                if(MemberGroupLayoutFacet.DEFAULT_GROUP.equals(fieldSet.getName())) {
-                    defaultPropertyGroupRef.compareAndSet(null, fieldSet);
-                }
-            }
-            @Override
-            public void visit(final FCTabGroup tabGroup) {
-                lastTabGroupRef.set(tabGroup);
-            }
-        });
-
-        // any missing properties will be added to the (first) 'General' property group found
-        // if there is no default ('General') property group
-        // then one will be added to the first Column of the first Tab.
-        final Tuple<List<String>> propertyIdTuple = surplusAndMissing(propertyIds.keySet(), oneToOneAssociationById.keySet());
-        final List<String> surplusPropertyIds = propertyIdTuple.first;
-        final List<String> missingPropertyIds = propertyIdTuple.second;
-
-        for (String surplusPropertyId : surplusPropertyIds) {
-            propertyIds.get(surplusPropertyId).setMetadataError("No such property");
-        }
-
-        if(!missingPropertyIds.isEmpty()) {
-            // ensure that there is a property group to use
-            boolean wasSet = defaultPropertyGroupRef.compareAndSet(null, new FieldSet(MemberGroupLayoutFacet.DEFAULT_GROUP));
-            final FieldSet defaultFieldSet = defaultPropertyGroupRef.get();
-            if(wasSet) {
-                firstColumnRef.get().getFieldSets().add(defaultFieldSet);
-            }
-            for (final String propertyId : missingPropertyIds) {
-                defaultFieldSet.getProperties().add(new PropertyLayoutData(propertyId));
-            }
-        }
-
-
-        // any missing collections will be added as tabs to the last TabGroup.
-        // If there is only a single tab group then a new TabGroup will be added first
-        final Tuple<List<String>> collectionIdTuple = surplusAndMissing(collectionIds.keySet(), oneToManyAssociationById.keySet());
-        final List<String> surplusCollectionIds = collectionIdTuple.first;
-        final List<String> missingCollectionIds = collectionIdTuple.second;
-
-        for (String surplusCollectionId : surplusCollectionIds) {
-            collectionIds.get(surplusCollectionId).setMetadataError("No such collection");
-        }
-
-        if(!missingCollectionIds.isEmpty()) {
-            while(metadata.getTabGroups().size() < 2) {
-                final FCTabGroup tabGroup = new FCTabGroup();
-                metadata.getTabGroups().add(tabGroup);
-                lastTabGroupRef.set(tabGroup);
-            }
-            final FCTabGroup lastTabGroup = lastTabGroupRef.get();
-            for (final String collectionId : missingCollectionIds) {
-                final FCTab FCTab = new FCTab();
-                lastTabGroup.getTabs().add(FCTab);
-                FCColumn left = new FCColumn(12);
-                FCTab.setLeft(left);
-                final CollectionLayoutData layoutMetadata = new CollectionLayoutData(collectionId);
-                layoutMetadata.setDefaultView("table");
-                left.getCollections().add(layoutMetadata);
-            }
-        }
-
-        // any missing actions will be added as domain object actions (in the header)
-        final Tuple<List<String>> actionIdTuple = surplusAndMissing(actionIds.keySet(), objectActionById.keySet());
-        final List<String> surplusActionIds = actionIdTuple.first;
-        final List<String> missingActionIds = actionIdTuple.second;
-
-        for (String surplusActionId : surplusActionIds) {
-            actionIds.get(surplusActionId).setMetadataError("No such action");
-        }
-
-        if(!missingActionIds.isEmpty()) {
-            for (String actionId : missingActionIds) {
-                List<ActionLayoutData> actions = metadata.getActions();
-                if(actions == null) {
-                    actions = Lists.newArrayList();
-                    metadata.setActions(actions);
-                }
-                actions.add(new ActionLayoutData(actionId));
-            }
-        }
-    }
-
-    static class Tuple<T> {
-        final T first;
-        final T second;
-        private Tuple(final T first, final T second) {
-            this.first = first;
-            this.second = second;
-        }
-        public static <T> Tuple<T> of(final T first, final T second) {
-            return new Tuple<>(first, second);
-        }
-    }
-    /**
-     * Returns a 2-element tuple of [first-second, second-first]
-     */
-    static <T> Tuple<List<T>> surplusAndMissing(final Collection<T> first, final Collection<T> second){
-        final List<T> firstNotSecond = Lists.newArrayList(first);
-        firstNotSecond.removeAll(second);
-        final List<T> secondNotFirst = Lists.newArrayList(second);
-        secondNotFirst.removeAll(first);
-        return Tuple.of(firstNotSecond, secondNotFirst);
-    }
-
-    private void overwrite(
-            final FCPage metadata,
-            final Map<String, OneToOneAssociation> oneToOneAssociationById,
-            final Map<String, OneToManyAssociation> oneToManyAssociationById,
-            final Map<String, ObjectAction> objectActionById) {
-
-        final Map<String, int[]> propertySequenceByGroup = Maps.newHashMap();
-
-        metadata.visit(new FCPage.VisitorAdapter() {
-            private int collectionSequence = 1;
-            private int actionDomainObjectSequence = 1;
-            private int actionPropertyGroupSequence = 1;
-            private int actionPropertySequence = 1;
-            private int actionCollectionSequence = 1;
-
-            @Override
-            public void visit(final ActionLayoutData actionLayoutData) {
-                final ActionOwner actionOwner = actionLayoutData.getOwner();
-                final ObjectAction objectAction = objectActionById.get(actionLayoutData.getId());
-                if(objectAction == null) {
-                    return;
-                }
-
-                final String memberOrderName;
-                final int memberOrderSequence;
-                if(actionOwner instanceof FieldSet) {
-                    final FieldSet fieldSet = (FieldSet) actionOwner;
-                    final List<PropertyLayoutData> properties = fieldSet.getProperties();
-                    final PropertyLayoutData propertyLayoutData = properties.get(0); // any will do
-                    memberOrderName = propertyLayoutData.getId();
-                    memberOrderSequence = actionPropertyGroupSequence++;
-                } else if(actionOwner instanceof PropertyLayoutData) {
-                    final PropertyLayoutData propertyLayoutData = (PropertyLayoutData) actionOwner;
-                    memberOrderName = propertyLayoutData.getId();
-                    memberOrderSequence = actionPropertySequence++;
-                } else if(actionOwner instanceof CollectionLayoutData) {
-                    final CollectionLayoutData collectionLayoutData = (CollectionLayoutData) actionOwner;
-                    memberOrderName = collectionLayoutData.getId();
-                    memberOrderSequence = actionCollectionSequence++;
-                } else {
-                    // DomainObject
-                    memberOrderName = null;
-                    memberOrderSequence = actionDomainObjectSequence++;
-                }
-                FacetUtil.addFacet(
-                        new MemberOrderFacetXml(memberOrderName, ""+memberOrderSequence, translationService, objectAction));
-
-
-                if(actionOwner instanceof FieldSet) {
-                    if(actionLayoutData.getPosition() == null ||
-                            actionLayoutData.getPosition() == org.apache.isis.applib.annotation.ActionLayout.Position.BELOW ||
-                            actionLayoutData.getPosition() == org.apache.isis.applib.annotation.ActionLayout.Position.RIGHT) {
-                        actionLayoutData.setPosition(org.apache.isis.applib.annotation.ActionLayout.Position.PANEL);
-                    }
-                } else if(actionOwner instanceof PropertyLayoutData) {
-                    if(actionLayoutData.getPosition() == null ||
-                            actionLayoutData.getPosition() == org.apache.isis.applib.annotation.ActionLayout.Position.PANEL_DROPDOWN ||
-                            actionLayoutData.getPosition() == org.apache.isis.applib.annotation.ActionLayout.Position.PANEL) {
-                        actionLayoutData.setPosition(org.apache.isis.applib.annotation.ActionLayout.Position.BELOW);
-                    }
-                } else {
-                    // doesn't do anything for DomainObject or Collection
-                    actionLayoutData.setPosition(null);
-                }
-
-                FacetUtil.addFacet(ActionPositionFacetForActionXml.create(actionLayoutData, objectAction));
-                FacetUtil.addFacet(BookmarkPolicyFacetForActionXml.create(actionLayoutData, objectAction));
-                FacetUtil.addFacet(CssClassFacetForActionXml.create(actionLayoutData, objectAction));
-                FacetUtil.addFacet(CssClassFaFacetForActionXml.create(actionLayoutData, objectAction));
-                FacetUtil.addFacet(DescribedAsFacetForActionXml.create(actionLayoutData, objectAction));
-                FacetUtil.addFacet(HiddenFacetForActionLayoutXml.create(actionLayoutData, objectAction));
-                FacetUtil.addFacet(NamedFacetForActionXml.create(actionLayoutData, objectAction));
-            }
-
-            @Override
-            public void visit(final PropertyLayoutData propertyLayoutData) {
-                final OneToOneAssociation oneToOneAssociation = oneToOneAssociationById.get(propertyLayoutData.getId());
-                if(oneToOneAssociation == null) {
-                    return;
-                }
-
-                FacetUtil.addFacet(CssClassFacetForPropertyXml.create(propertyLayoutData, oneToOneAssociation));
-                FacetUtil.addFacet(DescribedAsFacetForPropertyXml.create(propertyLayoutData, oneToOneAssociation));
-                FacetUtil.addFacet(HiddenFacetForPropertyXml.create(propertyLayoutData, oneToOneAssociation));
-                FacetUtil.addFacet(LabelAtFacetForPropertyXml.create(propertyLayoutData, oneToOneAssociation));
-                FacetUtil.addFacet(MultiLineFacetForPropertyXml.create(propertyLayoutData, oneToOneAssociation));
-                FacetUtil.addFacet(NamedFacetForPropertyXml.create(propertyLayoutData, oneToOneAssociation));
-                FacetUtil.addFacet(
-                        RenderedAdjustedFacetForPropertyXml.create(propertyLayoutData, oneToOneAssociation));
-                FacetUtil.addFacet(TypicalLengthFacetForPropertyXml.create(propertyLayoutData, oneToOneAssociation));
-
-                // @MemberOrder#name based on owning property group, @MemberOrder#sequence monotonically increasing
-                final FieldSet fieldSet = propertyLayoutData.getOwner();
-                final String groupName = fieldSet.getName();
-                final String sequence = nextInSequenceFor(groupName, propertySequenceByGroup);
-                FacetUtil.addFacet(
-                        new MemberOrderFacetXml(groupName, sequence, translationService, oneToOneAssociation));
-            }
-
-            @Override
-            public void visit(final CollectionLayoutData collectionLayoutData) {
-                final OneToManyAssociation oneToManyAssociation = oneToManyAssociationById.get(collectionLayoutData.getId());
-                if(oneToManyAssociation == null) {
-                    return;
-                }
-
-                FacetUtil.addFacet(CssClassFacetForCollectionXml.create(collectionLayoutData, oneToManyAssociation));
-                FacetUtil.addFacet(
-                        DefaultViewFacetForCollectionXml.create(collectionLayoutData, oneToManyAssociation));
-                FacetUtil.addFacet(
-                        DescribedAsFacetForCollectionXml.create(collectionLayoutData, oneToManyAssociation));
-                FacetUtil.addFacet(HiddenFacetForCollectionXml.create(collectionLayoutData, oneToManyAssociation));
-                FacetUtil.addFacet(NamedFacetForCollectionXml.create(collectionLayoutData, oneToManyAssociation));
-                FacetUtil.addFacet(PagedFacetForCollectionXml.create(collectionLayoutData, oneToManyAssociation));
-                FacetUtil.addFacet(SortedByFacetForCollectionXml.create(collectionLayoutData, oneToManyAssociation));
-
-                // @MemberOrder#name based on the collection's id (so that each has a single "member group")
-                final String groupName = collectionLayoutData.getId();
-                final String sequence = "" + collectionSequence++;
-                FacetUtil.addFacet(
-                        new MemberOrderFacetXml(groupName, sequence, translationService, oneToManyAssociation));
-
-                // if there is only a single column and no other contents, then copy the collection Id onto the tab'
-                final MemberRegionOwner memberRegionOwner = collectionLayoutData.getOwner();
-                if(memberRegionOwner instanceof FCColumn) {
-                    final FCColumn FCColumn = (FCColumn) memberRegionOwner;
-                    final FCColumnOwner holder = FCColumn.getOwner();
-                    if(holder instanceof FCTab) {
-                        final FCTab FCTab = (FCTab) holder;
-                        if(FCTab.getContents().size() == 1 && Strings.isNullOrEmpty(FCTab.getName()) ) {
-                            final String collectionName = oneToManyAssociation.getName();
-                            FCTab.setName(collectionName);
-                        }
-                    }
-                }
-            }
-        });
-    }
-
-    private String nextInSequenceFor(
-            final String key, final Map<String, int[]> seqByKey) {
-        synchronized (seqByKey) {
-            int[] holder = seqByKey.get(key);
-            if(holder == null) {
-                holder = new int[]{0};
-                seqByKey.put(key, holder);
-            }
-            holder[0]++;
-            return ""+holder[0];
-        }
-    }
-
-    private static List<OneToOneAssociation> getOneToOneAssociations(final ObjectSpecification objectSpec) {
-        List associations = objectSpec
-                .getAssociations(Contributed.INCLUDED, ObjectAssociation.Filters.PROPERTIES);
-        return associations;
-    }
-    private static List<OneToManyAssociation> getOneToManyAssociations(final ObjectSpecification objectSpec) {
-        List associations = objectSpec
-                .getAssociations(Contributed.INCLUDED, ObjectAssociation.Filters.COLLECTIONS);
-        return associations;
-    }
-
-    private ObjectSpecification getSpecification() {
-        return (ObjectSpecification)getFacetHolder();
-    }
-
-
-
-}

http://git-wip-us.apache.org/repos/asf/isis/blob/8f0abcdb/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/layoutmetadata/ObjectLayoutMetadataFacetFactory.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/layoutmetadata/ObjectLayoutMetadataFacetFactory.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/layoutmetadata/ObjectLayoutMetadataFacetFactory.java
deleted file mode 100644
index 28c69e6..0000000
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/layoutmetadata/ObjectLayoutMetadataFacetFactory.java
+++ /dev/null
@@ -1,57 +0,0 @@
-/* Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- * 
- * http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License. */
-package org.apache.isis.core.metamodel.facets.object.layoutmetadata;
-
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import org.apache.isis.applib.services.i18n.TranslationService;
-import org.apache.isis.applib.services.layout.ObjectLayoutMetadataService;
-import org.apache.isis.core.metamodel.facetapi.FacetHolder;
-import org.apache.isis.core.metamodel.facetapi.FacetUtil;
-import org.apache.isis.core.metamodel.facetapi.FeatureType;
-import org.apache.isis.core.metamodel.facets.FacetFactoryAbstract;
-import org.apache.isis.core.metamodel.runtimecontext.ServicesInjector;
-import org.apache.isis.core.metamodel.runtimecontext.ServicesInjectorAware;
-
-public class ObjectLayoutMetadataFacetFactory extends FacetFactoryAbstract implements ServicesInjectorAware {
-
-    private static final Logger LOG = LoggerFactory.getLogger(ObjectLayoutMetadataFacetFactory.class);
-
-    public ObjectLayoutMetadataFacetFactory() {
-        super(FeatureType.OBJECTS_ONLY);
-    }
-
-    @Override
-    public void process(final ProcessClassContext processClassContext) {
-        final FacetHolder facetHolder = processClassContext.getFacetHolder();
-
-        final TranslationService translationService = servicesInjector.lookupService(TranslationService.class);
-        final ObjectLayoutMetadataService objectLayoutMetadataService = servicesInjector.lookupService(ObjectLayoutMetadataService.class);
-        FacetUtil.addFacet(
-                ObjectLayoutMetadataFacetDefault.create(facetHolder,
-                        translationService, objectLayoutMetadataService, getDeploymentCategory()));
-    }
-
-    private ServicesInjector servicesInjector;
-
-    @Override
-    public void setServicesInjector(final ServicesInjector servicesInjector) {
-        this.servicesInjector = servicesInjector;
-    }
-
-}

http://git-wip-us.apache.org/repos/asf/isis/blob/8f0abcdb/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/layoutmetadata/PageFacet.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/layoutmetadata/PageFacet.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/layoutmetadata/PageFacet.java
new file mode 100644
index 0000000..40c5139
--- /dev/null
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/layoutmetadata/PageFacet.java
@@ -0,0 +1,33 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
+package org.apache.isis.core.metamodel.facets.object.layoutmetadata;
+
+
+import org.apache.isis.applib.layout.members.v1.Page;
+import org.apache.isis.core.metamodel.facetapi.Facet;
+
+/**
+ * Corresponds to providing a <code>.layout.xml</code> file for the domain object's class.
+ */
+public interface PageFacet extends Facet {
+
+    Page getPage();
+
+
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/isis/blob/8f0abcdb/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/layoutmetadata/PageFacetDefault.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/layoutmetadata/PageFacetDefault.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/layoutmetadata/PageFacetDefault.java
new file mode 100644
index 0000000..3c29e8c
--- /dev/null
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/layoutmetadata/PageFacetDefault.java
@@ -0,0 +1,117 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
+package org.apache.isis.core.metamodel.facets.object.layoutmetadata;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import org.apache.isis.applib.layout.members.v1.Page;
+import org.apache.isis.applib.services.i18n.TranslationService;
+import org.apache.isis.applib.services.layout.PageService;
+import org.apache.isis.core.metamodel.deployment.DeploymentCategory;
+import org.apache.isis.core.metamodel.facetapi.Facet;
+import org.apache.isis.core.metamodel.facetapi.FacetAbstract;
+import org.apache.isis.core.metamodel.facetapi.FacetHolder;
+import org.apache.isis.core.metamodel.services.layout.provider.PageNormalizerService;
+import org.apache.isis.core.metamodel.spec.ObjectSpecification;
+
+public class PageFacetDefault
+            extends FacetAbstract
+            implements PageFacet {
+
+    private static final Logger LOG = LoggerFactory.getLogger(PageFacetDefault.class);
+
+
+    public static Class<? extends Facet> type() {
+        return PageFacet.class;
+    }
+
+
+    public static PageFacet create(
+            final FacetHolder facetHolder,
+            final TranslationService translationService,
+            final PageService pageService,
+            final PageNormalizerService pageNormalizerService, final DeploymentCategory deploymentCategory) {
+        return new PageFacetDefault(facetHolder, translationService, pageService, pageNormalizerService,
+                deploymentCategory);
+    }
+
+    private final TranslationService translationService;
+    private final PageNormalizerService pageNormalizerService;
+    private final DeploymentCategory deploymentCategory;
+    private final PageService pageService;
+
+    private Page page;
+    private boolean blacklisted;
+
+    private PageFacetDefault(
+            final FacetHolder facetHolder,
+            final TranslationService translationService,
+            final PageService pageService,
+            final PageNormalizerService pageNormalizerService,
+            final DeploymentCategory deploymentCategory) {
+        super(PageFacetDefault.type(), facetHolder, Derivation.NOT_DERIVED);
+        this.pageService = pageService;
+        this.translationService = translationService;
+        this.pageNormalizerService = pageNormalizerService;
+        this.deploymentCategory = deploymentCategory;
+    }
+
+    /**
+     * Blacklisting only occurs if running in production mode.
+     */
+    @Override
+    public Page getPage() {
+        if (deploymentCategory.isProduction() || blacklisted) {
+            return page;
+        }
+        final Class<?> domainClass = getSpecification().getCorrespondingClass();
+        final Page page = pageService.fromXml(domainClass);
+        if(deploymentCategory.isProduction() && page == null) {
+            blacklisted = true;
+        }
+        this.page = normalize(page);
+        return this.page;
+    }
+
+    private Page normalize(final Page page) {
+        if(page == null) {
+            return null;
+        }
+
+        // if have .layout.json and then add a .layout.xml without restarting, then note that
+        // the changes won't be picked up.  Normalizing would be required
+        // in order to trample over the .layout.json's original facets
+        if(page.isNormalized()) {
+            return page;
+        }
+
+        final Class<?> domainClass = getSpecification().getCorrespondingClass();
+
+        pageNormalizerService.normalize(page, domainClass);
+        return page;
+    }
+
+    private ObjectSpecification getSpecification() {
+        return (ObjectSpecification) getFacetHolder();
+    }
+
+
+
+}

http://git-wip-us.apache.org/repos/asf/isis/blob/8f0abcdb/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/layoutmetadata/PageFacetFactory.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/layoutmetadata/PageFacetFactory.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/layoutmetadata/PageFacetFactory.java
new file mode 100644
index 0000000..60c7ad3
--- /dev/null
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/layoutmetadata/PageFacetFactory.java
@@ -0,0 +1,63 @@
+/* Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License. */
+package org.apache.isis.core.metamodel.facets.object.layoutmetadata;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import org.apache.isis.applib.services.i18n.TranslationService;
+import org.apache.isis.applib.services.layout.PageService;
+import org.apache.isis.core.metamodel.facetapi.FacetHolder;
+import org.apache.isis.core.metamodel.facetapi.FacetUtil;
+import org.apache.isis.core.metamodel.facetapi.FeatureType;
+import org.apache.isis.core.metamodel.facets.FacetFactoryAbstract;
+import org.apache.isis.core.metamodel.runtimecontext.ServicesInjector;
+import org.apache.isis.core.metamodel.runtimecontext.ServicesInjectorAware;
+import org.apache.isis.core.metamodel.services.layout.provider.PageNormalizerService;
+
+public class PageFacetFactory extends FacetFactoryAbstract implements ServicesInjectorAware {
+
+    private static final Logger LOG = LoggerFactory.getLogger(PageFacetFactory.class);
+
+    public PageFacetFactory() {
+        super(FeatureType.OBJECTS_ONLY);
+    }
+
+    @Override
+    public void process(final ProcessClassContext processClassContext) {
+        final FacetHolder facetHolder = processClassContext.getFacetHolder();
+
+        final TranslationService translationService =
+                servicesInjector.lookupService(TranslationService.class);
+        final PageService pageService =
+                servicesInjector.lookupService(PageService.class);
+        final PageNormalizerService pageNormalizerService =
+                servicesInjector.lookupService(PageNormalizerService.class);
+
+        FacetUtil.addFacet(
+                PageFacetDefault.create(facetHolder,
+                        translationService, pageService, pageNormalizerService, getDeploymentCategory()));
+    }
+
+    private ServicesInjector servicesInjector;
+
+    @Override
+    public void setServicesInjector(final ServicesInjector servicesInjector) {
+        this.servicesInjector = servicesInjector;
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/isis/blob/8f0abcdb/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 e460e07..a97a969 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
@@ -43,7 +43,7 @@ import org.apache.isis.applib.annotation.Render.Type;
 import org.apache.isis.applib.annotation.When;
 import org.apache.isis.applib.annotation.Where;
 import org.apache.isis.applib.filter.Filter;
-import org.apache.isis.applib.services.layout.ObjectLayoutMetadataService;
+import org.apache.isis.applib.services.layout.PageService;
 import org.apache.isis.core.commons.lang.ClassExtensions;
 import org.apache.isis.core.metamodel.facets.all.describedas.DescribedAsFacet;
 import org.apache.isis.core.metamodel.facets.all.hide.HiddenFacet;
@@ -415,8 +415,8 @@ public class LayoutMetadataReaderFromJson implements LayoutMetadataReader2, Serv
         }
 
         try {
-            final ObjectLayoutMetadataService objectLayoutMetadataService = getObjectLayoutMetadataService();
-            if(objectLayoutMetadataService.exists(domainClass)) {
+            final PageService pageService = getObjectLayoutMetadataService();
+            if(pageService.exists(domainClass)) {
                 blacklisted.add(domainClass);
                 return null;
             }
@@ -699,8 +699,8 @@ public class LayoutMetadataReaderFromJson implements LayoutMetadataReader2, Serv
 
 
 
-    private ObjectLayoutMetadataService getObjectLayoutMetadataService() {
-        return servicesInjector.lookupService(ObjectLayoutMetadataService.class);
+    private PageService getObjectLayoutMetadataService() {
+        return servicesInjector.lookupService(PageService.class);
     }
 
 

http://git-wip-us.apache.org/repos/asf/isis/blob/8f0abcdb/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/layout/ObjectLayoutMetadataServiceDefault.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/layout/ObjectLayoutMetadataServiceDefault.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/layout/ObjectLayoutMetadataServiceDefault.java
deleted file mode 100644
index d37b145..0000000
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/layout/ObjectLayoutMetadataServiceDefault.java
+++ /dev/null
@@ -1,172 +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.services.layout;
-
-import java.io.IOException;
-import java.net.URL;
-import java.nio.charset.Charset;
-import java.util.Map;
-import java.util.Objects;
-
-import javax.inject.Inject;
-
-import com.google.common.collect.Maps;
-import com.google.common.io.Resources;
-
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import org.apache.isis.applib.annotation.DomainService;
-import org.apache.isis.applib.annotation.NatureOfService;
-import org.apache.isis.applib.annotation.Programmatic;
-import org.apache.isis.applib.layout.fixedcols.FCPage;
-import org.apache.isis.applib.services.jaxb.JaxbService;
-import org.apache.isis.applib.services.layout.ObjectLayoutMetadataService;
-import org.apache.isis.core.metamodel.deployment.DeploymentCategory;
-import org.apache.isis.core.metamodel.deployment.DeploymentCategoryAware;
-import org.apache.isis.core.metamodel.facets.object.layoutmetadata.ObjectLayoutMetadataFacet;
-import org.apache.isis.core.metamodel.spec.ObjectSpecification;
-import org.apache.isis.core.metamodel.spec.SpecificationLoader;
-import org.apache.isis.core.metamodel.spec.SpecificationLoaderAware;
-
-@DomainService(nature = NatureOfService.DOMAIN)
-public class ObjectLayoutMetadataServiceDefault
-        implements ObjectLayoutMetadataService, SpecificationLoaderAware, DeploymentCategoryAware {
-
-    private static final Logger LOG = LoggerFactory.getLogger(ObjectLayoutMetadataServiceDefault.class);
-
-    // for better logging messages (used only in prototyping mode)
-    private final Map<Class<?>, String> badXmlByClass = Maps.newHashMap();
-
-    // cache (used only in prototyping mode)
-    private final Map<String, FCPage> metadataByXml = Maps.newHashMap();
-
-    @Override
-    @Programmatic
-    public boolean exists(final Class<?> domainClass) {
-        final URL resource = Resources.getResource(domainClass, resourceNameFor(domainClass));
-        return resource != null;
-    }
-
-    @Override
-    @Programmatic
-    public FCPage fromXml(Class<?> domainClass) {
-
-        final String resourceName = resourceNameFor(domainClass);
-        final String xml;
-        try {
-            xml = resourceContentOf(domainClass, resourceName);
-        } catch (IOException | IllegalArgumentException ex) {
-
-            final String message = String .format(
-                    "Failed to locate file %s (relative to %s.class); ex: %s)",
-                    resourceName, domainClass.getName(), ex.getMessage());
-
-            LOG.debug(message);
-            return null;
-        }
-
-
-        if(!deploymentCategory.isProduction()) {
-            final FCPage FCPage = metadataByXml.get(xml);
-            if(FCPage != null) {
-                return FCPage;
-            }
-
-            final String badXml = badXmlByClass.get(domainClass);
-            if(badXml != null) {
-                if(Objects.equals(xml, badXml)) {
-                    // seen this before and already logged; just quit
-                    return null;
-                } else {
-                    // this different XML might be good
-                    badXmlByClass.remove(domainClass);
-                }
-            }
-
-        }
-
-        try {
-            final FCPage metadata = jaxbService.fromXml(FCPage.class, xml);
-            if(!deploymentCategory.isProduction()) {
-                metadataByXml.put(xml, metadata);
-            }
-            return metadata;
-        } catch(Exception ex) {
-
-            if(!deploymentCategory.isProduction()) {
-                // save fact that this was bad XML, so that we don't log again if called next time
-                badXmlByClass.put(domainClass, xml);
-            }
-
-            // note that we don't blacklist if the file exists but couldn't be parsed;
-            // the developer might fix so we will want to retry.
-            final String message = "Failed to parse " + resourceName + " file (" + ex.getMessage() + ")";
-            LOG.warn(message);
-
-            return null;
-        }
-    }
-
-    private static String resourceContentOf(final Class<?> cls, final String resourceName) throws IOException {
-        final URL url = Resources.getResource(cls, resourceName);
-        return Resources.toString(url, Charset.defaultCharset());
-    }
-
-    private String resourceNameFor(final Class<?> domainClass) {
-        return domainClass.getSimpleName() + ".layout.xml";
-    }
-
-
-    @Override
-    @Programmatic
-    public FCPage toMetadata(final Object domainObject) {
-        return toMetadata(domainObject.getClass());
-    }
-
-    @Override
-    public FCPage toMetadata(final Class<?> domainClass) {
-        final ObjectSpecification objectSpec = specificationLookup.loadSpecification(domainClass);
-        final ObjectLayoutMetadataFacet facet = objectSpec.getFacet(ObjectLayoutMetadataFacet.class);
-        return facet != null? facet.getMetadata(): null;
-    }
-
-    ////////////////////////////////////////////////////////
-
-
-    //region > injected dependencies
-
-    private SpecificationLoader specificationLookup;
-
-    @Override
-    public void setSpecificationLoader(final SpecificationLoader specificationLookup) {
-        this.specificationLookup = specificationLookup;
-    }
-
-    private DeploymentCategory deploymentCategory;
-
-    @Override
-    public void setDeploymentCategory(final DeploymentCategory deploymentCategory) {
-        this.deploymentCategory = deploymentCategory;
-    }
-
-    @Inject
-    JaxbService jaxbService;
-
-    //endregion
-
-}

http://git-wip-us.apache.org/repos/asf/isis/blob/8f0abcdb/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/layout/PageServiceDefault.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/layout/PageServiceDefault.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/layout/PageServiceDefault.java
new file mode 100644
index 0000000..b72534d
--- /dev/null
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/layout/PageServiceDefault.java
@@ -0,0 +1,189 @@
+/**
+ *  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.services.layout;
+
+import java.io.IOException;
+import java.net.URL;
+import java.nio.charset.Charset;
+import java.util.List;
+import java.util.Map;
+import java.util.Objects;
+
+import javax.inject.Inject;
+import javax.xml.bind.JAXBContext;
+
+import com.google.common.collect.Maps;
+import com.google.common.io.Resources;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import org.apache.isis.applib.annotation.DomainService;
+import org.apache.isis.applib.annotation.NatureOfService;
+import org.apache.isis.applib.annotation.Programmatic;
+import org.apache.isis.applib.layout.members.v1.Page;
+import org.apache.isis.applib.services.jaxb.JaxbService;
+import org.apache.isis.applib.services.layout.PageService;
+import org.apache.isis.core.metamodel.deployment.DeploymentCategory;
+import org.apache.isis.core.metamodel.deployment.DeploymentCategoryAware;
+import org.apache.isis.core.metamodel.facets.object.layoutmetadata.PageFacet;
+import org.apache.isis.core.metamodel.services.layout.provider.PageNormalizerService;
+import org.apache.isis.core.metamodel.spec.ObjectSpecification;
+import org.apache.isis.core.metamodel.spec.SpecificationLoader;
+import org.apache.isis.core.metamodel.spec.SpecificationLoaderAware;
+
+@DomainService(
+        nature = NatureOfService.DOMAIN
+)
+public class PageServiceDefault
+        implements PageService, SpecificationLoaderAware, DeploymentCategoryAware {
+
+    private static final Logger LOG = LoggerFactory.getLogger(PageServiceDefault.class);
+
+    // for better logging messages (used only in prototyping mode)
+    private final Map<Class<?>, String> badXmlByClass = Maps.newHashMap();
+
+    // cache (used only in prototyping mode)
+    private final Map<String, Page> pageByXml = Maps.newHashMap();
+
+    @Override
+    @Programmatic
+    public boolean exists(final Class<?> domainClass) {
+        final URL resource = Resources.getResource(domainClass, resourceNameFor(domainClass));
+        return resource != null;
+    }
+
+    @Override
+    @Programmatic
+    public Page fromXml(Class<?> domainClass) {
+
+        final String resourceName = resourceNameFor(domainClass);
+        final String xml;
+        try {
+            xml = resourceContentOf(domainClass, resourceName);
+        } catch (IOException | IllegalArgumentException ex) {
+
+            final String message = String .format(
+                    "Failed to locate file %s (relative to %s.class); ex: %s)",
+                    resourceName, domainClass.getName(), ex.getMessage());
+
+            LOG.debug(message);
+            return null;
+        }
+
+
+        if(!deploymentCategory.isProduction()) {
+            final Page page = pageByXml.get(xml);
+            if(page != null) {
+                return page;
+            }
+
+            final String badXml = badXmlByClass.get(domainClass);
+            if(badXml != null) {
+                if(Objects.equals(xml, badXml)) {
+                    // seen this before and already logged; just quit
+                    return null;
+                } else {
+                    // this different XML might be good
+                    badXmlByClass.remove(domainClass);
+                }
+            }
+
+        }
+
+        try {
+            // all known implementations of Page
+            List<Class<? extends Page>> pageImplementations = pageNormalizerService.pageImplementations();
+            final JAXBContext context = JAXBContext.newInstance(pageImplementations.toArray(new Class[0]));
+
+            final Page metadata = (Page) jaxbService.fromXml(context, xml);
+            if(!deploymentCategory.isProduction()) {
+                pageByXml.put(xml, metadata);
+            }
+            return metadata;
+        } catch(Exception ex) {
+
+            if(!deploymentCategory.isProduction()) {
+                // save fact that this was bad XML, so that we don't log again if called next time
+                badXmlByClass.put(domainClass, xml);
+            }
+
+            // note that we don't blacklist if the file exists but couldn't be parsed;
+            // the developer might fix so we will want to retry.
+            final String message = "Failed to parse " + resourceName + " file (" + ex.getMessage() + ")";
+            LOG.warn(message);
+
+            return null;
+        }
+    }
+
+    private static String resourceContentOf(final Class<?> cls, final String resourceName) throws IOException {
+        final URL url = Resources.getResource(cls, resourceName);
+        return Resources.toString(url, Charset.defaultCharset());
+    }
+
+    private String resourceNameFor(final Class<?> domainClass) {
+        return domainClass.getSimpleName() + ".layout.xml";
+    }
+
+
+    @Override
+    @Programmatic
+    public Page toPage(final Object domainObject) {
+        return toPage(domainObject.getClass());
+    }
+
+    @Override
+    public Page toPage(final Class<?> domainClass) {
+        final ObjectSpecification objectSpec = specificationLookup.loadSpecification(domainClass);
+        final PageFacet facet = objectSpec.getFacet(PageFacet.class);
+        return facet != null? facet.getPage(): null;
+    }
+
+
+    @Override
+    public String schemaLocations(final Page page) {
+        return pageNormalizerService.schemaLocationsFor(page);
+    }
+
+    ////////////////////////////////////////////////////////
+
+
+    //region > injected dependencies
+
+    private SpecificationLoader specificationLookup;
+
+    @Override
+    public void setSpecificationLoader(final SpecificationLoader specificationLookup) {
+        this.specificationLookup = specificationLookup;
+    }
+
+    private DeploymentCategory deploymentCategory;
+
+    @Override
+    public void setDeploymentCategory(final DeploymentCategory deploymentCategory) {
+        this.deploymentCategory = deploymentCategory;
+    }
+
+    @Inject
+    JaxbService jaxbService;
+
+    @Inject
+    PageNormalizerService pageNormalizerService;
+    //endregion
+
+}

http://git-wip-us.apache.org/repos/asf/isis/blob/8f0abcdb/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/layout/provider/PageNormalizer.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/layout/provider/PageNormalizer.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/layout/provider/PageNormalizer.java
new file mode 100644
index 0000000..4978f66
--- /dev/null
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/layout/provider/PageNormalizer.java
@@ -0,0 +1,25 @@
+/**
+ *  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.services.layout.provider;
+
+import org.apache.isis.applib.layout.members.v1.Page;
+
+public interface PageNormalizer<P extends Page> {
+
+    void normalize(final P page, final Class<?> domainClass);
+
+}

http://git-wip-us.apache.org/repos/asf/isis/blob/8f0abcdb/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/layout/provider/PageNormalizerAbstract.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/layout/provider/PageNormalizerAbstract.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/layout/provider/PageNormalizerAbstract.java
new file mode 100644
index 0000000..ad65e5b
--- /dev/null
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/layout/provider/PageNormalizerAbstract.java
@@ -0,0 +1,35 @@
+/**
+ *  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.services.layout.provider;
+
+import org.apache.isis.applib.layout.members.v1.Page;
+import org.apache.isis.applib.services.i18n.TranslationService;
+import org.apache.isis.core.metamodel.spec.SpecificationLoader;
+
+public abstract class PageNormalizerAbstract<P extends Page> implements PageNormalizer<P> {
+
+    protected final SpecificationLoader specificationLookup;
+    protected final TranslationService translationService;
+
+    public PageNormalizerAbstract(
+            final TranslationService translationService,
+            final SpecificationLoader specificationLookup) {
+        this.specificationLookup = specificationLookup;
+        this.translationService = translationService;
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/isis/blob/8f0abcdb/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/layout/provider/PageNormalizerBS3.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/layout/provider/PageNormalizerBS3.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/layout/provider/PageNormalizerBS3.java
new file mode 100644
index 0000000..ed1514b
--- /dev/null
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/layout/provider/PageNormalizerBS3.java
@@ -0,0 +1,39 @@
+/**
+ *  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.services.layout.provider;
+
+import org.apache.isis.applib.layout.bootstrap3.BS3Page;
+import org.apache.isis.applib.services.i18n.TranslationService;
+import org.apache.isis.core.metamodel.spec.SpecificationLoader;
+
+public class PageNormalizerBS3 extends PageNormalizerAbstract<BS3Page> {
+
+    public static final String TNS = "http://isis.apache.org/schema/applib/layout/bootstrap3";
+    public static final String SCHEMA_LOCATION = "http://isis.apache.org/schema/applib/layout/bootstrap3/bootstrap3.xsd";
+
+
+    public PageNormalizerBS3(
+            final TranslationService translationService,
+            final SpecificationLoader specificationLookup) {
+        super(translationService, specificationLookup);
+    }
+
+    @Override
+    public void normalize(final BS3Page page, final Class<?> domainClass) {
+
+    }
+}

http://git-wip-us.apache.org/repos/asf/isis/blob/8f0abcdb/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/layout/provider/PageNormalizerFC.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/layout/provider/PageNormalizerFC.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/layout/provider/PageNormalizerFC.java
new file mode 100644
index 0000000..7b4caed
--- /dev/null
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/layout/provider/PageNormalizerFC.java
@@ -0,0 +1,399 @@
+/**
+ *  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.services.layout.provider;
+
+import java.util.Collection;
+import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.concurrent.atomic.AtomicReference;
+
+import com.google.common.base.Strings;
+import com.google.common.collect.Lists;
+import com.google.common.collect.Maps;
+
+import org.apache.isis.applib.layout.fixedcols.FCColumn;
+import org.apache.isis.applib.layout.fixedcols.FCColumnOwner;
+import org.apache.isis.applib.layout.fixedcols.FCPage;
+import org.apache.isis.applib.layout.fixedcols.FCTab;
+import org.apache.isis.applib.layout.fixedcols.FCTabGroup;
+import org.apache.isis.applib.layout.members.MemberRegionOwner;
+import org.apache.isis.applib.layout.members.v1.ActionLayoutData;
+import org.apache.isis.applib.layout.members.v1.ActionOwner;
+import org.apache.isis.applib.layout.members.v1.CollectionLayoutData;
+import org.apache.isis.applib.layout.members.v1.FieldSet;
+import org.apache.isis.applib.layout.members.v1.PropertyLayoutData;
+import org.apache.isis.applib.services.i18n.TranslationService;
+import org.apache.isis.core.metamodel.facetapi.FacetUtil;
+import org.apache.isis.core.metamodel.facets.actions.layout.ActionPositionFacetForActionXml;
+import org.apache.isis.core.metamodel.facets.actions.layout.BookmarkPolicyFacetForActionXml;
+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.NamedFacetForActionXml;
+import org.apache.isis.core.metamodel.facets.collections.layout.CssClassFacetForCollectionXml;
+import org.apache.isis.core.metamodel.facets.collections.layout.DefaultViewFacetForCollectionXml;
+import org.apache.isis.core.metamodel.facets.collections.layout.DescribedAsFacetForCollectionXml;
+import org.apache.isis.core.metamodel.facets.collections.layout.HiddenFacetForCollectionXml;
+import org.apache.isis.core.metamodel.facets.collections.layout.NamedFacetForCollectionXml;
+import org.apache.isis.core.metamodel.facets.collections.layout.PagedFacetForCollectionXml;
+import org.apache.isis.core.metamodel.facets.collections.layout.SortedByFacetForCollectionXml;
+import org.apache.isis.core.metamodel.facets.members.order.annotprop.MemberOrderFacetXml;
+import org.apache.isis.core.metamodel.facets.object.membergroups.MemberGroupLayoutFacet;
+import org.apache.isis.core.metamodel.facets.properties.propertylayout.CssClassFacetForPropertyXml;
+import org.apache.isis.core.metamodel.facets.properties.propertylayout.DescribedAsFacetForPropertyXml;
+import org.apache.isis.core.metamodel.facets.properties.propertylayout.HiddenFacetForPropertyXml;
+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.RenderedAdjustedFacetForPropertyXml;
+import org.apache.isis.core.metamodel.facets.properties.propertylayout.TypicalLengthFacetForPropertyXml;
+import org.apache.isis.core.metamodel.spec.ObjectSpecification;
+import org.apache.isis.core.metamodel.spec.SpecificationLoader;
+import org.apache.isis.core.metamodel.spec.feature.Contributed;
+import org.apache.isis.core.metamodel.spec.feature.ObjectAction;
+import org.apache.isis.core.metamodel.spec.feature.ObjectAssociation;
+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 class PageNormalizerFC extends PageNormalizerAbstract<FCPage> {
+
+    public static final String TNS = "http://isis.apache.org/schema/applib/layout/fixedcols";
+    public static final String SCHEMA_LOCATION = "http://isis.apache.org/schema/applib/layout/fixedcols/fixedcols.xsd";
+
+
+    public PageNormalizerFC(
+            final TranslationService translationService,
+            final SpecificationLoader specificationLookup) {
+        super(translationService, specificationLookup);
+    }
+
+    @Override
+    public void normalize(final FCPage page, final Class<?> domainClass) {
+
+        final ObjectSpecification objectSpec = specificationLookup.loadSpecification(domainClass);
+
+        final Map<String, OneToOneAssociation> oneToOneAssociationById =
+                ObjectMember.Util.mapById(getOneToOneAssociations(objectSpec));
+        final Map<String, OneToManyAssociation> oneToManyAssociationById =
+                ObjectMember.Util.mapById(getOneToManyAssociations(objectSpec));
+        final Map<String, ObjectAction> objectActionById =
+                ObjectMember.Util.mapById(objectSpec.getObjectActions(Contributed.INCLUDED));
+
+        derive(page, oneToOneAssociationById, oneToManyAssociationById, objectActionById);
+        overwrite(page, oneToOneAssociationById, oneToManyAssociationById, objectActionById);
+    }
+
+    /**
+     * Ensures that all object members (properties, collections and actions) are in the metadata.
+     *
+     * <p>
+     *     If they are missing then they will be added to default tabs (created on the fly if need be).
+     * </p>
+     */
+    private static void derive(
+            final FCPage metadata,
+            final Map<String, OneToOneAssociation> oneToOneAssociationById,
+            final Map<String, OneToManyAssociation> oneToManyAssociationById,
+            final Map<String, ObjectAction> objectActionById) {
+
+        final LinkedHashMap<String, PropertyLayoutData> propertyIds = metadata.getAllPropertiesById();
+        final LinkedHashMap<String, CollectionLayoutData> collectionIds = metadata.getAllCollectionsById();
+        final LinkedHashMap<String, ActionLayoutData> actionIds = metadata.getAllActionsById();
+
+        final AtomicReference<FieldSet> defaultPropertyGroupRef = new AtomicReference<>();
+        final AtomicReference<FCColumn> firstColumnRef = new AtomicReference<>();
+        final AtomicReference<FCTabGroup> lastTabGroupRef = new AtomicReference<>();
+
+        // capture the first column, and also
+        // capture the first property group (if any) with the default name ('General')
+        metadata.visit(new FCPage.VisitorAdapter() {
+            @Override
+            public void visit(final FCColumn FCColumn) {
+                firstColumnRef.compareAndSet(null, FCColumn);
+            }
+            @Override
+            public void visit(final FieldSet fieldSet) {
+                if(MemberGroupLayoutFacet.DEFAULT_GROUP.equals(fieldSet.getName())) {
+                    defaultPropertyGroupRef.compareAndSet(null, fieldSet);
+                }
+            }
+            @Override
+            public void visit(final FCTabGroup tabGroup) {
+                lastTabGroupRef.set(tabGroup);
+            }
+        });
+
+        // any missing properties will be added to the (first) 'General' property group found
+        // if there is no default ('General') property group
+        // then one will be added to the first Column of the first Tab.
+        final Tuple<List<String>> propertyIdTuple = surplusAndMissing(propertyIds.keySet(), oneToOneAssociationById.keySet());
+        final List<String> surplusPropertyIds = propertyIdTuple.first;
+        final List<String> missingPropertyIds = propertyIdTuple.second;
+
+        for (String surplusPropertyId : surplusPropertyIds) {
+            propertyIds.get(surplusPropertyId).setMetadataError("No such property");
+        }
+
+        if(!missingPropertyIds.isEmpty()) {
+            // ensure that there is a property group to use
+            boolean wasSet = defaultPropertyGroupRef.compareAndSet(null, new FieldSet(MemberGroupLayoutFacet.DEFAULT_GROUP));
+            final FieldSet defaultFieldSet = defaultPropertyGroupRef.get();
+            if(wasSet) {
+                firstColumnRef.get().getFieldSets().add(defaultFieldSet);
+            }
+            for (final String propertyId : missingPropertyIds) {
+                defaultFieldSet.getProperties().add(new PropertyLayoutData(propertyId));
+            }
+        }
+
+
+        // any missing collections will be added as tabs to the last TabGroup.
+        // If there is only a single tab group then a new TabGroup will be added first
+        final Tuple<List<String>> collectionIdTuple = surplusAndMissing(collectionIds.keySet(), oneToManyAssociationById.keySet());
+        final List<String> surplusCollectionIds = collectionIdTuple.first;
+        final List<String> missingCollectionIds = collectionIdTuple.second;
+
+        for (String surplusCollectionId : surplusCollectionIds) {
+            collectionIds.get(surplusCollectionId).setMetadataError("No such collection");
+        }
+
+        if(!missingCollectionIds.isEmpty()) {
+            while(metadata.getTabGroups().size() < 2) {
+                final FCTabGroup tabGroup = new FCTabGroup();
+                metadata.getTabGroups().add(tabGroup);
+                lastTabGroupRef.set(tabGroup);
+            }
+            final FCTabGroup lastTabGroup = lastTabGroupRef.get();
+            for (final String collectionId : missingCollectionIds) {
+                final FCTab FCTab = new FCTab();
+                lastTabGroup.getTabs().add(FCTab);
+                FCColumn left = new FCColumn(12);
+                FCTab.setLeft(left);
+                final CollectionLayoutData layoutMetadata = new CollectionLayoutData(collectionId);
+                layoutMetadata.setDefaultView("table");
+                left.getCollections().add(layoutMetadata);
+            }
+        }
+
+        // any missing actions will be added as domain object actions (in the header)
+        final Tuple<List<String>> actionIdTuple = surplusAndMissing(actionIds.keySet(), objectActionById.keySet());
+        final List<String> surplusActionIds = actionIdTuple.first;
+        final List<String> missingActionIds = actionIdTuple.second;
+
+        for (String surplusActionId : surplusActionIds) {
+            actionIds.get(surplusActionId).setMetadataError("No such action");
+        }
+
+        if(!missingActionIds.isEmpty()) {
+            for (String actionId : missingActionIds) {
+                List<ActionLayoutData> actions = metadata.getActions();
+                if(actions == null) {
+                    actions = Lists.newArrayList();
+                    metadata.setActions(actions);
+                }
+                actions.add(new ActionLayoutData(actionId));
+            }
+        }
+    }
+
+    static class Tuple<T> {
+        final T first;
+        final T second;
+        private Tuple(final T first, final T second) {
+            this.first = first;
+            this.second = second;
+        }
+        public static <T> Tuple<T> of(final T first, final T second) {
+            return new Tuple<>(first, second);
+        }
+    }
+    /**
+     * Returns a 2-element tuple of [first-second, second-first]
+     */
+    static <T> Tuple<List<T>> surplusAndMissing(final Collection<T> first, final Collection<T> second){
+        final List<T> firstNotSecond = Lists.newArrayList(first);
+        firstNotSecond.removeAll(second);
+        final List<T> secondNotFirst = Lists.newArrayList(second);
+        secondNotFirst.removeAll(first);
+        return Tuple.of(firstNotSecond, secondNotFirst);
+    }
+
+    private void overwrite(
+            final FCPage page,
+            final Map<String, OneToOneAssociation> oneToOneAssociationById,
+            final Map<String, OneToManyAssociation> oneToManyAssociationById,
+            final Map<String, ObjectAction> objectActionById) {
+
+        final Map<String, int[]> propertySequenceByGroup = Maps.newHashMap();
+
+        page.visit(new FCPage.VisitorAdapter() {
+            private int collectionSequence = 1;
+            private int actionDomainObjectSequence = 1;
+            private int actionPropertyGroupSequence = 1;
+            private int actionPropertySequence = 1;
+            private int actionCollectionSequence = 1;
+
+            @Override
+            public void visit(final ActionLayoutData actionLayoutData) {
+                final ActionOwner actionOwner = actionLayoutData.getOwner();
+                final ObjectAction objectAction = objectActionById.get(actionLayoutData.getId());
+                if(objectAction == null) {
+                    return;
+                }
+
+                final String memberOrderName;
+                final int memberOrderSequence;
+                if(actionOwner instanceof FieldSet) {
+                    final FieldSet fieldSet = (FieldSet) actionOwner;
+                    final List<PropertyLayoutData> properties = fieldSet.getProperties();
+                    final PropertyLayoutData propertyLayoutData = properties.get(0); // any will do
+                    memberOrderName = propertyLayoutData.getId();
+                    memberOrderSequence = actionPropertyGroupSequence++;
+                } else if(actionOwner instanceof PropertyLayoutData) {
+                    final PropertyLayoutData propertyLayoutData = (PropertyLayoutData) actionOwner;
+                    memberOrderName = propertyLayoutData.getId();
+                    memberOrderSequence = actionPropertySequence++;
+                } else if(actionOwner instanceof CollectionLayoutData) {
+                    final CollectionLayoutData collectionLayoutData = (CollectionLayoutData) actionOwner;
+                    memberOrderName = collectionLayoutData.getId();
+                    memberOrderSequence = actionCollectionSequence++;
+                } else {
+                    // DomainObject
+                    memberOrderName = null;
+                    memberOrderSequence = actionDomainObjectSequence++;
+                }
+                FacetUtil.addFacet(
+                        new MemberOrderFacetXml(memberOrderName, ""+memberOrderSequence, translationService, objectAction));
+
+
+                if(actionOwner instanceof FieldSet) {
+                    if(actionLayoutData.getPosition() == null ||
+                            actionLayoutData.getPosition() == org.apache.isis.applib.annotation.ActionLayout.Position.BELOW ||
+                            actionLayoutData.getPosition() == org.apache.isis.applib.annotation.ActionLayout.Position.RIGHT) {
+                        actionLayoutData.setPosition(org.apache.isis.applib.annotation.ActionLayout.Position.PANEL);
+                    }
+                } else if(actionOwner instanceof PropertyLayoutData) {
+                    if(actionLayoutData.getPosition() == null ||
+                            actionLayoutData.getPosition() == org.apache.isis.applib.annotation.ActionLayout.Position.PANEL_DROPDOWN ||
+                            actionLayoutData.getPosition() == org.apache.isis.applib.annotation.ActionLayout.Position.PANEL) {
+                        actionLayoutData.setPosition(org.apache.isis.applib.annotation.ActionLayout.Position.BELOW);
+                    }
+                } else {
+                    // doesn't do anything for DomainObject or Collection
+                    actionLayoutData.setPosition(null);
+                }
+
+                FacetUtil.addFacet(ActionPositionFacetForActionXml.create(actionLayoutData, objectAction));
+                FacetUtil.addFacet(BookmarkPolicyFacetForActionXml.create(actionLayoutData, objectAction));
+                FacetUtil.addFacet(CssClassFacetForActionXml.create(actionLayoutData, objectAction));
+                FacetUtil.addFacet(CssClassFaFacetForActionXml.create(actionLayoutData, objectAction));
+                FacetUtil.addFacet(DescribedAsFacetForActionXml.create(actionLayoutData, objectAction));
+                FacetUtil.addFacet(HiddenFacetForActionLayoutXml.create(actionLayoutData, objectAction));
+                FacetUtil.addFacet(NamedFacetForActionXml.create(actionLayoutData, objectAction));
+            }
+
+            @Override
+            public void visit(final PropertyLayoutData propertyLayoutData) {
+                final OneToOneAssociation oneToOneAssociation = oneToOneAssociationById.get(propertyLayoutData.getId());
+                if(oneToOneAssociation == null) {
+                    return;
+                }
+
+                FacetUtil.addFacet(CssClassFacetForPropertyXml.create(propertyLayoutData, oneToOneAssociation));
+                FacetUtil.addFacet(DescribedAsFacetForPropertyXml.create(propertyLayoutData, oneToOneAssociation));
+                FacetUtil.addFacet(HiddenFacetForPropertyXml.create(propertyLayoutData, oneToOneAssociation));
+                FacetUtil.addFacet(LabelAtFacetForPropertyXml.create(propertyLayoutData, oneToOneAssociation));
+                FacetUtil.addFacet(MultiLineFacetForPropertyXml.create(propertyLayoutData, oneToOneAssociation));
+                FacetUtil.addFacet(NamedFacetForPropertyXml.create(propertyLayoutData, oneToOneAssociation));
+                FacetUtil.addFacet(
+                        RenderedAdjustedFacetForPropertyXml.create(propertyLayoutData, oneToOneAssociation));
+                FacetUtil.addFacet(TypicalLengthFacetForPropertyXml.create(propertyLayoutData, oneToOneAssociation));
+
+                // @MemberOrder#name based on owning property group, @MemberOrder#sequence monotonically increasing
+                final FieldSet fieldSet = propertyLayoutData.getOwner();
+                final String groupName = fieldSet.getName();
+                final String sequence = nextInSequenceFor(groupName, propertySequenceByGroup);
+                FacetUtil.addFacet(
+                        new MemberOrderFacetXml(groupName, sequence, translationService, oneToOneAssociation));
+            }
+
+            @Override
+            public void visit(final CollectionLayoutData collectionLayoutData) {
+                final OneToManyAssociation oneToManyAssociation = oneToManyAssociationById.get(collectionLayoutData.getId());
+                if(oneToManyAssociation == null) {
+                    return;
+                }
+
+                FacetUtil.addFacet(CssClassFacetForCollectionXml.create(collectionLayoutData, oneToManyAssociation));
+                FacetUtil.addFacet(
+                        DefaultViewFacetForCollectionXml.create(collectionLayoutData, oneToManyAssociation));
+                FacetUtil.addFacet(
+                        DescribedAsFacetForCollectionXml.create(collectionLayoutData, oneToManyAssociation));
+                FacetUtil.addFacet(HiddenFacetForCollectionXml.create(collectionLayoutData, oneToManyAssociation));
+                FacetUtil.addFacet(NamedFacetForCollectionXml.create(collectionLayoutData, oneToManyAssociation));
+                FacetUtil.addFacet(PagedFacetForCollectionXml.create(collectionLayoutData, oneToManyAssociation));
+                FacetUtil.addFacet(SortedByFacetForCollectionXml.create(collectionLayoutData, oneToManyAssociation));
+
+                // @MemberOrder#name based on the collection's id (so that each has a single "member group")
+                final String groupName = collectionLayoutData.getId();
+                final String sequence = "" + collectionSequence++;
+                FacetUtil.addFacet(
+                        new MemberOrderFacetXml(groupName, sequence, translationService, oneToManyAssociation));
+
+                // if there is only a single column and no other contents, then copy the collection Id onto the tab'
+                final MemberRegionOwner memberRegionOwner = collectionLayoutData.getOwner();
+                if(memberRegionOwner instanceof FCColumn) {
+                    final FCColumn FCColumn = (FCColumn) memberRegionOwner;
+                    final FCColumnOwner holder = FCColumn.getOwner();
+                    if(holder instanceof FCTab) {
+                        final FCTab FCTab = (FCTab) holder;
+                        if(FCTab.getContents().size() == 1 && Strings.isNullOrEmpty(FCTab.getName()) ) {
+                            final String collectionName = oneToManyAssociation.getName();
+                            FCTab.setName(collectionName);
+                        }
+                    }
+                }
+            }
+        });
+    }
+
+    private String nextInSequenceFor(
+            final String key, final Map<String, int[]> seqByKey) {
+        synchronized (seqByKey) {
+            int[] holder = seqByKey.get(key);
+            if(holder == null) {
+                holder = new int[]{0};
+                seqByKey.put(key, holder);
+            }
+            holder[0]++;
+            return ""+holder[0];
+        }
+    }
+
+    private static List<OneToOneAssociation> getOneToOneAssociations(final ObjectSpecification objectSpec) {
+        List associations = objectSpec.getAssociations(Contributed.INCLUDED, ObjectAssociation.Filters.PROPERTIES);
+        return associations;
+    }
+    private static List<OneToManyAssociation> getOneToManyAssociations(final ObjectSpecification objectSpec) {
+        List associations = objectSpec.getAssociations(Contributed.INCLUDED, ObjectAssociation.Filters.COLLECTIONS);
+        return associations;
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/isis/blob/8f0abcdb/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/layout/provider/PageNormalizerService.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/layout/provider/PageNormalizerService.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/layout/provider/PageNormalizerService.java
new file mode 100644
index 0000000..dbc4013
--- /dev/null
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/layout/provider/PageNormalizerService.java
@@ -0,0 +1,37 @@
+/**
+ *  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.services.layout.provider;
+
+import java.util.List;
+
+import org.apache.isis.applib.annotation.Programmatic;
+import org.apache.isis.applib.layout.members.v1.Page;
+import org.apache.isis.core.metamodel.services.layout.PageServiceDefault;
+
+/**
+ * Internal SPI used by {@link PageServiceDefault}.
+ */
+public interface PageNormalizerService {
+
+    @Programmatic
+    List<Class<? extends Page>> pageImplementations();
+
+    @Programmatic
+    void normalize(Page page, Class<?> domainClass);
+
+    String schemaLocationsFor(final Page fcPage);
+}


[16/18] isis git commit: ISIS-993: bootstrap3 schema now properly defined and serializing ok. Also juggling around with the common (nee members)

Posted by da...@apache.org.
http://git-wip-us.apache.org/repos/asf/isis/blob/65f7d320/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/layout/provider/PageNormalizerServiceDefault.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/layout/provider/PageNormalizerServiceDefault.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/layout/provider/PageNormalizerServiceDefault.java
index 789821b..918faa2 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/layout/provider/PageNormalizerServiceDefault.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/layout/provider/PageNormalizerServiceDefault.java
@@ -32,7 +32,7 @@ import org.apache.isis.applib.annotation.NatureOfService;
 import org.apache.isis.applib.annotation.Programmatic;
 import org.apache.isis.applib.layout.bootstrap3.BS3Page;
 import org.apache.isis.applib.layout.fixedcols.FCPage;
-import org.apache.isis.applib.layout.members.v1.Page;
+import org.apache.isis.applib.layout.common.Page;
 import org.apache.isis.applib.services.i18n.TranslationService;
 import org.apache.isis.core.metamodel.spec.SpecificationLoader;
 import org.apache.isis.core.metamodel.spec.SpecificationLoaderAware;
@@ -42,11 +42,11 @@ import org.apache.isis.core.metamodel.spec.SpecificationLoaderAware;
 )
 public class PageNormalizerServiceDefault implements PageNormalizerService, SpecificationLoaderAware {
 
-    public static final String MEMBERS_TNS = "http://isis.apache.org/schema/applib/layout/members/v1";
-    public static final String MEMBERS_SCHEMA_LOCATION = "http://isis.apache.org/schema/applib/layout/members/v1/members.xsd";
+    private static final Logger LOG = LoggerFactory.getLogger(PageNormalizerServiceDefault.class);
 
+    public static final String COMMON_TNS = "http://isis.apache.org/schema/applib/layout/common";
+    public static final String COMMON_SCHEMA_LOCATION = "http://isis.apache.org/schema/applib/layout/common/common.xsd";
 
-    private static final Logger LOG = LoggerFactory.getLogger(PageNormalizerServiceDefault.class);
     private SpecificationLoader specificationLookup;
 
     private PageNormalizerFC pageNormalizerFC;
@@ -86,8 +86,8 @@ public class PageNormalizerServiceDefault implements PageNormalizerService, Spec
     @Override
     public String schemaLocationsFor(final Page page) {
         final List<String> parts = Lists.newArrayList();
-        parts.add(MEMBERS_TNS);
-        parts.add(MEMBERS_SCHEMA_LOCATION);
+        parts.add(COMMON_TNS);
+        parts.add(COMMON_SCHEMA_LOCATION);
         if(page instanceof FCPage) {
             parts.add(PageNormalizerFC.TNS);
             parts.add(PageNormalizerFC.SCHEMA_LOCATION);

http://git-wip-us.apache.org/repos/asf/isis/blob/65f7d320/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/metamodel/MetadataMenu.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/metamodel/MetadataMenu.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/metamodel/MetadataMenu.java
index 6f307f7..519867b 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/metamodel/MetadataMenu.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/metamodel/MetadataMenu.java
@@ -42,7 +42,7 @@ import org.apache.isis.applib.annotation.NatureOfService;
 import org.apache.isis.applib.annotation.Programmatic;
 import org.apache.isis.applib.annotation.RestrictTo;
 import org.apache.isis.applib.annotation.SemanticsOf;
-import org.apache.isis.applib.layout.members.v1.Page;
+import org.apache.isis.applib.layout.common.Page;
 import org.apache.isis.applib.services.jaxb.JaxbService;
 import org.apache.isis.applib.services.layout.PageService;
 import org.apache.isis.applib.value.Blob;

http://git-wip-us.apache.org/repos/asf/isis/blob/65f7d320/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/object/layoutxml/PageFacetDefaultTest.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/object/layoutxml/PageFacetDefaultTest.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/object/layoutxml/PageFacetDefaultTest.java
index ca65e96..2ca8356 100644
--- a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/object/layoutxml/PageFacetDefaultTest.java
+++ b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/object/layoutxml/PageFacetDefaultTest.java
@@ -22,7 +22,7 @@ import java.util.concurrent.atomic.AtomicReference;
 
 import org.junit.Test;
 
-import org.apache.isis.applib.layout.members.v1.FieldSet;
+import org.apache.isis.applib.layout.common.FieldSet;
 
 import static org.hamcrest.CoreMatchers.is;
 import static org.hamcrest.CoreMatchers.nullValue;

http://git-wip-us.apache.org/repos/asf/isis/blob/65f7d320/core/metamodel/src/test/java/org/apache/isis/core/metamodel/layout/bootstrap3/BS3PageTest.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/layout/bootstrap3/BS3PageTest.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/layout/bootstrap3/BS3PageTest.java
new file mode 100644
index 0000000..c5a81d6
--- /dev/null
+++ b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/layout/bootstrap3/BS3PageTest.java
@@ -0,0 +1,149 @@
+/*
+ *  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.layout.bootstrap3;
+
+import java.util.Map;
+
+import javax.xml.bind.Marshaller;
+
+import com.google.common.collect.ImmutableMap;
+import com.google.common.collect.Lists;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+
+import org.apache.isis.applib.layout.bootstrap3.BS3Col;
+import org.apache.isis.applib.layout.bootstrap3.BS3Page;
+import org.apache.isis.applib.layout.bootstrap3.BS3Row;
+import org.apache.isis.applib.layout.bootstrap3.BS3Tab;
+import org.apache.isis.applib.layout.bootstrap3.BS3TabGroup;
+import org.apache.isis.applib.layout.common.ActionLayoutData;
+import org.apache.isis.applib.layout.common.CollectionLayoutData;
+import org.apache.isis.applib.layout.common.DomainObjectLayoutData;
+import org.apache.isis.applib.layout.common.FieldSet;
+import org.apache.isis.applib.layout.common.PropertyLayoutData;
+import org.apache.isis.applib.services.jaxb.JaxbService;
+import org.apache.isis.core.metamodel.services.layout.provider.PageNormalizerServiceDefault;
+
+import static org.hamcrest.CoreMatchers.equalTo;
+import static org.hamcrest.CoreMatchers.is;
+import static org.junit.Assert.assertThat;
+
+public class BS3PageTest {
+
+    private JaxbService jaxbService;
+
+    @Before
+    public void setUp() throws Exception {
+        jaxbService = new JaxbService.Simple();
+    }
+
+    @After
+    public void tearDown() throws Exception {
+
+    }
+
+    @Test
+    public void xxx() throws Exception {
+
+        final BS3Page bs3Page = new BS3Page();
+
+        // header
+        final BS3Row headerRow = bs3Page.getRows().get(0);
+        final BS3Col headerCol = (BS3Col) headerRow.getCols().get(0);
+        headerCol.setSpan(12);
+
+        final DomainObjectLayoutData objectLayoutData = new DomainObjectLayoutData();
+        headerCol.setDomainObject(objectLayoutData);
+
+        final ActionLayoutData deleteActionLayoutData = new ActionLayoutData();
+        deleteActionLayoutData.setId("delete");
+        headerCol.setActions(Lists.<ActionLayoutData>newArrayList());
+        headerCol.getActions().add(deleteActionLayoutData);
+
+        // content
+        final BS3Row contentRow = new BS3Row();
+        bs3Page.getRows().add(contentRow);
+
+        final BS3Col contentCol = (BS3Col) contentRow.getCols().get(0);
+        contentCol.setSpan(12);
+
+        // a tabgroup containing a 'Common' tab
+        final BS3TabGroup tabGroup = new BS3TabGroup();
+        contentCol.getTabGroups().add(tabGroup);
+        BS3Tab bs3Tab = tabGroup.getTabs().get(0);
+        bs3Tab.setName("Common");
+
+        // with a left col...
+        final BS3Row tabRow = bs3Tab.getRows().get(0);
+        final BS3Col tabLeftCol = (BS3Col) tabRow.getCols().get(0);
+        tabLeftCol.setSpan(6);
+
+        // containing a fieldset
+        final FieldSet leftPropGroup = new FieldSet("General");
+        tabLeftCol.setFieldSets(Lists.<FieldSet>newArrayList());
+        tabLeftCol.getFieldSets().add(leftPropGroup);
+        leftPropGroup.setName("General");
+
+        // with a single property
+        final PropertyLayoutData namePropertyLayoutData = leftPropGroup.getProperties().get(0);
+        namePropertyLayoutData.setNamed("name");
+
+        // and its associated action
+        final ActionLayoutData updateNameActionLayoutData = new ActionLayoutData();
+        updateNameActionLayoutData.setId("updateName");
+        namePropertyLayoutData.setActions(Lists.<ActionLayoutData>newArrayList());
+        namePropertyLayoutData.getActions().add(updateNameActionLayoutData);
+
+        // and the tab also has a right col...
+        final BS3Col tabRightCol = (BS3Col) tabRow.getCols().get(0);
+        tabRightCol.setSpan(6);
+
+        // containing a collection
+        final CollectionLayoutData similarToColl = new CollectionLayoutData();
+        tabRightCol.setCollections(Lists.<CollectionLayoutData>newArrayList());
+        tabRightCol.getCollections().add(similarToColl);
+        similarToColl.setId("similarTo");
+
+
+        final String schemaLocations = new PageNormalizerServiceDefault().schemaLocationsFor(bs3Page);
+        String xml = jaxbService.toXml(bs3Page,
+                ImmutableMap.<String,Object>of(Marshaller.JAXB_SCHEMA_LOCATION, schemaLocations));
+        System.out.println(xml);
+
+        BS3Page bs3Pageroundtripped = jaxbService.fromXml(BS3Page.class, xml);
+        String xmlRoundtripped = jaxbService.toXml(bs3Pageroundtripped,
+                ImmutableMap.<String,Object>of(Marshaller.JAXB_SCHEMA_LOCATION, schemaLocations));
+        assertThat(xml, is(equalTo(xmlRoundtripped)));
+
+
+        System.out.println("==========");
+
+        dumpXsd(bs3Page);
+    }
+
+    protected void dumpXsd(final BS3Page bs3Page) {
+        Map<String, String> schemas = jaxbService.toXsd(bs3Page, JaxbService.IsisSchemas.INCLUDE);
+        for (Map.Entry<String, String> entry : schemas.entrySet()) {
+            System.out.println(entry.getKey() + ":");
+            System.out.println(entry.getValue());
+        }
+    }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/isis/blob/65f7d320/core/metamodel/src/test/java/org/apache/isis/core/metamodel/layout/fixedcols/FCPageTest.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/layout/fixedcols/FCPageTest.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/layout/fixedcols/FCPageTest.java
new file mode 100644
index 0000000..9bce74b
--- /dev/null
+++ b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/layout/fixedcols/FCPageTest.java
@@ -0,0 +1,120 @@
+/*
+ *  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.layout.fixedcols;
+
+import java.util.Map;
+
+import javax.xml.bind.Marshaller;
+
+import com.google.common.collect.ImmutableMap;
+import com.google.common.collect.Lists;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+
+import org.apache.isis.applib.layout.fixedcols.FCColumn;
+import org.apache.isis.applib.layout.fixedcols.FCPage;
+import org.apache.isis.applib.layout.fixedcols.FCTab;
+import org.apache.isis.applib.layout.fixedcols.FCTabGroup;
+import org.apache.isis.applib.layout.common.ActionLayoutData;
+import org.apache.isis.applib.layout.common.CollectionLayoutData;
+import org.apache.isis.applib.layout.common.FieldSet;
+import org.apache.isis.applib.layout.common.PropertyLayoutData;
+import org.apache.isis.applib.services.jaxb.JaxbService;
+import org.apache.isis.core.metamodel.services.layout.provider.PageNormalizerServiceDefault;
+
+import static org.hamcrest.CoreMatchers.equalTo;
+import static org.hamcrest.CoreMatchers.is;
+import static org.junit.Assert.assertThat;
+
+public class FCPageTest {
+
+    private JaxbService jaxbService;
+
+    @Before
+    public void setUp() throws Exception {
+        jaxbService = new JaxbService.Simple();
+    }
+
+    @After
+    public void tearDown() throws Exception {
+
+    }
+
+    @Test
+    public void xxx() throws Exception {
+
+        final FCPage fcPage = new FCPage();
+
+        fcPage.setTabGroups(Lists.<FCTabGroup>newArrayList());
+        fcPage.getTabGroups().add(new FCTabGroup());
+        FCTabGroup tabGroup = fcPage.getTabGroups().get(0);
+        FCTab FCTab = tabGroup.getTabs().get(0);
+        FCTab.setName("Common");
+        FCColumn left = FCTab.getLeft();
+
+        FieldSet leftPropGroup = new FieldSet();
+        left.setFieldSets(Lists.<FieldSet>newArrayList());
+        left.getFieldSets().add(leftPropGroup);
+        leftPropGroup.setName("General");
+
+        CollectionLayoutData similarToColl = new CollectionLayoutData();
+        left.setCollections(Lists.<CollectionLayoutData>newArrayList());
+        left.getCollections().add(similarToColl);
+        similarToColl.setId("similarTo");
+
+        left.getFieldSets().add(new FieldSet("General"));
+        PropertyLayoutData namePropertyLayoutData = new PropertyLayoutData("name");
+        left.getFieldSets().get(0).getProperties().add(namePropertyLayoutData);
+
+        ActionLayoutData updateNameActionLayoutData = new ActionLayoutData();
+        updateNameActionLayoutData.setId("updateName");
+        namePropertyLayoutData.setActions(Lists.<ActionLayoutData>newArrayList());
+        namePropertyLayoutData.getActions().add(updateNameActionLayoutData);
+
+        ActionLayoutData deleteActionLayoutData = new ActionLayoutData();
+        deleteActionLayoutData.setId("delete");
+        fcPage.setActions(Lists.<ActionLayoutData>newArrayList());
+        fcPage.getActions().add(deleteActionLayoutData);
+
+        final String schemaLocations = new PageNormalizerServiceDefault().schemaLocationsFor(fcPage);
+        String xml = jaxbService.toXml(fcPage,
+                ImmutableMap.<String,Object>of(Marshaller.JAXB_SCHEMA_LOCATION, schemaLocations));
+        System.out.println(xml);
+
+        FCPage fcPageRoundtripped = jaxbService.fromXml(FCPage.class, xml);
+        String xmlRoundtripped = jaxbService.toXml(fcPageRoundtripped,
+                ImmutableMap.<String,Object>of(Marshaller.JAXB_SCHEMA_LOCATION, schemaLocations));
+        assertThat(xml, is(equalTo(xmlRoundtripped)));
+
+
+        System.out.println("==========");
+
+        dumpXsd(fcPage);
+    }
+
+    protected void dumpXsd(final FCPage fcPage) {
+        Map<String, String> schemas = jaxbService.toXsd(fcPage, JaxbService.IsisSchemas.INCLUDE);
+        for (Map.Entry<String, String> entry : schemas.entrySet()) {
+            System.out.println(entry.getKey() + ":");
+            System.out.println(entry.getValue());
+        }
+    }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/isis/blob/65f7d320/core/metamodel/src/test/java/org/apache/isis/core/metamodel/layoutxml/v1_0/FCPageTest.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/layoutxml/v1_0/FCPageTest.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/layoutxml/v1_0/FCPageTest.java
deleted file mode 100644
index 29bd0c4..0000000
--- a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/layoutxml/v1_0/FCPageTest.java
+++ /dev/null
@@ -1,120 +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.layoutxml.v1_0;
-
-import java.util.Map;
-
-import javax.xml.bind.Marshaller;
-
-import com.google.common.collect.ImmutableMap;
-import com.google.common.collect.Lists;
-
-import org.junit.After;
-import org.junit.Before;
-import org.junit.Test;
-
-import org.apache.isis.applib.layout.members.v1.ActionLayoutData;
-import org.apache.isis.applib.layout.members.v1.CollectionLayoutData;
-import org.apache.isis.applib.layout.fixedcols.FCColumn;
-import org.apache.isis.applib.layout.fixedcols.FCPage;
-import org.apache.isis.applib.layout.members.v1.PropertyLayoutData;
-import org.apache.isis.applib.layout.members.v1.FieldSet;
-import org.apache.isis.applib.layout.fixedcols.FCTab;
-import org.apache.isis.applib.layout.fixedcols.FCTabGroup;
-import org.apache.isis.applib.services.jaxb.JaxbService;
-import org.apache.isis.core.metamodel.services.layout.provider.PageNormalizerServiceDefault;
-
-import static org.hamcrest.CoreMatchers.equalTo;
-import static org.hamcrest.CoreMatchers.is;
-import static org.junit.Assert.assertThat;
-
-public class FCPageTest {
-
-    private JaxbService jaxbService;
-
-    @Before
-    public void setUp() throws Exception {
-        jaxbService = new JaxbService.Simple();
-    }
-
-    @After
-    public void tearDown() throws Exception {
-
-    }
-
-    @Test
-    public void xxx() throws Exception {
-
-        final FCPage fcPage = new FCPage();
-
-        fcPage.setTabGroups(Lists.<FCTabGroup>newArrayList());
-        fcPage.getTabGroups().add(new FCTabGroup());
-        FCTabGroup tabGroup = fcPage.getTabGroups().get(0);
-        FCTab FCTab = tabGroup.getTabs().get(0);
-        FCTab.setName("Common");
-        FCColumn left = FCTab.getLeft();
-
-        FieldSet leftPropGroup = new FieldSet();
-        left.setFieldSets(Lists.<FieldSet>newArrayList());
-        left.getFieldSets().add(leftPropGroup);
-        leftPropGroup.setName("General");
-
-        CollectionLayoutData similarToColl = new CollectionLayoutData();
-        left.setCollections(Lists.<CollectionLayoutData>newArrayList());
-        left.getCollections().add(similarToColl);
-        similarToColl.setId("similarTo");
-
-        left.getFieldSets().add(new FieldSet("General"));
-        PropertyLayoutData namePropertyLayoutData = new PropertyLayoutData("name");
-        left.getFieldSets().get(0).getProperties().add(namePropertyLayoutData);
-
-        ActionLayoutData updateNameActionLayoutData = new ActionLayoutData();
-        updateNameActionLayoutData.setId("updateName");
-        namePropertyLayoutData.setActions(Lists.<ActionLayoutData>newArrayList());
-        namePropertyLayoutData.getActions().add(updateNameActionLayoutData);
-
-        ActionLayoutData deleteActionLayoutData = new ActionLayoutData();
-        deleteActionLayoutData.setId("delete");
-        fcPage.setActions(Lists.<ActionLayoutData>newArrayList());
-        fcPage.getActions().add(deleteActionLayoutData);
-
-        final String schemaLocations = new PageNormalizerServiceDefault().schemaLocationsFor(fcPage);
-        String xml = jaxbService.toXml(fcPage,
-                ImmutableMap.<String,Object>of(Marshaller.JAXB_SCHEMA_LOCATION, schemaLocations));
-        System.out.println(xml);
-
-        FCPage FCPageRoundtripped = jaxbService.fromXml(FCPage.class, xml);
-        String xmlRoundtripped = jaxbService.toXml(FCPageRoundtripped,
-                ImmutableMap.<String,Object>of(Marshaller.JAXB_SCHEMA_LOCATION, schemaLocations));
-        assertThat(xml, is(equalTo(xmlRoundtripped)));
-
-
-        System.out.println("==========");
-
-        dumpXsd(fcPage);
-    }
-
-    protected void dumpXsd(final FCPage FCPage) {
-        Map<String, String> schemas = jaxbService.toXsd(FCPage, JaxbService.IsisSchemas.INCLUDE);
-        for (Map.Entry<String, String> entry : schemas.entrySet()) {
-            System.out.println(entry.getKey() + ":");
-            System.out.println(entry.getValue());
-        }
-    }
-}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/isis/blob/65f7d320/core/viewer-wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/models/EntityCollectionModel.java
----------------------------------------------------------------------
diff --git a/core/viewer-wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/models/EntityCollectionModel.java b/core/viewer-wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/models/EntityCollectionModel.java
index 6f39c53..d27f624 100644
--- a/core/viewer-wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/models/EntityCollectionModel.java
+++ b/core/viewer-wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/models/EntityCollectionModel.java
@@ -31,7 +31,7 @@ import com.google.common.collect.Iterables;
 import com.google.common.collect.Lists;
 import com.google.common.collect.Maps;
 
-import org.apache.isis.applib.layout.members.v1.CollectionLayoutData;
+import org.apache.isis.applib.layout.common.CollectionLayoutData;
 import org.apache.isis.core.commons.factory.InstanceUtil;
 import org.apache.isis.core.commons.lang.ClassUtil;
 import org.apache.isis.core.commons.lang.Closure;

http://git-wip-us.apache.org/repos/asf/isis/blob/65f7d320/core/viewer-wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/models/EntityModel.java
----------------------------------------------------------------------
diff --git a/core/viewer-wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/models/EntityModel.java b/core/viewer-wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/models/EntityModel.java
index d54f13b..debcd80 100644
--- a/core/viewer-wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/models/EntityModel.java
+++ b/core/viewer-wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/models/EntityModel.java
@@ -30,10 +30,10 @@ import org.apache.wicket.model.Model;
 import org.apache.wicket.request.mapper.parameter.PageParameters;
 
 import org.apache.isis.applib.annotation.BookmarkPolicy;
-import org.apache.isis.applib.layout.members.v1.CollectionLayoutData;
+import org.apache.isis.applib.layout.common.CollectionLayoutData;
 import org.apache.isis.applib.layout.fixedcols.FCColumn;
 import org.apache.isis.applib.layout.fixedcols.FCColumn.Hint;
-import org.apache.isis.applib.layout.members.v1.FieldSet;
+import org.apache.isis.applib.layout.common.FieldSet;
 import org.apache.isis.applib.layout.fixedcols.FCTabGroup;
 import org.apache.isis.applib.layout.fixedcols.FCTab;
 import org.apache.isis.applib.services.memento.MementoService.Memento;

http://git-wip-us.apache.org/repos/asf/isis/blob/65f7d320/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/EntityPanelFactory.java
----------------------------------------------------------------------
diff --git a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/EntityPanelFactory.java b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/EntityPanelFactory.java
index 0430f42..c187f2a 100644
--- a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/EntityPanelFactory.java
+++ b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/EntityPanelFactory.java
@@ -23,7 +23,7 @@ import org.apache.wicket.Component;
 import org.apache.wicket.model.IModel;
 
 import org.apache.isis.applib.layout.fixedcols.FCPage;
-import org.apache.isis.applib.layout.members.v1.Page;
+import org.apache.isis.applib.layout.common.Page;
 import org.apache.isis.core.metamodel.facets.object.layoutmetadata.PageFacet;
 import org.apache.isis.core.metamodel.spec.ObjectSpecification;
 import org.apache.isis.viewer.wicket.model.models.EntityModel;

http://git-wip-us.apache.org/repos/asf/isis/blob/65f7d320/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/PropUtil.java
----------------------------------------------------------------------
diff --git a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/PropUtil.java b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/PropUtil.java
index 6e390ac..f846e26 100644
--- a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/PropUtil.java
+++ b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/PropUtil.java
@@ -27,7 +27,7 @@ import org.apache.isis.applib.annotation.Where;
 import org.apache.isis.applib.filter.Filter;
 import org.apache.isis.applib.filter.Filters;
 import org.apache.isis.applib.layout.fixedcols.FCColumn;
-import org.apache.isis.applib.layout.members.v1.FieldSet;
+import org.apache.isis.applib.layout.common.FieldSet;
 import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
 import org.apache.isis.core.metamodel.consent.InteractionInitiatedBy;
 import org.apache.isis.core.metamodel.spec.ObjectSpecification;

http://git-wip-us.apache.org/repos/asf/isis/blob/65f7d320/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/collections/EntityCollectionsPanel.java
----------------------------------------------------------------------
diff --git a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/collections/EntityCollectionsPanel.java b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/collections/EntityCollectionsPanel.java
index d7f8240..5bd57d0 100644
--- a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/collections/EntityCollectionsPanel.java
+++ b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/collections/EntityCollectionsPanel.java
@@ -31,7 +31,7 @@ import org.apache.wicket.markup.repeater.RepeatingView;
 import org.apache.isis.applib.annotation.Where;
 import org.apache.isis.applib.filter.Filter;
 import org.apache.isis.applib.filter.Filters;
-import org.apache.isis.applib.layout.members.v1.CollectionLayoutData;
+import org.apache.isis.applib.layout.common.CollectionLayoutData;
 import org.apache.isis.applib.layout.fixedcols.FCColumn;
 import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
 import org.apache.isis.core.metamodel.consent.InteractionInitiatedBy;

http://git-wip-us.apache.org/repos/asf/isis/blob/65f7d320/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/column/EntityColumn.java
----------------------------------------------------------------------
diff --git a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/column/EntityColumn.java b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/column/EntityColumn.java
index 4cda729..66bc4c6 100644
--- a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/column/EntityColumn.java
+++ b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/column/EntityColumn.java
@@ -32,8 +32,8 @@ import org.apache.wicket.markup.html.WebMarkupContainer;
 import org.apache.wicket.markup.repeater.RepeatingView;
 
 import org.apache.isis.applib.layout.fixedcols.FCColumn;
-import org.apache.isis.applib.layout.members.v1.FieldSet;
-import org.apache.isis.applib.layout.members.v1.PropertyLayoutData;
+import org.apache.isis.applib.layout.common.FieldSet;
+import org.apache.isis.applib.layout.common.PropertyLayoutData;
 import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
 import org.apache.isis.core.metamodel.facets.object.membergroups.MemberGroupLayoutFacet;
 import org.apache.isis.core.metamodel.spec.ObjectSpecification;

http://git-wip-us.apache.org/repos/asf/isis/blob/65f7d320/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/propgroup/PropertyGroup.java
----------------------------------------------------------------------
diff --git a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/propgroup/PropertyGroup.java b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/propgroup/PropertyGroup.java
index e595806..6a13547 100644
--- a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/propgroup/PropertyGroup.java
+++ b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/propgroup/PropertyGroup.java
@@ -27,8 +27,8 @@ import org.apache.wicket.markup.html.basic.Label;
 import org.apache.wicket.markup.repeater.RepeatingView;
 
 import org.apache.isis.applib.annotation.ActionLayout;
-import org.apache.isis.applib.layout.members.v1.FieldSet;
-import org.apache.isis.applib.layout.members.v1.PropertyLayoutData;
+import org.apache.isis.applib.layout.common.FieldSet;
+import org.apache.isis.applib.layout.common.PropertyLayoutData;
 import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
 import org.apache.isis.core.metamodel.spec.feature.ObjectAction;
 import org.apache.isis.core.metamodel.spec.feature.ObjectAssociation;

http://git-wip-us.apache.org/repos/asf/isis/blob/65f7d320/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/bootstrap-overrides.css
----------------------------------------------------------------------
diff --git a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/bootstrap-overrides.css b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/bootstrap-overrides.css
index dd192d1..235b356 100644
--- a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/bootstrap-overrides.css
+++ b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/bootstrap-overrides.css
@@ -749,3 +749,7 @@ tr.headers th form input {
 .tabGroups > .row {
     padding-bottom: 10px;
 }
+
+.entityPage .middleColumn .tabbable {
+    padding-bottom: 10px;
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/isis/blob/65f7d320/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/entity/EntityPage.java
----------------------------------------------------------------------
diff --git a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/entity/EntityPage.java b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/entity/EntityPage.java
index 563434a..45c42d7 100644
--- a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/entity/EntityPage.java
+++ b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/entity/EntityPage.java
@@ -29,7 +29,7 @@ import org.apache.wicket.model.AbstractReadOnlyModel;
 import org.apache.wicket.request.mapper.parameter.PageParameters;
 import org.apache.wicket.util.string.Strings;
 
-import org.apache.isis.applib.layout.members.v1.Page;
+import org.apache.isis.applib.layout.common.Page;
 import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
 import org.apache.isis.core.metamodel.adapter.mgr.AdapterManager.ConcurrencyChecking;
 import org.apache.isis.core.metamodel.adapter.version.ConcurrencyException;

http://git-wip-us.apache.org/repos/asf/isis/blob/65f7d320/example/application/simpleapp/dom/src/main/java/domainapp/dom/simple/SimpleObject.layout-BS3.xml
----------------------------------------------------------------------
diff --git a/example/application/simpleapp/dom/src/main/java/domainapp/dom/simple/SimpleObject.layout-BS3.xml b/example/application/simpleapp/dom/src/main/java/domainapp/dom/simple/SimpleObject.layout-BS3.xml
new file mode 100644
index 0000000..7bc7d20
--- /dev/null
+++ b/example/application/simpleapp/dom/src/main/java/domainapp/dom/simple/SimpleObject.layout-BS3.xml
@@ -0,0 +1,42 @@
+<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
+<bs3:page xsi:schemaLocation="http://isis.apache.org/schema/applib/layout/common http://isis.apache.org/schema/applib/layout/common/common.xsd http://isis.apache.org/schema/applib/layout/bootstrap3 http://isis.apache.org/schema/applib/layout/bootstrap3/bootstrap3.xsd" xmlns:common="http://isis.apache.org/schema/applib/layout/common" xmlns:bs3="http://isis.apache.org/schema/applib/layout/bootstrap3" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+
+    <bs3:row>
+        <bs3:col span="12">
+            <common:domainObject/>
+            <common:action id="delete"/>
+        </bs3:col>
+    </bs3:row>
+
+    <bs3:row>
+        <bs3:col span="12">
+            <bs3:tabGroup>
+                <bs3:tab name="Metadata">
+                    <bs3:row>
+                        <bs3:col span="7">
+                            <common:fieldSet name="General">
+                                <common:action id="downloadJdoMetadata" position="PANEL"/>
+                                <common:action id="downloadLayoutXml" position="PANEL_DROPDOWN"/>
+                                <common:property id="name" labelPosition="TOP">
+                                    <common:action id="updateName">
+                                        <common:describedAs>This allows the name to be updated</common:describedAs>
+                                    </common:action>
+                                </common:property>
+                            </common:fieldSet>
+                        </bs3:col>
+                    </bs3:row>
+                </bs3:tab>
+            </bs3:tabGroup>
+            <bs3:tabGroup>
+                <bs3:tab name="SimilarTo">
+                    <bs3:row>
+                        <bs3:col span="12">
+                            <common:collection id="similarTo" defaultView="table"/>
+                            <common:collection id="others" defaultView="hide"/>
+                        </bs3:col>
+                    </bs3:row>
+                </bs3:tab>
+            </bs3:tabGroup>
+        </bs3:col>
+    </bs3:row>
+</bs3:page>

http://git-wip-us.apache.org/repos/asf/isis/blob/65f7d320/example/application/simpleapp/dom/src/main/java/domainapp/dom/simple/SimpleObject.layout.xml
----------------------------------------------------------------------
diff --git a/example/application/simpleapp/dom/src/main/java/domainapp/dom/simple/SimpleObject.layout.xml b/example/application/simpleapp/dom/src/main/java/domainapp/dom/simple/SimpleObject.layout.xml
index 4284f73..9e6d5ac 100644
--- a/example/application/simpleapp/dom/src/main/java/domainapp/dom/simple/SimpleObject.layout.xml
+++ b/example/application/simpleapp/dom/src/main/java/domainapp/dom/simple/SimpleObject.layout.xml
@@ -1,38 +1,36 @@
 <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
-<page xsi:schemaLocation="http://isis.apache.org/schema/applib/layout/members/v1 http://isis.apache.org/schema/applib/layout/members/v1/members.xsd http://isis.apache.org/schema/applib/layout/fixedcols http://isis.apache.org/schema/applib/layout/fixedcols/fixedcols.xsd" xmlns="http://isis.apache.org/schema/applib/layout/fixedcols" xmlns:ns2="http://isis.apache.org/schema/applib/layout/members/v1" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+<page xsi:schemaLocation="http://isis.apache.org/schema/applib/layout/common http://isis.apache.org/schema/applib/layout/common/common.xsd http://isis.apache.org/schema/applib/layout/fixedcols http://isis.apache.org/schema/applib/layout/fixedcols/fixedcols.xsd" xmlns="http://isis.apache.org/schema/applib/layout/fixedcols" xmlns:c="http://isis.apache.org/schema/applib/layout/common" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
 
-    <action id="delete"/>
 
     <left span="0">
     </left>
     <tabGroup>
-        <tab name="Metadata">
-            <left span="12">
-                <fieldSet name="Foo">
-                    <ns2:property id="versionSequence"/>
-                </fieldSet>
+        <tab name="Properties">
+            <left span="8">
+                <c:fieldSet name="General">
+                    <c:action id="delete"/>
+                    <c:property id="name" labelPosition="TOP">
+                        <c:action id="updateName">
+                            <c:describedAs>This allows the name to be updated</c:describedAs>
+                        </c:action>
+                    </c:property>
+                </c:fieldSet>
             </left>
+            <middle span="4">
+                <c:fieldSet name="Foo">
+                    <c:action id="downloadJdoMetadata" position="PANEL"/>
+                    <c:action id="downloadLayoutXml" position="PANEL"/>
+                    <c:property id="versionSequence"/>
+                </c:fieldSet>
+            </middle>
         </tab>
-        <tab name="General">
-            <left span="12">
-                <fieldSet name="General">
-                    <ns2:action id="downloadJdoMetadata" position="PANEL"/>
-                    <ns2:action id="downloadLayoutXml" position="PANEL_DROPDOWN"/>
-                    <ns2:property id="name" labelPosition="TOP">
-                        <ns2:action id="updateName">
-                            <ns2:describedAs>This allows the name to be updated</ns2:describedAs>
-                        </ns2:action>
-                    </ns2:property>
-                </fieldSet>
-            </left>
-        </tab>
-    </tabGroup>
-    <tabGroup>
-        <tab name="SimilarTo">
-            <left span="12">
-                <collection id="similarTo" defaultView="table"/>
-                <collection id="others" defaultView="hide"/>
+        <tab name="Collections">
+            <left span="6">
+                <c:collection id="similarTo" defaultView="table"/>
             </left>
+            <right span="6">
+                <c:collection id="others" defaultView="table"/>
+            </right>
         </tab>
     </tabGroup>
 </page>
\ No newline at end of file


[09/18] isis git commit: ISIS-993: still sketching out the layout classes for BS3 and FC (fixed col)

Posted by da...@apache.org.
http://git-wip-us.apache.org/repos/asf/isis/blob/10d80f3a/core/viewer-wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/models/EntityModel.java
----------------------------------------------------------------------
diff --git a/core/viewer-wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/models/EntityModel.java b/core/viewer-wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/models/EntityModel.java
index 1a87a1f..d54f13b 100644
--- a/core/viewer-wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/models/EntityModel.java
+++ b/core/viewer-wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/models/EntityModel.java
@@ -30,12 +30,12 @@ import org.apache.wicket.model.Model;
 import org.apache.wicket.request.mapper.parameter.PageParameters;
 
 import org.apache.isis.applib.annotation.BookmarkPolicy;
-import org.apache.isis.applib.layout.v1_0.CollectionLayoutMetadata;
-import org.apache.isis.applib.layout.fixedcols.ColumnMetadata;
-import org.apache.isis.applib.layout.fixedcols.ColumnMetadata.Hint;
-import org.apache.isis.applib.layout.v1_0.PropertyGroupMetadata;
-import org.apache.isis.applib.layout.fixedcols.TabGroupMetadata;
-import org.apache.isis.applib.layout.fixedcols.TabMetadata;
+import org.apache.isis.applib.layout.members.v1.CollectionLayoutData;
+import org.apache.isis.applib.layout.fixedcols.FCColumn;
+import org.apache.isis.applib.layout.fixedcols.FCColumn.Hint;
+import org.apache.isis.applib.layout.members.v1.FieldSet;
+import org.apache.isis.applib.layout.fixedcols.FCTabGroup;
+import org.apache.isis.applib.layout.fixedcols.FCTab;
 import org.apache.isis.applib.services.memento.MementoService.Memento;
 import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
 import org.apache.isis.core.metamodel.adapter.mgr.AdapterManager.ConcurrencyChecking;
@@ -648,71 +648,71 @@ public class EntityModel extends BookmarkableModel<ObjectAdapter> {
     // tab and column metadata (if any)
     // //////////////////////////////////////////////////////////
 
-    private List<TabGroupMetadata> tabGroupListMetadata;
+    private List<FCTabGroup> tabGroupListMetadata;
 
-    public List<TabGroupMetadata> getTabGroupListMetadata() {
+    public List<FCTabGroup> getTabGroupListMetadata() {
         return tabGroupListMetadata;
     }
 
     /**
      * Returns a new copy that SHARES the property scalar models (for edit form).
      */
-    public EntityModel cloneWithTabGroupListMetadata(final List<TabGroupMetadata> tabGroupListMetadata) {
+    public EntityModel cloneWithTabGroupListMetadata(final List<FCTabGroup> tabGroupListMetadata) {
         final EntityModel entityModel = new EntityModel(this.adapterMemento, this.propertyScalarModels);
         entityModel.tabGroupListMetadata = tabGroupListMetadata;
         return entityModel;
     }
 
 
-    private TabGroupMetadata tabGroupMetadata;
+    private FCTabGroup FCTabGroup;
 
-    public TabGroupMetadata getTabGroupMetadata() {
-        return tabGroupMetadata;
+    public FCTabGroup getFCTabGroup() {
+        return FCTabGroup;
     }
 
     /**
      * Returns a new copy that SHARES the property scalar models (for edit form).
      */
-    public EntityModel cloneWithTabGroupMetadata(final TabGroupMetadata tabGroupMetadata) {
+    public EntityModel cloneWithTabGroupMetadata(final FCTabGroup FCTabGroup) {
         final EntityModel entityModel = new EntityModel(this.adapterMemento, this.propertyScalarModels);
-        entityModel.tabGroupMetadata = tabGroupMetadata;
+        entityModel.FCTabGroup = FCTabGroup;
         return entityModel;
     }
 
 
-    private TabMetadata tabMetadata;
+    private FCTab FCTab;
 
-    public TabMetadata getTabMetadata() {
-        return tabMetadata;
+    public FCTab getFCTab() {
+        return FCTab;
     }
 
     /**
      * Returns a new copy that SHARES the property scalar models (for edit form).
      */
-    public EntityModel cloneWithTabMetadata(final TabMetadata tabMetadata) {
+    public EntityModel cloneWithTabMetadata(final FCTab FCTab) {
         final EntityModel entityModel = new EntityModel(this.adapterMemento, this.propertyScalarModels);
-        entityModel.tabMetadata = tabMetadata;
+        entityModel.FCTab = FCTab;
         return entityModel;
     }
 
 
-    private ColumnMetadata columnMetadata;
-    private ColumnMetadata.Hint columnHint;
+    private FCColumn FCColumn;
+    private FCColumn.Hint columnHint;
 
     /**
      * Returns a new copy that SHARES the property scalar models (for edit form).
      */
-    public EntityModel cloneWithColumnMetadata(final ColumnMetadata columnMetadata, final ColumnMetadata.Hint columnHint) {
+    public EntityModel cloneWithColumnMetadata(final FCColumn FCColumn, final FCColumn.Hint columnHint) {
         final EntityModel entityModel = new EntityModel(this.adapterMemento, this.propertyScalarModels);
-        entityModel.columnMetadata = columnMetadata;
+        entityModel.FCColumn = FCColumn;
         entityModel.columnHint = columnHint;
         return entityModel;
     }
 
-    public ColumnMetadata getColumnMetadata() {
-        return columnMetadata;
+    public FCColumn getFCColumn() {
+        return FCColumn;
     }
-    public ColumnMetadata.Hint getColumnHint() {
+    public FCColumn.Hint getColumnHint() {
         return columnHint;
     }
 
@@ -726,34 +726,34 @@ public class EntityModel extends BookmarkableModel<ObjectAdapter> {
     }
 
 
-    private PropertyGroupMetadata propertyGroupMetadata;
-    public PropertyGroupMetadata getPropertyGroupMetadata() {
-        return propertyGroupMetadata;
+    private FieldSet fieldSet;
+    public FieldSet getFieldSet() {
+        return fieldSet;
     }
 
     /**
      * Returns a new copy that SHARES the property scalar models (for edit form).
      */
     public EntityModel cloneWithPropertyGroupMetadata(
-            final PropertyGroupMetadata propertyGroupMetadata) {
+            final FieldSet fieldSet) {
         final EntityModel entityModel = new EntityModel(this.adapterMemento, this.propertyScalarModels);
-        entityModel.propertyGroupMetadata = propertyGroupMetadata;
+        entityModel.fieldSet = fieldSet;
         return entityModel;
     }
 
 
-    private CollectionLayoutMetadata collectionLayoutMetadata;
-    public CollectionLayoutMetadata getCollectionLayoutMetadata() {
-        return collectionLayoutMetadata;
+    private CollectionLayoutData collectionLayoutData;
+    public CollectionLayoutData getCollectionLayoutData() {
+        return collectionLayoutData;
     }
 
     /**
      * Returns a new copy that SHARES the property scalar models.
      */
     public EntityModel cloneWithCollectionLayoutMetadata(
-            final CollectionLayoutMetadata collectionLayoutMetadata) {
+            final CollectionLayoutData collectionLayoutData) {
         final EntityModel entityModel = new EntityModel(this.adapterMemento, this.propertyScalarModels);
-        entityModel.collectionLayoutMetadata = collectionLayoutMetadata;
+        entityModel.collectionLayoutData = collectionLayoutData;
         return entityModel;
     }
 

http://git-wip-us.apache.org/repos/asf/isis/blob/10d80f3a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/EntityPanelFactory.java
----------------------------------------------------------------------
diff --git a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/EntityPanelFactory.java b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/EntityPanelFactory.java
index 8861172..d779a5c 100644
--- a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/EntityPanelFactory.java
+++ b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/EntityPanelFactory.java
@@ -22,7 +22,7 @@ package org.apache.isis.viewer.wicket.ui.components.entity;
 import org.apache.wicket.Component;
 import org.apache.wicket.model.IModel;
 
-import org.apache.isis.applib.layout.fixedcols.ObjectLayoutMetadata;
+import org.apache.isis.applib.layout.fixedcols.FCPage;
 import org.apache.isis.core.metamodel.facets.object.layoutmetadata.ObjectLayoutMetadataFacet;
 import org.apache.isis.core.metamodel.spec.ObjectSpecification;
 import org.apache.isis.viewer.wicket.model.models.EntityModel;
@@ -51,7 +51,7 @@ public class EntityPanelFactory extends EntityComponentFactoryAbstract {
 
         final ObjectSpecification specification = entityModel.getTypeOfSpecification();
         final ObjectLayoutMetadataFacet facet = specification.getFacet(ObjectLayoutMetadataFacet.class);
-        final ObjectLayoutMetadata layoutMetadata = facet.getMetadata();
+        final FCPage layoutMetadata = facet.getMetadata();
         final boolean hasLayout = layoutMetadata != null;
         return hasLayout
                 ? new EntityTabbedPanel(id, entityModel)

http://git-wip-us.apache.org/repos/asf/isis/blob/10d80f3a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/PropUtil.java
----------------------------------------------------------------------
diff --git a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/PropUtil.java b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/PropUtil.java
index 37bcd93..6e390ac 100644
--- a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/PropUtil.java
+++ b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/PropUtil.java
@@ -26,8 +26,8 @@ import com.google.common.collect.FluentIterable;
 import org.apache.isis.applib.annotation.Where;
 import org.apache.isis.applib.filter.Filter;
 import org.apache.isis.applib.filter.Filters;
-import org.apache.isis.applib.layout.fixedcols.ColumnMetadata;
-import org.apache.isis.applib.layout.v1_0.PropertyGroupMetadata;
+import org.apache.isis.applib.layout.fixedcols.FCColumn;
+import org.apache.isis.applib.layout.members.v1.FieldSet;
 import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
 import org.apache.isis.core.metamodel.consent.InteractionInitiatedBy;
 import org.apache.isis.core.metamodel.spec.ObjectSpecification;
@@ -43,7 +43,7 @@ public final class PropUtil {
 
     public static List<String> propertyGroupNames(
             final EntityModel entityModel,
-            final ColumnMetadata.Hint hint, final ColumnMetadata columnMetaDataIfAny) {
+            final FCColumn.Hint hint, final FCColumn columnMetaDataIfAny) {
         final ObjectAdapter adapter = entityModel.getObject();
         final ObjectSpecification objSpec = adapter.getSpecification();
 
@@ -52,8 +52,8 @@ public final class PropUtil {
 
         return columnMetaDataIfAny != null
                 ? FluentIterable
-                .from(columnMetaDataIfAny.getPropertyGroups())
-                .transform(PropertyGroupMetadata.Util.nameOf())
+                .from(columnMetaDataIfAny.getFieldSets())
+                .transform(FieldSet.Util.nameOf())
                 .toList()
                 : ObjectSpecifications.orderByMemberGroups(objSpec, associationsByGroup.keySet(),
                 hint);

http://git-wip-us.apache.org/repos/asf/isis/blob/10d80f3a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/collections/EntityCollectionsPanel.java
----------------------------------------------------------------------
diff --git a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/collections/EntityCollectionsPanel.java b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/collections/EntityCollectionsPanel.java
index 14eb27c..d7f8240 100644
--- a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/collections/EntityCollectionsPanel.java
+++ b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/collections/EntityCollectionsPanel.java
@@ -31,8 +31,8 @@ import org.apache.wicket.markup.repeater.RepeatingView;
 import org.apache.isis.applib.annotation.Where;
 import org.apache.isis.applib.filter.Filter;
 import org.apache.isis.applib.filter.Filters;
-import org.apache.isis.applib.layout.v1_0.CollectionLayoutMetadata;
-import org.apache.isis.applib.layout.fixedcols.ColumnMetadata;
+import org.apache.isis.applib.layout.members.v1.CollectionLayoutData;
+import org.apache.isis.applib.layout.fixedcols.FCColumn;
 import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
 import org.apache.isis.core.metamodel.consent.InteractionInitiatedBy;
 import org.apache.isis.core.metamodel.facets.members.order.MemberOrderFacet;
@@ -56,12 +56,12 @@ public class EntityCollectionsPanel extends PanelAbstract<EntityModel> {
     private static final String ID_COLLECTION = "collection";
 
     // view metadata (if any available)
-    private final ColumnMetadata columnMetadataIfAny;
+    private final FCColumn FCColumnIfAny;
 
     public EntityCollectionsPanel(final String id, final EntityModel entityModel) {
         super(id, entityModel);
 
-        columnMetadataIfAny = entityModel.getColumnMetadata();
+        FCColumnIfAny = entityModel.getFCColumn();
 
         buildGui();
     }
@@ -86,10 +86,10 @@ public class EntityCollectionsPanel extends PanelAbstract<EntityModel> {
         final ObjectAdapter adapter = entityModel.getObject();
 
         final Filter<ObjectAssociation> filter;
-        if (columnMetadataIfAny != null) {
+        if (FCColumnIfAny != null) {
             final ImmutableList<String> collectionIds = FluentIterable
-                    .from(columnMetadataIfAny.getCollections())
-                    .transform(CollectionLayoutMetadata.Functions.id())
+                    .from(FCColumnIfAny.getCollections())
+                    .transform(CollectionLayoutData.Functions.id())
                     .toList();
             filter = new Filter<ObjectAssociation>() {
                 @Override
@@ -122,9 +122,9 @@ public class EntityCollectionsPanel extends PanelAbstract<EntityModel> {
             final WebMarkupContainer collectionRvContainer = new WebMarkupContainer(collectionRv.newChildId());
             collectionRv.add(collectionRvContainer);
 
-            final CollectionLayoutMetadata collectionLayoutMetadata = new CollectionLayoutMetadata(association.getId());
+            final CollectionLayoutData collectionLayoutData = new CollectionLayoutData(association.getId());
             final EntityModel entityModelWithCollectionLayoutMetadata =
-                    entityModel.cloneWithCollectionLayoutMetadata(collectionLayoutMetadata);
+                    entityModel.cloneWithCollectionLayoutMetadata(collectionLayoutData);
 
             collectionRvContainer.add(new EntityCollectionPanel(ID_COLLECTION, entityModelWithCollectionLayoutMetadata));
         }

http://git-wip-us.apache.org/repos/asf/isis/blob/10d80f3a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/column/EntityColumn.java
----------------------------------------------------------------------
diff --git a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/column/EntityColumn.java b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/column/EntityColumn.java
index 528ba06..4cda729 100644
--- a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/column/EntityColumn.java
+++ b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/column/EntityColumn.java
@@ -31,9 +31,9 @@ import org.apache.wicket.MarkupContainer;
 import org.apache.wicket.markup.html.WebMarkupContainer;
 import org.apache.wicket.markup.repeater.RepeatingView;
 
-import org.apache.isis.applib.layout.fixedcols.ColumnMetadata;
-import org.apache.isis.applib.layout.v1_0.PropertyGroupMetadata;
-import org.apache.isis.applib.layout.v1_0.PropertyLayoutMetadata;
+import org.apache.isis.applib.layout.fixedcols.FCColumn;
+import org.apache.isis.applib.layout.members.v1.FieldSet;
+import org.apache.isis.applib.layout.members.v1.PropertyLayoutData;
 import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
 import org.apache.isis.core.metamodel.facets.object.membergroups.MemberGroupLayoutFacet;
 import org.apache.isis.core.metamodel.spec.ObjectSpecification;
@@ -44,7 +44,6 @@ import org.apache.isis.core.runtime.system.context.IsisContext;
 import org.apache.isis.viewer.wicket.model.models.EntityModel;
 import org.apache.isis.viewer.wicket.ui.ComponentType;
 import org.apache.isis.viewer.wicket.ui.components.entity.PropUtil;
-import org.apache.isis.viewer.wicket.ui.components.entity.propgroup.PropertyGroup;
 import org.apache.isis.viewer.wicket.ui.panels.PanelAbstract;
 import org.apache.isis.viewer.wicket.ui.util.Components;
 
@@ -52,9 +51,9 @@ import org.apache.isis.viewer.wicket.ui.util.Components;
  * Adds properties (in property groups) and collections to a column.
  *
  * <p>
- *     If {@link ColumnMetadata} is present, then only those properties and collections for that
+ *     If {@link FCColumn} is present, then only those properties and collections for that
  *     column metadata are rendered.   Otherwise the {@link MemberGroupLayoutFacet} on the
- *     {@link ObjectSpecification} in conjunction with the provided {@link ColumnMetadata.Hint} is
+ *     {@link ObjectSpecification} in conjunction with the provided {@link FCColumn.Hint} is
  *     used to filter down to just those properties/collections in the column.
  * </p>
  */
@@ -66,9 +65,9 @@ public class EntityColumn extends PanelAbstract<EntityModel> {
 
 
     // view metadata (populated for EntityTabbedPanel, absent for EntityEditablePanel)
-    private final ColumnMetadata columnMetaDataIfAny;
+    private final FCColumn columnMetaDataIfAny;
     // which column to render (populated for EntityEditablePanel, not required and so absent for EntityTabbedPanel)
-    final ColumnMetadata.Hint hint;
+    final FCColumn.Hint hint;
 
     public EntityColumn(
             final String id,
@@ -76,7 +75,7 @@ public class EntityColumn extends PanelAbstract<EntityModel> {
 
         super(id, entityModel);
 
-        columnMetaDataIfAny = entityModel.getColumnMetadata();
+        columnMetaDataIfAny = entityModel.getFCColumn();
         hint = entityModel.getColumnHint();
 
         buildGui();
@@ -105,9 +104,9 @@ public class EntityColumn extends PanelAbstract<EntityModel> {
         final RepeatingView memberGroupRv = new RepeatingView(ID_PROPERTY_GROUP);
         markupContainer.add(memberGroupRv);
 
-        final ImmutableMap<String, PropertyGroupMetadata> propertyGroupMetadataByNameIfAny =
+        final ImmutableMap<String, FieldSet> propertyGroupMetadataByNameIfAny =
                 columnMetaDataIfAny != null
-                    ? Maps.uniqueIndex(columnMetaDataIfAny.getPropertyGroups(), PropertyGroupMetadata.Util.nameOf())
+                    ? Maps.uniqueIndex(columnMetaDataIfAny.getFieldSets(), FieldSet.Util.nameOf())
                     : null;
 
         final Collection<String> groupNames =
@@ -118,33 +117,33 @@ public class EntityColumn extends PanelAbstract<EntityModel> {
         for(final String groupName: groupNames) {
 
 
-            final PropertyGroupMetadata propertyGroupMetadata;
+            final FieldSet fieldSet;
             if (propertyGroupMetadataByNameIfAny != null) {
-                propertyGroupMetadata = propertyGroupMetadataByNameIfAny.get(groupName);
+                fieldSet = propertyGroupMetadataByNameIfAny.get(groupName);
             }
             else {
                 final List<ObjectAssociation> associationsInGroup = associationsByGroup.get(groupName);
-                propertyGroupMetadata = new PropertyGroupMetadata(groupName);
-                propertyGroupMetadata.setProperties(
+                fieldSet = new FieldSet(groupName);
+                fieldSet.setProperties(
                         FluentIterable
                                 .from(associationsInGroup)
                                 .transform(
-                                    new Function<ObjectAssociation, PropertyLayoutMetadata>() {
+                                    new Function<ObjectAssociation, PropertyLayoutData>() {
                                         @Override
-                                        public PropertyLayoutMetadata apply(final ObjectAssociation assoc) {
-                                            return new PropertyLayoutMetadata(assoc.getId());
+                                        public PropertyLayoutData apply(final ObjectAssociation assoc) {
+                                            return new PropertyLayoutData(assoc.getId());
                                         }
                                     }).toList());
             }
 
-            if(propertyGroupMetadata.getProperties().isEmpty()) {
+            if(fieldSet.getProperties().isEmpty()) {
                 continue;
             }
 
             final String id = memberGroupRv.newChildId();
 
-            final EntityModel entityModelWithHints = entityModel.cloneWithPropertyGroupMetadata(propertyGroupMetadata);
-            final WebMarkupContainer memberGroupRvContainer = new PropertyGroup(id, entityModelWithHints);
+            final EntityModel entityModelWithHints = entityModel.cloneWithPropertyGroupMetadata(fieldSet);
+            final WebMarkupContainer memberGroupRvContainer = new org.apache.isis.viewer.wicket.ui.components.entity.propgroup.PropertyGroup(id, entityModelWithHints);
 
             memberGroupRv.add(memberGroupRvContainer);
         }

http://git-wip-us.apache.org/repos/asf/isis/blob/10d80f3a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/propgroup/PropertyGroup.java
----------------------------------------------------------------------
diff --git a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/propgroup/PropertyGroup.java b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/propgroup/PropertyGroup.java
index 9d2039b..e595806 100644
--- a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/propgroup/PropertyGroup.java
+++ b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/propgroup/PropertyGroup.java
@@ -27,8 +27,8 @@ import org.apache.wicket.markup.html.basic.Label;
 import org.apache.wicket.markup.repeater.RepeatingView;
 
 import org.apache.isis.applib.annotation.ActionLayout;
-import org.apache.isis.applib.layout.v1_0.PropertyGroupMetadata;
-import org.apache.isis.applib.layout.v1_0.PropertyLayoutMetadata;
+import org.apache.isis.applib.layout.members.v1.FieldSet;
+import org.apache.isis.applib.layout.members.v1.PropertyLayoutData;
 import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
 import org.apache.isis.core.metamodel.spec.feature.ObjectAction;
 import org.apache.isis.core.metamodel.spec.feature.ObjectAssociation;
@@ -52,11 +52,11 @@ public class PropertyGroup extends PanelAbstract<EntityModel> {
     private static final String ID_PROPERTIES = "properties";
     private static final String ID_PROPERTY = "property";
 
-    private final PropertyGroupMetadata propertyGroupMetadata;
+    private final FieldSet fieldSet;
 
     public PropertyGroup(final String id, final EntityModel model) {
         super(id, model);
-        propertyGroupMetadata = model.getPropertyGroupMetadata();
+        fieldSet = model.getFieldSet();
 
         buildGui();
     }
@@ -66,7 +66,7 @@ public class PropertyGroup extends PanelAbstract<EntityModel> {
     }
 
     private void buildGui() {
-        String groupName = propertyGroupMetadata.getName();
+        String groupName = fieldSet.getName();
         final ObjectAdapter adapter = getModel().getObject();
 
         add(new Label(ID_MEMBER_GROUP_NAME, groupName));
@@ -76,8 +76,8 @@ public class PropertyGroup extends PanelAbstract<EntityModel> {
         final RepeatingView propertyRv = new RepeatingView(ID_PROPERTIES);
         add(propertyRv);
 
-        final List<PropertyLayoutMetadata> properties = propertyGroupMetadata.getProperties();
-        for (PropertyLayoutMetadata property : properties) {
+        final List<PropertyLayoutData> properties = fieldSet.getProperties();
+        for (PropertyLayoutData property : properties) {
             final ObjectAssociation association = adapter.getSpecification().getAssociation(property.getId());
 
             final WebMarkupContainer propertyRvContainer = new WebMarkupContainer(propertyRv.newChildId());

http://git-wip-us.apache.org/repos/asf/isis/blob/10d80f3a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/propsandcolls/EntityPropsAndCollsForm.java
----------------------------------------------------------------------
diff --git a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/propsandcolls/EntityPropsAndCollsForm.java b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/propsandcolls/EntityPropsAndCollsForm.java
index 770b883..69eea60 100644
--- a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/propsandcolls/EntityPropsAndCollsForm.java
+++ b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/propsandcolls/EntityPropsAndCollsForm.java
@@ -44,9 +44,9 @@ import org.apache.isis.applib.annotation.MemberGroupLayout.ColumnSpans;
 import org.apache.isis.applib.annotation.Where;
 import org.apache.isis.applib.filter.Filter;
 import org.apache.isis.applib.filter.Filters;
-import org.apache.isis.applib.layout.fixedcols.ColumnMetadata;
-import org.apache.isis.applib.layout.fixedcols.ColumnMetadata.Hint;
-import org.apache.isis.applib.layout.fixedcols.TabMetadata;
+import org.apache.isis.applib.layout.fixedcols.FCColumn;
+import org.apache.isis.applib.layout.fixedcols.FCColumn.Hint;
+import org.apache.isis.applib.layout.fixedcols.FCTab;
 import org.apache.isis.applib.services.exceprecog.ExceptionRecognizer;
 import org.apache.isis.applib.services.exceprecog.ExceptionRecognizerComposite;
 import org.apache.isis.core.commons.authentication.MessageBroker;
@@ -127,14 +127,14 @@ public class EntityPropsAndCollsForm extends FormAbstract<ObjectAdapter> impleme
     private void buildGui() {
 
         final EntityModel entityModel = (EntityModel) getModel();
-        final TabMetadata tabMetaDataIfAny = entityModel.getTabMetadata();
+        final FCTab FCTabMetaDataIfAny = entityModel.getFCTab();
 
         final ColumnSpans columnSpans;
-        if(tabMetaDataIfAny != null) {
-            final ColumnMetadata middle = tabMetaDataIfAny.getMiddle();
-            final ColumnMetadata right = tabMetaDataIfAny.getRight();
+        if(FCTabMetaDataIfAny != null) {
+            final FCColumn middle = FCTabMetaDataIfAny.getMiddle();
+            final FCColumn right = FCTabMetaDataIfAny.getRight();
             columnSpans = ColumnSpans.asSpans(
-                    tabMetaDataIfAny.getLeft().getSpan(),
+                    FCTabMetaDataIfAny.getLeft().getSpan(),
                     middle != null? middle.getSpan(): 0,
                     right != null? right.getSpan(): 0);
         } else {
@@ -149,7 +149,7 @@ public class EntityPropsAndCollsForm extends FormAbstract<ObjectAdapter> impleme
         add(leftColumn);
 
         if(columnSpans.getLeft() > 0) {
-            addPropertiesAndCollections(leftColumn, entityModel, tabMetaDataIfAny, Hint.LEFT);
+            addPropertiesAndCollections(leftColumn, entityModel, FCTabMetaDataIfAny, Hint.LEFT);
         } else {
             Components.permanentlyHide(this, ID_LEFT_COLUMN);
         }
@@ -159,7 +159,7 @@ public class EntityPropsAndCollsForm extends FormAbstract<ObjectAdapter> impleme
         if(columnSpans.getMiddle() > 0) {
             middleColumn = new WebMarkupContainer(ID_MIDDLE_COLUMN);
             add(middleColumn);
-            addPropertiesAndCollections(middleColumn, entityModel, tabMetaDataIfAny, Hint.MIDDLE);
+            addPropertiesAndCollections(middleColumn, entityModel, FCTabMetaDataIfAny, Hint.MIDDLE);
         } else {
             middleColumn = null;
             Components.permanentlyHide(this, ID_MIDDLE_COLUMN);
@@ -170,7 +170,7 @@ public class EntityPropsAndCollsForm extends FormAbstract<ObjectAdapter> impleme
         if(columnSpans.getRight() > 0) {
             rightColumn = new WebMarkupContainer(ID_RIGHT_COLUMN);
             add(rightColumn);
-            addPropertiesAndCollections(rightColumn, entityModel, tabMetaDataIfAny, Hint.RIGHT);
+            addPropertiesAndCollections(rightColumn, entityModel, FCTabMetaDataIfAny, Hint.RIGHT);
         } else {
             rightColumn = null;
             Components.permanentlyHide(this, ID_RIGHT_COLUMN);
@@ -189,7 +189,7 @@ public class EntityPropsAndCollsForm extends FormAbstract<ObjectAdapter> impleme
 
         // edit buttons and feedback (not supported on tabbed view)
         final Hint leftHint = Hint.LEFT;
-        final ColumnMetadata leftColumnMetaDataIfAny = leftHint.from(tabMetaDataIfAny);
+        final FCColumn leftColumnMetaDataIfAny = leftHint.from(FCTabMetaDataIfAny);
         final boolean hasProperties = leftColumnMetaDataIfAny == null && !PropUtil
                 .propertyGroupNames(entityModel, leftHint, leftColumnMetaDataIfAny).isEmpty();
         if (hasProperties) {
@@ -204,7 +204,7 @@ public class EntityPropsAndCollsForm extends FormAbstract<ObjectAdapter> impleme
 
 
         // collections (only if not being added to a tab)
-        if(tabMetaDataIfAny == null && columnSpans.getCollections() > 0) {
+        if(FCTabMetaDataIfAny == null && columnSpans.getCollections() > 0) {
             final String idCollectionsToShow;
             final String idCollectionsToHide;
             int collectionSpan;
@@ -233,9 +233,9 @@ public class EntityPropsAndCollsForm extends FormAbstract<ObjectAdapter> impleme
     private void addPropertiesAndCollections(
             final MarkupContainer markupContainer,
             final EntityModel entityModel,
-            final TabMetadata tabMetaDataIfAny,
+            final FCTab FCTabMetaDataIfAny,
             final Hint hint) {
-        final ColumnMetadata columnMetaDataIfAny = hint.from(tabMetaDataIfAny);
+        final FCColumn columnMetaDataIfAny = hint.from(FCTabMetaDataIfAny);
 
         final EntityModel entityModelWithHints = entityModel.cloneWithColumnMetadata(columnMetaDataIfAny, hint);
 

http://git-wip-us.apache.org/repos/asf/isis/blob/10d80f3a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/tabbed/EntityTabbedPanel.java
----------------------------------------------------------------------
diff --git a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/tabbed/EntityTabbedPanel.java b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/tabbed/EntityTabbedPanel.java
index ca5c9ad..40ec6e3 100644
--- a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/tabbed/EntityTabbedPanel.java
+++ b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/tabbed/EntityTabbedPanel.java
@@ -23,9 +23,9 @@ import java.util.List;
 
 import com.google.common.collect.FluentIterable;
 
-import org.apache.isis.applib.layout.fixedcols.ColumnMetadata;
-import org.apache.isis.applib.layout.fixedcols.ObjectLayoutMetadata;
-import org.apache.isis.applib.layout.fixedcols.TabGroupMetadata;
+import org.apache.isis.applib.layout.fixedcols.FCColumn;
+import org.apache.isis.applib.layout.fixedcols.FCPage;
+import org.apache.isis.applib.layout.fixedcols.FCTabGroup;
 import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
 import org.apache.isis.core.metamodel.facets.members.cssclass.CssClassFacet;
 import org.apache.isis.core.metamodel.facets.object.layoutmetadata.ObjectLayoutMetadataFacet;
@@ -64,16 +64,16 @@ public class EntityTabbedPanel extends PanelAbstract<EntityModel> {
 
         // forces metadata to be derived && synced
         final ObjectLayoutMetadataFacet objectLayoutMetadataFacet = model.getTypeOfSpecification().getFacet(ObjectLayoutMetadataFacet.class);
-        final ObjectLayoutMetadata objectLayoutMetadata = objectLayoutMetadataFacet.getMetadata();
+        final FCPage FCPage = objectLayoutMetadataFacet.getMetadata();
 
 
         addOrReplace(ComponentType.ENTITY_SUMMARY, model);
 
-        final int leftSpan = addColumnIfRequired(ID_LEFT_COLUMN, objectLayoutMetadata.getLeft(), ColumnMetadata.Hint.LEFT);
+        final int leftSpan = addColumnIfRequired(ID_LEFT_COLUMN, FCPage.getLeft(), FCColumn.Hint.LEFT);
 
-        final TabGroupListPanel middleTabs = addTabGroups(ID_MIDDLE_COLUMN, objectLayoutMetadata.getTabGroups());
+        final TabGroupListPanel middleTabs = addTabGroups(ID_MIDDLE_COLUMN, FCPage.getTabGroups());
 
-        final int rightSpan = addColumnIfRequired(ID_RIGHT_COLUMN, objectLayoutMetadata.getRight(), ColumnMetadata.Hint.RIGHT);
+        final int rightSpan = addColumnIfRequired(ID_RIGHT_COLUMN, FCPage.getRight(), FCColumn.Hint.RIGHT);
 
         final int columnSpans = leftSpan + rightSpan;
         int tabGroupSpan = columnSpans < 12 ? 12 - (columnSpans) : 12;
@@ -82,11 +82,11 @@ public class EntityTabbedPanel extends PanelAbstract<EntityModel> {
     }
 
     private TabGroupListPanel addTabGroups(
-            final String id, final List<TabGroupMetadata> tabGroupList) {
+            final String id, final List<FCTabGroup> tabGroupList) {
         final EntityModel model = getModel();
-        final List<TabGroupMetadata> tabGroups = FluentIterable
+        final List<FCTabGroup> tabGroups = FluentIterable
                 .from(tabGroupList)
-                .filter(TabGroupMetadata.Predicates.notEmpty())
+                .filter(FCTabGroup.Predicates.notEmpty())
                 .toList();
         final EntityModel entityModelWitHints = model.cloneWithTabGroupListMetadata(tabGroups);
         final TabGroupListPanel middleComponent = new TabGroupListPanel(id, entityModelWitHints);
@@ -94,11 +94,11 @@ public class EntityTabbedPanel extends PanelAbstract<EntityModel> {
         return middleComponent;
     }
 
-    private int addColumnIfRequired(final String id, final ColumnMetadata col, final ColumnMetadata.Hint hint) {
+    private int addColumnIfRequired(final String id, final FCColumn col, final FCColumn.Hint hint) {
         if(col != null) {
             final EntityModel entityModel =
                     getModel().cloneWithColumnMetadata(col, hint);
-            final int span = entityModel.getColumnMetadata().getSpan();
+            final int span = entityModel.getFCColumn().getSpan();
             if(span > 0) {
                 final EntityColumn entityColumn = new EntityColumn(id, entityModel);
                 addOrReplace(entityColumn);

http://git-wip-us.apache.org/repos/asf/isis/blob/10d80f3a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/tabgroup/TabGroupPanel.java
----------------------------------------------------------------------
diff --git a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/tabgroup/TabGroupPanel.java b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/tabgroup/TabGroupPanel.java
index c4dbb15..1047855 100644
--- a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/tabgroup/TabGroupPanel.java
+++ b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/tabgroup/TabGroupPanel.java
@@ -29,8 +29,8 @@ import org.apache.wicket.extensions.markup.html.tabs.TabbedPanel;
 import org.apache.wicket.markup.html.panel.Panel;
 import org.apache.wicket.model.Model;
 
-import org.apache.isis.applib.layout.fixedcols.TabGroupMetadata;
-import org.apache.isis.applib.layout.fixedcols.TabMetadata;
+import org.apache.isis.applib.layout.fixedcols.FCTabGroup;
+import org.apache.isis.applib.layout.fixedcols.FCTab;
 import org.apache.isis.viewer.wicket.model.models.EntityModel;
 import org.apache.isis.viewer.wicket.model.util.ScopedSessionAttribute;
 import org.apache.isis.viewer.wicket.ui.components.entity.tabpanel.TabPanel;
@@ -42,7 +42,7 @@ public class TabGroupPanel extends AjaxBootstrapTabbedPanel {
     public static final String SESSION_ATTR_SELECTED_TAB = "selectedTab";
     private final EntityModel entityModel;
     // the view metadata
-    private final TabGroupMetadata tabGroup;
+    private final FCTabGroup tabGroup;
     private final ScopedSessionAttribute<Integer> selectedTabInSession;
 
     private static final String ID_TAB_GROUP = "tabGroup";
@@ -50,19 +50,19 @@ public class TabGroupPanel extends AjaxBootstrapTabbedPanel {
     private static List<ITab> tabsFor(final EntityModel entityModel) {
         final List<ITab> tabs = Lists.newArrayList();
 
-        final TabGroupMetadata tabGroup = entityModel.getTabGroupMetadata();
-        final List<TabMetadata> tabMetadataList = FluentIterable
+        final FCTabGroup tabGroup = entityModel.getFCTabGroup();
+        final List<FCTab> FCTabList = FluentIterable
                 .from(tabGroup.getTabs())
-                .filter(TabMetadata.Predicates.notEmpty())
+                .filter(FCTab.Predicates.notEmpty())
                 .toList();
 
-        for (final TabMetadata tabMetadata : tabMetadataList) {
-            tabs.add(new AbstractTab(Model.of(tabMetadata.getName())) {
+        for (final FCTab FCTab : FCTabList) {
+            tabs.add(new AbstractTab(Model.of(FCTab.getName())) {
                 private static final long serialVersionUID1 = 1L;
 
                 @Override
                 public Panel getPanel(String panelId) {
-                    return new TabPanel(panelId, entityModel, tabMetadata);
+                    return new TabPanel(panelId, entityModel, FCTab);
                 }
             });
         }
@@ -73,7 +73,7 @@ public class TabGroupPanel extends AjaxBootstrapTabbedPanel {
         super(ID_TAB_GROUP, tabsFor(entityModel));
 
         this.entityModel = entityModel;
-        this.tabGroup = entityModel.getTabGroupMetadata();
+        this.tabGroup = entityModel.getFCTabGroup();
         this.selectedTabInSession = ScopedSessionAttribute.create(entityModel, this, SESSION_ATTR_SELECTED_TAB);
 
     }

http://git-wip-us.apache.org/repos/asf/isis/blob/10d80f3a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/tabgrouplist/TabGroupListPanel.java
----------------------------------------------------------------------
diff --git a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/tabgrouplist/TabGroupListPanel.java b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/tabgrouplist/TabGroupListPanel.java
index 5a53620..ff0de4d 100644
--- a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/tabgrouplist/TabGroupListPanel.java
+++ b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/tabgrouplist/TabGroupListPanel.java
@@ -24,7 +24,7 @@ import java.util.List;
 import org.apache.wicket.markup.html.list.ListItem;
 import org.apache.wicket.markup.html.list.ListView;
 
-import org.apache.isis.applib.layout.fixedcols.TabGroupMetadata;
+import org.apache.isis.applib.layout.fixedcols.FCTabGroup;
 import org.apache.isis.viewer.wicket.model.models.EntityModel;
 import org.apache.isis.viewer.wicket.ui.components.entity.tabgroup.TabGroupPanel;
 import org.apache.isis.viewer.wicket.ui.panels.PanelAbstract;
@@ -36,7 +36,7 @@ public class TabGroupListPanel extends PanelAbstract<EntityModel> {
     private static final String ID_TAB_GROUPS = "tabGroups";
 
     // the view metadata
-    private final List<TabGroupMetadata> tabGroups;
+    private final List<FCTabGroup> tabGroups;
 
     public TabGroupListPanel(final String id, final EntityModel entityModel) {
         super(id, entityModel);
@@ -49,12 +49,12 @@ public class TabGroupListPanel extends PanelAbstract<EntityModel> {
     private void buildGui() {
         final EntityModel model = getModel();
 
-        final ListView<TabGroupMetadata> tabGroupsList = new ListView<TabGroupMetadata>(ID_TAB_GROUPS, this.tabGroups) {
+        final ListView<FCTabGroup> tabGroupsList = new ListView<FCTabGroup>(ID_TAB_GROUPS, this.tabGroups) {
 
             @Override
-            protected void populateItem(final ListItem<TabGroupMetadata> item) {
+            protected void populateItem(final ListItem<FCTabGroup> item) {
 
-                final TabGroupMetadata tabGroup = item.getModelObject();
+                final FCTabGroup tabGroup = item.getModelObject();
                 final EntityModel entityModelWithHints = model.cloneWithTabGroupMetadata(tabGroup);
                 final TabGroupPanel tabGroupPanel = new TabGroupPanel(entityModelWithHints);
                 item.add(tabGroupPanel);

http://git-wip-us.apache.org/repos/asf/isis/blob/10d80f3a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/tabpanel/TabPanel.java
----------------------------------------------------------------------
diff --git a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/tabpanel/TabPanel.java b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/tabpanel/TabPanel.java
index 8b21ddf..6b6d9d7 100644
--- a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/tabpanel/TabPanel.java
+++ b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/tabpanel/TabPanel.java
@@ -1,6 +1,6 @@
 package org.apache.isis.viewer.wicket.ui.components.entity.tabpanel;
 
-import org.apache.isis.applib.layout.fixedcols.TabMetadata;
+import org.apache.isis.applib.layout.fixedcols.FCTab;
 import org.apache.isis.viewer.wicket.model.models.EntityModel;
 import org.apache.isis.viewer.wicket.ui.ComponentType;
 import org.apache.isis.viewer.wicket.ui.panels.PanelAbstract;
@@ -11,10 +11,10 @@ public class TabPanel extends PanelAbstract {
 
     private static final String ID_COLUMN = "column";
 
-    public TabPanel(String id, final EntityModel model, final TabMetadata tabMetadata) {
+    public TabPanel(String id, final EntityModel model, final FCTab FCTab) {
         super(id);
 
-        final EntityModel modelWithTabHints = model.cloneWithTabMetadata(tabMetadata);
+        final EntityModel modelWithTabHints = model.cloneWithTabMetadata(FCTab);
 
         getComponentFactoryRegistry()
                 .addOrReplaceComponent(this,

http://git-wip-us.apache.org/repos/asf/isis/blob/10d80f3a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/entity/EntityPage.java
----------------------------------------------------------------------
diff --git a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/entity/EntityPage.java b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/entity/EntityPage.java
index ce5f0b5..51c222c 100644
--- a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/entity/EntityPage.java
+++ b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/entity/EntityPage.java
@@ -29,7 +29,7 @@ import org.apache.wicket.model.AbstractReadOnlyModel;
 import org.apache.wicket.request.mapper.parameter.PageParameters;
 import org.apache.wicket.util.string.Strings;
 
-import org.apache.isis.applib.layout.fixedcols.ObjectLayoutMetadata;
+import org.apache.isis.applib.layout.fixedcols.FCPage;
 import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
 import org.apache.isis.core.metamodel.adapter.mgr.AdapterManager.ConcurrencyChecking;
 import org.apache.isis.core.metamodel.adapter.version.ConcurrencyException;
@@ -142,7 +142,7 @@ public class EntityPage extends PageAbstract {
             // the facet should always exist, in fact
             // just enough to ask for the metadata.
             // This will cause the current ObjectSpec to be updated as a side effect.
-            final ObjectLayoutMetadata metadata = facet.getMetadata();
+            final FCPage metadata = facet.getMetadata();
 
             // if none, then fallback to invalidating entire cache
             // (this is the original LayoutMetadataFromJson behaviour)


[04/18] isis git commit: ISIS-1300: new configuration property to enable the wicketsource plugin. Also updated docs.

Posted by da...@apache.org.
ISIS-1300: new configuration property to enable the wicketsource plugin.  Also updated docs.


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

Branch: refs/heads/ISIS-993
Commit: dbfa9e29c88b59320552f27f7355b4c78f7ce532
Parents: 5de42bb
Author: Dan Haywood <da...@haywood-associates.co.uk>
Authored: Thu Jan 28 08:41:22 2016 +0000
Committer: Dan Haywood <da...@haywood-associates.co.uk>
Committed: Thu Jan 28 08:41:22 2016 +0000

----------------------------------------------------------------------
 .../guides/_ugvw_configuration-properties.adoc  | 13 ++++++++
 .../wicket/viewer/IsisWicketApplication.java    | 34 ++++++++++++--------
 2 files changed, 34 insertions(+), 13 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/isis/blob/dbfa9e29/adocs/documentation/src/main/asciidoc/guides/_ugvw_configuration-properties.adoc
----------------------------------------------------------------------
diff --git a/adocs/documentation/src/main/asciidoc/guides/_ugvw_configuration-properties.adoc b/adocs/documentation/src/main/asciidoc/guides/_ugvw_configuration-properties.adoc
index d82c5d6..f4bb645 100644
--- a/adocs/documentation/src/main/asciidoc/guides/_ugvw_configuration-properties.adoc
+++ b/adocs/documentation/src/main/asciidoc/guides/_ugvw_configuration-properties.adoc
@@ -33,6 +33,11 @@ If you prefer you can place all configuration properties into `WEB-INF/isis.prop
 |Description
 
 |`isis.viewer.wicket.` +
+`ajaxDebugMode`
+| `true`,`false` (`_false_`)
+| whether the Wicket debug mode should be enabled.
+
+|`isis.viewer.wicket.` +
 `bookmarkedPages`
 | +ve int (`_15_`)
 | number of pages to bookmark
@@ -99,6 +104,14 @@ Note that action pages are still used for bookmarked actions.
 | `true`,`false` (`_false_`)
 | Whether to show chooser for Bootstrap themes.  See discussion xref:ugvw.adoc#_ugvw_configuration-properties_showing-theme-chooser[below]
 
+|`isis.viewer.wicket.` +
+`wicketSourcePlugin`
+| `true`,`false` (`_false_`)
+| (`1.12.0-SNAPSHOT`) whether the Wicketsource plugin should be enabled; by default it is not enabled.
+
+Prior to `1.12.0` this was enabled by default for prototyping (not production).  However it can significantly
+slow down rendering, hence the introduction of this configuration setting.
+
 |===
 
 

http://git-wip-us.apache.org/repos/asf/isis/blob/dbfa9e29/core/viewer-wicket-impl/src/main/java/org/apache/isis/viewer/wicket/viewer/IsisWicketApplication.java
----------------------------------------------------------------------
diff --git a/core/viewer-wicket-impl/src/main/java/org/apache/isis/viewer/wicket/viewer/IsisWicketApplication.java b/core/viewer-wicket-impl/src/main/java/org/apache/isis/viewer/wicket/viewer/IsisWicketApplication.java
index 4209f38..fb0cc96 100644
--- a/core/viewer-wicket-impl/src/main/java/org/apache/isis/viewer/wicket/viewer/IsisWicketApplication.java
+++ b/core/viewer-wicket-impl/src/main/java/org/apache/isis/viewer/wicket/viewer/IsisWicketApplication.java
@@ -154,6 +154,8 @@ public class IsisWicketApplication
     private static final boolean STRIP_WICKET_TAGS_DEFAULT = true;
     private static final String AJAX_DEBUG_MODE_KEY = "isis.viewer.wicket.ajaxDebugMode";
     private static final boolean AJAX_DEBUG_MODE_DEFAULT = false;
+    private static final String WICKET_SOURCE_PLUGIN_KEY = "isis.viewer.wicket.wicketSourcePlugin";
+    private static final boolean WICKET_SOURCE_PLUGIN_DEFAULT = false;
 
     private final IsisLoggingConfigurer loggingConfigurer = new IsisLoggingConfigurer();
 
@@ -279,7 +281,7 @@ public class IsisWicketApplication
 
             filterJavascriptContributions();
 
-            configureWicketSourcePlugin();
+            configureWicketSourcePluginIfNecessary(configuration);
 
             // TODO ISIS-987 Either make the API better (no direct access to the map) or use DB records
             int maxEntries = 1000;
@@ -321,18 +323,13 @@ public class IsisWicketApplication
         select2Settings.setIncludeJqueryUI(false);
     }
 
-    /**
-     * as temporary measure, this method now does nothing.
-     *
-     * the original behaviour can be re-enabled by overriding this method and calling doConfigureWicketSourcePlugin();
-     */
-    protected void configureWicketSourcePlugin() {
-        // see Javadoc above.
-        //
-        // doConfigureWicketSourcePlugin();
+    protected void configureWicketSourcePluginIfNecessary(final IsisConfiguration configuration) {
+        if(isEnabledWicketSourcePluginEnabled(configuration)) {
+            configureWicketSourcePlugin();
+        }
     }
 
-    protected void doConfigureWicketSourcePlugin() {
+    protected void configureWicketSourcePlugin() {
         if(!deploymentType.isProduction()) {
             WicketSource.configure(this);
         }
@@ -661,8 +658,19 @@ public class IsisWicketApplication
      * If the <tt>isis.viewer.wicket.ajaxDebugMode</tt> is set, then this is used, otherwise the default is to disable.
      */
     private boolean determineAjaxDebugModeEnabled(IsisConfiguration configuration) {
-        final boolean debugMode = configuration.getBoolean(AJAX_DEBUG_MODE_KEY, AJAX_DEBUG_MODE_DEFAULT);
-        return debugMode;
+        final boolean debugModeEnabled = configuration.getBoolean(AJAX_DEBUG_MODE_KEY, AJAX_DEBUG_MODE_DEFAULT);
+        return debugModeEnabled;
+    }
+
+    /**
+     * Whether the Wicket source plugin should be enabled, as specified by configuration settings.
+     *
+     * <p>
+     * If the <tt>isis.viewer.wicket.wicketSourcePlugin</tt> is set, then this is used, otherwise the default is to disable.
+     */
+    private boolean isEnabledWicketSourcePluginEnabled(IsisConfiguration configuration) {
+        final boolean pluginEnabled = configuration.getBoolean(WICKET_SOURCE_PLUGIN_KEY, WICKET_SOURCE_PLUGIN_DEFAULT);
+        return pluginEnabled;
     }
 
     // //////////////////////////////////////


[02/18] isis git commit: Fix typo in documentation

Posted by da...@apache.org.
Fix typo in documentation


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

Branch: refs/heads/ISIS-993
Commit: 271f9671f3b7bf1a6bc161b744c6bb32c218401c
Parents: e77ce85
Author: Jeroen van der Wal <je...@stromboli.it>
Authored: Wed Jan 27 14:52:53 2016 +0100
Committer: Dan Haywood <da...@haywood-associates.co.uk>
Committed: Thu Jan 28 08:13:21 2016 +0000

----------------------------------------------------------------------
 .../src/main/asciidoc/guides/_rgcfg_configuring-core.adoc          | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/isis/blob/271f9671/adocs/documentation/src/main/asciidoc/guides/_rgcfg_configuring-core.adoc
----------------------------------------------------------------------
diff --git a/adocs/documentation/src/main/asciidoc/guides/_rgcfg_configuring-core.adoc b/adocs/documentation/src/main/asciidoc/guides/_rgcfg_configuring-core.adoc
index 1b47663..a1efd65 100644
--- a/adocs/documentation/src/main/asciidoc/guides/_rgcfg_configuring-core.adoc
+++ b/adocs/documentation/src/main/asciidoc/guides/_rgcfg_configuring-core.adoc
@@ -21,7 +21,7 @@ Configuration properties for the JDO/DataNucleus objectstore can be found in the
 (default value)
 |Description
 
-|`isis.object.` +
+|`isis.objects.` +
 `editing`
 |`true`,`false` +
 (`true`)


[08/18] isis git commit: ISIS-993: working towards a 'bootstrap3' layout

Posted by da...@apache.org.
ISIS-993: working towards a 'bootstrap3' layout


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

Branch: refs/heads/ISIS-993
Commit: 517b6ccbb3e523f084f739fd73d009a86cc7c6c5
Parents: b72bce9
Author: Dan Haywood <da...@haywood-associates.co.uk>
Authored: Thu Jan 28 23:15:25 2016 +0000
Committer: Dan Haywood <da...@haywood-associates.co.uk>
Committed: Thu Jan 28 23:15:37 2016 +0000

----------------------------------------------------------------------
 .../org/apache/isis/applib/layout/Util.java     |  49 +++
 .../applib/layout/bootstrap3/BS3Collection.java |  44 +++
 .../applib/layout/bootstrap3/BS3PropGroup.java  |  44 +++
 .../isis/applib/layout/bootstrap3/BS3Tab.java   |  64 ++++
 .../applib/layout/bootstrap3/BS3TabGroup.java   |  50 +++
 .../applib/layout/bootstrap3/DivColumn.java     |  82 +++++
 .../applib/layout/bootstrap3/DivContainer.java  |  81 +++++
 .../isis/applib/layout/bootstrap3/DivRow.java   |  52 ++++
 .../applib/layout/fixedcols/ColumnMetadata.java | 153 +++++++++
 .../layout/fixedcols/ObjectLayoutMetadata.java  | 310 +++++++++++++++++++
 .../layout/fixedcols/TabGroupMetadata.java      | 114 +++++++
 .../applib/layout/fixedcols/TabGroupOwner.java  |  25 ++
 .../applib/layout/fixedcols/TabMetadata.java    | 173 +++++++++++
 .../layout/v1_0/CollectionLayoutMetadata.java   |   8 +-
 .../isis/applib/layout/v1_0/ColumnContent.java  |  24 --
 .../isis/applib/layout/v1_0/ColumnMetadata.java | 148 ---------
 .../layout/v1_0/MemberLayoutMetadata.java       |  24 ++
 .../layout/v1_0/MemberLayoutMetadataOwner.java  |  23 ++
 .../layout/v1_0/ObjectLayoutMetadata.java       | 304 ------------------
 .../layout/v1_0/PropertyGroupMetadata.java      |   8 +-
 .../applib/layout/v1_0/TabGroupMetadata.java    | 112 -------
 .../isis/applib/layout/v1_0/TabGroupOwner.java  |  23 --
 .../isis/applib/layout/v1_0/TabMetadata.java    | 168 ----------
 .../apache/isis/applib/layout/v1_0/Util.java    |  49 ---
 .../layout/ObjectLayoutMetadataService.java     |   2 +-
 .../layout/Object_downloadLayoutXml.java        |   2 +-
 .../services/layout/Object_viewLayout.java      |   2 +-
 .../ObjectLayoutMetadataFacet.java              |   2 +-
 .../ObjectLayoutMetadataFacetDefault.java       |  28 +-
 .../json/LayoutMetadataReaderFromJson.java      |   2 +-
 .../ObjectLayoutMetadataServiceDefault.java     |   2 +-
 .../services/metamodel/MetadataMenu.java        |   2 +-
 .../metamodel/spec/ObjectSpecifications.java    |   2 +-
 .../v1_0/ObjectLayoutMetadataTest.java          |   8 +-
 .../viewer/wicket/model/models/EntityModel.java |  15 +-
 .../isis/viewer/wicket/ui/ComponentType.java    |   3 -
 .../components/entity/EntityPanelFactory.java   |   2 +-
 .../wicket/ui/components/entity/PropUtil.java   |   2 +-
 .../collections/EntityCollectionsPanel.java     |   2 +-
 .../components/entity/column/EntityColumn.java  |   2 +-
 .../propsandcolls/EntityPropsAndCollsForm.java  |   6 +-
 .../entity/tabbed/EntityTabbedPanel.java        |   6 +-
 .../entity/tabgroup/TabGroupPanel.java          |   4 +-
 .../entity/tabgrouplist/TabGroupListPanel.java  |   2 +-
 .../ui/components/entity/tabpanel/TabPanel.java |   2 +-
 .../wicket/ui/pages/entity/EntityPage.java      |   2 +-
 46 files changed, 1346 insertions(+), 886 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/isis/blob/517b6ccb/core/applib/src/main/java/org/apache/isis/applib/layout/Util.java
----------------------------------------------------------------------
diff --git a/core/applib/src/main/java/org/apache/isis/applib/layout/Util.java b/core/applib/src/main/java/org/apache/isis/applib/layout/Util.java
new file mode 100644
index 0000000..60725ff
--- /dev/null
+++ b/core/applib/src/main/java/org/apache/isis/applib/layout/Util.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.applib.layout;
+
+import javax.annotation.Nullable;
+
+import com.google.common.base.Function;
+import com.google.common.base.Predicate;
+
+class Util {
+
+    private Util(){}
+
+    static <F,T> Predicate<F> is(final Class<T> cls) {
+        return new Predicate<F>() {
+            @Override public boolean apply(@Nullable final F from) {
+                return cls.isAssignableFrom(from.getClass());
+            }
+        };
+    }
+
+    static <F, T extends F> CastFunction<F, T> cast(final Class<T> cls) {
+        return new CastFunction<>();
+    }
+
+    private static class CastFunction<F, T extends F> implements Function<F, T> {
+        @Override
+        public final T apply(final F from) {
+            return (T) from;
+        }
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/isis/blob/517b6ccb/core/applib/src/main/java/org/apache/isis/applib/layout/bootstrap3/BS3Collection.java
----------------------------------------------------------------------
diff --git a/core/applib/src/main/java/org/apache/isis/applib/layout/bootstrap3/BS3Collection.java b/core/applib/src/main/java/org/apache/isis/applib/layout/bootstrap3/BS3Collection.java
new file mode 100644
index 0000000..d1cb0b9
--- /dev/null
+++ b/core/applib/src/main/java/org/apache/isis/applib/layout/bootstrap3/BS3Collection.java
@@ -0,0 +1,44 @@
+/*
+ *  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.applib.layout.bootstrap3;
+
+import javax.xml.bind.annotation.XmlAttribute;
+import javax.xml.bind.annotation.XmlType;
+
+@XmlType(
+        name = "collection"
+        , propOrder = {
+            "name"
+        }
+)
+public class BS3Collection {
+
+
+    private String name;
+
+    @XmlAttribute(required = true)
+    public String getName() {
+        return name;
+    }
+
+    public void setName(final String name) {
+        this.name = name;
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/isis/blob/517b6ccb/core/applib/src/main/java/org/apache/isis/applib/layout/bootstrap3/BS3PropGroup.java
----------------------------------------------------------------------
diff --git a/core/applib/src/main/java/org/apache/isis/applib/layout/bootstrap3/BS3PropGroup.java b/core/applib/src/main/java/org/apache/isis/applib/layout/bootstrap3/BS3PropGroup.java
new file mode 100644
index 0000000..b8aa5c9
--- /dev/null
+++ b/core/applib/src/main/java/org/apache/isis/applib/layout/bootstrap3/BS3PropGroup.java
@@ -0,0 +1,44 @@
+/*
+ *  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.applib.layout.bootstrap3;
+
+import javax.xml.bind.annotation.XmlAttribute;
+import javax.xml.bind.annotation.XmlType;
+
+@XmlType(
+        name = "propGroup"
+        , propOrder = {
+            "name"
+        }
+)
+public class BS3PropGroup {
+
+
+    private String name;
+
+    @XmlAttribute(required = true)
+    public String getName() {
+        return name;
+    }
+
+    public void setName(final String name) {
+        this.name = name;
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/isis/blob/517b6ccb/core/applib/src/main/java/org/apache/isis/applib/layout/bootstrap3/BS3Tab.java
----------------------------------------------------------------------
diff --git a/core/applib/src/main/java/org/apache/isis/applib/layout/bootstrap3/BS3Tab.java b/core/applib/src/main/java/org/apache/isis/applib/layout/bootstrap3/BS3Tab.java
new file mode 100644
index 0000000..5520a6f
--- /dev/null
+++ b/core/applib/src/main/java/org/apache/isis/applib/layout/bootstrap3/BS3Tab.java
@@ -0,0 +1,64 @@
+/*
+ *  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.applib.layout.bootstrap3;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.xml.bind.annotation.XmlAttribute;
+import javax.xml.bind.annotation.XmlElement;
+import javax.xml.bind.annotation.XmlType;
+
+@XmlType(
+        name = "tab"
+        , propOrder = {
+            "name",
+            "rows"
+        }
+)
+public class BS3Tab {
+
+    // at least one row
+    private List<DivRow> rows = new ArrayList<DivRow>(){{
+        add(new DivRow());
+    }};
+
+
+    private String name;
+    @XmlAttribute(required = true)
+    public String getName() {
+        return name;
+    }
+
+    public void setName(final String name) {
+        this.name = name;
+    }
+
+
+    // no wrapper
+    @XmlElement(name = "row", required = true)
+    public List<DivRow> getRows() {
+        return rows;
+    }
+
+    public void setRows(final List<DivRow> rows) {
+        this.rows = rows;
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/isis/blob/517b6ccb/core/applib/src/main/java/org/apache/isis/applib/layout/bootstrap3/BS3TabGroup.java
----------------------------------------------------------------------
diff --git a/core/applib/src/main/java/org/apache/isis/applib/layout/bootstrap3/BS3TabGroup.java b/core/applib/src/main/java/org/apache/isis/applib/layout/bootstrap3/BS3TabGroup.java
new file mode 100644
index 0000000..a561811
--- /dev/null
+++ b/core/applib/src/main/java/org/apache/isis/applib/layout/bootstrap3/BS3TabGroup.java
@@ -0,0 +1,50 @@
+/*
+ *  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.applib.layout.bootstrap3;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.xml.bind.annotation.XmlElement;
+import javax.xml.bind.annotation.XmlType;
+
+@XmlType(
+        name = "tabGroup"
+        , propOrder = {
+            "tabs"
+        }
+)
+public class BS3TabGroup {
+
+    private List<DivColumn> columns = new ArrayList<DivColumn>(){{
+        add(new DivColumn());
+    }};
+
+    // no wrapper
+    @XmlElement(name = "column", required = true)
+    public List<DivColumn> getColumns() {
+        return columns;
+    }
+
+    public void setColumns(final List<DivColumn> columns) {
+        this.columns = columns;
+    }
+
+
+}

http://git-wip-us.apache.org/repos/asf/isis/blob/517b6ccb/core/applib/src/main/java/org/apache/isis/applib/layout/bootstrap3/DivColumn.java
----------------------------------------------------------------------
diff --git a/core/applib/src/main/java/org/apache/isis/applib/layout/bootstrap3/DivColumn.java b/core/applib/src/main/java/org/apache/isis/applib/layout/bootstrap3/DivColumn.java
new file mode 100644
index 0000000..2338b84
--- /dev/null
+++ b/core/applib/src/main/java/org/apache/isis/applib/layout/bootstrap3/DivColumn.java
@@ -0,0 +1,82 @@
+/*
+ *  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.applib.layout.bootstrap3;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.xml.bind.annotation.XmlElement;
+import javax.xml.bind.annotation.XmlType;
+
+@XmlType(
+        name = "div-column"
+        , propOrder = {
+            "rows",
+            "tabGroup",
+            "propGroups",
+            "collections",
+        }
+)
+public class DivColumn {
+
+
+    private List<DivRow> rows = new ArrayList<DivRow>();
+
+    // no wrapper
+    @XmlElement(name = "row", required = false)
+    public List<DivRow> getRows() {
+        return rows;
+    }
+
+    public void setRows(final List<DivRow> rows) {
+        this.rows = rows;
+    }
+
+
+
+    private BS3TabGroup tabGroup;
+
+    @XmlElement(name="tabGroup", required = false)
+    public BS3TabGroup getTabGroup() {
+        return tabGroup;
+    }
+
+    public void setTabGroup(final BS3TabGroup tabGroup) {
+        this.tabGroup = tabGroup;
+    }
+
+
+
+
+    private List<BS3PropGroup> propGroups = new ArrayList<BS3PropGroup>();
+
+    // no wrapper
+    @XmlElement(name = "propGroup", required = false)
+    public List<BS3PropGroup> getPropGroups() {
+        return propGroups;
+    }
+
+    public void setPropGroups(final List<BS3PropGroup> propGroups) {
+        this.propGroups = propGroups;
+    }
+
+
+
+
+}

http://git-wip-us.apache.org/repos/asf/isis/blob/517b6ccb/core/applib/src/main/java/org/apache/isis/applib/layout/bootstrap3/DivContainer.java
----------------------------------------------------------------------
diff --git a/core/applib/src/main/java/org/apache/isis/applib/layout/bootstrap3/DivContainer.java b/core/applib/src/main/java/org/apache/isis/applib/layout/bootstrap3/DivContainer.java
new file mode 100644
index 0000000..fc026f2
--- /dev/null
+++ b/core/applib/src/main/java/org/apache/isis/applib/layout/bootstrap3/DivContainer.java
@@ -0,0 +1,81 @@
+/*
+ *  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.applib.layout.bootstrap3;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.xml.bind.annotation.XmlAttribute;
+import javax.xml.bind.annotation.XmlElement;
+import javax.xml.bind.annotation.XmlRootElement;
+import javax.xml.bind.annotation.XmlType;
+
+@XmlRootElement(
+        name = "div-container"
+)
+@XmlType(
+        name = "div-container"
+        , propOrder = {
+            "rows"
+        }
+)
+public class DivContainer {
+
+    public enum Width {
+        /**
+         * <code>div class=&quot;container&quot;</code>
+         */
+        FIXED,
+        /**
+         * <code>div class=&quot;container-fluid&quot;</code>
+         */
+        FULL
+    }
+
+    private Width width;
+
+    @XmlAttribute(required = true)
+    public Width getWidth() {
+        return width;
+    }
+
+    public void setWidth(final Width width) {
+        this.width = width;
+    }
+
+
+
+
+    private List<DivRow> rows = new ArrayList<DivRow>(){{
+        add(new DivRow());
+    }};
+
+    // no wrapper
+    @XmlElement(name = "row", required = true)
+    public List<DivRow> getRows() {
+        return rows;
+    }
+
+    public void setRows(final List<DivRow> rows) {
+        this.rows = rows;
+    }
+
+
+
+}

http://git-wip-us.apache.org/repos/asf/isis/blob/517b6ccb/core/applib/src/main/java/org/apache/isis/applib/layout/bootstrap3/DivRow.java
----------------------------------------------------------------------
diff --git a/core/applib/src/main/java/org/apache/isis/applib/layout/bootstrap3/DivRow.java b/core/applib/src/main/java/org/apache/isis/applib/layout/bootstrap3/DivRow.java
new file mode 100644
index 0000000..d39731d
--- /dev/null
+++ b/core/applib/src/main/java/org/apache/isis/applib/layout/bootstrap3/DivRow.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.applib.layout.bootstrap3;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.xml.bind.annotation.XmlElement;
+import javax.xml.bind.annotation.XmlType;
+
+@XmlType(
+        name = "div-row"
+        , propOrder = {
+            "columns"
+        }
+)
+public class DivRow {
+
+
+
+    private List<DivColumn> columns = new ArrayList<DivColumn>(){{
+        add(new DivColumn());
+    }};
+
+    // no wrapper
+    @XmlElement(name = "column", required = true)
+    public List<DivColumn> getColumns() {
+        return columns;
+    }
+
+    public void setColumns(final List<DivColumn> columns) {
+        this.columns = columns;
+    }
+
+
+}

http://git-wip-us.apache.org/repos/asf/isis/blob/517b6ccb/core/applib/src/main/java/org/apache/isis/applib/layout/fixedcols/ColumnMetadata.java
----------------------------------------------------------------------
diff --git a/core/applib/src/main/java/org/apache/isis/applib/layout/fixedcols/ColumnMetadata.java b/core/applib/src/main/java/org/apache/isis/applib/layout/fixedcols/ColumnMetadata.java
new file mode 100644
index 0000000..2897ad8
--- /dev/null
+++ b/core/applib/src/main/java/org/apache/isis/applib/layout/fixedcols/ColumnMetadata.java
@@ -0,0 +1,153 @@
+/*
+ *  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.applib.layout.fixedcols;
+
+import java.io.Serializable;
+import java.util.List;
+
+import javax.xml.bind.annotation.XmlAttribute;
+import javax.xml.bind.annotation.XmlElement;
+import javax.xml.bind.annotation.XmlTransient;
+import javax.xml.bind.annotation.XmlType;
+
+import com.google.common.collect.Lists;
+
+import org.apache.isis.applib.annotation.MemberGroupLayout;
+import org.apache.isis.applib.annotation.Programmatic;
+import org.apache.isis.applib.layout.v1_0.CollectionLayoutMetadata;
+import org.apache.isis.applib.layout.v1_0.ColumnOwner;
+import org.apache.isis.applib.layout.v1_0.MemberLayoutMetadataOwner;
+import org.apache.isis.applib.layout.v1_0.Owned;
+import org.apache.isis.applib.layout.v1_0.PropertyGroupMetadata;
+
+@XmlType(
+        propOrder = {
+                "propertyGroups"
+                , "collections"
+        }
+)
+public class ColumnMetadata implements Serializable, MemberLayoutMetadataOwner, Owned<ColumnOwner> {
+
+    private static final long serialVersionUID = 1L;
+
+    public ColumnMetadata() {
+    }
+
+    public ColumnMetadata(final int span) {
+        setSpan(span);
+    }
+
+    private int span = 4;
+
+    @XmlAttribute(required = true)
+    public int getSpan() {
+        return span;
+    }
+
+    public void setSpan(final int span) {
+        this.span = span;
+    }
+
+
+
+    private List<PropertyGroupMetadata> propertyGroups = Lists.newArrayList();
+
+    // no wrapper
+    @XmlElement(name = "propertyGroup", required = false)
+    public List<PropertyGroupMetadata> getPropertyGroups() {
+        return propertyGroups;
+    }
+
+    public void setPropertyGroups(final List<PropertyGroupMetadata> propertyGroups) {
+        this.propertyGroups = propertyGroups;
+    }
+
+
+    private List<CollectionLayoutMetadata> collections = Lists.newArrayList();
+
+    // no wrapper
+    @XmlElement(name = "collection", required = false)
+    public List<CollectionLayoutMetadata> getCollections() {
+        return collections;
+    }
+
+    public void setCollections(final List<CollectionLayoutMetadata> collections) {
+        this.collections = collections;
+    }
+
+
+    private ColumnOwner owner;
+    /**
+     * Owner.
+     *
+     * <p>
+     *     Set programmatically by framework after reading in from XML.
+     * </p>
+     */
+    @XmlTransient
+    public ColumnOwner getOwner() {
+        return owner;
+    }
+
+    public void setOwner(final ColumnOwner owner) {
+        this.owner = owner;
+    }
+
+
+
+    private String path;
+
+    @Programmatic
+    @XmlTransient
+    public String getPath() {
+        return path;
+    }
+
+    @Programmatic
+    public void setPath(final String path) {
+        this.path = path;
+    }
+
+
+
+
+    public enum Hint {
+        LEFT,
+        MIDDLE,
+        RIGHT;
+
+        public int from(MemberGroupLayout.ColumnSpans columnSpans) {
+            if(this == LEFT) return columnSpans.getLeft();
+            if(this == MIDDLE) return columnSpans.getMiddle();
+            if(this == RIGHT) return columnSpans.getRight();
+            throw new IllegalStateException();
+        }
+
+        public ColumnMetadata from(final TabMetadata tabMetadata) {
+            if(tabMetadata == null) {
+                return null;
+            }
+            if(this == LEFT) return tabMetadata.getLeft();
+            if(this == MIDDLE) return tabMetadata.getMiddle();
+            if(this == RIGHT) return tabMetadata.getRight();
+            throw new IllegalStateException();
+        }
+
+    }
+}

http://git-wip-us.apache.org/repos/asf/isis/blob/517b6ccb/core/applib/src/main/java/org/apache/isis/applib/layout/fixedcols/ObjectLayoutMetadata.java
----------------------------------------------------------------------
diff --git a/core/applib/src/main/java/org/apache/isis/applib/layout/fixedcols/ObjectLayoutMetadata.java b/core/applib/src/main/java/org/apache/isis/applib/layout/fixedcols/ObjectLayoutMetadata.java
new file mode 100644
index 0000000..87566af
--- /dev/null
+++ b/core/applib/src/main/java/org/apache/isis/applib/layout/fixedcols/ObjectLayoutMetadata.java
@@ -0,0 +1,310 @@
+/*
+ *  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.applib.layout.fixedcols;
+
+import java.io.Serializable;
+import java.util.LinkedHashMap;
+import java.util.List;
+
+import javax.xml.bind.annotation.XmlElement;
+import javax.xml.bind.annotation.XmlElementWrapper;
+import javax.xml.bind.annotation.XmlRootElement;
+import javax.xml.bind.annotation.XmlTransient;
+import javax.xml.bind.annotation.XmlType;
+
+import com.google.common.collect.Maps;
+
+import org.apache.isis.applib.annotation.Programmatic;
+import org.apache.isis.applib.layout.v1_0.ActionLayoutMetadata;
+import org.apache.isis.applib.layout.v1_0.ActionOwner;
+import org.apache.isis.applib.layout.v1_0.CollectionLayoutMetadata;
+import org.apache.isis.applib.layout.v1_0.ColumnOwner;
+import org.apache.isis.applib.layout.v1_0.PropertyGroupMetadata;
+import org.apache.isis.applib.layout.v1_0.PropertyLayoutMetadata;
+import org.apache.isis.applib.services.dto.Dto;
+
+@XmlRootElement(
+        name = "objectLayout"
+)
+@XmlType(
+        name = "objectLayout"
+        , propOrder = {
+                "actions"
+                , "left"
+                , "tabGroups"
+                , "right"
+        }
+)
+public class ObjectLayoutMetadata implements Dto, ActionOwner, Serializable, ColumnOwner, TabGroupOwner {
+
+    private static final long serialVersionUID = 1L;
+
+    private List<ActionLayoutMetadata> actions;
+
+    @XmlElementWrapper(name = "actions", required = false)
+    @XmlElement(name = "action", required = false)
+    public List<ActionLayoutMetadata> getActions() {
+        return actions;
+    }
+
+    public void setActions(List<ActionLayoutMetadata> actionLayoutMetadatas) {
+        this.actions = actionLayoutMetadatas;
+    }
+
+
+
+    private ColumnMetadata left;
+
+    @XmlElement(required = false)
+    public ColumnMetadata getLeft() {
+        return left;
+    }
+
+    public void setLeft(final ColumnMetadata left) {
+        this.left = left;
+    }
+
+
+
+    private List<TabGroupMetadata> tabGroups;
+
+    // no wrapper
+    @XmlElement(name = "tabGroup", required = true)
+    public List<TabGroupMetadata> getTabGroups() {
+        return tabGroups;
+    }
+
+    public void setTabGroups(List<TabGroupMetadata> tabGroups) {
+        this.tabGroups = tabGroups;
+    }
+
+
+
+    private ColumnMetadata right;
+
+    @XmlElement(required = false)
+    public ColumnMetadata getRight() {
+        return right;
+    }
+
+    public void setRight(final ColumnMetadata right) {
+        this.right = right;
+    }
+    
+
+    public interface Visitor {
+        void visit(final ObjectLayoutMetadata objectLayoutMetadata);
+        void visit(final TabGroupMetadata tabGroup);
+        void visit(final TabMetadata tabMetadata);
+        void visit(final ColumnMetadata columnMetadata);
+        void visit(final PropertyGroupMetadata propertyGroupMetadata);
+        void visit(final PropertyLayoutMetadata propertyLayoutMetadata);
+        void visit(final CollectionLayoutMetadata collectionLayoutMetadata);
+        void visit(final ActionLayoutMetadata actionLayoutMetadata);
+    }
+
+    public static class VisitorAdapter implements Visitor {
+        @Override
+        public void visit(final ObjectLayoutMetadata objectLayoutMetadata) { }
+        @Override
+        public void visit(final TabGroupMetadata tabGroup) { }
+        @Override
+        public void visit(final TabMetadata tabMetadata) { }
+        @Override
+        public void visit(final ColumnMetadata columnMetadata) { }
+        @Override
+        public void visit(final PropertyGroupMetadata propertyGroupMetadata) {}
+        @Override
+        public void visit(final PropertyLayoutMetadata propertyLayoutMetadata) {}
+        @Override
+        public void visit(final CollectionLayoutMetadata collectionLayoutMetadata) {}
+        @Override
+        public void visit(final ActionLayoutMetadata actionLayoutMetadata) { }
+    }
+
+
+    /**
+     * Visits all elements of the graph.  The {@link Visitor} implementation
+     * can assume that all "owner" references are populated.
+     */
+    public void visit(final Visitor visitor) {
+        visitor.visit(this);
+        traverseActions(this, visitor);
+        traverseColumn(getLeft(), this, visitor);
+        final List<TabGroupMetadata> tabGroups = getTabGroups();
+        for (final TabGroupMetadata tabGroup : tabGroups) {
+            tabGroup.setOwner(this);
+            visitor.visit(tabGroup);
+            final List<TabMetadata> tabs = tabGroup.getTabs();
+            for (final TabMetadata tabMetadata : tabs) {
+                tabMetadata.setOwner(tabGroup);
+                visitor.visit(tabMetadata);
+                traverseColumn(tabMetadata.getLeft(), tabMetadata, visitor);
+                traverseColumn(tabMetadata.getMiddle(), tabMetadata, visitor);
+                traverseColumn(tabMetadata.getRight(), tabMetadata, visitor);
+            }
+        }
+        traverseColumn(getRight(), this, visitor);
+    }
+
+    private void traverseColumn(final ColumnMetadata columnMetadata, final ColumnOwner columnOwner, final Visitor visitor) {
+        if(columnMetadata == null) {
+            return;
+        }
+        columnMetadata.setOwner(columnOwner);
+        visitor.visit(columnMetadata);
+        traversePropertyGroups(columnMetadata, visitor);
+        traverseCollections(columnMetadata, visitor);
+    }
+
+    private void traversePropertyGroups(final ColumnMetadata columnMetadata, final Visitor visitor) {
+        for (final PropertyGroupMetadata propertyGroupMetadata : columnMetadata.getPropertyGroups()) {
+            propertyGroupMetadata.setOwner(columnMetadata);
+            visitor.visit(propertyGroupMetadata);
+            traverseActions(propertyGroupMetadata, visitor);
+            final List<PropertyLayoutMetadata> properties = propertyGroupMetadata.getProperties();
+            for (final PropertyLayoutMetadata propertyLayoutMetadata : properties) {
+                propertyLayoutMetadata.setOwner(propertyGroupMetadata);
+                visitor.visit(propertyLayoutMetadata);
+                traverseActions(propertyLayoutMetadata, visitor);
+            }
+        }
+    }
+
+    private void traverseCollections(final ColumnMetadata columnMetadata, final Visitor visitor) {
+        for (final CollectionLayoutMetadata collectionLayoutMetadata : columnMetadata.getCollections()) {
+            collectionLayoutMetadata.setOwner(columnMetadata);
+            visitor.visit(collectionLayoutMetadata);
+            traverseActions(collectionLayoutMetadata, visitor);
+        }
+    }
+
+    private void traverseActions(final ActionOwner actionOwner, final Visitor visitor) {
+        final List<ActionLayoutMetadata> actionLayoutMetadatas = actionOwner.getActions();
+        if(actionLayoutMetadatas == null) {
+            return;
+        }
+        for (final ActionLayoutMetadata actionLayoutMetadata : actionLayoutMetadatas) {
+            actionLayoutMetadata.setOwner(actionOwner);
+            visitor.visit(actionLayoutMetadata);
+        }
+    }
+
+
+    @Programmatic
+    @XmlTransient
+    public LinkedHashMap<String, PropertyLayoutMetadata> getAllPropertiesById() {
+        final LinkedHashMap<String, PropertyLayoutMetadata> propertiesById = Maps.newLinkedHashMap();
+        visit(new ObjectLayoutMetadata.VisitorAdapter() {
+            public void visit(final PropertyLayoutMetadata propertyLayoutMetadata) {
+                propertiesById.put(propertyLayoutMetadata.getId(), propertyLayoutMetadata);
+            }
+        });
+        return propertiesById;
+    }
+
+
+    @Programmatic
+    @XmlTransient
+    public LinkedHashMap<String, CollectionLayoutMetadata> getAllCollectionsById() {
+        final LinkedHashMap<String, CollectionLayoutMetadata> collectionsById = Maps.newLinkedHashMap();
+
+        visit(new ObjectLayoutMetadata.VisitorAdapter() {
+            @Override
+            public void visit(final CollectionLayoutMetadata collectionLayoutMetadata) {
+                collectionsById.put(collectionLayoutMetadata.getId(), collectionLayoutMetadata);
+            }
+        });
+        return collectionsById;
+    }
+
+
+    @Programmatic
+    @XmlTransient
+    public LinkedHashMap<String, ActionLayoutMetadata> getAllActionsById() {
+        final LinkedHashMap<String, ActionLayoutMetadata> actionsById = Maps.newLinkedHashMap();
+
+        visit(new ObjectLayoutMetadata.VisitorAdapter() {
+            @Override
+            public void visit(final ActionLayoutMetadata actionLayoutMetadata) {
+                actionsById.put(actionLayoutMetadata.getId(), actionLayoutMetadata);
+            }
+        });
+        return actionsById;
+    }
+
+
+    @Programmatic
+    @XmlTransient
+    public LinkedHashMap<String, TabMetadata> getAllTabsByName() {
+        final LinkedHashMap<String, TabMetadata> tabsByName = Maps.newLinkedHashMap();
+
+        visit(new ObjectLayoutMetadata.VisitorAdapter() {
+            @Override
+            public void visit(final TabMetadata tabMetadata) {
+                tabsByName.put(tabMetadata.getName(), tabMetadata);
+            }
+        });
+        return tabsByName;
+    }
+
+
+    @Programmatic
+    @XmlTransient
+    public LinkedHashMap<String, PropertyGroupMetadata> getAllPropertyGroupsByName() {
+        final LinkedHashMap<String, PropertyGroupMetadata> propertyGroupsByName = Maps.newLinkedHashMap();
+
+        visit(new ObjectLayoutMetadata.VisitorAdapter() {
+            @Override
+            public void visit(final PropertyGroupMetadata propertyGroupMetadata) {
+                propertyGroupsByName.put(propertyGroupMetadata.getName(), propertyGroupMetadata);
+            }
+        });
+        return propertyGroupsByName;
+    }
+
+
+    private String path;
+
+    @Programmatic
+    @XmlTransient
+    public String getPath() {
+        return path;
+    }
+
+    @Programmatic
+    public void setPath(final String path) {
+        this.path = path;
+    }
+
+
+    private boolean normalized;
+
+    @Programmatic
+    @XmlTransient
+    public boolean isNormalized() {
+        return normalized;
+    }
+
+    @Programmatic
+    public void setNormalized(final boolean normalized) {
+        this.normalized = normalized;
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/isis/blob/517b6ccb/core/applib/src/main/java/org/apache/isis/applib/layout/fixedcols/TabGroupMetadata.java
----------------------------------------------------------------------
diff --git a/core/applib/src/main/java/org/apache/isis/applib/layout/fixedcols/TabGroupMetadata.java b/core/applib/src/main/java/org/apache/isis/applib/layout/fixedcols/TabGroupMetadata.java
new file mode 100644
index 0000000..2e95386
--- /dev/null
+++ b/core/applib/src/main/java/org/apache/isis/applib/layout/fixedcols/TabGroupMetadata.java
@@ -0,0 +1,114 @@
+/*
+ *  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.applib.layout.fixedcols;
+
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.xml.bind.annotation.XmlElement;
+import javax.xml.bind.annotation.XmlTransient;
+import javax.xml.bind.annotation.XmlType;
+
+import com.google.common.base.Predicate;
+import com.google.common.collect.FluentIterable;
+
+import org.apache.isis.applib.annotation.Programmatic;
+import org.apache.isis.applib.layout.v1_0.ColumnOwner;
+import org.apache.isis.applib.layout.v1_0.Owned;
+
+@XmlType(
+        propOrder = {
+                "tabs"
+        }
+
+)
+public class TabGroupMetadata implements ColumnOwner, Serializable, Owned<TabGroupOwner> {
+
+    private static final long serialVersionUID = 1L;
+
+    // must be at least one tab.
+    private List<TabMetadata> tabs = new ArrayList<TabMetadata>(){{
+        add(new TabMetadata());
+    }};
+
+
+
+    // no wrapper
+    @XmlElement(name = "tab", required = true)
+    public List<TabMetadata> getTabs() {
+        return tabs;
+    }
+
+    public void setTabs(List<TabMetadata> tabs) {
+        this.tabs = tabs;
+    }
+
+
+
+    private TabGroupOwner owner;
+
+    /**
+     * Owner.
+     *
+     * <p>
+     *     Set programmatically by framework after reading in from XML.
+     * </p>
+     */
+    @XmlTransient
+    public TabGroupOwner getOwner() {
+        return owner;
+    }
+
+    public void setOwner(final TabGroupOwner owner) {
+        this.owner = owner;
+    }
+
+
+
+
+    private String path;
+
+    @Programmatic
+    @XmlTransient
+    public String getPath() {
+        return path;
+    }
+
+    @Programmatic
+    public void setPath(final String path) {
+        this.path = path;
+    }
+
+
+
+    public static class Predicates {
+        public static Predicate<TabGroupMetadata> notEmpty() {
+            return new Predicate<TabGroupMetadata>() {
+                @Override
+                public boolean apply(final TabGroupMetadata tabGroup) {
+                    return FluentIterable
+                            .from(tabGroup.getTabs())
+                            .anyMatch(TabMetadata.Predicates.notEmpty());
+                }
+            };
+        }
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/isis/blob/517b6ccb/core/applib/src/main/java/org/apache/isis/applib/layout/fixedcols/TabGroupOwner.java
----------------------------------------------------------------------
diff --git a/core/applib/src/main/java/org/apache/isis/applib/layout/fixedcols/TabGroupOwner.java b/core/applib/src/main/java/org/apache/isis/applib/layout/fixedcols/TabGroupOwner.java
new file mode 100644
index 0000000..ab118c8
--- /dev/null
+++ b/core/applib/src/main/java/org/apache/isis/applib/layout/fixedcols/TabGroupOwner.java
@@ -0,0 +1,25 @@
+/*
+ *  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.applib.layout.fixedcols;
+
+import org.apache.isis.applib.layout.v1_0.Owner;
+
+public interface TabGroupOwner extends Owner {
+
+}

http://git-wip-us.apache.org/repos/asf/isis/blob/517b6ccb/core/applib/src/main/java/org/apache/isis/applib/layout/fixedcols/TabMetadata.java
----------------------------------------------------------------------
diff --git a/core/applib/src/main/java/org/apache/isis/applib/layout/fixedcols/TabMetadata.java b/core/applib/src/main/java/org/apache/isis/applib/layout/fixedcols/TabMetadata.java
new file mode 100644
index 0000000..979b1b5
--- /dev/null
+++ b/core/applib/src/main/java/org/apache/isis/applib/layout/fixedcols/TabMetadata.java
@@ -0,0 +1,173 @@
+/*
+ *  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.applib.layout.fixedcols;
+
+import java.io.Serializable;
+import java.util.List;
+
+import javax.xml.bind.annotation.XmlAttribute;
+import javax.xml.bind.annotation.XmlElement;
+import javax.xml.bind.annotation.XmlTransient;
+import javax.xml.bind.annotation.XmlType;
+
+import com.google.common.base.Predicate;
+import com.google.common.collect.Lists;
+
+import org.apache.isis.applib.annotation.Programmatic;
+import org.apache.isis.applib.layout.v1_0.CollectionLayoutMetadata;
+import org.apache.isis.applib.layout.v1_0.ColumnOwner;
+import org.apache.isis.applib.layout.v1_0.MemberLayoutMetadata;
+import org.apache.isis.applib.layout.v1_0.Owned;
+import org.apache.isis.applib.layout.v1_0.PropertyGroupMetadata;
+
+@XmlType(
+        name="tab"
+        , propOrder = {
+                "name"
+                , "left"
+                , "middle"
+                , "right"
+        }
+)
+public class TabMetadata implements ColumnOwner, Serializable, Owned<TabGroupMetadata> {
+
+    private static final long serialVersionUID = 1L;
+
+    private String name;
+
+    @XmlAttribute(required = true)
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+
+
+    private ColumnMetadata left = new ColumnMetadata();
+
+    @XmlElement(required = true)
+    public ColumnMetadata getLeft() {
+        return left;
+    }
+
+    public void setLeft(final ColumnMetadata left) {
+        this.left = left;
+    }
+
+
+    private ColumnMetadata middle;
+
+    @XmlElement(required = false)
+    public ColumnMetadata getMiddle() {
+        return middle;
+    }
+
+    public void setMiddle(final ColumnMetadata middle) {
+        this.middle = middle;
+    }
+
+
+    private ColumnMetadata right;
+
+    @XmlElement(required = false)
+    public ColumnMetadata getRight() {
+        return right;
+    }
+
+    public void setRight(final ColumnMetadata right) {
+        this.right = right;
+    }
+
+
+
+    private TabGroupMetadata owner;
+    /**
+     * Owner.
+     *
+     * <p>
+     *     Set programmatically by framework after reading in from XML.
+     * </p>
+     */
+    @XmlTransient
+    public TabGroupMetadata getOwner() {
+        return owner;
+    }
+
+    public void setOwner(final TabGroupMetadata owner) {
+        this.owner = owner;
+    }
+
+    /**
+     * Aggregates the contents of all collections on this tab.
+     */
+    @Programmatic
+    public List<MemberLayoutMetadata> getContents() {
+        final List<MemberLayoutMetadata> contents = Lists.newArrayList();
+        appendContent(contents, getLeft());
+        appendContent(contents, getMiddle());
+        appendContent(contents, getRight());
+        return contents;
+    }
+
+
+
+
+    private String path;
+
+    @Programmatic
+    @XmlTransient
+    public String getPath() {
+        return path;
+    }
+
+    @Programmatic
+    public void setPath(final String path) {
+        this.path = path;
+    }
+
+
+
+    private static void appendContent(final List<MemberLayoutMetadata> contents, final ColumnMetadata columnMetadata) {
+        if(columnMetadata == null) {
+            return;
+        }
+        final List<PropertyGroupMetadata> propertyGroups = columnMetadata.getPropertyGroups();
+        if(propertyGroups != null) {
+            contents.addAll(propertyGroups);
+        }
+        final List<CollectionLayoutMetadata> collectionLayoutMetadatas = columnMetadata.getCollections();
+        if(collectionLayoutMetadatas != null) {
+            contents.addAll(collectionLayoutMetadatas);
+        }
+    }
+
+    public static class Predicates {
+        public static Predicate<TabMetadata> notEmpty() {
+            return new Predicate<TabMetadata>() {
+                @Override
+                public boolean apply(final TabMetadata tabMetadata) {
+                    return !tabMetadata.getContents().isEmpty();
+                }
+            };
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/isis/blob/517b6ccb/core/applib/src/main/java/org/apache/isis/applib/layout/v1_0/CollectionLayoutMetadata.java
----------------------------------------------------------------------
diff --git a/core/applib/src/main/java/org/apache/isis/applib/layout/v1_0/CollectionLayoutMetadata.java b/core/applib/src/main/java/org/apache/isis/applib/layout/v1_0/CollectionLayoutMetadata.java
index 2fe0b48..0dee4b6 100644
--- a/core/applib/src/main/java/org/apache/isis/applib/layout/v1_0/CollectionLayoutMetadata.java
+++ b/core/applib/src/main/java/org/apache/isis/applib/layout/v1_0/CollectionLayoutMetadata.java
@@ -49,7 +49,7 @@ import org.apache.isis.applib.annotation.Where;
                 , "metadataError"
         }
 )
-public class CollectionLayoutMetadata implements ColumnContent, ActionOwner, Serializable, Owned<ColumnMetadata> {
+public class CollectionLayoutMetadata implements MemberLayoutMetadata, ActionOwner, Serializable {
 
     private static final long serialVersionUID = 1L;
 
@@ -194,7 +194,7 @@ public class CollectionLayoutMetadata implements ColumnContent, ActionOwner, Ser
 
 
 
-    private ColumnMetadata owner;
+    private MemberLayoutMetadataOwner owner;
     /**
      * Owner.
      *
@@ -203,11 +203,11 @@ public class CollectionLayoutMetadata implements ColumnContent, ActionOwner, Ser
      * </p>
      */
     @XmlTransient
-    public ColumnMetadata getOwner() {
+    public MemberLayoutMetadataOwner getOwner() {
         return owner;
     }
 
-    public void setOwner(final ColumnMetadata owner) {
+    public void setOwner(final MemberLayoutMetadataOwner owner) {
         this.owner = owner;
     }
 

http://git-wip-us.apache.org/repos/asf/isis/blob/517b6ccb/core/applib/src/main/java/org/apache/isis/applib/layout/v1_0/ColumnContent.java
----------------------------------------------------------------------
diff --git a/core/applib/src/main/java/org/apache/isis/applib/layout/v1_0/ColumnContent.java b/core/applib/src/main/java/org/apache/isis/applib/layout/v1_0/ColumnContent.java
deleted file mode 100644
index 526aa26..0000000
--- a/core/applib/src/main/java/org/apache/isis/applib/layout/v1_0/ColumnContent.java
+++ /dev/null
@@ -1,24 +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.applib.layout.v1_0;
-
-public interface ColumnContent {
-
-
-}

http://git-wip-us.apache.org/repos/asf/isis/blob/517b6ccb/core/applib/src/main/java/org/apache/isis/applib/layout/v1_0/ColumnMetadata.java
----------------------------------------------------------------------
diff --git a/core/applib/src/main/java/org/apache/isis/applib/layout/v1_0/ColumnMetadata.java b/core/applib/src/main/java/org/apache/isis/applib/layout/v1_0/ColumnMetadata.java
deleted file mode 100644
index 3663600..0000000
--- a/core/applib/src/main/java/org/apache/isis/applib/layout/v1_0/ColumnMetadata.java
+++ /dev/null
@@ -1,148 +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.applib.layout.v1_0;
-
-import java.io.Serializable;
-import java.util.List;
-
-import javax.xml.bind.annotation.XmlAttribute;
-import javax.xml.bind.annotation.XmlElement;
-import javax.xml.bind.annotation.XmlTransient;
-import javax.xml.bind.annotation.XmlType;
-
-import com.google.common.collect.Lists;
-
-import org.apache.isis.applib.annotation.MemberGroupLayout;
-import org.apache.isis.applib.annotation.Programmatic;
-
-@XmlType(
-        propOrder = {
-                "propertyGroups"
-                , "collections"
-        }
-)
-public class ColumnMetadata implements Serializable, Owner, Owned<ColumnOwner> {
-
-    private static final long serialVersionUID = 1L;
-
-    public ColumnMetadata() {
-    }
-
-    public ColumnMetadata(final int span) {
-        setSpan(span);
-    }
-
-    private int span = 4;
-
-    @XmlAttribute(required = true)
-    public int getSpan() {
-        return span;
-    }
-
-    public void setSpan(final int span) {
-        this.span = span;
-    }
-
-
-
-    private List<PropertyGroupMetadata> propertyGroups = Lists.newArrayList();
-
-    // no wrapper
-    @XmlElement(name = "propertyGroup", required = false)
-    public List<PropertyGroupMetadata> getPropertyGroups() {
-        return propertyGroups;
-    }
-
-    public void setPropertyGroups(final List<PropertyGroupMetadata> propertyGroups) {
-        this.propertyGroups = propertyGroups;
-    }
-
-
-    private List<CollectionLayoutMetadata> collections = Lists.newArrayList();
-
-    // no wrapper
-    @XmlElement(name = "collection", required = false)
-    public List<CollectionLayoutMetadata> getCollections() {
-        return collections;
-    }
-
-    public void setCollections(final List<CollectionLayoutMetadata> collections) {
-        this.collections = collections;
-    }
-
-
-    private ColumnOwner owner;
-    /**
-     * Owner.
-     *
-     * <p>
-     *     Set programmatically by framework after reading in from XML.
-     * </p>
-     */
-    @XmlTransient
-    public ColumnOwner getOwner() {
-        return owner;
-    }
-
-    public void setOwner(final ColumnOwner owner) {
-        this.owner = owner;
-    }
-
-
-
-    private String path;
-
-    @Programmatic
-    @XmlTransient
-    public String getPath() {
-        return path;
-    }
-
-    @Programmatic
-    public void setPath(final String path) {
-        this.path = path;
-    }
-
-
-
-
-    public enum Hint {
-        LEFT,
-        MIDDLE,
-        RIGHT;
-
-        public int from(MemberGroupLayout.ColumnSpans columnSpans) {
-            if(this == LEFT) return columnSpans.getLeft();
-            if(this == MIDDLE) return columnSpans.getMiddle();
-            if(this == RIGHT) return columnSpans.getRight();
-            throw new IllegalStateException();
-        }
-
-        public ColumnMetadata from(final TabMetadata tabMetadata) {
-            if(tabMetadata == null) {
-                return null;
-            }
-            if(this == LEFT) return tabMetadata.getLeft();
-            if(this == MIDDLE) return tabMetadata.getMiddle();
-            if(this == RIGHT) return tabMetadata.getRight();
-            throw new IllegalStateException();
-        }
-
-    }
-}

http://git-wip-us.apache.org/repos/asf/isis/blob/517b6ccb/core/applib/src/main/java/org/apache/isis/applib/layout/v1_0/MemberLayoutMetadata.java
----------------------------------------------------------------------
diff --git a/core/applib/src/main/java/org/apache/isis/applib/layout/v1_0/MemberLayoutMetadata.java b/core/applib/src/main/java/org/apache/isis/applib/layout/v1_0/MemberLayoutMetadata.java
new file mode 100644
index 0000000..9361a36
--- /dev/null
+++ b/core/applib/src/main/java/org/apache/isis/applib/layout/v1_0/MemberLayoutMetadata.java
@@ -0,0 +1,24 @@
+/*
+ *  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.applib.layout.v1_0;
+
+public interface MemberLayoutMetadata extends Owned<MemberLayoutMetadataOwner> {
+
+
+}

http://git-wip-us.apache.org/repos/asf/isis/blob/517b6ccb/core/applib/src/main/java/org/apache/isis/applib/layout/v1_0/MemberLayoutMetadataOwner.java
----------------------------------------------------------------------
diff --git a/core/applib/src/main/java/org/apache/isis/applib/layout/v1_0/MemberLayoutMetadataOwner.java b/core/applib/src/main/java/org/apache/isis/applib/layout/v1_0/MemberLayoutMetadataOwner.java
new file mode 100644
index 0000000..5aa26c6
--- /dev/null
+++ b/core/applib/src/main/java/org/apache/isis/applib/layout/v1_0/MemberLayoutMetadataOwner.java
@@ -0,0 +1,23 @@
+/*
+ *  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.applib.layout.v1_0;
+
+public interface MemberLayoutMetadataOwner extends Owner {
+
+}

http://git-wip-us.apache.org/repos/asf/isis/blob/517b6ccb/core/applib/src/main/java/org/apache/isis/applib/layout/v1_0/ObjectLayoutMetadata.java
----------------------------------------------------------------------
diff --git a/core/applib/src/main/java/org/apache/isis/applib/layout/v1_0/ObjectLayoutMetadata.java b/core/applib/src/main/java/org/apache/isis/applib/layout/v1_0/ObjectLayoutMetadata.java
deleted file mode 100644
index d2bcc3c..0000000
--- a/core/applib/src/main/java/org/apache/isis/applib/layout/v1_0/ObjectLayoutMetadata.java
+++ /dev/null
@@ -1,304 +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.applib.layout.v1_0;
-
-import java.io.Serializable;
-import java.util.LinkedHashMap;
-import java.util.List;
-
-import javax.xml.bind.annotation.XmlElement;
-import javax.xml.bind.annotation.XmlElementWrapper;
-import javax.xml.bind.annotation.XmlRootElement;
-import javax.xml.bind.annotation.XmlTransient;
-import javax.xml.bind.annotation.XmlType;
-
-import com.google.common.collect.Maps;
-
-import org.apache.isis.applib.annotation.Programmatic;
-import org.apache.isis.applib.services.dto.Dto;
-
-@XmlRootElement(
-        name = "objectLayout"
-)
-@XmlType(
-        name = "objectLayout"
-        , propOrder = {
-                "actions"
-                , "left"
-                , "tabGroups"
-                , "right"
-        }
-)
-public class ObjectLayoutMetadata implements Dto, ActionOwner, Serializable, ColumnOwner, TabGroupOwner {
-
-    private static final long serialVersionUID = 1L;
-
-    private List<ActionLayoutMetadata> actions;
-
-    @XmlElementWrapper(name = "actions", required = false)
-    @XmlElement(name = "action", required = false)
-    public List<ActionLayoutMetadata> getActions() {
-        return actions;
-    }
-
-    public void setActions(List<ActionLayoutMetadata> actionLayoutMetadatas) {
-        this.actions = actionLayoutMetadatas;
-    }
-
-
-
-    private ColumnMetadata left;
-
-    @XmlElement(required = false)
-    public ColumnMetadata getLeft() {
-        return left;
-    }
-
-    public void setLeft(final ColumnMetadata left) {
-        this.left = left;
-    }
-
-
-
-    private List<TabGroupMetadata> tabGroups;
-
-    // no wrapper
-    @XmlElement(name = "tabGroup", required = true)
-    public List<TabGroupMetadata> getTabGroups() {
-        return tabGroups;
-    }
-
-    public void setTabGroups(List<TabGroupMetadata> tabGroups) {
-        this.tabGroups = tabGroups;
-    }
-
-
-
-    private ColumnMetadata right;
-
-    @XmlElement(required = false)
-    public ColumnMetadata getRight() {
-        return right;
-    }
-
-    public void setRight(final ColumnMetadata right) {
-        this.right = right;
-    }
-    
-
-    public interface Visitor {
-        void visit(final ObjectLayoutMetadata objectLayoutMetadata);
-        void visit(final TabGroupMetadata tabGroup);
-        void visit(final TabMetadata tabMetadata);
-        void visit(final ColumnMetadata columnMetadata);
-        void visit(final PropertyGroupMetadata propertyGroupMetadata);
-        void visit(final PropertyLayoutMetadata propertyLayoutMetadata);
-        void visit(final CollectionLayoutMetadata collectionLayoutMetadata);
-        void visit(final ActionLayoutMetadata actionLayoutMetadata);
-    }
-
-    public static class VisitorAdapter implements Visitor {
-        @Override
-        public void visit(final ObjectLayoutMetadata objectLayoutMetadata) { }
-        @Override
-        public void visit(final TabGroupMetadata tabGroup) { }
-        @Override
-        public void visit(final TabMetadata tabMetadata) { }
-        @Override
-        public void visit(final ColumnMetadata columnMetadata) { }
-        @Override
-        public void visit(final PropertyGroupMetadata propertyGroupMetadata) {}
-        @Override
-        public void visit(final PropertyLayoutMetadata propertyLayoutMetadata) {}
-        @Override
-        public void visit(final CollectionLayoutMetadata collectionLayoutMetadata) {}
-        @Override
-        public void visit(final ActionLayoutMetadata actionLayoutMetadata) { }
-    }
-
-
-    /**
-     * Visits all elements of the graph.  The {@link Visitor} implementation
-     * can assume that all "owner" references are populated.
-     */
-    public void visit(final Visitor visitor) {
-        visitor.visit(this);
-        traverseActions(this, visitor);
-        traverseColumn(getLeft(), this, visitor);
-        final List<TabGroupMetadata> tabGroups = getTabGroups();
-        for (final TabGroupMetadata tabGroup : tabGroups) {
-            tabGroup.setOwner(this);
-            visitor.visit(tabGroup);
-            final List<TabMetadata> tabs = tabGroup.getTabs();
-            for (final TabMetadata tabMetadata : tabs) {
-                tabMetadata.setOwner(tabGroup);
-                visitor.visit(tabMetadata);
-                traverseColumn(tabMetadata.getLeft(), tabMetadata, visitor);
-                traverseColumn(tabMetadata.getMiddle(), tabMetadata, visitor);
-                traverseColumn(tabMetadata.getRight(), tabMetadata, visitor);
-            }
-        }
-        traverseColumn(getRight(), this, visitor);
-    }
-
-    private void traverseColumn(final ColumnMetadata columnMetadata, final ColumnOwner columnOwner, final Visitor visitor) {
-        if(columnMetadata == null) {
-            return;
-        }
-        columnMetadata.setOwner(columnOwner);
-        visitor.visit(columnMetadata);
-        traversePropertyGroups(columnMetadata, visitor);
-        traverseCollections(columnMetadata, visitor);
-    }
-
-    private void traversePropertyGroups(final ColumnMetadata columnMetadata, final Visitor visitor) {
-        for (final PropertyGroupMetadata propertyGroupMetadata : columnMetadata.getPropertyGroups()) {
-            propertyGroupMetadata.setOwner(columnMetadata);
-            visitor.visit(propertyGroupMetadata);
-            traverseActions(propertyGroupMetadata, visitor);
-            final List<PropertyLayoutMetadata> properties = propertyGroupMetadata.getProperties();
-            for (final PropertyLayoutMetadata propertyLayoutMetadata : properties) {
-                propertyLayoutMetadata.setOwner(propertyGroupMetadata);
-                visitor.visit(propertyLayoutMetadata);
-                traverseActions(propertyLayoutMetadata, visitor);
-            }
-        }
-    }
-
-    private void traverseCollections(final ColumnMetadata columnMetadata, final Visitor visitor) {
-        for (final CollectionLayoutMetadata collectionLayoutMetadata : columnMetadata.getCollections()) {
-            collectionLayoutMetadata.setOwner(columnMetadata);
-            visitor.visit(collectionLayoutMetadata);
-            traverseActions(collectionLayoutMetadata, visitor);
-        }
-    }
-
-    private void traverseActions(final ActionOwner actionOwner, final Visitor visitor) {
-        final List<ActionLayoutMetadata> actionLayoutMetadatas = actionOwner.getActions();
-        if(actionLayoutMetadatas == null) {
-            return;
-        }
-        for (final ActionLayoutMetadata actionLayoutMetadata : actionLayoutMetadatas) {
-            actionLayoutMetadata.setOwner(actionOwner);
-            visitor.visit(actionLayoutMetadata);
-        }
-    }
-
-
-    @Programmatic
-    @XmlTransient
-    public LinkedHashMap<String, PropertyLayoutMetadata> getAllPropertiesById() {
-        final LinkedHashMap<String, PropertyLayoutMetadata> propertiesById = Maps.newLinkedHashMap();
-        visit(new ObjectLayoutMetadata.VisitorAdapter() {
-            public void visit(final PropertyLayoutMetadata propertyLayoutMetadata) {
-                propertiesById.put(propertyLayoutMetadata.getId(), propertyLayoutMetadata);
-            }
-        });
-        return propertiesById;
-    }
-
-
-    @Programmatic
-    @XmlTransient
-    public LinkedHashMap<String, CollectionLayoutMetadata> getAllCollectionsById() {
-        final LinkedHashMap<String, CollectionLayoutMetadata> collectionsById = Maps.newLinkedHashMap();
-
-        visit(new ObjectLayoutMetadata.VisitorAdapter() {
-            @Override
-            public void visit(final CollectionLayoutMetadata collectionLayoutMetadata) {
-                collectionsById.put(collectionLayoutMetadata.getId(), collectionLayoutMetadata);
-            }
-        });
-        return collectionsById;
-    }
-
-
-    @Programmatic
-    @XmlTransient
-    public LinkedHashMap<String, ActionLayoutMetadata> getAllActionsById() {
-        final LinkedHashMap<String, ActionLayoutMetadata> actionsById = Maps.newLinkedHashMap();
-
-        visit(new ObjectLayoutMetadata.VisitorAdapter() {
-            @Override
-            public void visit(final ActionLayoutMetadata actionLayoutMetadata) {
-                actionsById.put(actionLayoutMetadata.getId(), actionLayoutMetadata);
-            }
-        });
-        return actionsById;
-    }
-
-
-    @Programmatic
-    @XmlTransient
-    public LinkedHashMap<String, TabMetadata> getAllTabsByName() {
-        final LinkedHashMap<String, TabMetadata> tabsByName = Maps.newLinkedHashMap();
-
-        visit(new ObjectLayoutMetadata.VisitorAdapter() {
-            @Override
-            public void visit(final TabMetadata tabMetadata) {
-                tabsByName.put(tabMetadata.getName(), tabMetadata);
-            }
-        });
-        return tabsByName;
-    }
-
-
-    @Programmatic
-    @XmlTransient
-    public LinkedHashMap<String, PropertyGroupMetadata> getAllPropertyGroupsByName() {
-        final LinkedHashMap<String, PropertyGroupMetadata> propertyGroupsByName = Maps.newLinkedHashMap();
-
-        visit(new ObjectLayoutMetadata.VisitorAdapter() {
-            @Override
-            public void visit(final PropertyGroupMetadata propertyGroupMetadata) {
-                propertyGroupsByName.put(propertyGroupMetadata.getName(), propertyGroupMetadata);
-            }
-        });
-        return propertyGroupsByName;
-    }
-
-
-    private String path;
-
-    @Programmatic
-    @XmlTransient
-    public String getPath() {
-        return path;
-    }
-
-    @Programmatic
-    public void setPath(final String path) {
-        this.path = path;
-    }
-
-
-    private boolean normalized;
-
-    @Programmatic
-    @XmlTransient
-    public boolean isNormalized() {
-        return normalized;
-    }
-
-    @Programmatic
-    public void setNormalized(final boolean normalized) {
-        this.normalized = normalized;
-    }
-
-}

http://git-wip-us.apache.org/repos/asf/isis/blob/517b6ccb/core/applib/src/main/java/org/apache/isis/applib/layout/v1_0/PropertyGroupMetadata.java
----------------------------------------------------------------------
diff --git a/core/applib/src/main/java/org/apache/isis/applib/layout/v1_0/PropertyGroupMetadata.java b/core/applib/src/main/java/org/apache/isis/applib/layout/v1_0/PropertyGroupMetadata.java
index d50cd66..c5acbc0 100644
--- a/core/applib/src/main/java/org/apache/isis/applib/layout/v1_0/PropertyGroupMetadata.java
+++ b/core/applib/src/main/java/org/apache/isis/applib/layout/v1_0/PropertyGroupMetadata.java
@@ -41,7 +41,7 @@ import org.apache.isis.applib.annotation.Programmatic;
                 , "properties"
         }
 )
-public class PropertyGroupMetadata implements ColumnContent, ActionOwner, Serializable, Owned<ColumnMetadata> {
+public class PropertyGroupMetadata implements MemberLayoutMetadata, ActionOwner, Serializable {
 
     private static final long serialVersionUID = 1L;
 
@@ -94,7 +94,7 @@ public class PropertyGroupMetadata implements ColumnContent, ActionOwner, Serial
     }
 
 
-    private ColumnMetadata owner;
+    private MemberLayoutMetadataOwner owner;
     /**
      * Owner.
      *
@@ -103,11 +103,11 @@ public class PropertyGroupMetadata implements ColumnContent, ActionOwner, Serial
      * </p>
      */
     @XmlTransient
-    public ColumnMetadata getOwner() {
+    public MemberLayoutMetadataOwner getOwner() {
         return owner;
     }
 
-    public void setOwner(final ColumnMetadata owner) {
+    public void setOwner(final MemberLayoutMetadataOwner owner) {
         this.owner = owner;
     }
 

http://git-wip-us.apache.org/repos/asf/isis/blob/517b6ccb/core/applib/src/main/java/org/apache/isis/applib/layout/v1_0/TabGroupMetadata.java
----------------------------------------------------------------------
diff --git a/core/applib/src/main/java/org/apache/isis/applib/layout/v1_0/TabGroupMetadata.java b/core/applib/src/main/java/org/apache/isis/applib/layout/v1_0/TabGroupMetadata.java
deleted file mode 100644
index b5ebfc5..0000000
--- a/core/applib/src/main/java/org/apache/isis/applib/layout/v1_0/TabGroupMetadata.java
+++ /dev/null
@@ -1,112 +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.applib.layout.v1_0;
-
-import java.io.Serializable;
-import java.util.ArrayList;
-import java.util.List;
-
-import javax.xml.bind.annotation.XmlElement;
-import javax.xml.bind.annotation.XmlTransient;
-import javax.xml.bind.annotation.XmlType;
-
-import com.google.common.base.Predicate;
-import com.google.common.collect.FluentIterable;
-
-import org.apache.isis.applib.annotation.Programmatic;
-
-@XmlType(
-        propOrder = {
-                "tabs"
-        }
-
-)
-public class TabGroupMetadata implements ColumnOwner, Serializable, Owned<TabGroupOwner> {
-
-    private static final long serialVersionUID = 1L;
-
-    // must be at least one tab.
-    private List<TabMetadata> tabs = new ArrayList<TabMetadata>(){{
-        add(new TabMetadata());
-    }};
-
-
-
-    // no wrapper
-    @XmlElement(name = "tab", required = true)
-    public List<TabMetadata> getTabs() {
-        return tabs;
-    }
-
-    public void setTabs(List<TabMetadata> tabs) {
-        this.tabs = tabs;
-    }
-
-
-
-    private TabGroupOwner owner;
-
-    /**
-     * Owner.
-     *
-     * <p>
-     *     Set programmatically by framework after reading in from XML.
-     * </p>
-     */
-    @XmlTransient
-    public TabGroupOwner getOwner() {
-        return owner;
-    }
-
-    public void setOwner(final TabGroupOwner owner) {
-        this.owner = owner;
-    }
-
-
-
-
-    private String path;
-
-    @Programmatic
-    @XmlTransient
-    public String getPath() {
-        return path;
-    }
-
-    @Programmatic
-    public void setPath(final String path) {
-        this.path = path;
-    }
-
-
-
-    public static class Predicates {
-        public static Predicate<TabGroupMetadata> notEmpty() {
-            return new Predicate<TabGroupMetadata>() {
-                @Override
-                public boolean apply(final TabGroupMetadata tabGroup) {
-                    return FluentIterable
-                            .from(tabGroup.getTabs())
-                            .anyMatch(TabMetadata.Predicates.notEmpty());
-                }
-            };
-        }
-    }
-
-}

http://git-wip-us.apache.org/repos/asf/isis/blob/517b6ccb/core/applib/src/main/java/org/apache/isis/applib/layout/v1_0/TabGroupOwner.java
----------------------------------------------------------------------
diff --git a/core/applib/src/main/java/org/apache/isis/applib/layout/v1_0/TabGroupOwner.java b/core/applib/src/main/java/org/apache/isis/applib/layout/v1_0/TabGroupOwner.java
deleted file mode 100644
index 12dc645..0000000
--- a/core/applib/src/main/java/org/apache/isis/applib/layout/v1_0/TabGroupOwner.java
+++ /dev/null
@@ -1,23 +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.applib.layout.v1_0;
-
-public interface TabGroupOwner extends Owner {
-
-}

http://git-wip-us.apache.org/repos/asf/isis/blob/517b6ccb/core/applib/src/main/java/org/apache/isis/applib/layout/v1_0/TabMetadata.java
----------------------------------------------------------------------
diff --git a/core/applib/src/main/java/org/apache/isis/applib/layout/v1_0/TabMetadata.java b/core/applib/src/main/java/org/apache/isis/applib/layout/v1_0/TabMetadata.java
deleted file mode 100644
index fa12f63..0000000
--- a/core/applib/src/main/java/org/apache/isis/applib/layout/v1_0/TabMetadata.java
+++ /dev/null
@@ -1,168 +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.applib.layout.v1_0;
-
-import java.io.Serializable;
-import java.util.List;
-
-import javax.xml.bind.annotation.XmlAttribute;
-import javax.xml.bind.annotation.XmlElement;
-import javax.xml.bind.annotation.XmlTransient;
-import javax.xml.bind.annotation.XmlType;
-
-import com.google.common.base.Predicate;
-import com.google.common.collect.Lists;
-
-import org.apache.isis.applib.annotation.Programmatic;
-
-@XmlType(
-        name="tab"
-        , propOrder = {
-                "name"
-                , "left"
-                , "middle"
-                , "right"
-        }
-)
-public class TabMetadata implements ColumnOwner, Serializable, Owned<TabGroupMetadata> {
-
-    private static final long serialVersionUID = 1L;
-
-    private String name;
-
-    @XmlAttribute(required = true)
-    public String getName() {
-        return name;
-    }
-
-    public void setName(String name) {
-        this.name = name;
-    }
-
-
-
-    private ColumnMetadata left = new ColumnMetadata();
-
-    @XmlElement(required = true)
-    public ColumnMetadata getLeft() {
-        return left;
-    }
-
-    public void setLeft(final ColumnMetadata left) {
-        this.left = left;
-    }
-
-
-    private ColumnMetadata middle;
-
-    @XmlElement(required = false)
-    public ColumnMetadata getMiddle() {
-        return middle;
-    }
-
-    public void setMiddle(final ColumnMetadata middle) {
-        this.middle = middle;
-    }
-
-
-    private ColumnMetadata right;
-
-    @XmlElement(required = false)
-    public ColumnMetadata getRight() {
-        return right;
-    }
-
-    public void setRight(final ColumnMetadata right) {
-        this.right = right;
-    }
-
-
-
-    private TabGroupMetadata owner;
-    /**
-     * Owner.
-     *
-     * <p>
-     *     Set programmatically by framework after reading in from XML.
-     * </p>
-     */
-    @XmlTransient
-    public TabGroupMetadata getOwner() {
-        return owner;
-    }
-
-    public void setOwner(final TabGroupMetadata owner) {
-        this.owner = owner;
-    }
-
-    /**
-     * Aggregates the contents of all collections on this tab.
-     */
-    @Programmatic
-    public List<ColumnContent> getContents() {
-        final List<ColumnContent> contents = Lists.newArrayList();
-        appendContent(contents, getLeft());
-        appendContent(contents, getMiddle());
-        appendContent(contents, getRight());
-        return contents;
-    }
-
-
-
-
-    private String path;
-
-    @Programmatic
-    @XmlTransient
-    public String getPath() {
-        return path;
-    }
-
-    @Programmatic
-    public void setPath(final String path) {
-        this.path = path;
-    }
-
-
-
-    private static void appendContent(final List<ColumnContent> contents, final ColumnMetadata columnMetadata) {
-        if(columnMetadata == null) {
-            return;
-        }
-        final List<PropertyGroupMetadata> propertyGroups = columnMetadata.getPropertyGroups();
-        if(propertyGroups != null) {
-            contents.addAll(propertyGroups);
-        }
-        final List<CollectionLayoutMetadata> collectionLayoutMetadatas = columnMetadata.getCollections();
-        if(collectionLayoutMetadatas != null) {
-            contents.addAll(collectionLayoutMetadatas);
-        }
-    }
-
-    public static class Predicates {
-        public static Predicate<TabMetadata> notEmpty() {
-            return new Predicate<TabMetadata>() {
-                @Override
-                public boolean apply(final TabMetadata tabMetadata) {
-                    return !tabMetadata.getContents().isEmpty();
-                }
-            };
-        }
-    }
-}

http://git-wip-us.apache.org/repos/asf/isis/blob/517b6ccb/core/applib/src/main/java/org/apache/isis/applib/layout/v1_0/Util.java
----------------------------------------------------------------------
diff --git a/core/applib/src/main/java/org/apache/isis/applib/layout/v1_0/Util.java b/core/applib/src/main/java/org/apache/isis/applib/layout/v1_0/Util.java
deleted file mode 100644
index 6007850..0000000
--- a/core/applib/src/main/java/org/apache/isis/applib/layout/v1_0/Util.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.applib.layout.v1_0;
-
-import javax.annotation.Nullable;
-
-import com.google.common.base.Function;
-import com.google.common.base.Predicate;
-
-class Util {
-
-    private Util(){}
-
-    static <F,T> Predicate<F> is(final Class<T> cls) {
-        return new Predicate<F>() {
-            @Override public boolean apply(@Nullable final F from) {
-                return cls.isAssignableFrom(from.getClass());
-            }
-        };
-    }
-
-    static <F, T extends F> CastFunction<F, T> cast(final Class<T> cls) {
-        return new CastFunction<>();
-    }
-
-    private static class CastFunction<F, T extends F> implements Function<F, T> {
-        @Override
-        public final T apply(final F from) {
-            return (T) from;
-        }
-    }
-
-}

http://git-wip-us.apache.org/repos/asf/isis/blob/517b6ccb/core/applib/src/main/java/org/apache/isis/applib/services/layout/ObjectLayoutMetadataService.java
----------------------------------------------------------------------
diff --git a/core/applib/src/main/java/org/apache/isis/applib/services/layout/ObjectLayoutMetadataService.java b/core/applib/src/main/java/org/apache/isis/applib/services/layout/ObjectLayoutMetadataService.java
index 1de0147..c4ad854 100644
--- a/core/applib/src/main/java/org/apache/isis/applib/services/layout/ObjectLayoutMetadataService.java
+++ b/core/applib/src/main/java/org/apache/isis/applib/services/layout/ObjectLayoutMetadataService.java
@@ -17,7 +17,7 @@
 package org.apache.isis.applib.services.layout;
 
 import org.apache.isis.applib.annotation.Programmatic;
-import org.apache.isis.applib.layout.v1_0.ObjectLayoutMetadata;
+import org.apache.isis.applib.layout.fixedcols.ObjectLayoutMetadata;
 
 public interface ObjectLayoutMetadataService {
 

http://git-wip-us.apache.org/repos/asf/isis/blob/517b6ccb/core/applib/src/main/java/org/apache/isis/applib/services/layout/Object_downloadLayoutXml.java
----------------------------------------------------------------------
diff --git a/core/applib/src/main/java/org/apache/isis/applib/services/layout/Object_downloadLayoutXml.java b/core/applib/src/main/java/org/apache/isis/applib/services/layout/Object_downloadLayoutXml.java
index 726becf..089461d 100644
--- a/core/applib/src/main/java/org/apache/isis/applib/services/layout/Object_downloadLayoutXml.java
+++ b/core/applib/src/main/java/org/apache/isis/applib/services/layout/Object_downloadLayoutXml.java
@@ -28,7 +28,7 @@ import org.apache.isis.applib.annotation.Mixin;
 import org.apache.isis.applib.annotation.ParameterLayout;
 import org.apache.isis.applib.annotation.RestrictTo;
 import org.apache.isis.applib.annotation.SemanticsOf;
-import org.apache.isis.applib.layout.v1_0.ObjectLayoutMetadata;
+import org.apache.isis.applib.layout.fixedcols.ObjectLayoutMetadata;
 import org.apache.isis.applib.services.jaxb.JaxbService;
 import org.apache.isis.applib.value.Clob;
 

http://git-wip-us.apache.org/repos/asf/isis/blob/517b6ccb/core/applib/src/main/java/org/apache/isis/applib/services/layout/Object_viewLayout.java
----------------------------------------------------------------------
diff --git a/core/applib/src/main/java/org/apache/isis/applib/services/layout/Object_viewLayout.java b/core/applib/src/main/java/org/apache/isis/applib/services/layout/Object_viewLayout.java
index 82d574c..4ba2145 100644
--- a/core/applib/src/main/java/org/apache/isis/applib/services/layout/Object_viewLayout.java
+++ b/core/applib/src/main/java/org/apache/isis/applib/services/layout/Object_viewLayout.java
@@ -25,7 +25,7 @@ import org.apache.isis.applib.annotation.Mixin;
 import org.apache.isis.applib.annotation.Programmatic;
 import org.apache.isis.applib.annotation.RestrictTo;
 import org.apache.isis.applib.annotation.SemanticsOf;
-import org.apache.isis.applib.layout.v1_0.ObjectLayoutMetadata;
+import org.apache.isis.applib.layout.fixedcols.ObjectLayoutMetadata;
 
 @Mixin
 public class Object_viewLayout {

http://git-wip-us.apache.org/repos/asf/isis/blob/517b6ccb/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/layoutmetadata/ObjectLayoutMetadataFacet.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/layoutmetadata/ObjectLayoutMetadataFacet.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/layoutmetadata/ObjectLayoutMetadataFacet.java
index eb7efcd..c3b8830 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/layoutmetadata/ObjectLayoutMetadataFacet.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/layoutmetadata/ObjectLayoutMetadataFacet.java
@@ -19,7 +19,7 @@
 package org.apache.isis.core.metamodel.facets.object.layoutmetadata;
 
 
-import org.apache.isis.applib.layout.v1_0.ObjectLayoutMetadata;
+import org.apache.isis.applib.layout.fixedcols.ObjectLayoutMetadata;
 import org.apache.isis.core.metamodel.facetapi.Facet;
 
 /**


[07/18] isis git commit: ISIS-993: working towards a 'bootstrap3' layout

Posted by da...@apache.org.
http://git-wip-us.apache.org/repos/asf/isis/blob/517b6ccb/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/layoutmetadata/ObjectLayoutMetadataFacetDefault.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/layoutmetadata/ObjectLayoutMetadataFacetDefault.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/layoutmetadata/ObjectLayoutMetadataFacetDefault.java
index 990ec54..e188f85 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/layoutmetadata/ObjectLayoutMetadataFacetDefault.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/layoutmetadata/ObjectLayoutMetadataFacetDefault.java
@@ -22,7 +22,6 @@ import java.util.Collection;
 import java.util.LinkedHashMap;
 import java.util.List;
 import java.util.Map;
-import java.util.concurrent.atomic.AtomicInteger;
 import java.util.concurrent.atomic.AtomicReference;
 
 import com.google.common.base.Strings;
@@ -35,14 +34,14 @@ import org.slf4j.LoggerFactory;
 import org.apache.isis.applib.layout.v1_0.ActionLayoutMetadata;
 import org.apache.isis.applib.layout.v1_0.ActionOwner;
 import org.apache.isis.applib.layout.v1_0.CollectionLayoutMetadata;
-import org.apache.isis.applib.layout.v1_0.ColumnMetadata;
+import org.apache.isis.applib.layout.fixedcols.ColumnMetadata;
 import org.apache.isis.applib.layout.v1_0.ColumnOwner;
-import org.apache.isis.applib.layout.v1_0.ObjectLayoutMetadata;
-import org.apache.isis.applib.layout.v1_0.Owned;
+import org.apache.isis.applib.layout.fixedcols.ObjectLayoutMetadata;
+import org.apache.isis.applib.layout.v1_0.MemberLayoutMetadataOwner;
 import org.apache.isis.applib.layout.v1_0.PropertyGroupMetadata;
 import org.apache.isis.applib.layout.v1_0.PropertyLayoutMetadata;
-import org.apache.isis.applib.layout.v1_0.TabMetadata;
-import org.apache.isis.applib.layout.v1_0.TabGroupMetadata;
+import org.apache.isis.applib.layout.fixedcols.TabMetadata;
+import org.apache.isis.applib.layout.fixedcols.TabGroupMetadata;
 import org.apache.isis.applib.services.i18n.TranslationService;
 import org.apache.isis.applib.services.layout.ObjectLayoutMetadataService;
 import org.apache.isis.core.metamodel.deployment.DeploymentCategory;
@@ -425,13 +424,16 @@ public class ObjectLayoutMetadataFacetDefault
                         new MemberOrderFacetXml(groupName, sequence, translationService, oneToManyAssociation));
 
                 // if there is only a single column and no other contents, then copy the collection Id onto the tab'
-                final ColumnMetadata columnMetadata = collectionLayoutMetadata.getOwner();
-                final ColumnOwner holder = columnMetadata.getOwner();
-                if(holder instanceof TabMetadata) {
-                    final TabMetadata tabMetadata = (TabMetadata) holder;
-                    if(tabMetadata.getContents().size() == 1 && Strings.isNullOrEmpty(tabMetadata.getName()) ) {
-                        final String collectionName = oneToManyAssociation.getName();
-                        tabMetadata.setName(collectionName);
+                final MemberLayoutMetadataOwner memberLayoutMetadataOwner = collectionLayoutMetadata.getOwner();
+                if(memberLayoutMetadataOwner instanceof ColumnMetadata) {
+                    final ColumnMetadata columnMetadata = (ColumnMetadata) memberLayoutMetadataOwner;
+                    final ColumnOwner holder = columnMetadata.getOwner();
+                    if(holder instanceof TabMetadata) {
+                        final TabMetadata tabMetadata = (TabMetadata) holder;
+                        if(tabMetadata.getContents().size() == 1 && Strings.isNullOrEmpty(tabMetadata.getName()) ) {
+                            final String collectionName = oneToManyAssociation.getName();
+                            tabMetadata.setName(collectionName);
+                        }
                     }
                 }
             }

http://git-wip-us.apache.org/repos/asf/isis/blob/517b6ccb/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 fd48915..9f761c6 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
@@ -84,7 +84,7 @@ import org.apache.isis.core.metamodel.runtimecontext.ServicesInjectorAware;
 import org.apache.isis.core.metamodel.spec.ActionType;
 import org.apache.isis.core.metamodel.spec.ObjectSpecification;
 import org.apache.isis.core.metamodel.spec.ObjectSpecifications;
-import org.apache.isis.applib.layout.v1_0.ColumnMetadata.Hint;
+import org.apache.isis.applib.layout.fixedcols.ColumnMetadata.Hint;
 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;

http://git-wip-us.apache.org/repos/asf/isis/blob/517b6ccb/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/layout/ObjectLayoutMetadataServiceDefault.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/layout/ObjectLayoutMetadataServiceDefault.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/layout/ObjectLayoutMetadataServiceDefault.java
index f2861b8..446abae 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/layout/ObjectLayoutMetadataServiceDefault.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/layout/ObjectLayoutMetadataServiceDefault.java
@@ -33,7 +33,7 @@ import org.slf4j.LoggerFactory;
 import org.apache.isis.applib.annotation.DomainService;
 import org.apache.isis.applib.annotation.NatureOfService;
 import org.apache.isis.applib.annotation.Programmatic;
-import org.apache.isis.applib.layout.v1_0.ObjectLayoutMetadata;
+import org.apache.isis.applib.layout.fixedcols.ObjectLayoutMetadata;
 import org.apache.isis.applib.services.jaxb.JaxbService;
 import org.apache.isis.applib.services.layout.ObjectLayoutMetadataService;
 import org.apache.isis.core.metamodel.deployment.DeploymentCategory;

http://git-wip-us.apache.org/repos/asf/isis/blob/517b6ccb/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/metamodel/MetadataMenu.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/metamodel/MetadataMenu.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/metamodel/MetadataMenu.java
index cc05eca..db40223 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/metamodel/MetadataMenu.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/metamodel/MetadataMenu.java
@@ -42,7 +42,7 @@ import org.apache.isis.applib.annotation.NatureOfService;
 import org.apache.isis.applib.annotation.Programmatic;
 import org.apache.isis.applib.annotation.RestrictTo;
 import org.apache.isis.applib.annotation.SemanticsOf;
-import org.apache.isis.applib.layout.v1_0.ObjectLayoutMetadata;
+import org.apache.isis.applib.layout.fixedcols.ObjectLayoutMetadata;
 import org.apache.isis.applib.services.jaxb.JaxbService;
 import org.apache.isis.applib.services.layout.ObjectLayoutMetadataService;
 import org.apache.isis.applib.value.Blob;

http://git-wip-us.apache.org/repos/asf/isis/blob/517b6ccb/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/ObjectSpecifications.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/ObjectSpecifications.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/ObjectSpecifications.java
index acc1edc..209b105 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/ObjectSpecifications.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/ObjectSpecifications.java
@@ -25,7 +25,7 @@ import java.util.Set;
 
 import com.google.common.collect.Lists;
 
-import org.apache.isis.applib.layout.v1_0.ColumnMetadata;
+import org.apache.isis.applib.layout.fixedcols.ColumnMetadata;
 import org.apache.isis.core.metamodel.facets.object.membergroups.MemberGroupLayoutFacet;
 
 

http://git-wip-us.apache.org/repos/asf/isis/blob/517b6ccb/core/metamodel/src/test/java/org/apache/isis/core/metamodel/layoutxml/v1_0/ObjectLayoutMetadataTest.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/layoutxml/v1_0/ObjectLayoutMetadataTest.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/layoutxml/v1_0/ObjectLayoutMetadataTest.java
index a70177e..e0f9737 100644
--- a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/layoutxml/v1_0/ObjectLayoutMetadataTest.java
+++ b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/layoutxml/v1_0/ObjectLayoutMetadataTest.java
@@ -31,12 +31,12 @@ import org.junit.Test;
 
 import org.apache.isis.applib.layout.v1_0.ActionLayoutMetadata;
 import org.apache.isis.applib.layout.v1_0.CollectionLayoutMetadata;
-import org.apache.isis.applib.layout.v1_0.ColumnMetadata;
-import org.apache.isis.applib.layout.v1_0.ObjectLayoutMetadata;
+import org.apache.isis.applib.layout.fixedcols.ColumnMetadata;
+import org.apache.isis.applib.layout.fixedcols.ObjectLayoutMetadata;
 import org.apache.isis.applib.layout.v1_0.PropertyLayoutMetadata;
 import org.apache.isis.applib.layout.v1_0.PropertyGroupMetadata;
-import org.apache.isis.applib.layout.v1_0.TabMetadata;
-import org.apache.isis.applib.layout.v1_0.TabGroupMetadata;
+import org.apache.isis.applib.layout.fixedcols.TabMetadata;
+import org.apache.isis.applib.layout.fixedcols.TabGroupMetadata;
 import org.apache.isis.applib.services.jaxb.JaxbService;
 
 import static org.hamcrest.CoreMatchers.equalTo;

http://git-wip-us.apache.org/repos/asf/isis/blob/517b6ccb/core/viewer-wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/models/EntityModel.java
----------------------------------------------------------------------
diff --git a/core/viewer-wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/models/EntityModel.java b/core/viewer-wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/models/EntityModel.java
index 7caef5b..1a87a1f 100644
--- a/core/viewer-wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/models/EntityModel.java
+++ b/core/viewer-wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/models/EntityModel.java
@@ -31,11 +31,11 @@ import org.apache.wicket.request.mapper.parameter.PageParameters;
 
 import org.apache.isis.applib.annotation.BookmarkPolicy;
 import org.apache.isis.applib.layout.v1_0.CollectionLayoutMetadata;
-import org.apache.isis.applib.layout.v1_0.ColumnMetadata;
-import org.apache.isis.applib.layout.v1_0.ColumnMetadata.Hint;
+import org.apache.isis.applib.layout.fixedcols.ColumnMetadata;
+import org.apache.isis.applib.layout.fixedcols.ColumnMetadata.Hint;
 import org.apache.isis.applib.layout.v1_0.PropertyGroupMetadata;
-import org.apache.isis.applib.layout.v1_0.TabGroupMetadata;
-import org.apache.isis.applib.layout.v1_0.TabMetadata;
+import org.apache.isis.applib.layout.fixedcols.TabGroupMetadata;
+import org.apache.isis.applib.layout.fixedcols.TabMetadata;
 import org.apache.isis.applib.services.memento.MementoService.Memento;
 import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
 import org.apache.isis.core.metamodel.adapter.mgr.AdapterManager.ConcurrencyChecking;
@@ -137,7 +137,6 @@ public class EntityModel extends BookmarkableModel<ObjectAdapter> {
 
     private Mode mode = Mode.VIEW;
     private RenderingHint renderingHint = RenderingHint.REGULAR;
-    private Hint hint;
     private final PendingModel pendingModel;
 
     /**
@@ -464,10 +463,12 @@ public class EntityModel extends BookmarkableModel<ObjectAdapter> {
         entityDetailsVisible = !entityDetailsVisible;
     }
 
-    public Hint getHint() {
+    private Hint hint;
+
+    private Hint getHint() {
         return hint;
     }
-    public void setHint(Hint hint) {
+    private void setHint(Hint hint) {
         this.hint = hint;
     }
 

http://git-wip-us.apache.org/repos/asf/isis/blob/517b6ccb/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/ComponentType.java
----------------------------------------------------------------------
diff --git a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/ComponentType.java b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/ComponentType.java
index 70281cf..a4e8865 100644
--- a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/ComponentType.java
+++ b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/ComponentType.java
@@ -74,9 +74,6 @@ public enum ComponentType {
     ENTITY_PROPERTIES,
     /**
      * The set of collections of a single entity, designed to be standalone outside of a form.
-     * 
-     * <p>
-     * compare with {@value #ENTITY_COLLECTIONS}.
      */
     ENTITY_COLLECTIONS,
     /**

http://git-wip-us.apache.org/repos/asf/isis/blob/517b6ccb/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/EntityPanelFactory.java
----------------------------------------------------------------------
diff --git a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/EntityPanelFactory.java b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/EntityPanelFactory.java
index 4020bd2..8861172 100644
--- a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/EntityPanelFactory.java
+++ b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/EntityPanelFactory.java
@@ -22,7 +22,7 @@ package org.apache.isis.viewer.wicket.ui.components.entity;
 import org.apache.wicket.Component;
 import org.apache.wicket.model.IModel;
 
-import org.apache.isis.applib.layout.v1_0.ObjectLayoutMetadata;
+import org.apache.isis.applib.layout.fixedcols.ObjectLayoutMetadata;
 import org.apache.isis.core.metamodel.facets.object.layoutmetadata.ObjectLayoutMetadataFacet;
 import org.apache.isis.core.metamodel.spec.ObjectSpecification;
 import org.apache.isis.viewer.wicket.model.models.EntityModel;

http://git-wip-us.apache.org/repos/asf/isis/blob/517b6ccb/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/PropUtil.java
----------------------------------------------------------------------
diff --git a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/PropUtil.java b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/PropUtil.java
index 5b4e39d..37bcd93 100644
--- a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/PropUtil.java
+++ b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/PropUtil.java
@@ -26,7 +26,7 @@ import com.google.common.collect.FluentIterable;
 import org.apache.isis.applib.annotation.Where;
 import org.apache.isis.applib.filter.Filter;
 import org.apache.isis.applib.filter.Filters;
-import org.apache.isis.applib.layout.v1_0.ColumnMetadata;
+import org.apache.isis.applib.layout.fixedcols.ColumnMetadata;
 import org.apache.isis.applib.layout.v1_0.PropertyGroupMetadata;
 import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
 import org.apache.isis.core.metamodel.consent.InteractionInitiatedBy;

http://git-wip-us.apache.org/repos/asf/isis/blob/517b6ccb/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/collections/EntityCollectionsPanel.java
----------------------------------------------------------------------
diff --git a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/collections/EntityCollectionsPanel.java b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/collections/EntityCollectionsPanel.java
index 5666b66..14eb27c 100644
--- a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/collections/EntityCollectionsPanel.java
+++ b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/collections/EntityCollectionsPanel.java
@@ -32,7 +32,7 @@ import org.apache.isis.applib.annotation.Where;
 import org.apache.isis.applib.filter.Filter;
 import org.apache.isis.applib.filter.Filters;
 import org.apache.isis.applib.layout.v1_0.CollectionLayoutMetadata;
-import org.apache.isis.applib.layout.v1_0.ColumnMetadata;
+import org.apache.isis.applib.layout.fixedcols.ColumnMetadata;
 import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
 import org.apache.isis.core.metamodel.consent.InteractionInitiatedBy;
 import org.apache.isis.core.metamodel.facets.members.order.MemberOrderFacet;

http://git-wip-us.apache.org/repos/asf/isis/blob/517b6ccb/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/column/EntityColumn.java
----------------------------------------------------------------------
diff --git a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/column/EntityColumn.java b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/column/EntityColumn.java
index c741589..528ba06 100644
--- a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/column/EntityColumn.java
+++ b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/column/EntityColumn.java
@@ -31,7 +31,7 @@ import org.apache.wicket.MarkupContainer;
 import org.apache.wicket.markup.html.WebMarkupContainer;
 import org.apache.wicket.markup.repeater.RepeatingView;
 
-import org.apache.isis.applib.layout.v1_0.ColumnMetadata;
+import org.apache.isis.applib.layout.fixedcols.ColumnMetadata;
 import org.apache.isis.applib.layout.v1_0.PropertyGroupMetadata;
 import org.apache.isis.applib.layout.v1_0.PropertyLayoutMetadata;
 import org.apache.isis.core.metamodel.adapter.ObjectAdapter;

http://git-wip-us.apache.org/repos/asf/isis/blob/517b6ccb/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/propsandcolls/EntityPropsAndCollsForm.java
----------------------------------------------------------------------
diff --git a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/propsandcolls/EntityPropsAndCollsForm.java b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/propsandcolls/EntityPropsAndCollsForm.java
index c414a22..770b883 100644
--- a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/propsandcolls/EntityPropsAndCollsForm.java
+++ b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/propsandcolls/EntityPropsAndCollsForm.java
@@ -44,9 +44,9 @@ import org.apache.isis.applib.annotation.MemberGroupLayout.ColumnSpans;
 import org.apache.isis.applib.annotation.Where;
 import org.apache.isis.applib.filter.Filter;
 import org.apache.isis.applib.filter.Filters;
-import org.apache.isis.applib.layout.v1_0.ColumnMetadata;
-import org.apache.isis.applib.layout.v1_0.ColumnMetadata.Hint;
-import org.apache.isis.applib.layout.v1_0.TabMetadata;
+import org.apache.isis.applib.layout.fixedcols.ColumnMetadata;
+import org.apache.isis.applib.layout.fixedcols.ColumnMetadata.Hint;
+import org.apache.isis.applib.layout.fixedcols.TabMetadata;
 import org.apache.isis.applib.services.exceprecog.ExceptionRecognizer;
 import org.apache.isis.applib.services.exceprecog.ExceptionRecognizerComposite;
 import org.apache.isis.core.commons.authentication.MessageBroker;

http://git-wip-us.apache.org/repos/asf/isis/blob/517b6ccb/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/tabbed/EntityTabbedPanel.java
----------------------------------------------------------------------
diff --git a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/tabbed/EntityTabbedPanel.java b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/tabbed/EntityTabbedPanel.java
index 8bf707f..ca5c9ad 100644
--- a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/tabbed/EntityTabbedPanel.java
+++ b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/tabbed/EntityTabbedPanel.java
@@ -23,9 +23,9 @@ import java.util.List;
 
 import com.google.common.collect.FluentIterable;
 
-import org.apache.isis.applib.layout.v1_0.ColumnMetadata;
-import org.apache.isis.applib.layout.v1_0.ObjectLayoutMetadata;
-import org.apache.isis.applib.layout.v1_0.TabGroupMetadata;
+import org.apache.isis.applib.layout.fixedcols.ColumnMetadata;
+import org.apache.isis.applib.layout.fixedcols.ObjectLayoutMetadata;
+import org.apache.isis.applib.layout.fixedcols.TabGroupMetadata;
 import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
 import org.apache.isis.core.metamodel.facets.members.cssclass.CssClassFacet;
 import org.apache.isis.core.metamodel.facets.object.layoutmetadata.ObjectLayoutMetadataFacet;

http://git-wip-us.apache.org/repos/asf/isis/blob/517b6ccb/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/tabgroup/TabGroupPanel.java
----------------------------------------------------------------------
diff --git a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/tabgroup/TabGroupPanel.java b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/tabgroup/TabGroupPanel.java
index e8684da..c4dbb15 100644
--- a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/tabgroup/TabGroupPanel.java
+++ b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/tabgroup/TabGroupPanel.java
@@ -29,8 +29,8 @@ import org.apache.wicket.extensions.markup.html.tabs.TabbedPanel;
 import org.apache.wicket.markup.html.panel.Panel;
 import org.apache.wicket.model.Model;
 
-import org.apache.isis.applib.layout.v1_0.TabGroupMetadata;
-import org.apache.isis.applib.layout.v1_0.TabMetadata;
+import org.apache.isis.applib.layout.fixedcols.TabGroupMetadata;
+import org.apache.isis.applib.layout.fixedcols.TabMetadata;
 import org.apache.isis.viewer.wicket.model.models.EntityModel;
 import org.apache.isis.viewer.wicket.model.util.ScopedSessionAttribute;
 import org.apache.isis.viewer.wicket.ui.components.entity.tabpanel.TabPanel;

http://git-wip-us.apache.org/repos/asf/isis/blob/517b6ccb/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/tabgrouplist/TabGroupListPanel.java
----------------------------------------------------------------------
diff --git a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/tabgrouplist/TabGroupListPanel.java b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/tabgrouplist/TabGroupListPanel.java
index 3ef1a82..5a53620 100644
--- a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/tabgrouplist/TabGroupListPanel.java
+++ b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/tabgrouplist/TabGroupListPanel.java
@@ -24,7 +24,7 @@ import java.util.List;
 import org.apache.wicket.markup.html.list.ListItem;
 import org.apache.wicket.markup.html.list.ListView;
 
-import org.apache.isis.applib.layout.v1_0.TabGroupMetadata;
+import org.apache.isis.applib.layout.fixedcols.TabGroupMetadata;
 import org.apache.isis.viewer.wicket.model.models.EntityModel;
 import org.apache.isis.viewer.wicket.ui.components.entity.tabgroup.TabGroupPanel;
 import org.apache.isis.viewer.wicket.ui.panels.PanelAbstract;

http://git-wip-us.apache.org/repos/asf/isis/blob/517b6ccb/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/tabpanel/TabPanel.java
----------------------------------------------------------------------
diff --git a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/tabpanel/TabPanel.java b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/tabpanel/TabPanel.java
index fe7d5ad..8b21ddf 100644
--- a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/tabpanel/TabPanel.java
+++ b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/tabpanel/TabPanel.java
@@ -1,6 +1,6 @@
 package org.apache.isis.viewer.wicket.ui.components.entity.tabpanel;
 
-import org.apache.isis.applib.layout.v1_0.TabMetadata;
+import org.apache.isis.applib.layout.fixedcols.TabMetadata;
 import org.apache.isis.viewer.wicket.model.models.EntityModel;
 import org.apache.isis.viewer.wicket.ui.ComponentType;
 import org.apache.isis.viewer.wicket.ui.panels.PanelAbstract;

http://git-wip-us.apache.org/repos/asf/isis/blob/517b6ccb/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/entity/EntityPage.java
----------------------------------------------------------------------
diff --git a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/entity/EntityPage.java b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/entity/EntityPage.java
index b104ac3..ce5f0b5 100644
--- a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/entity/EntityPage.java
+++ b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/entity/EntityPage.java
@@ -29,7 +29,7 @@ import org.apache.wicket.model.AbstractReadOnlyModel;
 import org.apache.wicket.request.mapper.parameter.PageParameters;
 import org.apache.wicket.util.string.Strings;
 
-import org.apache.isis.applib.layout.v1_0.ObjectLayoutMetadata;
+import org.apache.isis.applib.layout.fixedcols.ObjectLayoutMetadata;
 import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
 import org.apache.isis.core.metamodel.adapter.mgr.AdapterManager.ConcurrencyChecking;
 import org.apache.isis.core.metamodel.adapter.version.ConcurrencyException;


[15/18] isis git commit: ISIS-993: introduction of the PageNormalizerService as an internal SPI which keeps track of the different Page implementations and their algorithms for normalizing themselves. The original FixedCol layout is now working again a

Posted by da...@apache.org.
ISIS-993: introduction of the PageNormalizerService as an internal SPI which keeps track of the different Page implementations and their algorithms for normalizing themselves.   The original FixedCol layout is now working again as of this commit.


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

Branch: refs/heads/ISIS-993
Commit: 8f0abcdb64e98ab5e6d3aa30fd32f62444891a62
Parents: 10d80f3
Author: Dan Haywood <da...@haywood-associates.co.uk>
Authored: Fri Jan 29 18:28:20 2016 +0000
Committer: Dan Haywood <da...@haywood-associates.co.uk>
Committed: Fri Jan 29 18:28:20 2016 +0000

----------------------------------------------------------------------
 .../applib/layout/fixedcols/fixedcols.xsd       |  39 ++
 .../schema/applib/layout/layout-1.0.xsd         | 167 -------
 .../asciidoc/schema/applib/layout/layout.xsd    | 167 -------
 .../schema/applib/layout/members/v1/members.xsd | 109 +++++
 .../applib/annotation/DomainObjectLayout.java   |   2 +-
 .../applib/layout/bootstrap3/BS3ClearFix.java   |  23 +
 .../layout/bootstrap3/BS3ClearFixHidden.java    |  30 ++
 .../layout/bootstrap3/BS3ClearFixVisible.java   |  49 ++
 .../isis/applib/layout/bootstrap3/BS3Col.java   |  81 +++-
 .../layout/bootstrap3/BS3ElementAbstract.java   |  67 +++
 .../isis/applib/layout/bootstrap3/BS3Page.java  |  60 ++-
 .../isis/applib/layout/bootstrap3/BS3Row.java   |  27 +-
 .../applib/layout/bootstrap3/BS3RowContent.java |  61 +++
 .../isis/applib/layout/bootstrap3/BS3Tab.java   |  20 +-
 .../applib/layout/bootstrap3/BS3TabGroup.java   |  24 +-
 .../isis/applib/layout/fixedcols/FCColumn.java  |   4 +-
 .../isis/applib/layout/fixedcols/FCPage.java    |  26 +-
 .../layout/members/v1/CollectionLayoutData.java |   3 +-
 .../members/v1/DomainObjectLayoutData.java      | 158 +++++++
 .../isis/applib/layout/members/v1/FieldSet.java |   3 +-
 .../isis/applib/layout/members/v1/Page.java     |  38 ++
 .../layout/members/v1/PropertyLayoutData.java   |   3 +-
 .../applib/layout/members/v1/package-info.java  |   2 +-
 .../isis/applib/services/jaxb/JaxbService.java  |  38 +-
 .../layout/ObjectLayoutMetadataService.java     |  46 --
 .../layout/Object_downloadLayoutXml.java        |  21 +-
 .../services/layout/Object_viewLayout.java      |  14 +-
 .../applib/services/layout/PageService.java     |  49 ++
 .../ObjectLayoutMetadataFacet.java              |  33 --
 .../ObjectLayoutMetadataFacetDefault.java       | 473 -------------------
 .../ObjectLayoutMetadataFacetFactory.java       |  57 ---
 .../facets/object/layoutmetadata/PageFacet.java |  33 ++
 .../object/layoutmetadata/PageFacetDefault.java | 117 +++++
 .../object/layoutmetadata/PageFacetFactory.java |  63 +++
 .../json/LayoutMetadataReaderFromJson.java      |  10 +-
 .../ObjectLayoutMetadataServiceDefault.java     | 172 -------
 .../services/layout/PageServiceDefault.java     | 189 ++++++++
 .../layout/provider/PageNormalizer.java         |  25 +
 .../layout/provider/PageNormalizerAbstract.java |  35 ++
 .../layout/provider/PageNormalizerBS3.java      |  39 ++
 .../layout/provider/PageNormalizerFC.java       | 399 ++++++++++++++++
 .../layout/provider/PageNormalizerService.java  |  37 ++
 .../provider/PageNormalizerServiceDefault.java  | 110 +++++
 .../services/metamodel/MetadataMenu.java        |  12 +-
 .../dflt/ProgrammingModelFacetsJava5.java       |   4 +-
 .../layoutxml/FCPageFacetDefaultTest.java       |  60 ---
 .../object/layoutxml/PageFacetDefaultTest.java  |  60 +++
 .../metamodel/layoutxml/v1_0/FCPageTest.java    |  32 +-
 .../components/entity/EntityPanelFactory.java   |  19 +-
 .../entity/tabbed/EntityTabbedPanel.java        |  12 +-
 .../wicket/ui/pages/entity/EntityPage.java      |  12 +-
 .../dom/simple/SimpleObject.layout.xml          |  38 +-
 52 files changed, 2039 insertions(+), 1333 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/isis/blob/8f0abcdb/adocs/documentation/src/main/asciidoc/schema/applib/layout/fixedcols/fixedcols.xsd
----------------------------------------------------------------------
diff --git a/adocs/documentation/src/main/asciidoc/schema/applib/layout/fixedcols/fixedcols.xsd b/adocs/documentation/src/main/asciidoc/schema/applib/layout/fixedcols/fixedcols.xsd
new file mode 100644
index 0000000..bc3a648
--- /dev/null
+++ b/adocs/documentation/src/main/asciidoc/schema/applib/layout/fixedcols/fixedcols.xsd
@@ -0,0 +1,39 @@
+<?xml version="1.0" standalone="yes"?>
+<xs:schema elementFormDefault="qualified" version="1.0" targetNamespace="http://isis.apache.org/schema/applib/layout/fixedcols" xmlns:tns="http://isis.apache.org/schema/applib/layout/fixedcols" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:ns1="http://isis.apache.org/schema/applib/layout/members/v1">
+
+    <xs:import namespace="http://isis.apache.org/schema/applib/layout/members/v1" schemaLocation="../members/v1"/>
+
+    <xs:element name="page" type="tns:page"/>
+
+    <xs:complexType name="page">
+        <xs:sequence>
+            <xs:element name="action" type="ns1:actionLayout" minOccurs="0" maxOccurs="unbounded"/>
+            <xs:element name="left" type="tns:fcColumn" minOccurs="0"/>
+            <xs:element name="tabGroup" type="tns:fcTabGroup" maxOccurs="unbounded"/>
+            <xs:element name="right" type="tns:fcColumn" minOccurs="0"/>
+        </xs:sequence>
+    </xs:complexType>
+
+    <xs:complexType name="fcColumn">
+        <xs:sequence>
+            <xs:element name="fieldSet" type="ns1:fieldSet" minOccurs="0" maxOccurs="unbounded"/>
+            <xs:element name="collection" type="ns1:collectionLayoutData" minOccurs="0" maxOccurs="unbounded"/>
+        </xs:sequence>
+        <xs:attribute name="span" type="xs:int" use="required"/>
+    </xs:complexType>
+
+    <xs:complexType name="fcTabGroup">
+        <xs:sequence>
+            <xs:element name="tab" type="tns:tab" maxOccurs="unbounded"/>
+        </xs:sequence>
+    </xs:complexType>
+
+    <xs:complexType name="tab">
+        <xs:sequence>
+            <xs:element name="left" type="tns:fcColumn"/>
+            <xs:element name="middle" type="tns:fcColumn" minOccurs="0"/>
+            <xs:element name="right" type="tns:fcColumn" minOccurs="0"/>
+        </xs:sequence>
+        <xs:attribute name="name" type="xs:string" use="required"/>
+    </xs:complexType>
+</xs:schema>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/isis/blob/8f0abcdb/adocs/documentation/src/main/asciidoc/schema/applib/layout/layout-1.0.xsd
----------------------------------------------------------------------
diff --git a/adocs/documentation/src/main/asciidoc/schema/applib/layout/layout-1.0.xsd b/adocs/documentation/src/main/asciidoc/schema/applib/layout/layout-1.0.xsd
deleted file mode 100644
index 9628c78..0000000
--- a/adocs/documentation/src/main/asciidoc/schema/applib/layout/layout-1.0.xsd
+++ /dev/null
@@ -1,167 +0,0 @@
-<?xml version="1.0" standalone="yes"?>
-<xs:schema elementFormDefault="qualified" version="1.0" targetNamespace="http://isis.apache.org/schema/applib/layout" xmlns:tns="http://isis.apache.org/schema/applib/layout" xmlns:xs="http://www.w3.org/2001/XMLSchema">
-
-  <xs:element name="objectLayout" type="tns:objectLayout"/>
-
-  <xs:complexType name="objectLayout">
-    <xs:sequence>
-      <xs:element name="actions" minOccurs="0">
-        <xs:complexType>
-          <xs:sequence>
-            <xs:element name="action" type="tns:actionLayout" minOccurs="0" maxOccurs="unbounded"/>
-          </xs:sequence>
-        </xs:complexType>
-      </xs:element>
-      <xs:element name="left" type="tns:column" minOccurs="0"/>
-      <xs:element name="tabGroup" type="tns:tabGroup" maxOccurs="unbounded"/>
-      <xs:element name="right" type="tns:column" minOccurs="0"/>
-    </xs:sequence>
-  </xs:complexType>
-
-  <xs:complexType name="actionLayout">
-    <xs:sequence>
-      <xs:element name="named" type="xs:string" minOccurs="0"/>
-      <xs:element name="describedAs" type="xs:string" minOccurs="0"/>
-      <xs:element name="metadataError" type="xs:string" minOccurs="0"/>
-    </xs:sequence>
-    <xs:attribute name="bookmarking" type="tns:bookmarkPolicy"/>
-    <xs:attribute name="cssClass" type="xs:string"/>
-    <xs:attribute name="cssClassFa" type="xs:string"/>
-    <xs:attribute name="cssClassFaPosition" type="tns:cssClassFaPosition"/>
-    <xs:attribute name="hidden" type="tns:where"/>
-    <xs:attribute name="id" type="xs:string" use="required"/>
-    <xs:attribute name="namedEscaped" type="xs:boolean"/>
-    <xs:attribute name="position" type="tns:position"/>
-  </xs:complexType>
-
-  <xs:complexType name="column">
-    <xs:sequence>
-      <xs:element name="propertyGroup" type="tns:propertyGroup" minOccurs="0" maxOccurs="unbounded"/>
-      <xs:element name="collection" type="tns:collectionLayoutMetadata" minOccurs="0" maxOccurs="unbounded"/>
-    </xs:sequence>
-    <xs:attribute name="span" type="xs:int" use="required"/>
-  </xs:complexType>
-
-  <xs:complexType name="propertyGroup">
-    <xs:sequence>
-      <xs:element name="actions" minOccurs="0">
-        <xs:complexType>
-          <xs:sequence>
-            <xs:element name="action" type="tns:actionLayout" minOccurs="0" maxOccurs="unbounded"/>
-          </xs:sequence>
-        </xs:complexType>
-      </xs:element>
-      <xs:element name="property" type="tns:propertyLayout" maxOccurs="unbounded"/>
-    </xs:sequence>
-    <xs:attribute name="name" type="xs:string" use="required"/>
-  </xs:complexType>
-
-  <xs:complexType name="propertyLayout">
-    <xs:sequence>
-      <xs:element name="named" type="xs:string" minOccurs="0"/>
-      <xs:element name="describedAs" type="xs:string" minOccurs="0"/>
-      <xs:element name="actions" minOccurs="0">
-        <xs:complexType>
-          <xs:sequence>
-            <xs:element name="action" type="tns:actionLayout" minOccurs="0" maxOccurs="unbounded"/>
-          </xs:sequence>
-        </xs:complexType>
-      </xs:element>
-      <xs:element name="metadataError" type="xs:string" minOccurs="0"/>
-    </xs:sequence>
-    <xs:attribute name="cssClass" type="xs:string"/>
-    <xs:attribute name="hidden" type="tns:where"/>
-    <xs:attribute name="id" type="xs:string" use="required"/>
-    <xs:attribute name="labelPosition" type="tns:labelPosition"/>
-    <xs:attribute name="multiLine" type="xs:int"/>
-    <xs:attribute name="namedEscaped" type="xs:boolean"/>
-    <xs:attribute name="renderedAsDayBefore" type="xs:boolean"/>
-    <xs:attribute name="typicalLength" type="xs:int"/>
-  </xs:complexType>
-
-  <xs:complexType name="collectionLayoutMetadata">
-    <xs:sequence>
-      <xs:element name="named" type="xs:string" minOccurs="0"/>
-      <xs:element name="describedAs" type="xs:string" minOccurs="0"/>
-      <xs:element name="sortedBy" type="xs:string" minOccurs="0"/>
-      <xs:element name="actions" minOccurs="0">
-        <xs:complexType>
-          <xs:sequence>
-            <xs:element name="action" type="tns:actionLayout" minOccurs="0" maxOccurs="unbounded"/>
-          </xs:sequence>
-        </xs:complexType>
-      </xs:element>
-      <xs:element name="metadataError" type="xs:string" minOccurs="0"/>
-    </xs:sequence>
-    <xs:attribute name="cssClass" type="xs:string"/>
-    <xs:attribute name="defaultView" type="xs:string"/>
-    <xs:attribute name="hidden" type="tns:where"/>
-    <xs:attribute name="id" type="xs:string" use="required"/>
-    <xs:attribute name="namedEscaped" type="xs:boolean"/>
-    <xs:attribute name="paged" type="xs:int"/>
-  </xs:complexType>
-
-  <xs:complexType name="tabGroup">
-    <xs:sequence>
-      <xs:element name="tab" type="tns:tab" maxOccurs="unbounded"/>
-    </xs:sequence>
-  </xs:complexType>
-
-  <xs:complexType name="tab">
-    <xs:sequence>
-      <xs:element name="left" type="tns:column"/>
-      <xs:element name="middle" type="tns:column" minOccurs="0"/>
-      <xs:element name="right" type="tns:column" minOccurs="0"/>
-    </xs:sequence>
-    <xs:attribute name="name" type="xs:string" use="required"/>
-  </xs:complexType>
-
-  <xs:simpleType name="bookmarkPolicy">
-    <xs:restriction base="xs:string">
-      <xs:enumeration value="AS_ROOT"/>
-      <xs:enumeration value="AS_CHILD"/>
-      <xs:enumeration value="NEVER"/>
-    </xs:restriction>
-  </xs:simpleType>
-
-  <xs:simpleType name="cssClassFaPosition">
-    <xs:restriction base="xs:string">
-      <xs:enumeration value="LEFT"/>
-      <xs:enumeration value="RIGHT"/>
-    </xs:restriction>
-  </xs:simpleType>
-
-  <xs:simpleType name="where">
-    <xs:restriction base="xs:string">
-      <xs:enumeration value="EVERYWHERE"/>
-      <xs:enumeration value="ANYWHERE"/>
-      <xs:enumeration value="OBJECT_FORMS"/>
-      <xs:enumeration value="REFERENCES_PARENT"/>
-      <xs:enumeration value="PARENTED_TABLES"/>
-      <xs:enumeration value="STANDALONE_TABLES"/>
-      <xs:enumeration value="ALL_TABLES"/>
-      <xs:enumeration value="ALL_EXCEPT_STANDALONE_TABLES"/>
-      <xs:enumeration value="NOWHERE"/>
-      <xs:enumeration value="NOT_SPECIFIED"/>
-    </xs:restriction>
-  </xs:simpleType>
-
-  <xs:simpleType name="position">
-    <xs:restriction base="xs:string">
-      <xs:enumeration value="BELOW"/>
-      <xs:enumeration value="RIGHT"/>
-      <xs:enumeration value="PANEL"/>
-      <xs:enumeration value="PANEL_DROPDOWN"/>
-    </xs:restriction>
-  </xs:simpleType>
-
-  <xs:simpleType name="labelPosition">
-    <xs:restriction base="xs:string">
-      <xs:enumeration value="DEFAULT"/>
-      <xs:enumeration value="LEFT"/>
-      <xs:enumeration value="RIGHT"/>
-      <xs:enumeration value="TOP"/>
-      <xs:enumeration value="NONE"/>
-    </xs:restriction>
-  </xs:simpleType>
-</xs:schema>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/isis/blob/8f0abcdb/adocs/documentation/src/main/asciidoc/schema/applib/layout/layout.xsd
----------------------------------------------------------------------
diff --git a/adocs/documentation/src/main/asciidoc/schema/applib/layout/layout.xsd b/adocs/documentation/src/main/asciidoc/schema/applib/layout/layout.xsd
deleted file mode 100644
index 9628c78..0000000
--- a/adocs/documentation/src/main/asciidoc/schema/applib/layout/layout.xsd
+++ /dev/null
@@ -1,167 +0,0 @@
-<?xml version="1.0" standalone="yes"?>
-<xs:schema elementFormDefault="qualified" version="1.0" targetNamespace="http://isis.apache.org/schema/applib/layout" xmlns:tns="http://isis.apache.org/schema/applib/layout" xmlns:xs="http://www.w3.org/2001/XMLSchema">
-
-  <xs:element name="objectLayout" type="tns:objectLayout"/>
-
-  <xs:complexType name="objectLayout">
-    <xs:sequence>
-      <xs:element name="actions" minOccurs="0">
-        <xs:complexType>
-          <xs:sequence>
-            <xs:element name="action" type="tns:actionLayout" minOccurs="0" maxOccurs="unbounded"/>
-          </xs:sequence>
-        </xs:complexType>
-      </xs:element>
-      <xs:element name="left" type="tns:column" minOccurs="0"/>
-      <xs:element name="tabGroup" type="tns:tabGroup" maxOccurs="unbounded"/>
-      <xs:element name="right" type="tns:column" minOccurs="0"/>
-    </xs:sequence>
-  </xs:complexType>
-
-  <xs:complexType name="actionLayout">
-    <xs:sequence>
-      <xs:element name="named" type="xs:string" minOccurs="0"/>
-      <xs:element name="describedAs" type="xs:string" minOccurs="0"/>
-      <xs:element name="metadataError" type="xs:string" minOccurs="0"/>
-    </xs:sequence>
-    <xs:attribute name="bookmarking" type="tns:bookmarkPolicy"/>
-    <xs:attribute name="cssClass" type="xs:string"/>
-    <xs:attribute name="cssClassFa" type="xs:string"/>
-    <xs:attribute name="cssClassFaPosition" type="tns:cssClassFaPosition"/>
-    <xs:attribute name="hidden" type="tns:where"/>
-    <xs:attribute name="id" type="xs:string" use="required"/>
-    <xs:attribute name="namedEscaped" type="xs:boolean"/>
-    <xs:attribute name="position" type="tns:position"/>
-  </xs:complexType>
-
-  <xs:complexType name="column">
-    <xs:sequence>
-      <xs:element name="propertyGroup" type="tns:propertyGroup" minOccurs="0" maxOccurs="unbounded"/>
-      <xs:element name="collection" type="tns:collectionLayoutMetadata" minOccurs="0" maxOccurs="unbounded"/>
-    </xs:sequence>
-    <xs:attribute name="span" type="xs:int" use="required"/>
-  </xs:complexType>
-
-  <xs:complexType name="propertyGroup">
-    <xs:sequence>
-      <xs:element name="actions" minOccurs="0">
-        <xs:complexType>
-          <xs:sequence>
-            <xs:element name="action" type="tns:actionLayout" minOccurs="0" maxOccurs="unbounded"/>
-          </xs:sequence>
-        </xs:complexType>
-      </xs:element>
-      <xs:element name="property" type="tns:propertyLayout" maxOccurs="unbounded"/>
-    </xs:sequence>
-    <xs:attribute name="name" type="xs:string" use="required"/>
-  </xs:complexType>
-
-  <xs:complexType name="propertyLayout">
-    <xs:sequence>
-      <xs:element name="named" type="xs:string" minOccurs="0"/>
-      <xs:element name="describedAs" type="xs:string" minOccurs="0"/>
-      <xs:element name="actions" minOccurs="0">
-        <xs:complexType>
-          <xs:sequence>
-            <xs:element name="action" type="tns:actionLayout" minOccurs="0" maxOccurs="unbounded"/>
-          </xs:sequence>
-        </xs:complexType>
-      </xs:element>
-      <xs:element name="metadataError" type="xs:string" minOccurs="0"/>
-    </xs:sequence>
-    <xs:attribute name="cssClass" type="xs:string"/>
-    <xs:attribute name="hidden" type="tns:where"/>
-    <xs:attribute name="id" type="xs:string" use="required"/>
-    <xs:attribute name="labelPosition" type="tns:labelPosition"/>
-    <xs:attribute name="multiLine" type="xs:int"/>
-    <xs:attribute name="namedEscaped" type="xs:boolean"/>
-    <xs:attribute name="renderedAsDayBefore" type="xs:boolean"/>
-    <xs:attribute name="typicalLength" type="xs:int"/>
-  </xs:complexType>
-
-  <xs:complexType name="collectionLayoutMetadata">
-    <xs:sequence>
-      <xs:element name="named" type="xs:string" minOccurs="0"/>
-      <xs:element name="describedAs" type="xs:string" minOccurs="0"/>
-      <xs:element name="sortedBy" type="xs:string" minOccurs="0"/>
-      <xs:element name="actions" minOccurs="0">
-        <xs:complexType>
-          <xs:sequence>
-            <xs:element name="action" type="tns:actionLayout" minOccurs="0" maxOccurs="unbounded"/>
-          </xs:sequence>
-        </xs:complexType>
-      </xs:element>
-      <xs:element name="metadataError" type="xs:string" minOccurs="0"/>
-    </xs:sequence>
-    <xs:attribute name="cssClass" type="xs:string"/>
-    <xs:attribute name="defaultView" type="xs:string"/>
-    <xs:attribute name="hidden" type="tns:where"/>
-    <xs:attribute name="id" type="xs:string" use="required"/>
-    <xs:attribute name="namedEscaped" type="xs:boolean"/>
-    <xs:attribute name="paged" type="xs:int"/>
-  </xs:complexType>
-
-  <xs:complexType name="tabGroup">
-    <xs:sequence>
-      <xs:element name="tab" type="tns:tab" maxOccurs="unbounded"/>
-    </xs:sequence>
-  </xs:complexType>
-
-  <xs:complexType name="tab">
-    <xs:sequence>
-      <xs:element name="left" type="tns:column"/>
-      <xs:element name="middle" type="tns:column" minOccurs="0"/>
-      <xs:element name="right" type="tns:column" minOccurs="0"/>
-    </xs:sequence>
-    <xs:attribute name="name" type="xs:string" use="required"/>
-  </xs:complexType>
-
-  <xs:simpleType name="bookmarkPolicy">
-    <xs:restriction base="xs:string">
-      <xs:enumeration value="AS_ROOT"/>
-      <xs:enumeration value="AS_CHILD"/>
-      <xs:enumeration value="NEVER"/>
-    </xs:restriction>
-  </xs:simpleType>
-
-  <xs:simpleType name="cssClassFaPosition">
-    <xs:restriction base="xs:string">
-      <xs:enumeration value="LEFT"/>
-      <xs:enumeration value="RIGHT"/>
-    </xs:restriction>
-  </xs:simpleType>
-
-  <xs:simpleType name="where">
-    <xs:restriction base="xs:string">
-      <xs:enumeration value="EVERYWHERE"/>
-      <xs:enumeration value="ANYWHERE"/>
-      <xs:enumeration value="OBJECT_FORMS"/>
-      <xs:enumeration value="REFERENCES_PARENT"/>
-      <xs:enumeration value="PARENTED_TABLES"/>
-      <xs:enumeration value="STANDALONE_TABLES"/>
-      <xs:enumeration value="ALL_TABLES"/>
-      <xs:enumeration value="ALL_EXCEPT_STANDALONE_TABLES"/>
-      <xs:enumeration value="NOWHERE"/>
-      <xs:enumeration value="NOT_SPECIFIED"/>
-    </xs:restriction>
-  </xs:simpleType>
-
-  <xs:simpleType name="position">
-    <xs:restriction base="xs:string">
-      <xs:enumeration value="BELOW"/>
-      <xs:enumeration value="RIGHT"/>
-      <xs:enumeration value="PANEL"/>
-      <xs:enumeration value="PANEL_DROPDOWN"/>
-    </xs:restriction>
-  </xs:simpleType>
-
-  <xs:simpleType name="labelPosition">
-    <xs:restriction base="xs:string">
-      <xs:enumeration value="DEFAULT"/>
-      <xs:enumeration value="LEFT"/>
-      <xs:enumeration value="RIGHT"/>
-      <xs:enumeration value="TOP"/>
-      <xs:enumeration value="NONE"/>
-    </xs:restriction>
-  </xs:simpleType>
-</xs:schema>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/isis/blob/8f0abcdb/adocs/documentation/src/main/asciidoc/schema/applib/layout/members/v1/members.xsd
----------------------------------------------------------------------
diff --git a/adocs/documentation/src/main/asciidoc/schema/applib/layout/members/v1/members.xsd b/adocs/documentation/src/main/asciidoc/schema/applib/layout/members/v1/members.xsd
new file mode 100644
index 0000000..c5940b4
--- /dev/null
+++ b/adocs/documentation/src/main/asciidoc/schema/applib/layout/members/v1/members.xsd
@@ -0,0 +1,109 @@
+<?xml version="1.0" standalone="yes"?>
+<xs:schema elementFormDefault="qualified" version="1.0" targetNamespace="http://isis.apache.org/schema/applib/layout/members/v1" xmlns:tns="http://isis.apache.org/schema/applib/layout/members/v1" xmlns:xs="http://www.w3.org/2001/XMLSchema">
+
+  <xs:complexType name="actionLayout">
+    <xs:sequence>
+      <xs:element name="named" type="xs:string" minOccurs="0"/>
+      <xs:element name="describedAs" type="xs:string" minOccurs="0"/>
+      <xs:element name="metadataError" type="xs:string" minOccurs="0"/>
+    </xs:sequence>
+    <xs:attribute name="bookmarking" type="tns:bookmarkPolicy"/>
+    <xs:attribute name="cssClass" type="xs:string"/>
+    <xs:attribute name="cssClassFa" type="xs:string"/>
+    <xs:attribute name="cssClassFaPosition" type="tns:cssClassFaPosition"/>
+    <xs:attribute name="hidden" type="tns:where"/>
+    <xs:attribute name="id" type="xs:string" use="required"/>
+    <xs:attribute name="namedEscaped" type="xs:boolean"/>
+    <xs:attribute name="position" type="tns:position"/>
+  </xs:complexType>
+
+  <xs:complexType name="fieldSet">
+    <xs:sequence>
+      <xs:element name="action" type="tns:actionLayout" minOccurs="0" maxOccurs="unbounded"/>
+      <xs:element name="property" type="tns:propertyLayout" maxOccurs="unbounded"/>
+    </xs:sequence>
+    <xs:attribute name="name" type="xs:string" use="required"/>
+  </xs:complexType>
+
+  <xs:complexType name="propertyLayout">
+    <xs:sequence>
+      <xs:element name="named" type="xs:string" minOccurs="0"/>
+      <xs:element name="describedAs" type="xs:string" minOccurs="0"/>
+      <xs:element name="action" type="tns:actionLayout" minOccurs="0" maxOccurs="unbounded"/>
+      <xs:element name="metadataError" type="xs:string" minOccurs="0"/>
+    </xs:sequence>
+    <xs:attribute name="cssClass" type="xs:string"/>
+    <xs:attribute name="hidden" type="tns:where"/>
+    <xs:attribute name="id" type="xs:string" use="required"/>
+    <xs:attribute name="labelPosition" type="tns:labelPosition"/>
+    <xs:attribute name="multiLine" type="xs:int"/>
+    <xs:attribute name="namedEscaped" type="xs:boolean"/>
+    <xs:attribute name="renderedAsDayBefore" type="xs:boolean"/>
+    <xs:attribute name="typicalLength" type="xs:int"/>
+  </xs:complexType>
+
+  <xs:complexType name="collectionLayoutData">
+    <xs:sequence>
+      <xs:element name="named" type="xs:string" minOccurs="0"/>
+      <xs:element name="describedAs" type="xs:string" minOccurs="0"/>
+      <xs:element name="sortedBy" type="xs:string" minOccurs="0"/>
+      <xs:element name="action" type="tns:actionLayout" minOccurs="0" maxOccurs="unbounded"/>
+      <xs:element name="metadataError" type="xs:string" minOccurs="0"/>
+    </xs:sequence>
+    <xs:attribute name="cssClass" type="xs:string"/>
+    <xs:attribute name="defaultView" type="xs:string"/>
+    <xs:attribute name="hidden" type="tns:where"/>
+    <xs:attribute name="id" type="xs:string" use="required"/>
+    <xs:attribute name="namedEscaped" type="xs:boolean"/>
+    <xs:attribute name="paged" type="xs:int"/>
+  </xs:complexType>
+
+  <xs:simpleType name="bookmarkPolicy">
+    <xs:restriction base="xs:string">
+      <xs:enumeration value="AS_ROOT"/>
+      <xs:enumeration value="AS_CHILD"/>
+      <xs:enumeration value="NEVER"/>
+    </xs:restriction>
+  </xs:simpleType>
+
+  <xs:simpleType name="cssClassFaPosition">
+    <xs:restriction base="xs:string">
+      <xs:enumeration value="LEFT"/>
+      <xs:enumeration value="RIGHT"/>
+    </xs:restriction>
+  </xs:simpleType>
+
+  <xs:simpleType name="where">
+    <xs:restriction base="xs:string">
+      <xs:enumeration value="EVERYWHERE"/>
+      <xs:enumeration value="ANYWHERE"/>
+      <xs:enumeration value="OBJECT_FORMS"/>
+      <xs:enumeration value="REFERENCES_PARENT"/>
+      <xs:enumeration value="PARENTED_TABLES"/>
+      <xs:enumeration value="STANDALONE_TABLES"/>
+      <xs:enumeration value="ALL_TABLES"/>
+      <xs:enumeration value="ALL_EXCEPT_STANDALONE_TABLES"/>
+      <xs:enumeration value="NOWHERE"/>
+      <xs:enumeration value="NOT_SPECIFIED"/>
+    </xs:restriction>
+  </xs:simpleType>
+
+  <xs:simpleType name="position">
+    <xs:restriction base="xs:string">
+      <xs:enumeration value="BELOW"/>
+      <xs:enumeration value="RIGHT"/>
+      <xs:enumeration value="PANEL"/>
+      <xs:enumeration value="PANEL_DROPDOWN"/>
+    </xs:restriction>
+  </xs:simpleType>
+
+  <xs:simpleType name="labelPosition">
+    <xs:restriction base="xs:string">
+      <xs:enumeration value="DEFAULT"/>
+      <xs:enumeration value="LEFT"/>
+      <xs:enumeration value="RIGHT"/>
+      <xs:enumeration value="TOP"/>
+      <xs:enumeration value="NONE"/>
+    </xs:restriction>
+  </xs:simpleType>
+</xs:schema>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/isis/blob/8f0abcdb/core/applib/src/main/java/org/apache/isis/applib/annotation/DomainObjectLayout.java
----------------------------------------------------------------------
diff --git a/core/applib/src/main/java/org/apache/isis/applib/annotation/DomainObjectLayout.java b/core/applib/src/main/java/org/apache/isis/applib/annotation/DomainObjectLayout.java
index 0499cf3..84a8fca 100644
--- a/core/applib/src/main/java/org/apache/isis/applib/annotation/DomainObjectLayout.java
+++ b/core/applib/src/main/java/org/apache/isis/applib/annotation/DomainObjectLayout.java
@@ -126,7 +126,7 @@ s     */
      * If annotated on a type, then the page size refers to standalone
      * collections (eg as returned from a repository query).
      */
-    public int paged() default -1;
+    int paged() default -1;
 
 
     // //////////////////////////////////////

http://git-wip-us.apache.org/repos/asf/isis/blob/8f0abcdb/core/applib/src/main/java/org/apache/isis/applib/layout/bootstrap3/BS3ClearFix.java
----------------------------------------------------------------------
diff --git a/core/applib/src/main/java/org/apache/isis/applib/layout/bootstrap3/BS3ClearFix.java b/core/applib/src/main/java/org/apache/isis/applib/layout/bootstrap3/BS3ClearFix.java
new file mode 100644
index 0000000..abe186b
--- /dev/null
+++ b/core/applib/src/main/java/org/apache/isis/applib/layout/bootstrap3/BS3ClearFix.java
@@ -0,0 +1,23 @@
+/*
+ *  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.applib.layout.bootstrap3;
+
+public abstract class BS3ClearFix extends BS3RowContent {
+
+}

http://git-wip-us.apache.org/repos/asf/isis/blob/8f0abcdb/core/applib/src/main/java/org/apache/isis/applib/layout/bootstrap3/BS3ClearFixHidden.java
----------------------------------------------------------------------
diff --git a/core/applib/src/main/java/org/apache/isis/applib/layout/bootstrap3/BS3ClearFixHidden.java b/core/applib/src/main/java/org/apache/isis/applib/layout/bootstrap3/BS3ClearFixHidden.java
new file mode 100644
index 0000000..dd7a33c
--- /dev/null
+++ b/core/applib/src/main/java/org/apache/isis/applib/layout/bootstrap3/BS3ClearFixHidden.java
@@ -0,0 +1,30 @@
+/*
+ *  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.applib.layout.bootstrap3;
+
+import javax.xml.bind.annotation.XmlType;
+
+@XmlType(
+        name = "clearFixHidden"
+)
+public class BS3ClearFixHidden extends BS3ClearFix {
+
+    private static final long serialVersionUID = 1L;
+
+}

http://git-wip-us.apache.org/repos/asf/isis/blob/8f0abcdb/core/applib/src/main/java/org/apache/isis/applib/layout/bootstrap3/BS3ClearFixVisible.java
----------------------------------------------------------------------
diff --git a/core/applib/src/main/java/org/apache/isis/applib/layout/bootstrap3/BS3ClearFixVisible.java b/core/applib/src/main/java/org/apache/isis/applib/layout/bootstrap3/BS3ClearFixVisible.java
new file mode 100644
index 0000000..644d6b6
--- /dev/null
+++ b/core/applib/src/main/java/org/apache/isis/applib/layout/bootstrap3/BS3ClearFixVisible.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.applib.layout.bootstrap3;
+
+import javax.xml.bind.annotation.XmlAttribute;
+import javax.xml.bind.annotation.XmlType;
+
+@XmlType(
+        name = "clearFixVisible"
+)
+public class BS3ClearFixVisible extends BS3ClearFix {
+
+    private static final long serialVersionUID = 1L;
+
+    public enum CssDisplay {
+        BLOCK,
+        INLINE,
+        INLINE_BLOCK
+    }
+
+    private CssDisplay cssDisplay;
+
+
+    @XmlAttribute(required = true)
+    public CssDisplay getCssDisplay() {
+        return cssDisplay;
+    }
+
+    public void setCssDisplay(final CssDisplay cssDisplay) {
+        this.cssDisplay = cssDisplay;
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/isis/blob/8f0abcdb/core/applib/src/main/java/org/apache/isis/applib/layout/bootstrap3/BS3Col.java
----------------------------------------------------------------------
diff --git a/core/applib/src/main/java/org/apache/isis/applib/layout/bootstrap3/BS3Col.java b/core/applib/src/main/java/org/apache/isis/applib/layout/bootstrap3/BS3Col.java
index 4e948be..e4cde55 100644
--- a/core/applib/src/main/java/org/apache/isis/applib/layout/bootstrap3/BS3Col.java
+++ b/core/applib/src/main/java/org/apache/isis/applib/layout/bootstrap3/BS3Col.java
@@ -21,21 +21,97 @@ package org.apache.isis.applib.layout.bootstrap3;
 import java.util.ArrayList;
 import java.util.List;
 
+import javax.xml.bind.annotation.XmlAttribute;
 import javax.xml.bind.annotation.XmlElement;
+import javax.xml.bind.annotation.XmlElementWrapper;
 import javax.xml.bind.annotation.XmlType;
 
+import org.apache.isis.applib.layout.members.v1.ActionLayoutData;
+import org.apache.isis.applib.layout.members.v1.CollectionLayoutData;
+import org.apache.isis.applib.layout.members.v1.DomainObjectLayoutData;
 import org.apache.isis.applib.layout.members.v1.FieldSet;
 
+/**
+ * A column within a row which, depending on its {@link #getSpan()}, could be as narrow as 1/12th of the page's width, all the way up to spanning the entire page.
+ *
+ * <p>
+ *     Pretty much other content can be contained within a column, though most commonly it will be {@link FieldSet fieldset}s
+ *     (a group of properties) or {@link CollectionLayoutData collection}s.  However, columns can also be used to
+ *     contain further {@link BS3Row row}s (creating a nested grid of rows/cols/rows/cols) and {@link BS3TabGroup tabgroup}s.
+ * </p>
+ *
+ * <p>
+ *     It is also possible for them to contain specifically identified {@link org.apache.isis.applib.layout.members.v1.ActionLayoutData action}s and even the domain object's
+ *     {@link DomainObjectLayoutData title and icon}.  Most pages however tend to show these elements in a top-level
+ *     header, and so if that's the case then use the page's {@link BS3Page#setHeader(boolean) header} attribute that
+ *     is provided as a convenience.
+ * </p>
+ *
+ * <p>
+ *     It is rendered as a (eg) &lt;div class=&quot;col-md-4 ...&quot;&gt;
+ * </p>
+ */
 @XmlType(
         name = "col"
         , propOrder = {
+            "domainObjectLayout",
+            "actions",
             "rows",
             "tabGroup",
-            "propGroups",
+            "fieldSets",
             "collections",
         }
 )
-public class BS3Col {
+public class BS3Col extends BS3RowContent {
+
+    private static final long serialVersionUID = 1L;
+
+
+    private int span;
+
+    @XmlAttribute(required = true)
+    public int getSpan() {
+        return span;
+    }
+
+    public void setSpan(final int span) {
+        this.span = span;
+    }
+
+
+
+    private DomainObjectLayoutData domainObjectLayoutData;
+
+    /**
+     * Whether to show the object's icon and title.
+     *
+     * <p>
+     *     Generally speaking it is easier
+     * </p>
+     */
+    @XmlElement(name = "domainObjectLayout", required = false)
+    public DomainObjectLayoutData getDomainObjectLayoutData() {
+        return domainObjectLayoutData;
+    }
+
+    public void setDomainObjectLayoutData(final DomainObjectLayoutData domainObjectLayoutData) {
+        this.domainObjectLayoutData = domainObjectLayoutData;
+    }
+
+
+
+    private List<ActionLayoutData> actions = new ArrayList<ActionLayoutData>();
+
+    @XmlElementWrapper(required = false)
+    @XmlElement(name = "action", required = false)
+    public List<ActionLayoutData> getActions() {
+        return actions;
+    }
+
+    public void setActions(final List<ActionLayoutData> actions) {
+        this.actions = actions;
+    }
+
 
 
     private List<BS3Row> rows = new ArrayList<BS3Row>();
@@ -80,5 +156,4 @@ public class BS3Col {
 
 
 
-
 }

http://git-wip-us.apache.org/repos/asf/isis/blob/8f0abcdb/core/applib/src/main/java/org/apache/isis/applib/layout/bootstrap3/BS3ElementAbstract.java
----------------------------------------------------------------------
diff --git a/core/applib/src/main/java/org/apache/isis/applib/layout/bootstrap3/BS3ElementAbstract.java b/core/applib/src/main/java/org/apache/isis/applib/layout/bootstrap3/BS3ElementAbstract.java
new file mode 100644
index 0000000..6bcd45a
--- /dev/null
+++ b/core/applib/src/main/java/org/apache/isis/applib/layout/bootstrap3/BS3ElementAbstract.java
@@ -0,0 +1,67 @@
+/*
+ *  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.applib.layout.bootstrap3;
+
+import java.io.Serializable;
+
+import javax.xml.bind.annotation.XmlAttribute;
+import javax.xml.bind.annotation.XmlTransient;
+
+import org.apache.isis.applib.annotation.Programmatic;
+
+/**
+ * Superclass for all layout classes, factoring out the common {@link #getCssClass()} attribute.
+ */
+public abstract class BS3ElementAbstract implements Serializable {
+
+    private String cssClass;
+
+    /**
+     * Any additional CSS classes to render on the page element corresponding to this object,
+     * eg as per the <a href="http://getbootstrap.com/css/#grid-less">Bootstrap mixins</a> or just for
+     * custom styling.
+     */
+    @XmlAttribute(required = false)
+    public String getCssClass() {
+        return cssClass;
+    }
+
+    public void setCssClass(final String cssClass) {
+        this.cssClass = cssClass;
+    }
+
+
+
+
+    private String path;
+
+    @Programmatic
+    @XmlTransient
+    public String getPath() {
+        return path;
+    }
+
+    @Programmatic
+    public void setPath(final String path) {
+        this.path = path;
+    }
+
+
+
+}

http://git-wip-us.apache.org/repos/asf/isis/blob/8f0abcdb/core/applib/src/main/java/org/apache/isis/applib/layout/bootstrap3/BS3Page.java
----------------------------------------------------------------------
diff --git a/core/applib/src/main/java/org/apache/isis/applib/layout/bootstrap3/BS3Page.java b/core/applib/src/main/java/org/apache/isis/applib/layout/bootstrap3/BS3Page.java
index 0b81c30..22b7c5a 100644
--- a/core/applib/src/main/java/org/apache/isis/applib/layout/bootstrap3/BS3Page.java
+++ b/core/applib/src/main/java/org/apache/isis/applib/layout/bootstrap3/BS3Page.java
@@ -21,16 +21,32 @@ package org.apache.isis.applib.layout.bootstrap3;
 import java.util.ArrayList;
 import java.util.List;
 
+import javax.xml.bind.annotation.XmlAttribute;
 import javax.xml.bind.annotation.XmlElement;
 import javax.xml.bind.annotation.XmlRootElement;
+import javax.xml.bind.annotation.XmlTransient;
 import javax.xml.bind.annotation.XmlType;
 
+import org.apache.isis.applib.annotation.Programmatic;
+import org.apache.isis.applib.layout.members.v1.ActionLayoutData;
+import org.apache.isis.applib.layout.members.v1.DomainObjectLayoutData;
+import org.apache.isis.applib.layout.members.v1.Page;
+import org.apache.isis.applib.services.dto.Dto;
+
 /**
- * This is the top-level region for the domain object's properties, collections and actions.  It simply consists
+ * This is the top-level for rendering the domain object's properties, collections and actions.  It simply consists
  * of a number of rows.
  *
  * <p>
- *     Note that the title's
+ *     The {@link #isHeader()} is intended as a convenience to automatically render the object's icon/title and any
+ *     {@link ActionLayoutData action}s not otherwise associated with object members.  It is required to be
+ *     specified and will be set to <code>true</code> for the vast majority of domain object.  If set to 
+ *     <code>false</code> then the icon/title and actions can instead be rendered within a {@link BS3Col col}umn, at
+ *     anywhere on the page.
+ * </p>
+ *
+ * <p>
+ *     The element is rendered as a &lt;div class=&quot;...&quot;&gt;
  * </p>
  */
 @XmlRootElement(
@@ -42,7 +58,31 @@ import javax.xml.bind.annotation.XmlType;
             "rows"
         }
 )
-public class BS3Page {
+public class BS3Page extends BS3ElementAbstract implements Page, Dto {
+
+    private static final long serialVersionUID = 1L;
+
+
+    private boolean header;
+
+    /**
+     * Whether to render the top-level header (consisting of {@link DomainObjectLayoutData icon/title} and any
+     * not-otherwise-identified {@link ActionLayoutData action}s.
+     *
+     * <p>
+     *     Most pages will have this set.  Note that it is possible however to leave this unset and then to manually
+     *     construct the header (or some other arrangement) using {@link BS3Col col}.
+     * </p>
+     */
+    @XmlAttribute(required = true)
+    public boolean isHeader() {
+        return header;
+    }
+
+    public void setHeader(final boolean header) {
+        this.header = header;
+    }
+
 
     private List<BS3Row> rows = new ArrayList<BS3Row>(){{
         add(new BS3Row());
@@ -60,4 +100,18 @@ public class BS3Page {
 
 
 
+    private boolean normalized;
+
+    @Programmatic
+    @XmlTransient
+    public boolean isNormalized() {
+        return normalized;
+    }
+
+    @Programmatic
+    public void setNormalized(final boolean normalized) {
+        this.normalized = normalized;
+    }
+
+
 }

http://git-wip-us.apache.org/repos/asf/isis/blob/8f0abcdb/core/applib/src/main/java/org/apache/isis/applib/layout/bootstrap3/BS3Row.java
----------------------------------------------------------------------
diff --git a/core/applib/src/main/java/org/apache/isis/applib/layout/bootstrap3/BS3Row.java b/core/applib/src/main/java/org/apache/isis/applib/layout/bootstrap3/BS3Row.java
index ea78d7c..370c5bf 100644
--- a/core/applib/src/main/java/org/apache/isis/applib/layout/bootstrap3/BS3Row.java
+++ b/core/applib/src/main/java/org/apache/isis/applib/layout/bootstrap3/BS3Row.java
@@ -24,29 +24,36 @@ import java.util.List;
 import javax.xml.bind.annotation.XmlElement;
 import javax.xml.bind.annotation.XmlType;
 
+/**
+ * Contains a row of content, either on the top-level {@link BS3Page page} or at any other lower-level element that can
+ * contain rows, eg {@link BS3Tab tabs}.
+ *
+ * <p>
+ *     It is rendered as a &lt;div class=&quot;row ...&quot;&gt;
+ * </p>
+ */
 @XmlType(
         name = "row"
         , propOrder = {
-            "columns"
+            "cols"
         }
 )
-public class BS3Row {
+public class BS3Row extends BS3ElementAbstract {
 
+    private static final long serialVersionUID = 1L;
 
-
-    private List<BS3Col> columns = new ArrayList<BS3Col>(){{
+    private List<BS3RowContent> cols = new ArrayList<BS3RowContent>(){{
         add(new BS3Col());
     }};
 
     // no wrapper
-    @XmlElement(name = "column", required = true)
-    public List<BS3Col> getColumns() {
-        return columns;
+    @XmlElement(name = "col", required = true)
+    public List<BS3RowContent> getCols() {
+        return cols;
     }
 
-    public void setColumns(final List<BS3Col> columns) {
-        this.columns = columns;
+    public void setCols(final List<BS3RowContent> cols) {
+        this.cols = cols;
     }
 
-
 }

http://git-wip-us.apache.org/repos/asf/isis/blob/8f0abcdb/core/applib/src/main/java/org/apache/isis/applib/layout/bootstrap3/BS3RowContent.java
----------------------------------------------------------------------
diff --git a/core/applib/src/main/java/org/apache/isis/applib/layout/bootstrap3/BS3RowContent.java b/core/applib/src/main/java/org/apache/isis/applib/layout/bootstrap3/BS3RowContent.java
new file mode 100644
index 0000000..9caf07d
--- /dev/null
+++ b/core/applib/src/main/java/org/apache/isis/applib/layout/bootstrap3/BS3RowContent.java
@@ -0,0 +1,61 @@
+/*
+ *  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.applib.layout.bootstrap3;
+
+import javax.xml.bind.annotation.XmlAttribute;
+
+/**
+ * Common superclass for any content of a row.
+ *
+ * <p>
+ *     Most commonly the content of a row is {@link BS3Col col}umns, but it may be either of the
+ *     {@link BS3ClearFix clearfix} classes.
+ * </p>
+ *
+ */
+public abstract class BS3RowContent extends BS3ElementAbstract {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * As per <a href="http://getbootstrap.com/css/#grid-options">grid options</a>, also used in
+     * <a href="http://getbootstrap.com/css/#responsive-utilities">responsive utility</a> classes.
+     */
+    public static enum Size {
+        XS,
+        SM,
+        MD,
+        LG
+    }
+
+    private Size size;
+
+    /**
+     * Default if not specified is {@link Size#MD}.
+     */
+    @XmlAttribute(required = false)
+    public Size getSize() {
+        return size;
+    }
+
+    public void setSize(final Size size) {
+        this.size = size;
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/isis/blob/8f0abcdb/core/applib/src/main/java/org/apache/isis/applib/layout/bootstrap3/BS3Tab.java
----------------------------------------------------------------------
diff --git a/core/applib/src/main/java/org/apache/isis/applib/layout/bootstrap3/BS3Tab.java b/core/applib/src/main/java/org/apache/isis/applib/layout/bootstrap3/BS3Tab.java
index aea912d..8830bd1 100644
--- a/core/applib/src/main/java/org/apache/isis/applib/layout/bootstrap3/BS3Tab.java
+++ b/core/applib/src/main/java/org/apache/isis/applib/layout/bootstrap3/BS3Tab.java
@@ -25,6 +25,13 @@ import javax.xml.bind.annotation.XmlAttribute;
 import javax.xml.bind.annotation.XmlElement;
 import javax.xml.bind.annotation.XmlType;
 
+/**
+ * Represents a tab within a {@link BS3TabGroup tab group}.
+ *
+ * <p>
+ *     They simply contain one or more {@link BS3Row row}s.
+ * </p>
+ */
 @XmlType(
         name = "tab"
         , propOrder = {
@@ -32,13 +39,9 @@ import javax.xml.bind.annotation.XmlType;
             "rows"
         }
 )
-public class BS3Tab {
-
-    // at least one row
-    private List<BS3Row> rows = new ArrayList<BS3Row>(){{
-        add(new BS3Row());
-    }};
+public class BS3Tab extends BS3ElementAbstract {
 
+    private static final long serialVersionUID = 1L;
 
     private String name;
     @XmlAttribute(required = true)
@@ -51,6 +54,11 @@ public class BS3Tab {
     }
 
 
+    // at least one row
+    private List<BS3Row> rows = new ArrayList<BS3Row>(){{
+        add(new BS3Row());
+    }};
+
     // no wrapper
     @XmlElement(name = "row", required = true)
     public List<BS3Row> getRows() {

http://git-wip-us.apache.org/repos/asf/isis/blob/8f0abcdb/core/applib/src/main/java/org/apache/isis/applib/layout/bootstrap3/BS3TabGroup.java
----------------------------------------------------------------------
diff --git a/core/applib/src/main/java/org/apache/isis/applib/layout/bootstrap3/BS3TabGroup.java b/core/applib/src/main/java/org/apache/isis/applib/layout/bootstrap3/BS3TabGroup.java
index 8221069..7fae67b 100644
--- a/core/applib/src/main/java/org/apache/isis/applib/layout/bootstrap3/BS3TabGroup.java
+++ b/core/applib/src/main/java/org/apache/isis/applib/layout/bootstrap3/BS3TabGroup.java
@@ -24,27 +24,31 @@ import java.util.List;
 import javax.xml.bind.annotation.XmlElement;
 import javax.xml.bind.annotation.XmlType;
 
+/**
+ * Represents a tab group containing one or more {@link BS3Tab tab}s.
+ */
 @XmlType(
         name = "tabGroup"
         , propOrder = {
             "tabs"
         }
 )
-public class BS3TabGroup {
+public class BS3TabGroup extends BS3ElementAbstract{
+
+    private static final long serialVersionUID = 1L;
+
 
-    private List<BS3Col> columns = new ArrayList<BS3Col>(){{
-        add(new BS3Col());
+    private List<BS3Tab> tabs = new ArrayList<BS3Tab>(){{
+        add(new BS3Tab());
     }};
 
     // no wrapper
-    @XmlElement(name = "column", required = true)
-    public List<BS3Col> getColumns() {
-        return columns;
+    @XmlElement(name = "tab", required = true)
+    public List<BS3Tab> getTabs() {
+        return tabs;
     }
 
-    public void setColumns(final List<BS3Col> columns) {
-        this.columns = columns;
+    public void setTabs(final List<BS3Tab> tabs) {
+        this.tabs = tabs;
     }
-
-
 }

http://git-wip-us.apache.org/repos/asf/isis/blob/8f0abcdb/core/applib/src/main/java/org/apache/isis/applib/layout/fixedcols/FCColumn.java
----------------------------------------------------------------------
diff --git a/core/applib/src/main/java/org/apache/isis/applib/layout/fixedcols/FCColumn.java b/core/applib/src/main/java/org/apache/isis/applib/layout/fixedcols/FCColumn.java
index 830b21d..b0b369e 100644
--- a/core/applib/src/main/java/org/apache/isis/applib/layout/fixedcols/FCColumn.java
+++ b/core/applib/src/main/java/org/apache/isis/applib/layout/fixedcols/FCColumn.java
@@ -48,7 +48,7 @@ import org.apache.isis.applib.layout.members.v1.PropertyLayoutData;
  */
 @XmlType(
         propOrder = {
-                "propertyGroups"
+                "fieldSets"
                 , "collections"
         }
 )
@@ -79,7 +79,7 @@ public class FCColumn implements Serializable, MemberRegionOwner, Owned<FCColumn
     private List<FieldSet> fieldSets = Lists.newArrayList();
 
     // no wrapper
-    @XmlElement(name = "propertyGroup", required = false)
+    @XmlElement(name = "fieldSet", required = false)
     public List<FieldSet> getFieldSets() {
         return fieldSets;
     }

http://git-wip-us.apache.org/repos/asf/isis/blob/8f0abcdb/core/applib/src/main/java/org/apache/isis/applib/layout/fixedcols/FCPage.java
----------------------------------------------------------------------
diff --git a/core/applib/src/main/java/org/apache/isis/applib/layout/fixedcols/FCPage.java b/core/applib/src/main/java/org/apache/isis/applib/layout/fixedcols/FCPage.java
index c5ff91c..a5f6708 100644
--- a/core/applib/src/main/java/org/apache/isis/applib/layout/fixedcols/FCPage.java
+++ b/core/applib/src/main/java/org/apache/isis/applib/layout/fixedcols/FCPage.java
@@ -23,7 +23,6 @@ import java.util.LinkedHashMap;
 import java.util.List;
 
 import javax.xml.bind.annotation.XmlElement;
-import javax.xml.bind.annotation.XmlElementWrapper;
 import javax.xml.bind.annotation.XmlRootElement;
 import javax.xml.bind.annotation.XmlTransient;
 import javax.xml.bind.annotation.XmlType;
@@ -35,6 +34,7 @@ import org.apache.isis.applib.layout.members.v1.ActionLayoutData;
 import org.apache.isis.applib.layout.members.v1.ActionOwner;
 import org.apache.isis.applib.layout.members.v1.CollectionLayoutData;
 import org.apache.isis.applib.layout.members.v1.FieldSet;
+import org.apache.isis.applib.layout.members.v1.Page;
 import org.apache.isis.applib.layout.members.v1.PropertyLayoutData;
 import org.apache.isis.applib.services.dto.Dto;
 
@@ -43,10 +43,10 @@ import org.apache.isis.applib.services.dto.Dto;
  * far right, with the middle consisting of a number of {@link FCTabGroup tabgroup}s, stacked vertically.
  */
 @XmlRootElement(
-        name = "objectLayout"
+        name = "page"
 )
 @XmlType(
-        name = "objectLayout"
+        name = "page"
         , propOrder = {
                 "actions"
                 , "left"
@@ -54,13 +54,13 @@ import org.apache.isis.applib.services.dto.Dto;
                 , "right"
         }
 )
-public class FCPage implements Dto, ActionOwner, Serializable, FCColumnOwner, FCTabGroupOwner {
+public class FCPage implements Page, Dto, ActionOwner, Serializable, FCColumnOwner, FCTabGroupOwner {
 
     private static final long serialVersionUID = 1L;
 
     private List<ActionLayoutData> actions;
 
-    @XmlElementWrapper(name = "actions", required = false)
+    // no wrapper
     @XmlElement(name = "action", required = false)
     public List<ActionLayoutData> getActions() {
         return actions;
@@ -109,9 +109,9 @@ public class FCPage implements Dto, ActionOwner, Serializable, FCColumnOwner, FC
     public void setRight(final FCColumn right) {
         this.right = right;
     }
-    
 
-    public interface Visitor {
+
+    interface Visitor {
         void visit(final FCPage FCPage);
         void visit(final FCTabGroup tabGroup);
         void visit(final FCTab FCTab);
@@ -283,18 +283,6 @@ public class FCPage implements Dto, ActionOwner, Serializable, FCColumnOwner, FC
     }
 
 
-    private String path;
-
-    @Programmatic
-    @XmlTransient
-    public String getPath() {
-        return path;
-    }
-
-    @Programmatic
-    public void setPath(final String path) {
-        this.path = path;
-    }
 
 
     private boolean normalized;

http://git-wip-us.apache.org/repos/asf/isis/blob/8f0abcdb/core/applib/src/main/java/org/apache/isis/applib/layout/members/v1/CollectionLayoutData.java
----------------------------------------------------------------------
diff --git a/core/applib/src/main/java/org/apache/isis/applib/layout/members/v1/CollectionLayoutData.java b/core/applib/src/main/java/org/apache/isis/applib/layout/members/v1/CollectionLayoutData.java
index 8b9a608..a9723c6 100644
--- a/core/applib/src/main/java/org/apache/isis/applib/layout/members/v1/CollectionLayoutData.java
+++ b/core/applib/src/main/java/org/apache/isis/applib/layout/members/v1/CollectionLayoutData.java
@@ -23,7 +23,6 @@ import java.util.List;
 
 import javax.xml.bind.annotation.XmlAttribute;
 import javax.xml.bind.annotation.XmlElement;
-import javax.xml.bind.annotation.XmlElementWrapper;
 import javax.xml.bind.annotation.XmlTransient;
 import javax.xml.bind.annotation.XmlType;
 
@@ -184,7 +183,7 @@ public class CollectionLayoutData implements MemberRegion, ActionOwner, Serializ
 
     private List<ActionLayoutData> actions;
 
-    @XmlElementWrapper(name = "actions", required = false)
+    // no wrapper
     @XmlElement(name = "action", required = false)
     public List<ActionLayoutData> getActions() {
         return actions;

http://git-wip-us.apache.org/repos/asf/isis/blob/8f0abcdb/core/applib/src/main/java/org/apache/isis/applib/layout/members/v1/DomainObjectLayoutData.java
----------------------------------------------------------------------
diff --git a/core/applib/src/main/java/org/apache/isis/applib/layout/members/v1/DomainObjectLayoutData.java b/core/applib/src/main/java/org/apache/isis/applib/layout/members/v1/DomainObjectLayoutData.java
new file mode 100644
index 0000000..29807a2
--- /dev/null
+++ b/core/applib/src/main/java/org/apache/isis/applib/layout/members/v1/DomainObjectLayoutData.java
@@ -0,0 +1,158 @@
+/*
+ *  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.applib.layout.members.v1;
+
+import java.io.Serializable;
+
+import javax.xml.bind.annotation.XmlAttribute;
+import javax.xml.bind.annotation.XmlElement;
+import javax.xml.bind.annotation.XmlType;
+
+import org.apache.isis.applib.annotation.BookmarkPolicy;
+
+/**
+ * Describes the layout of the title and icon of a domain object, broadly corresponding to {@link org.apache.isis.applib.annotation.DomainObjectLayout}.
+ */
+@XmlType(
+    name = "domainObjectLayout"
+    , propOrder = {
+        "named"
+        , "describedAs"
+        , "plural"
+        , "metadataError"
+    }
+)
+public class DomainObjectLayoutData implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    public DomainObjectLayoutData() {
+    }
+
+
+    private BookmarkPolicy bookmarking;
+
+    @XmlAttribute(required = false)
+    public BookmarkPolicy getBookmarking() {
+        return bookmarking;
+    }
+
+    public void setBookmarking(BookmarkPolicy bookmarking) {
+        this.bookmarking = bookmarking;
+    }
+
+
+
+    private String cssClass;
+
+    @XmlAttribute(required = false)
+    public String getCssClass() {
+        return cssClass;
+    }
+
+    public void setCssClass(String cssClass) {
+        this.cssClass = cssClass;
+    }
+
+
+    private String cssClassFa;
+
+    @XmlAttribute(required = false)
+    public String getCssClassFa() {
+        return cssClassFa;
+    }
+
+    public void setCssClassFa(String cssClassFa) {
+        this.cssClassFa = cssClassFa;
+    }
+
+
+
+    private org.apache.isis.applib.annotation.ActionLayout.CssClassFaPosition cssClassFaPosition;
+
+    @XmlAttribute(required = false)
+    public org.apache.isis.applib.annotation.ActionLayout.CssClassFaPosition getCssClassFaPosition() {
+        return cssClassFaPosition;
+    }
+
+    public void setCssClassFaPosition(org.apache.isis.applib.annotation.ActionLayout.CssClassFaPosition cssClassFaPosition) {
+        this.cssClassFaPosition = cssClassFaPosition;
+    }
+
+
+    private String describedAs;
+
+    @XmlElement(required = false)
+    public String getDescribedAs() {
+        return describedAs;
+    }
+
+    public void setDescribedAs(String describedAs) {
+        this.describedAs = describedAs;
+    }
+
+
+
+    private String named;
+
+    @XmlElement(required = false)
+    public String getNamed() {
+        return named;
+    }
+
+    public void setNamed(String named) {
+        this.named = named;
+    }
+
+
+
+
+    private String plural;
+
+    @XmlElement(required = false)
+    public String getPlural() {
+        return plural;
+    }
+
+    public void setPlural(String plural) {
+        this.plural = plural;
+    }
+
+
+
+
+
+    private String metadataError;
+
+    /**
+     * For diagnostics; populated by the framework if and only if a metadata error.
+     */
+    @XmlElement(required = false)
+    public String getMetadataError() {
+        return metadataError;
+    }
+
+    public void setMetadataError(final String metadataError) {
+        this.metadataError = metadataError;
+    }
+
+
+
+
+}

http://git-wip-us.apache.org/repos/asf/isis/blob/8f0abcdb/core/applib/src/main/java/org/apache/isis/applib/layout/members/v1/FieldSet.java
----------------------------------------------------------------------
diff --git a/core/applib/src/main/java/org/apache/isis/applib/layout/members/v1/FieldSet.java b/core/applib/src/main/java/org/apache/isis/applib/layout/members/v1/FieldSet.java
index 59e7c46..13faf9d 100644
--- a/core/applib/src/main/java/org/apache/isis/applib/layout/members/v1/FieldSet.java
+++ b/core/applib/src/main/java/org/apache/isis/applib/layout/members/v1/FieldSet.java
@@ -24,7 +24,6 @@ import java.util.List;
 import javax.annotation.Nullable;
 import javax.xml.bind.annotation.XmlAttribute;
 import javax.xml.bind.annotation.XmlElement;
-import javax.xml.bind.annotation.XmlElementWrapper;
 import javax.xml.bind.annotation.XmlTransient;
 import javax.xml.bind.annotation.XmlType;
 
@@ -77,7 +76,7 @@ public class FieldSet implements MemberRegion, ActionOwner, Serializable {
 
     private List<ActionLayoutData> actions = Lists.newArrayList();
 
-    @XmlElementWrapper(required = false)
+    // no wrapper
     @XmlElement(name = "action", required = false)
     public List<ActionLayoutData> getActions() {
         return actions;

http://git-wip-us.apache.org/repos/asf/isis/blob/8f0abcdb/core/applib/src/main/java/org/apache/isis/applib/layout/members/v1/Page.java
----------------------------------------------------------------------
diff --git a/core/applib/src/main/java/org/apache/isis/applib/layout/members/v1/Page.java b/core/applib/src/main/java/org/apache/isis/applib/layout/members/v1/Page.java
new file mode 100644
index 0000000..6e07332
--- /dev/null
+++ b/core/applib/src/main/java/org/apache/isis/applib/layout/members/v1/Page.java
@@ -0,0 +1,38 @@
+/*
+ *  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.applib.layout.members.v1;
+
+import org.apache.isis.applib.services.layout.PageService;
+
+/**
+ * All top-level page layout classes should implement this interface.
+ *
+ * <p>
+ *     It is used by the {@link PageService} as a common based type for any layouts read in from XML.
+ * </p>
+ */
+public interface Page {
+
+
+    boolean isNormalized();
+
+    void setNormalized(final boolean normalized);
+
+
+}

http://git-wip-us.apache.org/repos/asf/isis/blob/8f0abcdb/core/applib/src/main/java/org/apache/isis/applib/layout/members/v1/PropertyLayoutData.java
----------------------------------------------------------------------
diff --git a/core/applib/src/main/java/org/apache/isis/applib/layout/members/v1/PropertyLayoutData.java b/core/applib/src/main/java/org/apache/isis/applib/layout/members/v1/PropertyLayoutData.java
index 3036c7f..d1eb092 100644
--- a/core/applib/src/main/java/org/apache/isis/applib/layout/members/v1/PropertyLayoutData.java
+++ b/core/applib/src/main/java/org/apache/isis/applib/layout/members/v1/PropertyLayoutData.java
@@ -23,7 +23,6 @@ import java.util.List;
 
 import javax.xml.bind.annotation.XmlAttribute;
 import javax.xml.bind.annotation.XmlElement;
-import javax.xml.bind.annotation.XmlElementWrapper;
 import javax.xml.bind.annotation.XmlTransient;
 import javax.xml.bind.annotation.XmlType;
 
@@ -182,7 +181,7 @@ public class PropertyLayoutData implements ActionOwner, Serializable, Owned<Fiel
 
     private List<ActionLayoutData> actions;
 
-    @XmlElementWrapper(required = false)
+    // no wrapper
     @XmlElement(name = "action", required = false)
     public List<ActionLayoutData> getActions() {
         return actions;

http://git-wip-us.apache.org/repos/asf/isis/blob/8f0abcdb/core/applib/src/main/java/org/apache/isis/applib/layout/members/v1/package-info.java
----------------------------------------------------------------------
diff --git a/core/applib/src/main/java/org/apache/isis/applib/layout/members/v1/package-info.java b/core/applib/src/main/java/org/apache/isis/applib/layout/members/v1/package-info.java
index 40a6f0b..d3e2c19 100644
--- a/core/applib/src/main/java/org/apache/isis/applib/layout/members/v1/package-info.java
+++ b/core/applib/src/main/java/org/apache/isis/applib/layout/members/v1/package-info.java
@@ -28,7 +28,7 @@
  *
  */
 @javax.xml.bind.annotation.XmlSchema(
-        namespace = "http://isis.apache.org/schema/applib/layout/members",
+        namespace = "http://isis.apache.org/schema/applib/layout/members/v1",
         elementFormDefault = javax.xml.bind.annotation.XmlNsForm.QUALIFIED
         // specifying the location seems to cause JaxbService#toXsd() to not generate the schema; not sure why...
         //, location = ..."http://isis.apache.org/schema/metamodel/layout/members/v1/members-1.0.xsd"

http://git-wip-us.apache.org/repos/asf/isis/blob/8f0abcdb/core/applib/src/main/java/org/apache/isis/applib/services/jaxb/JaxbService.java
----------------------------------------------------------------------
diff --git a/core/applib/src/main/java/org/apache/isis/applib/services/jaxb/JaxbService.java b/core/applib/src/main/java/org/apache/isis/applib/services/jaxb/JaxbService.java
index 450011a..ab44123 100644
--- a/core/applib/src/main/java/org/apache/isis/applib/services/jaxb/JaxbService.java
+++ b/core/applib/src/main/java/org/apache/isis/applib/services/jaxb/JaxbService.java
@@ -43,8 +43,20 @@ import org.apache.isis.applib.services.dto.Dto_downloadXsd;
 public interface JaxbService {
 
     @Programmatic
+    Object fromXml(JAXBContext jaxbContext, String xml);
+
+    @Programmatic
+    Object fromXml(JAXBContext jaxbContext, String xml, Map<String,Object> unmarshallerProperties);
+
+    /**
+     * As {@link #fromXml(JAXBContext, String)}, but downcast to a specific type.
+     */
+    @Programmatic
     <T> T fromXml(Class<T> domainClass, String xml);
 
+    /**
+     * As {@link #fromXml(JAXBContext, String, Map)}, but downcast to a specific type.
+     */
     @Programmatic
     <T> T fromXml(Class<T> domainClass, String xml, Map<String,Object> unmarshallerProperties);
 
@@ -91,15 +103,14 @@ public interface JaxbService {
     public static class Simple implements JaxbService {
 
         @Override
-        public <T> T fromXml(final Class<T> domainClass, final String xml) {
-            return fromXml(domainClass, xml, Maps.<String,Object>newHashMap());
+        public Object fromXml(final JAXBContext jaxbContext, final String xml) {
+            return fromXml(jaxbContext, xml, Maps.<String,Object>newHashMap());
         }
         @Override
-        public <T> T fromXml(final Class<T> domainClass, final String xml, final Map<String, Object> unmarshallerProperties) {
+        public Object fromXml(final JAXBContext jaxbContext, final String xml, final Map<String, Object> unmarshallerProperties) {
             try {
-                final JAXBContext context = JAXBContext.newInstance(domainClass);
 
-                final Unmarshaller unmarshaller = context.createUnmarshaller();
+                final Unmarshaller unmarshaller = jaxbContext.createUnmarshaller();
 
                 for (Map.Entry<String, Object> entry : unmarshallerProperties.entrySet()) {
                     unmarshaller.setProperty(entry.getKey(), entry.getValue());
@@ -108,7 +119,22 @@ public interface JaxbService {
                 configure(unmarshaller);
 
                 final Object unmarshal = unmarshaller.unmarshal(new StringReader(xml));
-                return (T) unmarshal;
+                return unmarshal;
+
+            } catch (final JAXBException ex) {
+                throw new NonRecoverableException("Error unmarshalling XML", ex);
+            }
+        }
+
+        @Override
+        public <T> T fromXml(final Class<T> domainClass, final String xml) {
+            return fromXml(domainClass, xml, Maps.<String,Object>newHashMap());
+        }
+        @Override
+        public <T> T fromXml(final Class<T> domainClass, final String xml, final Map<String, Object> unmarshallerProperties) {
+            try {
+                final JAXBContext context = JAXBContext.newInstance(domainClass);
+                return (T) fromXml(context, xml, unmarshallerProperties);
 
             } catch (final JAXBException ex) {
                 throw new NonRecoverableException("Error unmarshalling XML to class '" + domainClass.getName() + "'", ex);

http://git-wip-us.apache.org/repos/asf/isis/blob/8f0abcdb/core/applib/src/main/java/org/apache/isis/applib/services/layout/ObjectLayoutMetadataService.java
----------------------------------------------------------------------
diff --git a/core/applib/src/main/java/org/apache/isis/applib/services/layout/ObjectLayoutMetadataService.java b/core/applib/src/main/java/org/apache/isis/applib/services/layout/ObjectLayoutMetadataService.java
deleted file mode 100644
index 99f1a9d..0000000
--- a/core/applib/src/main/java/org/apache/isis/applib/services/layout/ObjectLayoutMetadataService.java
+++ /dev/null
@@ -1,46 +0,0 @@
-/**
- *  Licensed to the Apache Software Foundation (ASF) under one or more
- *  contributor license agreements.  See the NOTICE file distributed with
- *  this work for additional information regarding copyright ownership.
- *  The ASF licenses this file to You under the Apache License, Version 2.0
- *  (the "License"); you may not use this file except in compliance with
- *  the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing, software
- *  distributed under the License is distributed on an "AS IS" BASIS,
- *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- *  See the License for the specific language governing permissions and
- *  limitations under the License.
- */
-package org.apache.isis.applib.services.layout;
-
-import org.apache.isis.applib.annotation.Programmatic;
-import org.apache.isis.applib.layout.fixedcols.FCPage;
-
-public interface ObjectLayoutMetadataService {
-
-    /**
-     * Whether any metadata exists for this domain class, and if so then whether it is valid or invalid.
-     */
-    @Programmatic
-    boolean exists(Class<?> domainClass);
-
-    /**
-     * Returns raw (unnormalized) metadata, eg per the <code>.layout.xml</code> file.
-     */
-    @Programmatic FCPage fromXml(Class<?> domainClass);
-
-    /**
-     * Obtains the layout metadata, if any, for the (domain class of the) specified domain object.
-     */
-    @Programmatic FCPage toMetadata(Object domainObject);
-
-    /**
-     * Obtains the layout metadata, if any, for the specified domain class.
-     */
-    @Programmatic FCPage toMetadata(Class<?> domainClass);
-
-
-}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/isis/blob/8f0abcdb/core/applib/src/main/java/org/apache/isis/applib/services/layout/Object_downloadLayoutXml.java
----------------------------------------------------------------------
diff --git a/core/applib/src/main/java/org/apache/isis/applib/services/layout/Object_downloadLayoutXml.java b/core/applib/src/main/java/org/apache/isis/applib/services/layout/Object_downloadLayoutXml.java
index 4532705..10bfa19 100644
--- a/core/applib/src/main/java/org/apache/isis/applib/services/layout/Object_downloadLayoutXml.java
+++ b/core/applib/src/main/java/org/apache/isis/applib/services/layout/Object_downloadLayoutXml.java
@@ -28,16 +28,13 @@ import org.apache.isis.applib.annotation.Mixin;
 import org.apache.isis.applib.annotation.ParameterLayout;
 import org.apache.isis.applib.annotation.RestrictTo;
 import org.apache.isis.applib.annotation.SemanticsOf;
-import org.apache.isis.applib.layout.fixedcols.FCPage;
+import org.apache.isis.applib.layout.members.v1.Page;
 import org.apache.isis.applib.services.jaxb.JaxbService;
 import org.apache.isis.applib.value.Clob;
 
 @Mixin
 public class Object_downloadLayoutXml {
 
-    public static final String TNS = "http://isis.apache.org/schema/applib/layout";
-    public static final String SCHEMA_LOCATION = "http://isis.apache.org/schema/applib/layout/layout-1.0.xsd";
-
     private final Object object;
 
     public Object_downloadLayoutXml(final Object object) {
@@ -58,31 +55,29 @@ public class Object_downloadLayoutXml {
     public Object $$(
             @ParameterLayout(named = "File name")
             final String fileName) {
-        final FCPage metadata = getObjectLayoutMetadata();
-        final String xml = jaxbService.toXml(metadata,
+        final Page page = getPage();
+        final String xml = jaxbService.toXml(page,
                 ImmutableMap.<String,Object>of(
                         Marshaller.JAXB_SCHEMA_LOCATION,
-                        TNS + " " + SCHEMA_LOCATION
+                        pageService.schemaLocations(page)
                 ));
 
         return new Clob(Util.withSuffix(fileName, "xml"), "text/xml", xml);
     }
 
     public boolean hide$$() {
-        return getObjectLayoutMetadata() == null;
+        return getPage() == null;
     }
     public String default0$$() {
         return Util.withSuffix(object.getClass().getSimpleName(), "layout.xml");
     }
 
-    protected FCPage getObjectLayoutMetadata() {
-        return objectLayoutMetadataService.toMetadata(object);
+    protected Page getPage() {
+        return pageService.toPage(object);
     }
 
-
-
     @Inject
-    ObjectLayoutMetadataService objectLayoutMetadataService;
+    PageService pageService;
 
     @Inject
     JaxbService jaxbService;

http://git-wip-us.apache.org/repos/asf/isis/blob/8f0abcdb/core/applib/src/main/java/org/apache/isis/applib/services/layout/Object_viewLayout.java
----------------------------------------------------------------------
diff --git a/core/applib/src/main/java/org/apache/isis/applib/services/layout/Object_viewLayout.java b/core/applib/src/main/java/org/apache/isis/applib/services/layout/Object_viewLayout.java
index ae7d907..b8f128e 100644
--- a/core/applib/src/main/java/org/apache/isis/applib/services/layout/Object_viewLayout.java
+++ b/core/applib/src/main/java/org/apache/isis/applib/services/layout/Object_viewLayout.java
@@ -25,7 +25,7 @@ import org.apache.isis.applib.annotation.Mixin;
 import org.apache.isis.applib.annotation.Programmatic;
 import org.apache.isis.applib.annotation.RestrictTo;
 import org.apache.isis.applib.annotation.SemanticsOf;
-import org.apache.isis.applib.layout.fixedcols.FCPage;
+import org.apache.isis.applib.layout.members.v1.Page;
 
 @Mixin
 public class Object_viewLayout {
@@ -50,22 +50,22 @@ public class Object_viewLayout {
             cssClassFa = "fa-th"
     )
     @MemberOrder(sequence = "550.2")
-    public FCPage $$() {
-        return getObjectLayoutMetadata();
+    public Page $$() {
+        return getPage();
     }
 
     @Programmatic // TODO ... excluded for now (getting an Isis framework exception in the view model rendering).
     public boolean hide$$() {
-        return getObjectLayoutMetadata() == null;
+        return getPage() == null;
     }
 
-    protected FCPage getObjectLayoutMetadata() {
-        return objectLayoutMetadataService.toMetadata(object);
+    protected Page getPage() {
+        return pageService.toPage(object);
     }
 
 
 
     @Inject
-    ObjectLayoutMetadataService objectLayoutMetadataService;
+    PageService pageService;
 
 }

http://git-wip-us.apache.org/repos/asf/isis/blob/8f0abcdb/core/applib/src/main/java/org/apache/isis/applib/services/layout/PageService.java
----------------------------------------------------------------------
diff --git a/core/applib/src/main/java/org/apache/isis/applib/services/layout/PageService.java b/core/applib/src/main/java/org/apache/isis/applib/services/layout/PageService.java
new file mode 100644
index 0000000..b0fb237
--- /dev/null
+++ b/core/applib/src/main/java/org/apache/isis/applib/services/layout/PageService.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.applib.services.layout;
+
+import org.apache.isis.applib.annotation.Programmatic;
+import org.apache.isis.applib.layout.members.v1.Page;
+
+public interface PageService {
+
+    /**
+     * Whether any metadata exists for this domain class, and if so then whether it is valid or invalid.
+     */
+    @Programmatic
+    boolean exists(Class<?> domainClass);
+
+    /**
+     * Returns (raw unnormalized) metadata, eg per the <code>.layout.xml</code> file.
+     */
+    @Programmatic
+    Page fromXml(Class<?> domainClass);
+
+    /**
+     * Obtains the (normalized) layout metadata, if any, for the (domain class of the) specified domain object.
+     */
+    @Programmatic
+    Page toPage(Object domainObject);
+
+    /**
+     * Obtains the (normalized) layout metadata, if any, for the specified domain class.
+     */
+    @Programmatic
+    Page toPage(Class<?> domainClass);
+
+    String schemaLocations(final Page page);
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/isis/blob/8f0abcdb/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/layoutmetadata/ObjectLayoutMetadataFacet.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/layoutmetadata/ObjectLayoutMetadataFacet.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/layoutmetadata/ObjectLayoutMetadataFacet.java
deleted file mode 100644
index 72b937e..0000000
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/layoutmetadata/ObjectLayoutMetadataFacet.java
+++ /dev/null
@@ -1,33 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *        http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- */
-package org.apache.isis.core.metamodel.facets.object.layoutmetadata;
-
-
-import org.apache.isis.applib.layout.fixedcols.FCPage;
-import org.apache.isis.core.metamodel.facetapi.Facet;
-
-/**
- * Corresponds to providing a <code>.layout.xml</code> file for the domain object's class.
- */
-public interface ObjectLayoutMetadataFacet extends Facet {
-
-    FCPage getMetadata();
-
-
-}
\ No newline at end of file


[11/18] isis git commit: ISIS-993: still sketching out the layout classes for BS3 and FC (fixed col)

Posted by da...@apache.org.
http://git-wip-us.apache.org/repos/asf/isis/blob/10d80f3a/core/applib/src/main/java/org/apache/isis/applib/layout/fixedcols/TabMetadata.java
----------------------------------------------------------------------
diff --git a/core/applib/src/main/java/org/apache/isis/applib/layout/fixedcols/TabMetadata.java b/core/applib/src/main/java/org/apache/isis/applib/layout/fixedcols/TabMetadata.java
deleted file mode 100644
index 979b1b5..0000000
--- a/core/applib/src/main/java/org/apache/isis/applib/layout/fixedcols/TabMetadata.java
+++ /dev/null
@@ -1,173 +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.applib.layout.fixedcols;
-
-import java.io.Serializable;
-import java.util.List;
-
-import javax.xml.bind.annotation.XmlAttribute;
-import javax.xml.bind.annotation.XmlElement;
-import javax.xml.bind.annotation.XmlTransient;
-import javax.xml.bind.annotation.XmlType;
-
-import com.google.common.base.Predicate;
-import com.google.common.collect.Lists;
-
-import org.apache.isis.applib.annotation.Programmatic;
-import org.apache.isis.applib.layout.v1_0.CollectionLayoutMetadata;
-import org.apache.isis.applib.layout.v1_0.ColumnOwner;
-import org.apache.isis.applib.layout.v1_0.MemberLayoutMetadata;
-import org.apache.isis.applib.layout.v1_0.Owned;
-import org.apache.isis.applib.layout.v1_0.PropertyGroupMetadata;
-
-@XmlType(
-        name="tab"
-        , propOrder = {
-                "name"
-                , "left"
-                , "middle"
-                , "right"
-        }
-)
-public class TabMetadata implements ColumnOwner, Serializable, Owned<TabGroupMetadata> {
-
-    private static final long serialVersionUID = 1L;
-
-    private String name;
-
-    @XmlAttribute(required = true)
-    public String getName() {
-        return name;
-    }
-
-    public void setName(String name) {
-        this.name = name;
-    }
-
-
-
-    private ColumnMetadata left = new ColumnMetadata();
-
-    @XmlElement(required = true)
-    public ColumnMetadata getLeft() {
-        return left;
-    }
-
-    public void setLeft(final ColumnMetadata left) {
-        this.left = left;
-    }
-
-
-    private ColumnMetadata middle;
-
-    @XmlElement(required = false)
-    public ColumnMetadata getMiddle() {
-        return middle;
-    }
-
-    public void setMiddle(final ColumnMetadata middle) {
-        this.middle = middle;
-    }
-
-
-    private ColumnMetadata right;
-
-    @XmlElement(required = false)
-    public ColumnMetadata getRight() {
-        return right;
-    }
-
-    public void setRight(final ColumnMetadata right) {
-        this.right = right;
-    }
-
-
-
-    private TabGroupMetadata owner;
-    /**
-     * Owner.
-     *
-     * <p>
-     *     Set programmatically by framework after reading in from XML.
-     * </p>
-     */
-    @XmlTransient
-    public TabGroupMetadata getOwner() {
-        return owner;
-    }
-
-    public void setOwner(final TabGroupMetadata owner) {
-        this.owner = owner;
-    }
-
-    /**
-     * Aggregates the contents of all collections on this tab.
-     */
-    @Programmatic
-    public List<MemberLayoutMetadata> getContents() {
-        final List<MemberLayoutMetadata> contents = Lists.newArrayList();
-        appendContent(contents, getLeft());
-        appendContent(contents, getMiddle());
-        appendContent(contents, getRight());
-        return contents;
-    }
-
-
-
-
-    private String path;
-
-    @Programmatic
-    @XmlTransient
-    public String getPath() {
-        return path;
-    }
-
-    @Programmatic
-    public void setPath(final String path) {
-        this.path = path;
-    }
-
-
-
-    private static void appendContent(final List<MemberLayoutMetadata> contents, final ColumnMetadata columnMetadata) {
-        if(columnMetadata == null) {
-            return;
-        }
-        final List<PropertyGroupMetadata> propertyGroups = columnMetadata.getPropertyGroups();
-        if(propertyGroups != null) {
-            contents.addAll(propertyGroups);
-        }
-        final List<CollectionLayoutMetadata> collectionLayoutMetadatas = columnMetadata.getCollections();
-        if(collectionLayoutMetadatas != null) {
-            contents.addAll(collectionLayoutMetadatas);
-        }
-    }
-
-    public static class Predicates {
-        public static Predicate<TabMetadata> notEmpty() {
-            return new Predicate<TabMetadata>() {
-                @Override
-                public boolean apply(final TabMetadata tabMetadata) {
-                    return !tabMetadata.getContents().isEmpty();
-                }
-            };
-        }
-    }
-}

http://git-wip-us.apache.org/repos/asf/isis/blob/10d80f3a/core/applib/src/main/java/org/apache/isis/applib/layout/fixedcols/package-info.java
----------------------------------------------------------------------
diff --git a/core/applib/src/main/java/org/apache/isis/applib/layout/fixedcols/package-info.java b/core/applib/src/main/java/org/apache/isis/applib/layout/fixedcols/package-info.java
new file mode 100644
index 0000000..af1fb85
--- /dev/null
+++ b/core/applib/src/main/java/org/apache/isis/applib/layout/fixedcols/package-info.java
@@ -0,0 +1,35 @@
+/*
+ *  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.
+ */
+
+/**
+ * The classes in this package define how to layout the properties, collections and actions of a domain object - the
+ * building blocks - as defined in the <code>members.v1</code> package.
+ *
+ * <p>
+ *     The layout is reasonably flexible, being a half-way house between the annotation/JSON style layouts (pre 1.12.0)
+ *     vs the fully flexible layouts provided by the <code>bootstrap3</code> layouts.  In particular, they allow
+ *     property fieldsets and collections to be grouped into tabs, with collections being laid out in any column.
+ *     However, tab groups only appear in the central area of the page, and may only have a maximum of three columns.
+ * </p>
+ */
+@javax.xml.bind.annotation.XmlSchema(
+        namespace = "http://isis.apache.org/schema/applib/layout/fixedcols",
+        elementFormDefault = javax.xml.bind.annotation.XmlNsForm.QUALIFIED
+)
+package org.apache.isis.applib.layout.fixedcols;
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/isis/blob/10d80f3a/core/applib/src/main/java/org/apache/isis/applib/layout/members/MemberRegion.java
----------------------------------------------------------------------
diff --git a/core/applib/src/main/java/org/apache/isis/applib/layout/members/MemberRegion.java b/core/applib/src/main/java/org/apache/isis/applib/layout/members/MemberRegion.java
new file mode 100644
index 0000000..b4caf6f
--- /dev/null
+++ b/core/applib/src/main/java/org/apache/isis/applib/layout/members/MemberRegion.java
@@ -0,0 +1,33 @@
+/*
+ *  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.applib.layout.members;
+
+/**
+ * Represents an area on the page containing one or several related members.
+ *
+ * <p>
+ *     Implementations include a <code>FieldSet</code> (containing a number
+ *     of properties and their actions), and a <code>CollectionLayoutData</code>
+ *     (containing a single collection and associated actions)
+ * </p>
+ */
+public interface MemberRegion extends Owned<MemberRegionOwner> {
+
+
+}

http://git-wip-us.apache.org/repos/asf/isis/blob/10d80f3a/core/applib/src/main/java/org/apache/isis/applib/layout/members/MemberRegionOwner.java
----------------------------------------------------------------------
diff --git a/core/applib/src/main/java/org/apache/isis/applib/layout/members/MemberRegionOwner.java b/core/applib/src/main/java/org/apache/isis/applib/layout/members/MemberRegionOwner.java
new file mode 100644
index 0000000..174bfb1
--- /dev/null
+++ b/core/applib/src/main/java/org/apache/isis/applib/layout/members/MemberRegionOwner.java
@@ -0,0 +1,23 @@
+/*
+ *  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.applib.layout.members;
+
+public interface MemberRegionOwner extends Owner {
+
+}

http://git-wip-us.apache.org/repos/asf/isis/blob/10d80f3a/core/applib/src/main/java/org/apache/isis/applib/layout/members/Owned.java
----------------------------------------------------------------------
diff --git a/core/applib/src/main/java/org/apache/isis/applib/layout/members/Owned.java b/core/applib/src/main/java/org/apache/isis/applib/layout/members/Owned.java
new file mode 100644
index 0000000..54ef692
--- /dev/null
+++ b/core/applib/src/main/java/org/apache/isis/applib/layout/members/Owned.java
@@ -0,0 +1,23 @@
+/*
+ *  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.applib.layout.members;
+
+public interface Owned<T extends Owner> {
+    T getOwner();
+}

http://git-wip-us.apache.org/repos/asf/isis/blob/10d80f3a/core/applib/src/main/java/org/apache/isis/applib/layout/members/Owner.java
----------------------------------------------------------------------
diff --git a/core/applib/src/main/java/org/apache/isis/applib/layout/members/Owner.java b/core/applib/src/main/java/org/apache/isis/applib/layout/members/Owner.java
new file mode 100644
index 0000000..b0f9dd2
--- /dev/null
+++ b/core/applib/src/main/java/org/apache/isis/applib/layout/members/Owner.java
@@ -0,0 +1,24 @@
+/*
+ *  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.applib.layout.members;
+
+public interface Owner {
+
+
+}

http://git-wip-us.apache.org/repos/asf/isis/blob/10d80f3a/core/applib/src/main/java/org/apache/isis/applib/layout/members/v1/ActionLayoutData.java
----------------------------------------------------------------------
diff --git a/core/applib/src/main/java/org/apache/isis/applib/layout/members/v1/ActionLayoutData.java b/core/applib/src/main/java/org/apache/isis/applib/layout/members/v1/ActionLayoutData.java
new file mode 100644
index 0000000..6e15728
--- /dev/null
+++ b/core/applib/src/main/java/org/apache/isis/applib/layout/members/v1/ActionLayoutData.java
@@ -0,0 +1,227 @@
+/*
+ *  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.applib.layout.members.v1;
+
+import java.io.Serializable;
+
+import javax.xml.bind.annotation.XmlAttribute;
+import javax.xml.bind.annotation.XmlElement;
+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.Where;
+import org.apache.isis.applib.layout.members.Owned;
+
+/**
+ * Describes the layout of a single action, broadly corresponding to {@link org.apache.isis.applib.annotation.ActionLayout}.
+ *
+ * <p>
+ *  Note that {@link org.apache.isis.applib.annotation.ActionLayout#contributed()} is omitted because this only applies
+ *  to domain services.
+ * </p>
+ */
+@XmlType(
+    name = "actionLayout"
+    , propOrder = {
+        "named"
+        , "describedAs"
+        , "metadataError"
+    }
+)
+public class ActionLayoutData implements Serializable, Owned<ActionOwner> {
+
+    private static final long serialVersionUID = 1L;
+
+    public ActionLayoutData() {
+    }
+    public ActionLayoutData(final String id) {
+        setId(id);
+    }
+
+    private String id;
+    /**
+     * Method name.
+     *
+     * <p>
+     *     Overloaded methods are not supported.
+     * </p>
+     */
+    @XmlAttribute(name="id", required = true)
+    public String getId() {
+        return id;
+    }
+
+    public void setId(String id) {
+        this.id = id;
+    }
+
+
+
+    private BookmarkPolicy bookmarking;
+
+    @XmlAttribute(required = false)
+    public BookmarkPolicy getBookmarking() {
+        return bookmarking;
+    }
+
+    public void setBookmarking(BookmarkPolicy bookmarking) {
+        this.bookmarking = bookmarking;
+    }
+
+
+    private String cssClass;
+
+    @XmlAttribute(required = false)
+    public String getCssClass() {
+        return cssClass;
+    }
+
+    public void setCssClass(String cssClass) {
+        this.cssClass = cssClass;
+    }
+
+
+    private String cssClassFa;
+
+    @XmlAttribute(required = false)
+    public String getCssClassFa() {
+        return cssClassFa;
+    }
+
+    public void setCssClassFa(String cssClassFa) {
+        this.cssClassFa = cssClassFa;
+    }
+
+
+
+    private org.apache.isis.applib.annotation.ActionLayout.CssClassFaPosition cssClassFaPosition;
+
+    @XmlAttribute(required = false)
+    public org.apache.isis.applib.annotation.ActionLayout.CssClassFaPosition getCssClassFaPosition() {
+        return cssClassFaPosition;
+    }
+
+    public void setCssClassFaPosition(org.apache.isis.applib.annotation.ActionLayout.CssClassFaPosition cssClassFaPosition) {
+        this.cssClassFaPosition = cssClassFaPosition;
+    }
+
+
+    private String describedAs;
+
+    @XmlElement(required = false)
+    public String getDescribedAs() {
+        return describedAs;
+    }
+
+    public void setDescribedAs(String describedAs) {
+        this.describedAs = describedAs;
+    }
+
+
+
+    private Where hidden;
+
+    @XmlAttribute(required = false)
+    public Where getHidden() {
+        return hidden;
+    }
+
+    public void setHidden(Where hidden) {
+        this.hidden = hidden;
+    }
+
+
+
+    private String named;
+
+    @XmlElement(required = false)
+    public String getNamed() {
+        return named;
+    }
+
+    public void setNamed(String named) {
+        this.named = named;
+    }
+
+
+
+    private Boolean namedEscaped;
+
+    @XmlAttribute(required = false)
+    public Boolean getNamedEscaped() {
+        return namedEscaped;
+    }
+
+    public void setNamedEscaped(Boolean namedEscaped) {
+        this.namedEscaped = namedEscaped;
+    }
+
+
+
+    private org.apache.isis.applib.annotation.ActionLayout.Position position;
+
+    @XmlAttribute(required = false)
+    public org.apache.isis.applib.annotation.ActionLayout.Position getPosition() {
+        return position;
+    }
+
+    public void setPosition(org.apache.isis.applib.annotation.ActionLayout.Position position) {
+        this.position = position;
+    }
+
+
+
+
+    private ActionOwner owner;
+    /**
+     * Owner.
+     *
+     * <p>
+     *     Set programmatically by framework after reading in from XML.
+     * </p>
+     */
+    @XmlTransient
+    public ActionOwner getOwner() {
+        return owner;
+    }
+
+    public void setOwner(final ActionOwner owner) {
+        this.owner = owner;
+    }
+
+
+    private String metadataError;
+
+    /**
+     * For diagnostics; populated by the framework if and only if a metadata error.
+     */
+    @XmlElement(required = false)
+    public String getMetadataError() {
+        return metadataError;
+    }
+
+    public void setMetadataError(final String metadataError) {
+        this.metadataError = metadataError;
+    }
+
+
+
+
+}

http://git-wip-us.apache.org/repos/asf/isis/blob/10d80f3a/core/applib/src/main/java/org/apache/isis/applib/layout/members/v1/ActionOwner.java
----------------------------------------------------------------------
diff --git a/core/applib/src/main/java/org/apache/isis/applib/layout/members/v1/ActionOwner.java b/core/applib/src/main/java/org/apache/isis/applib/layout/members/v1/ActionOwner.java
new file mode 100644
index 0000000..2e604d2
--- /dev/null
+++ b/core/applib/src/main/java/org/apache/isis/applib/layout/members/v1/ActionOwner.java
@@ -0,0 +1,27 @@
+/*
+ *  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.applib.layout.members.v1;
+
+import java.util.List;
+
+import org.apache.isis.applib.layout.members.Owner;
+
+public interface ActionOwner extends Owner {
+    List<ActionLayoutData> getActions();
+}

http://git-wip-us.apache.org/repos/asf/isis/blob/10d80f3a/core/applib/src/main/java/org/apache/isis/applib/layout/members/v1/CollectionLayoutData.java
----------------------------------------------------------------------
diff --git a/core/applib/src/main/java/org/apache/isis/applib/layout/members/v1/CollectionLayoutData.java b/core/applib/src/main/java/org/apache/isis/applib/layout/members/v1/CollectionLayoutData.java
new file mode 100644
index 0000000..8b9a608
--- /dev/null
+++ b/core/applib/src/main/java/org/apache/isis/applib/layout/members/v1/CollectionLayoutData.java
@@ -0,0 +1,261 @@
+/*
+ *  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.applib.layout.members.v1;
+
+import java.io.Serializable;
+import java.util.List;
+
+import javax.xml.bind.annotation.XmlAttribute;
+import javax.xml.bind.annotation.XmlElement;
+import javax.xml.bind.annotation.XmlElementWrapper;
+import javax.xml.bind.annotation.XmlTransient;
+import javax.xml.bind.annotation.XmlType;
+
+import com.google.common.base.Function;
+
+import org.apache.isis.applib.annotation.Programmatic;
+import org.apache.isis.applib.annotation.Where;
+import org.apache.isis.applib.layout.members.MemberRegion;
+import org.apache.isis.applib.layout.members.MemberRegionOwner;
+
+/**
+ * Describes the layout of a single collection, broadly corresponds to the {@link org.apache.isis.applib.annotation.CollectionLayout} annotation.
+ *
+ * <p>
+ *     Note that {@link org.apache.isis.applib.annotation.CollectionLayout#render()} is omitted because
+ *     {@link #defaultView} is its replacement.
+ * </p>
+ */
+@XmlType(
+        propOrder = {
+                "named"
+                ,"describedAs"
+                ,"sortedBy"
+                , "actions"
+                , "metadataError"
+        }
+)
+public class CollectionLayoutData implements MemberRegion, ActionOwner, Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    public CollectionLayoutData() {
+    }
+    public CollectionLayoutData(final String id) {
+        setId(id);
+    }
+
+
+    private String id;
+
+    /**
+     * Collection identifier, being the getter method without "get" prefix, first letter lower cased.
+     */
+    @XmlAttribute(required = true)
+    public String getId() {
+        return id;
+    }
+
+    public void setId(String id) {
+        this.id = id;
+    }
+
+
+
+    private String cssClass;
+
+    @XmlAttribute(required = false)
+    public String getCssClass() {
+        return cssClass;
+    }
+
+    public void setCssClass(String cssClass) {
+        this.cssClass = cssClass;
+    }
+
+
+
+    private String describedAs;
+
+    @XmlElement(required = false)
+    public String getDescribedAs() {
+        return describedAs;
+    }
+
+    public void setDescribedAs(String describedAs) {
+        this.describedAs = describedAs;
+    }
+
+
+
+    private String defaultView;
+
+    /**
+     * Typically <code>table</code> or <code>hidden</code>, but could be any other named view that is configured and
+     * appropriate, eg <code>gmap3</code> or <code>fullcalendar2</code>.
+     */
+    @XmlAttribute(required = false)
+    public String getDefaultView() {
+        return defaultView;
+    }
+
+    public void setDefaultView(String defaultView) {
+        this.defaultView = defaultView;
+    }
+
+
+    private Where hidden;
+
+    @XmlAttribute(required = false)
+    public Where getHidden() {
+        return hidden;
+    }
+
+    public void setHidden(Where hidden) {
+        this.hidden = hidden;
+    }
+
+
+    private String named;
+
+    @XmlElement(required = false)
+    public String getNamed() {
+        return named;
+    }
+
+    public void setNamed(String named) {
+        this.named = named;
+    }
+
+
+    private Boolean namedEscaped;
+
+    @XmlAttribute(required = false)
+    public Boolean getNamedEscaped() {
+        return namedEscaped;
+    }
+
+    public void setNamedEscaped(Boolean namedEscaped) {
+        this.namedEscaped = namedEscaped;
+    }
+
+
+    private Integer paged;
+
+    @XmlAttribute(required = false)
+    public Integer getPaged() {
+        return paged;
+    }
+
+    public void setPaged(Integer paged) {
+        this.paged = paged;
+    }
+
+
+
+    private String sortedBy;
+
+    @XmlElement(required = false)
+    public String getSortedBy() {
+        return sortedBy;
+    }
+
+    public void setSortedBy(String sortedBy) {
+        this.sortedBy = sortedBy;
+    }
+
+
+
+    private List<ActionLayoutData> actions;
+
+    @XmlElementWrapper(name = "actions", required = false)
+    @XmlElement(name = "action", required = false)
+    public List<ActionLayoutData> getActions() {
+        return actions;
+    }
+
+    public void setActions(List<ActionLayoutData> actionLayoutDatas) {
+        this.actions = actionLayoutDatas;
+    }
+
+
+
+    private MemberRegionOwner owner;
+    /**
+     * Owner.
+     *
+     * <p>
+     *     Set programmatically by framework after reading in from XML.
+     * </p>
+     */
+    @XmlTransient
+    public MemberRegionOwner getOwner() {
+        return owner;
+    }
+
+    public void setOwner(final MemberRegionOwner owner) {
+        this.owner = owner;
+    }
+
+
+    private String metadataError;
+
+    /**
+     * For diagnostics; populated by the framework if and only if a metadata error.
+     */
+    @XmlElement(required = false)
+    public String getMetadataError() {
+        return metadataError;
+    }
+
+    public void setMetadataError(final String metadataError) {
+        this.metadataError = metadataError;
+    }
+
+
+
+
+    private String path;
+
+    @Programmatic
+    @XmlTransient
+    public String getPath() {
+        return path;
+    }
+
+    @Programmatic
+    public void setPath(final String path) {
+        this.path = path;
+    }
+
+
+
+    public static class Functions {
+        private Functions(){}
+
+        public static Function<CollectionLayoutData, String> id() {
+            return new Function<CollectionLayoutData, String>() {
+                @Override
+                public String apply(final CollectionLayoutData metadata) {
+                    return metadata.getId();
+                }
+            };
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/isis/blob/10d80f3a/core/applib/src/main/java/org/apache/isis/applib/layout/members/v1/FieldSet.java
----------------------------------------------------------------------
diff --git a/core/applib/src/main/java/org/apache/isis/applib/layout/members/v1/FieldSet.java b/core/applib/src/main/java/org/apache/isis/applib/layout/members/v1/FieldSet.java
new file mode 100644
index 0000000..59e7c46
--- /dev/null
+++ b/core/applib/src/main/java/org/apache/isis/applib/layout/members/v1/FieldSet.java
@@ -0,0 +1,152 @@
+/*
+ *  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.applib.layout.members.v1;
+
+import java.io.Serializable;
+import java.util.List;
+
+import javax.annotation.Nullable;
+import javax.xml.bind.annotation.XmlAttribute;
+import javax.xml.bind.annotation.XmlElement;
+import javax.xml.bind.annotation.XmlElementWrapper;
+import javax.xml.bind.annotation.XmlTransient;
+import javax.xml.bind.annotation.XmlType;
+
+import com.google.common.base.Function;
+import com.google.common.collect.Lists;
+
+import org.apache.isis.applib.annotation.MemberOrder;
+import org.apache.isis.applib.annotation.Programmatic;
+import org.apache.isis.applib.layout.members.MemberRegion;
+import org.apache.isis.applib.layout.members.MemberRegionOwner;
+
+/**
+ * A {@link MemberRegion region} of the page containing a set of
+ * related {@link PropertyLayoutData properties} and associated
+ * {@link ActionLayoutData actions}.
+ */
+@XmlType(
+        propOrder = {
+                "name"
+                , "actions"
+                , "properties"
+        }
+)
+public class FieldSet implements MemberRegion, ActionOwner, Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    public FieldSet() {
+    }
+
+    public FieldSet(final String name) {
+        setName(name);
+    }
+
+    private String name;
+
+    /**
+     * Corresponds to the {@link MemberOrder#name()} (when applied to properties).
+     */
+    @XmlAttribute(required = true)
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+
+
+    private List<ActionLayoutData> actions = Lists.newArrayList();
+
+    @XmlElementWrapper(required = false)
+    @XmlElement(name = "action", required = false)
+    public List<ActionLayoutData> getActions() {
+        return actions;
+    }
+
+    public void setActions(List<ActionLayoutData> actionLayoutDatas) {
+        this.actions = actionLayoutDatas;
+    }
+
+
+
+    private List<PropertyLayoutData> properties = Lists.newArrayList();
+
+    @XmlElement(name = "property", required = true)
+    public List<PropertyLayoutData> getProperties() {
+        return properties;
+    }
+
+    public void setProperties(List<PropertyLayoutData> properties) {
+        this.properties = properties;
+    }
+
+
+    private MemberRegionOwner owner;
+    /**
+     * Owner.
+     *
+     * <p>
+     *     Set programmatically by framework after reading in from XML.
+     * </p>
+     */
+    @XmlTransient
+    public MemberRegionOwner getOwner() {
+        return owner;
+    }
+
+    public void setOwner(final MemberRegionOwner owner) {
+        this.owner = owner;
+    }
+
+
+
+
+    private String path;
+
+    @Programmatic
+    @XmlTransient
+    public String getPath() {
+        return path;
+    }
+
+    @Programmatic
+    public void setPath(final String path) {
+        this.path = path;
+    }
+
+
+
+
+    public static class Util {
+        private Util(){}
+        public static Function<? super FieldSet, String> nameOf() {
+            return new Function<FieldSet, String>() {
+                @Nullable @Override
+                public String apply(@Nullable final FieldSet fieldSet) {
+                    return fieldSet.getName();
+                }
+            };
+        }
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/isis/blob/10d80f3a/core/applib/src/main/java/org/apache/isis/applib/layout/members/v1/PropertyLayoutData.java
----------------------------------------------------------------------
diff --git a/core/applib/src/main/java/org/apache/isis/applib/layout/members/v1/PropertyLayoutData.java b/core/applib/src/main/java/org/apache/isis/applib/layout/members/v1/PropertyLayoutData.java
new file mode 100644
index 0000000..3036c7f
--- /dev/null
+++ b/core/applib/src/main/java/org/apache/isis/applib/layout/members/v1/PropertyLayoutData.java
@@ -0,0 +1,246 @@
+/*
+ *  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.applib.layout.members.v1;
+
+import java.io.Serializable;
+import java.util.List;
+
+import javax.xml.bind.annotation.XmlAttribute;
+import javax.xml.bind.annotation.XmlElement;
+import javax.xml.bind.annotation.XmlElementWrapper;
+import javax.xml.bind.annotation.XmlTransient;
+import javax.xml.bind.annotation.XmlType;
+
+import org.apache.isis.applib.annotation.LabelPosition;
+import org.apache.isis.applib.annotation.Programmatic;
+import org.apache.isis.applib.annotation.Where;
+import org.apache.isis.applib.layout.members.Owned;
+
+/**
+ * Describes the layout of a single property, broadly corresponds to the {@link org.apache.isis.applib.annotation.PropertyLayout} annotation.
+ */
+@XmlType(
+        name = "propertyLayout"
+        , propOrder = {
+                "named"
+                , "describedAs"
+                , "actions"
+                , "metadataError"
+        }
+)
+public class PropertyLayoutData implements ActionOwner, Serializable, Owned<FieldSet> {
+
+    private static final long serialVersionUID = 1L;
+
+    public PropertyLayoutData() {
+    }
+
+    public PropertyLayoutData(final String id) {
+        this.id = id;
+    }
+
+    private String id;
+
+    /**
+     * Property identifier, being the getter method without "get" or "is" prefix, first letter lower cased.
+     */
+    @XmlAttribute(required = true)
+    public String getId() {
+        return id;
+    }
+
+    public void setId(String id) {
+        this.id = id;
+    }
+
+
+
+    private String cssClass;
+
+    @XmlAttribute(required = false)
+    public String getCssClass() {
+        return cssClass;
+    }
+
+    public void setCssClass(String cssClass) {
+        this.cssClass = cssClass;
+    }
+
+
+    private String describedAs;
+
+    @XmlElement(required = false)
+    public String getDescribedAs() {
+        return describedAs;
+    }
+
+    public void setDescribedAs(String describedAs) {
+        this.describedAs = describedAs;
+    }
+
+
+    private Where hidden;
+
+    @XmlAttribute(required = false)
+    public Where getHidden() {
+        return hidden;
+    }
+
+    public void setHidden(Where hidden) {
+        this.hidden = hidden;
+    }
+
+
+    private LabelPosition labelPosition;
+
+    @XmlAttribute(required = false)
+    public LabelPosition getLabelPosition() {
+        return labelPosition;
+    }
+
+    public void setLabelPosition(LabelPosition labelPosition) {
+        this.labelPosition = labelPosition;
+    }
+
+
+    private Integer multiLine;
+
+    @XmlAttribute(required = false)
+    public Integer getMultiLine() {
+        return multiLine;
+    }
+
+    public void setMultiLine(Integer multiLine) {
+        this.multiLine = multiLine;
+    }
+
+
+    private String named;
+
+    @XmlElement(required = false)
+    public String getNamed() {
+        return named;
+    }
+
+    public void setNamed(String named) {
+        this.named = named;
+    }
+
+
+    private Boolean namedEscaped;
+
+    @XmlAttribute(required = false)
+    public Boolean getNamedEscaped() {
+        return namedEscaped;
+    }
+
+    public void setNamedEscaped(Boolean namedEscaped) {
+        this.namedEscaped = namedEscaped;
+    }
+
+
+    private Boolean renderedAsDayBefore;
+
+    @XmlAttribute(required = false)
+    public Boolean getRenderedAsDayBefore() {
+        return renderedAsDayBefore;
+    }
+
+    public void setRenderedAsDayBefore(Boolean renderedAsDayBefore) {
+        this.renderedAsDayBefore = renderedAsDayBefore;
+    }
+
+
+    private Integer typicalLength;
+
+    @XmlAttribute(required = false)
+    public Integer getTypicalLength() {
+        return typicalLength;
+    }
+
+    public void setTypicalLength(Integer typicalLength) {
+        this.typicalLength = typicalLength;
+    }
+
+
+
+    private List<ActionLayoutData> actions;
+
+    @XmlElementWrapper(required = false)
+    @XmlElement(name = "action", required = false)
+    public List<ActionLayoutData> getActions() {
+        return actions;
+    }
+
+    public void setActions(List<ActionLayoutData> actionLayoutDatas) {
+        this.actions = actionLayoutDatas;
+    }
+
+
+    private FieldSet owner;
+    /**
+     * Owner.
+     *
+     * <p>
+     *     Set programmatically by framework after reading in from XML.
+     * </p>
+     */
+    @XmlTransient
+    public FieldSet getOwner() {
+        return owner;
+    }
+
+    public void setOwner(final FieldSet owner) {
+        this.owner = owner;
+    }
+
+
+
+    private String metadataError;
+
+    /**
+     * For diagnostics; populated by the framework if and only if a metadata error.
+     */
+    @XmlElement(required = false)
+    public String getMetadataError() {
+        return metadataError;
+    }
+
+    public void setMetadataError(final String metadataError) {
+        this.metadataError = metadataError;
+    }
+
+
+
+
+    private String path;
+
+    @Programmatic
+    @XmlTransient
+    public String getPath() {
+        return path;
+    }
+
+    @Programmatic
+    public void setPath(final String path) {
+        this.path = path;
+    }
+
+
+}

http://git-wip-us.apache.org/repos/asf/isis/blob/10d80f3a/core/applib/src/main/java/org/apache/isis/applib/layout/members/v1/package-info.java
----------------------------------------------------------------------
diff --git a/core/applib/src/main/java/org/apache/isis/applib/layout/members/v1/package-info.java b/core/applib/src/main/java/org/apache/isis/applib/layout/members/v1/package-info.java
new file mode 100644
index 0000000..40a6f0b
--- /dev/null
+++ b/core/applib/src/main/java/org/apache/isis/applib/layout/members/v1/package-info.java
@@ -0,0 +1,36 @@
+/*
+ *  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.
+ */
+
+/**
+ * The classes in this package provide layout metadata for a domain object's properties, collections and actions - the
+ * &quot;building blocks&quot; which then must be arranged into some sort of layout.
+ *
+ * <p>
+ *     The <code>bootstrap3</code> and <code>fixedcols</code> packages both provide different ways of doing the layout,
+ *     and both reference the classes in this package.
+ * </p>
+ *
+ */
+@javax.xml.bind.annotation.XmlSchema(
+        namespace = "http://isis.apache.org/schema/applib/layout/members",
+        elementFormDefault = javax.xml.bind.annotation.XmlNsForm.QUALIFIED
+        // specifying the location seems to cause JaxbService#toXsd() to not generate the schema; not sure why...
+        //, location = ..."http://isis.apache.org/schema/metamodel/layout/members/v1/members-1.0.xsd"
+)
+package org.apache.isis.applib.layout.members.v1;
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/isis/blob/10d80f3a/core/applib/src/main/java/org/apache/isis/applib/layout/v1_0/ActionLayoutMetadata.java
----------------------------------------------------------------------
diff --git a/core/applib/src/main/java/org/apache/isis/applib/layout/v1_0/ActionLayoutMetadata.java b/core/applib/src/main/java/org/apache/isis/applib/layout/v1_0/ActionLayoutMetadata.java
deleted file mode 100644
index 9cc269a..0000000
--- a/core/applib/src/main/java/org/apache/isis/applib/layout/v1_0/ActionLayoutMetadata.java
+++ /dev/null
@@ -1,226 +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.applib.layout.v1_0;
-
-import java.io.Serializable;
-
-import javax.xml.bind.annotation.XmlAttribute;
-import javax.xml.bind.annotation.XmlElement;
-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.Where;
-
-/**
- * Broadly corresponds to {@link org.apache.isis.applib.annotation.ActionLayout}.
- *
- * <p>
- *  Note that {@link org.apache.isis.applib.annotation.ActionLayout#contributed()} is omitted because this only applies
- *  to domain services.
- * </p>
- */
-@XmlType(
-    name = "actionLayout"
-    , propOrder = {
-        "named"
-        , "describedAs"
-        , "metadataError"
-    }
-)
-public class ActionLayoutMetadata implements Serializable, Owned<ActionOwner> {
-
-    private static final long serialVersionUID = 1L;
-
-    public ActionLayoutMetadata() {
-    }
-    public ActionLayoutMetadata(final String id) {
-        setId(id);
-    }
-
-    private String id;
-    /**
-     * Method name.
-     *
-     * <p>
-     *     Overloaded methods are not supported.
-     * </p>
-     */
-    @XmlAttribute(name="id", required = true)
-    public String getId() {
-        return id;
-    }
-
-    public void setId(String id) {
-        this.id = id;
-    }
-
-
-
-    private BookmarkPolicy bookmarking;
-
-    @XmlAttribute(required = false)
-    public BookmarkPolicy getBookmarking() {
-        return bookmarking;
-    }
-
-    public void setBookmarking(BookmarkPolicy bookmarking) {
-        this.bookmarking = bookmarking;
-    }
-
-
-    private String cssClass;
-
-    @XmlAttribute(required = false)
-    public String getCssClass() {
-        return cssClass;
-    }
-
-    public void setCssClass(String cssClass) {
-        this.cssClass = cssClass;
-    }
-
-
-    private String cssClassFa;
-
-    @XmlAttribute(required = false)
-    public String getCssClassFa() {
-        return cssClassFa;
-    }
-
-    public void setCssClassFa(String cssClassFa) {
-        this.cssClassFa = cssClassFa;
-    }
-
-
-
-    private org.apache.isis.applib.annotation.ActionLayout.CssClassFaPosition cssClassFaPosition;
-
-    @XmlAttribute(required = false)
-    public org.apache.isis.applib.annotation.ActionLayout.CssClassFaPosition getCssClassFaPosition() {
-        return cssClassFaPosition;
-    }
-
-    public void setCssClassFaPosition(org.apache.isis.applib.annotation.ActionLayout.CssClassFaPosition cssClassFaPosition) {
-        this.cssClassFaPosition = cssClassFaPosition;
-    }
-
-
-    private String describedAs;
-
-    @XmlElement(required = false)
-    public String getDescribedAs() {
-        return describedAs;
-    }
-
-    public void setDescribedAs(String describedAs) {
-        this.describedAs = describedAs;
-    }
-
-
-
-    private Where hidden;
-
-    @XmlAttribute(required = false)
-    public Where getHidden() {
-        return hidden;
-    }
-
-    public void setHidden(Where hidden) {
-        this.hidden = hidden;
-    }
-
-
-
-    private String named;
-
-    @XmlElement(required = false)
-    public String getNamed() {
-        return named;
-    }
-
-    public void setNamed(String named) {
-        this.named = named;
-    }
-
-
-
-    private Boolean namedEscaped;
-
-    @XmlAttribute(required = false)
-    public Boolean getNamedEscaped() {
-        return namedEscaped;
-    }
-
-    public void setNamedEscaped(Boolean namedEscaped) {
-        this.namedEscaped = namedEscaped;
-    }
-
-
-
-    private org.apache.isis.applib.annotation.ActionLayout.Position position;
-
-    @XmlAttribute(required = false)
-    public org.apache.isis.applib.annotation.ActionLayout.Position getPosition() {
-        return position;
-    }
-
-    public void setPosition(org.apache.isis.applib.annotation.ActionLayout.Position position) {
-        this.position = position;
-    }
-
-
-
-
-    private ActionOwner owner;
-    /**
-     * Owner.
-     *
-     * <p>
-     *     Set programmatically by framework after reading in from XML.
-     * </p>
-     */
-    @XmlTransient
-    public ActionOwner getOwner() {
-        return owner;
-    }
-
-    public void setOwner(final ActionOwner owner) {
-        this.owner = owner;
-    }
-
-
-    private String metadataError;
-
-    /**
-     * For diagnostics; populated by the framework if and only if a metadata error.
-     */
-    @XmlElement(required = false)
-    public String getMetadataError() {
-        return metadataError;
-    }
-
-    public void setMetadataError(final String metadataError) {
-        this.metadataError = metadataError;
-    }
-
-
-
-
-}

http://git-wip-us.apache.org/repos/asf/isis/blob/10d80f3a/core/applib/src/main/java/org/apache/isis/applib/layout/v1_0/ActionOwner.java
----------------------------------------------------------------------
diff --git a/core/applib/src/main/java/org/apache/isis/applib/layout/v1_0/ActionOwner.java b/core/applib/src/main/java/org/apache/isis/applib/layout/v1_0/ActionOwner.java
deleted file mode 100644
index 4dde062..0000000
--- a/core/applib/src/main/java/org/apache/isis/applib/layout/v1_0/ActionOwner.java
+++ /dev/null
@@ -1,25 +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.applib.layout.v1_0;
-
-import java.util.List;
-
-public interface ActionOwner extends Owner {
-    List<ActionLayoutMetadata> getActions();
-}

http://git-wip-us.apache.org/repos/asf/isis/blob/10d80f3a/core/applib/src/main/java/org/apache/isis/applib/layout/v1_0/CollectionLayoutMetadata.java
----------------------------------------------------------------------
diff --git a/core/applib/src/main/java/org/apache/isis/applib/layout/v1_0/CollectionLayoutMetadata.java b/core/applib/src/main/java/org/apache/isis/applib/layout/v1_0/CollectionLayoutMetadata.java
deleted file mode 100644
index 0dee4b6..0000000
--- a/core/applib/src/main/java/org/apache/isis/applib/layout/v1_0/CollectionLayoutMetadata.java
+++ /dev/null
@@ -1,259 +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.applib.layout.v1_0;
-
-import java.io.Serializable;
-import java.util.List;
-
-import javax.xml.bind.annotation.XmlAttribute;
-import javax.xml.bind.annotation.XmlElement;
-import javax.xml.bind.annotation.XmlElementWrapper;
-import javax.xml.bind.annotation.XmlTransient;
-import javax.xml.bind.annotation.XmlType;
-
-import com.google.common.base.Function;
-
-import org.apache.isis.applib.annotation.Programmatic;
-import org.apache.isis.applib.annotation.Where;
-
-/**
- * Broadly corresponds to the {@link org.apache.isis.applib.annotation.CollectionLayout} annotation.
- *
- * <p>
- *     Note that {@link org.apache.isis.applib.annotation.CollectionLayout#render()} is omitted because
- *     {@link #defaultView} is its replacement.
- * </p>
- */
-@XmlType(
-        propOrder = {
-                "named"
-                ,"describedAs"
-                ,"sortedBy"
-                , "actions"
-                , "metadataError"
-        }
-)
-public class CollectionLayoutMetadata implements MemberLayoutMetadata, ActionOwner, Serializable {
-
-    private static final long serialVersionUID = 1L;
-
-    public CollectionLayoutMetadata() {
-    }
-    public CollectionLayoutMetadata(final String id) {
-        setId(id);
-    }
-
-
-    private String id;
-
-    /**
-     * Collection identifier, being the getter method without "get" prefix, first letter lower cased.
-     */
-    @XmlAttribute(required = true)
-    public String getId() {
-        return id;
-    }
-
-    public void setId(String id) {
-        this.id = id;
-    }
-
-
-
-    private String cssClass;
-
-    @XmlAttribute(required = false)
-    public String getCssClass() {
-        return cssClass;
-    }
-
-    public void setCssClass(String cssClass) {
-        this.cssClass = cssClass;
-    }
-
-
-
-    private String describedAs;
-
-    @XmlElement(required = false)
-    public String getDescribedAs() {
-        return describedAs;
-    }
-
-    public void setDescribedAs(String describedAs) {
-        this.describedAs = describedAs;
-    }
-
-
-
-    private String defaultView;
-
-    /**
-     * Typically <code>table</code> or <code>hidden</code>, but could be any other named view that is configured and
-     * appropriate, eg <code>gmap3</code> or <code>fullcalendar2</code>.
-     */
-    @XmlAttribute(required = false)
-    public String getDefaultView() {
-        return defaultView;
-    }
-
-    public void setDefaultView(String defaultView) {
-        this.defaultView = defaultView;
-    }
-
-
-    private Where hidden;
-
-    @XmlAttribute(required = false)
-    public Where getHidden() {
-        return hidden;
-    }
-
-    public void setHidden(Where hidden) {
-        this.hidden = hidden;
-    }
-
-
-    private String named;
-
-    @XmlElement(required = false)
-    public String getNamed() {
-        return named;
-    }
-
-    public void setNamed(String named) {
-        this.named = named;
-    }
-
-
-    private Boolean namedEscaped;
-
-    @XmlAttribute(required = false)
-    public Boolean getNamedEscaped() {
-        return namedEscaped;
-    }
-
-    public void setNamedEscaped(Boolean namedEscaped) {
-        this.namedEscaped = namedEscaped;
-    }
-
-
-    private Integer paged;
-
-    @XmlAttribute(required = false)
-    public Integer getPaged() {
-        return paged;
-    }
-
-    public void setPaged(Integer paged) {
-        this.paged = paged;
-    }
-
-
-
-    private String sortedBy;
-
-    @XmlElement(required = false)
-    public String getSortedBy() {
-        return sortedBy;
-    }
-
-    public void setSortedBy(String sortedBy) {
-        this.sortedBy = sortedBy;
-    }
-
-
-
-    private List<ActionLayoutMetadata> actions;
-
-    @XmlElementWrapper(name = "actions", required = false)
-    @XmlElement(name = "action", required = false)
-    public List<ActionLayoutMetadata> getActions() {
-        return actions;
-    }
-
-    public void setActions(List<ActionLayoutMetadata> actionLayoutMetadatas) {
-        this.actions = actionLayoutMetadatas;
-    }
-
-
-
-    private MemberLayoutMetadataOwner owner;
-    /**
-     * Owner.
-     *
-     * <p>
-     *     Set programmatically by framework after reading in from XML.
-     * </p>
-     */
-    @XmlTransient
-    public MemberLayoutMetadataOwner getOwner() {
-        return owner;
-    }
-
-    public void setOwner(final MemberLayoutMetadataOwner owner) {
-        this.owner = owner;
-    }
-
-
-    private String metadataError;
-
-    /**
-     * For diagnostics; populated by the framework if and only if a metadata error.
-     */
-    @XmlElement(required = false)
-    public String getMetadataError() {
-        return metadataError;
-    }
-
-    public void setMetadataError(final String metadataError) {
-        this.metadataError = metadataError;
-    }
-
-
-
-
-    private String path;
-
-    @Programmatic
-    @XmlTransient
-    public String getPath() {
-        return path;
-    }
-
-    @Programmatic
-    public void setPath(final String path) {
-        this.path = path;
-    }
-
-
-
-    public static class Functions {
-        private Functions(){}
-
-        public static Function<CollectionLayoutMetadata, String> id() {
-            return new Function<CollectionLayoutMetadata, String>() {
-                @Override
-                public String apply(final CollectionLayoutMetadata metadata) {
-                    return metadata.getId();
-                }
-            };
-        }
-    }
-}

http://git-wip-us.apache.org/repos/asf/isis/blob/10d80f3a/core/applib/src/main/java/org/apache/isis/applib/layout/v1_0/ColumnOwner.java
----------------------------------------------------------------------
diff --git a/core/applib/src/main/java/org/apache/isis/applib/layout/v1_0/ColumnOwner.java b/core/applib/src/main/java/org/apache/isis/applib/layout/v1_0/ColumnOwner.java
deleted file mode 100644
index 62f6007..0000000
--- a/core/applib/src/main/java/org/apache/isis/applib/layout/v1_0/ColumnOwner.java
+++ /dev/null
@@ -1,23 +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.applib.layout.v1_0;
-
-public interface ColumnOwner extends Owner {
-
-}

http://git-wip-us.apache.org/repos/asf/isis/blob/10d80f3a/core/applib/src/main/java/org/apache/isis/applib/layout/v1_0/MemberLayoutMetadata.java
----------------------------------------------------------------------
diff --git a/core/applib/src/main/java/org/apache/isis/applib/layout/v1_0/MemberLayoutMetadata.java b/core/applib/src/main/java/org/apache/isis/applib/layout/v1_0/MemberLayoutMetadata.java
deleted file mode 100644
index 9361a36..0000000
--- a/core/applib/src/main/java/org/apache/isis/applib/layout/v1_0/MemberLayoutMetadata.java
+++ /dev/null
@@ -1,24 +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.applib.layout.v1_0;
-
-public interface MemberLayoutMetadata extends Owned<MemberLayoutMetadataOwner> {
-
-
-}

http://git-wip-us.apache.org/repos/asf/isis/blob/10d80f3a/core/applib/src/main/java/org/apache/isis/applib/layout/v1_0/MemberLayoutMetadataOwner.java
----------------------------------------------------------------------
diff --git a/core/applib/src/main/java/org/apache/isis/applib/layout/v1_0/MemberLayoutMetadataOwner.java b/core/applib/src/main/java/org/apache/isis/applib/layout/v1_0/MemberLayoutMetadataOwner.java
deleted file mode 100644
index 5aa26c6..0000000
--- a/core/applib/src/main/java/org/apache/isis/applib/layout/v1_0/MemberLayoutMetadataOwner.java
+++ /dev/null
@@ -1,23 +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.applib.layout.v1_0;
-
-public interface MemberLayoutMetadataOwner extends Owner {
-
-}

http://git-wip-us.apache.org/repos/asf/isis/blob/10d80f3a/core/applib/src/main/java/org/apache/isis/applib/layout/v1_0/Owned.java
----------------------------------------------------------------------
diff --git a/core/applib/src/main/java/org/apache/isis/applib/layout/v1_0/Owned.java b/core/applib/src/main/java/org/apache/isis/applib/layout/v1_0/Owned.java
deleted file mode 100644
index a209293..0000000
--- a/core/applib/src/main/java/org/apache/isis/applib/layout/v1_0/Owned.java
+++ /dev/null
@@ -1,23 +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.applib.layout.v1_0;
-
-public interface Owned<T extends Owner> {
-    T getOwner();
-}

http://git-wip-us.apache.org/repos/asf/isis/blob/10d80f3a/core/applib/src/main/java/org/apache/isis/applib/layout/v1_0/Owner.java
----------------------------------------------------------------------
diff --git a/core/applib/src/main/java/org/apache/isis/applib/layout/v1_0/Owner.java b/core/applib/src/main/java/org/apache/isis/applib/layout/v1_0/Owner.java
deleted file mode 100644
index 4a94642..0000000
--- a/core/applib/src/main/java/org/apache/isis/applib/layout/v1_0/Owner.java
+++ /dev/null
@@ -1,24 +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.applib.layout.v1_0;
-
-public interface Owner {
-
-
-}

http://git-wip-us.apache.org/repos/asf/isis/blob/10d80f3a/core/applib/src/main/java/org/apache/isis/applib/layout/v1_0/PropertyGroupMetadata.java
----------------------------------------------------------------------
diff --git a/core/applib/src/main/java/org/apache/isis/applib/layout/v1_0/PropertyGroupMetadata.java b/core/applib/src/main/java/org/apache/isis/applib/layout/v1_0/PropertyGroupMetadata.java
deleted file mode 100644
index c5acbc0..0000000
--- a/core/applib/src/main/java/org/apache/isis/applib/layout/v1_0/PropertyGroupMetadata.java
+++ /dev/null
@@ -1,145 +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.applib.layout.v1_0;
-
-import java.io.Serializable;
-import java.util.List;
-
-import javax.annotation.Nullable;
-import javax.xml.bind.annotation.XmlAttribute;
-import javax.xml.bind.annotation.XmlElement;
-import javax.xml.bind.annotation.XmlElementWrapper;
-import javax.xml.bind.annotation.XmlTransient;
-import javax.xml.bind.annotation.XmlType;
-
-import com.google.common.base.Function;
-import com.google.common.collect.Lists;
-
-import org.apache.isis.applib.annotation.MemberOrder;
-import org.apache.isis.applib.annotation.Programmatic;
-
-@XmlType(
-        propOrder = {
-                "name"
-                , "actions"
-                , "properties"
-        }
-)
-public class PropertyGroupMetadata implements MemberLayoutMetadata, ActionOwner, Serializable {
-
-    private static final long serialVersionUID = 1L;
-
-    public PropertyGroupMetadata() {
-    }
-
-    public PropertyGroupMetadata(final String name) {
-        setName(name);
-    }
-
-    private String name;
-
-    /**
-     * Corresponds to the {@link MemberOrder#name()} (when applied to properties).
-     */
-    @XmlAttribute(required = true)
-    public String getName() {
-        return name;
-    }
-
-    public void setName(String name) {
-        this.name = name;
-    }
-
-
-
-    private List<ActionLayoutMetadata> actions = Lists.newArrayList();
-
-    @XmlElementWrapper(required = false)
-    @XmlElement(name = "action", required = false)
-    public List<ActionLayoutMetadata> getActions() {
-        return actions;
-    }
-
-    public void setActions(List<ActionLayoutMetadata> actionLayoutMetadatas) {
-        this.actions = actionLayoutMetadatas;
-    }
-
-
-
-    private List<PropertyLayoutMetadata> properties = Lists.newArrayList();
-
-    @XmlElement(name = "property", required = true)
-    public List<PropertyLayoutMetadata> getProperties() {
-        return properties;
-    }
-
-    public void setProperties(List<PropertyLayoutMetadata> properties) {
-        this.properties = properties;
-    }
-
-
-    private MemberLayoutMetadataOwner owner;
-    /**
-     * Owner.
-     *
-     * <p>
-     *     Set programmatically by framework after reading in from XML.
-     * </p>
-     */
-    @XmlTransient
-    public MemberLayoutMetadataOwner getOwner() {
-        return owner;
-    }
-
-    public void setOwner(final MemberLayoutMetadataOwner owner) {
-        this.owner = owner;
-    }
-
-
-
-
-    private String path;
-
-    @Programmatic
-    @XmlTransient
-    public String getPath() {
-        return path;
-    }
-
-    @Programmatic
-    public void setPath(final String path) {
-        this.path = path;
-    }
-
-
-
-
-    public static class Util {
-        private Util(){}
-        public static Function<? super PropertyGroupMetadata, String> nameOf() {
-            return new Function<PropertyGroupMetadata, String>() {
-                @Nullable @Override
-                public String apply(@Nullable final PropertyGroupMetadata propertyGroupMetadata) {
-                    return propertyGroupMetadata.getName();
-                }
-            };
-        }
-    }
-
-}

http://git-wip-us.apache.org/repos/asf/isis/blob/10d80f3a/core/applib/src/main/java/org/apache/isis/applib/layout/v1_0/PropertyLayoutMetadata.java
----------------------------------------------------------------------
diff --git a/core/applib/src/main/java/org/apache/isis/applib/layout/v1_0/PropertyLayoutMetadata.java b/core/applib/src/main/java/org/apache/isis/applib/layout/v1_0/PropertyLayoutMetadata.java
deleted file mode 100644
index f6a7ec4..0000000
--- a/core/applib/src/main/java/org/apache/isis/applib/layout/v1_0/PropertyLayoutMetadata.java
+++ /dev/null
@@ -1,245 +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.applib.layout.v1_0;
-
-import java.io.Serializable;
-import java.util.List;
-
-import javax.xml.bind.annotation.XmlAttribute;
-import javax.xml.bind.annotation.XmlElement;
-import javax.xml.bind.annotation.XmlElementWrapper;
-import javax.xml.bind.annotation.XmlTransient;
-import javax.xml.bind.annotation.XmlType;
-
-import org.apache.isis.applib.annotation.LabelPosition;
-import org.apache.isis.applib.annotation.Programmatic;
-import org.apache.isis.applib.annotation.Where;
-
-/**
- * Broadly corresponds to the {@link org.apache.isis.applib.annotation.PropertyLayout} annotation.
- */
-@XmlType(
-        name = "propertyLayout"
-        , propOrder = {
-                "named"
-                , "describedAs"
-                , "actions"
-                , "metadataError"
-        }
-)
-public class PropertyLayoutMetadata implements ActionOwner, Serializable, Owned<PropertyGroupMetadata> {
-
-    private static final long serialVersionUID = 1L;
-
-    public PropertyLayoutMetadata() {
-    }
-
-    public PropertyLayoutMetadata(final String id) {
-        this.id = id;
-    }
-
-    private String id;
-
-    /**
-     * Property identifier, being the getter method without "get" or "is" prefix, first letter lower cased.
-     */
-    @XmlAttribute(required = true)
-    public String getId() {
-        return id;
-    }
-
-    public void setId(String id) {
-        this.id = id;
-    }
-
-
-
-    private String cssClass;
-
-    @XmlAttribute(required = false)
-    public String getCssClass() {
-        return cssClass;
-    }
-
-    public void setCssClass(String cssClass) {
-        this.cssClass = cssClass;
-    }
-
-
-    private String describedAs;
-
-    @XmlElement(required = false)
-    public String getDescribedAs() {
-        return describedAs;
-    }
-
-    public void setDescribedAs(String describedAs) {
-        this.describedAs = describedAs;
-    }
-
-
-    private Where hidden;
-
-    @XmlAttribute(required = false)
-    public Where getHidden() {
-        return hidden;
-    }
-
-    public void setHidden(Where hidden) {
-        this.hidden = hidden;
-    }
-
-
-    private LabelPosition labelPosition;
-
-    @XmlAttribute(required = false)
-    public LabelPosition getLabelPosition() {
-        return labelPosition;
-    }
-
-    public void setLabelPosition(LabelPosition labelPosition) {
-        this.labelPosition = labelPosition;
-    }
-
-
-    private Integer multiLine;
-
-    @XmlAttribute(required = false)
-    public Integer getMultiLine() {
-        return multiLine;
-    }
-
-    public void setMultiLine(Integer multiLine) {
-        this.multiLine = multiLine;
-    }
-
-
-    private String named;
-
-    @XmlElement(required = false)
-    public String getNamed() {
-        return named;
-    }
-
-    public void setNamed(String named) {
-        this.named = named;
-    }
-
-
-    private Boolean namedEscaped;
-
-    @XmlAttribute(required = false)
-    public Boolean getNamedEscaped() {
-        return namedEscaped;
-    }
-
-    public void setNamedEscaped(Boolean namedEscaped) {
-        this.namedEscaped = namedEscaped;
-    }
-
-
-    private Boolean renderedAsDayBefore;
-
-    @XmlAttribute(required = false)
-    public Boolean getRenderedAsDayBefore() {
-        return renderedAsDayBefore;
-    }
-
-    public void setRenderedAsDayBefore(Boolean renderedAsDayBefore) {
-        this.renderedAsDayBefore = renderedAsDayBefore;
-    }
-
-
-    private Integer typicalLength;
-
-    @XmlAttribute(required = false)
-    public Integer getTypicalLength() {
-        return typicalLength;
-    }
-
-    public void setTypicalLength(Integer typicalLength) {
-        this.typicalLength = typicalLength;
-    }
-
-
-
-    private List<ActionLayoutMetadata> actions;
-
-    @XmlElementWrapper(required = false)
-    @XmlElement(name = "action", required = false)
-    public List<ActionLayoutMetadata> getActions() {
-        return actions;
-    }
-
-    public void setActions(List<ActionLayoutMetadata> actionLayoutMetadatas) {
-        this.actions = actionLayoutMetadatas;
-    }
-
-
-    private PropertyGroupMetadata owner;
-    /**
-     * Owner.
-     *
-     * <p>
-     *     Set programmatically by framework after reading in from XML.
-     * </p>
-     */
-    @XmlTransient
-    public PropertyGroupMetadata getOwner() {
-        return owner;
-    }
-
-    public void setOwner(final PropertyGroupMetadata owner) {
-        this.owner = owner;
-    }
-
-
-
-    private String metadataError;
-
-    /**
-     * For diagnostics; populated by the framework if and only if a metadata error.
-     */
-    @XmlElement(required = false)
-    public String getMetadataError() {
-        return metadataError;
-    }
-
-    public void setMetadataError(final String metadataError) {
-        this.metadataError = metadataError;
-    }
-
-
-
-
-    private String path;
-
-    @Programmatic
-    @XmlTransient
-    public String getPath() {
-        return path;
-    }
-
-    @Programmatic
-    public void setPath(final String path) {
-        this.path = path;
-    }
-
-
-}

http://git-wip-us.apache.org/repos/asf/isis/blob/10d80f3a/core/applib/src/main/java/org/apache/isis/applib/layout/v1_0/package-info.java
----------------------------------------------------------------------
diff --git a/core/applib/src/main/java/org/apache/isis/applib/layout/v1_0/package-info.java b/core/applib/src/main/java/org/apache/isis/applib/layout/v1_0/package-info.java
deleted file mode 100644
index f187ff2..0000000
--- a/core/applib/src/main/java/org/apache/isis/applib/layout/v1_0/package-info.java
+++ /dev/null
@@ -1,25 +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.
- */
-@javax.xml.bind.annotation.XmlSchema(
-        namespace = "http://isis.apache.org/schema/applib/layout",
-        elementFormDefault = javax.xml.bind.annotation.XmlNsForm.QUALIFIED
-        // specifying the location seems to cause JaxbService#toXsd() to not generate the schema; not sure why...
-        //, location = "http://isis.apache.org/schema/metamodel/layout/layout-1.0.xsd"
-)
-package org.apache.isis.applib.layout.v1_0;
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/isis/blob/10d80f3a/core/applib/src/main/java/org/apache/isis/applib/services/layout/ObjectLayoutMetadataService.java
----------------------------------------------------------------------
diff --git a/core/applib/src/main/java/org/apache/isis/applib/services/layout/ObjectLayoutMetadataService.java b/core/applib/src/main/java/org/apache/isis/applib/services/layout/ObjectLayoutMetadataService.java
index c4ad854..99f1a9d 100644
--- a/core/applib/src/main/java/org/apache/isis/applib/services/layout/ObjectLayoutMetadataService.java
+++ b/core/applib/src/main/java/org/apache/isis/applib/services/layout/ObjectLayoutMetadataService.java
@@ -17,7 +17,7 @@
 package org.apache.isis.applib.services.layout;
 
 import org.apache.isis.applib.annotation.Programmatic;
-import org.apache.isis.applib.layout.fixedcols.ObjectLayoutMetadata;
+import org.apache.isis.applib.layout.fixedcols.FCPage;
 
 public interface ObjectLayoutMetadataService {
 
@@ -30,20 +30,17 @@ public interface ObjectLayoutMetadataService {
     /**
      * Returns raw (unnormalized) metadata, eg per the <code>.layout.xml</code> file.
      */
-    @Programmatic
-    ObjectLayoutMetadata fromXml(Class<?> domainClass);
+    @Programmatic FCPage fromXml(Class<?> domainClass);
 
     /**
      * Obtains the layout metadata, if any, for the (domain class of the) specified domain object.
      */
-    @Programmatic
-    ObjectLayoutMetadata toMetadata(Object domainObject);
+    @Programmatic FCPage toMetadata(Object domainObject);
 
     /**
      * Obtains the layout metadata, if any, for the specified domain class.
      */
-    @Programmatic
-    ObjectLayoutMetadata toMetadata(Class<?> domainClass);
+    @Programmatic FCPage toMetadata(Class<?> domainClass);
 
 
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/isis/blob/10d80f3a/core/applib/src/main/java/org/apache/isis/applib/services/layout/Object_downloadLayoutXml.java
----------------------------------------------------------------------
diff --git a/core/applib/src/main/java/org/apache/isis/applib/services/layout/Object_downloadLayoutXml.java b/core/applib/src/main/java/org/apache/isis/applib/services/layout/Object_downloadLayoutXml.java
index 089461d..4532705 100644
--- a/core/applib/src/main/java/org/apache/isis/applib/services/layout/Object_downloadLayoutXml.java
+++ b/core/applib/src/main/java/org/apache/isis/applib/services/layout/Object_downloadLayoutXml.java
@@ -28,7 +28,7 @@ import org.apache.isis.applib.annotation.Mixin;
 import org.apache.isis.applib.annotation.ParameterLayout;
 import org.apache.isis.applib.annotation.RestrictTo;
 import org.apache.isis.applib.annotation.SemanticsOf;
-import org.apache.isis.applib.layout.fixedcols.ObjectLayoutMetadata;
+import org.apache.isis.applib.layout.fixedcols.FCPage;
 import org.apache.isis.applib.services.jaxb.JaxbService;
 import org.apache.isis.applib.value.Clob;
 
@@ -58,7 +58,7 @@ public class Object_downloadLayoutXml {
     public Object $$(
             @ParameterLayout(named = "File name")
             final String fileName) {
-        final ObjectLayoutMetadata metadata = getObjectLayoutMetadata();
+        final FCPage metadata = getObjectLayoutMetadata();
         final String xml = jaxbService.toXml(metadata,
                 ImmutableMap.<String,Object>of(
                         Marshaller.JAXB_SCHEMA_LOCATION,
@@ -75,7 +75,7 @@ public class Object_downloadLayoutXml {
         return Util.withSuffix(object.getClass().getSimpleName(), "layout.xml");
     }
 
-    protected ObjectLayoutMetadata getObjectLayoutMetadata() {
+    protected FCPage getObjectLayoutMetadata() {
         return objectLayoutMetadataService.toMetadata(object);
     }
 

http://git-wip-us.apache.org/repos/asf/isis/blob/10d80f3a/core/applib/src/main/java/org/apache/isis/applib/services/layout/Object_viewLayout.java
----------------------------------------------------------------------
diff --git a/core/applib/src/main/java/org/apache/isis/applib/services/layout/Object_viewLayout.java b/core/applib/src/main/java/org/apache/isis/applib/services/layout/Object_viewLayout.java
index 4ba2145..ae7d907 100644
--- a/core/applib/src/main/java/org/apache/isis/applib/services/layout/Object_viewLayout.java
+++ b/core/applib/src/main/java/org/apache/isis/applib/services/layout/Object_viewLayout.java
@@ -25,7 +25,7 @@ import org.apache.isis.applib.annotation.Mixin;
 import org.apache.isis.applib.annotation.Programmatic;
 import org.apache.isis.applib.annotation.RestrictTo;
 import org.apache.isis.applib.annotation.SemanticsOf;
-import org.apache.isis.applib.layout.fixedcols.ObjectLayoutMetadata;
+import org.apache.isis.applib.layout.fixedcols.FCPage;
 
 @Mixin
 public class Object_viewLayout {
@@ -50,7 +50,7 @@ public class Object_viewLayout {
             cssClassFa = "fa-th"
     )
     @MemberOrder(sequence = "550.2")
-    public ObjectLayoutMetadata $$() {
+    public FCPage $$() {
         return getObjectLayoutMetadata();
     }
 
@@ -59,7 +59,7 @@ public class Object_viewLayout {
         return getObjectLayoutMetadata() == null;
     }
 
-    protected ObjectLayoutMetadata getObjectLayoutMetadata() {
+    protected FCPage getObjectLayoutMetadata() {
         return objectLayoutMetadataService.toMetadata(object);
     }
 

http://git-wip-us.apache.org/repos/asf/isis/blob/10d80f3a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/layout/ActionPositionFacetForActionXml.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/layout/ActionPositionFacetForActionXml.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/layout/ActionPositionFacetForActionXml.java
index d2ea8ea..daf84d1 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/layout/ActionPositionFacetForActionXml.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/layout/ActionPositionFacetForActionXml.java
@@ -19,14 +19,14 @@
 
 package org.apache.isis.core.metamodel.facets.actions.layout;
 
-import org.apache.isis.applib.layout.v1_0.ActionLayoutMetadata;
+import org.apache.isis.applib.layout.members.v1.ActionLayoutData;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 import org.apache.isis.core.metamodel.facets.actions.position.ActionPositionFacet;
 import org.apache.isis.core.metamodel.facets.actions.position.ActionPositionFacetAbstract;
 
 public class ActionPositionFacetForActionXml extends ActionPositionFacetAbstract {
 
-    public static ActionPositionFacet create(ActionLayoutMetadata actionLayout, FacetHolder holder) {
+    public static ActionPositionFacet create(ActionLayoutData actionLayout, FacetHolder holder) {
         if(actionLayout == null) {
             return null;
         }

http://git-wip-us.apache.org/repos/asf/isis/blob/10d80f3a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/layout/BookmarkPolicyFacetForActionXml.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/layout/BookmarkPolicyFacetForActionXml.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/layout/BookmarkPolicyFacetForActionXml.java
index 8ba315b..6cee700 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/layout/BookmarkPolicyFacetForActionXml.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/layout/BookmarkPolicyFacetForActionXml.java
@@ -20,14 +20,14 @@
 package org.apache.isis.core.metamodel.facets.actions.layout;
 
 import org.apache.isis.applib.annotation.BookmarkPolicy;
-import org.apache.isis.applib.layout.v1_0.ActionLayoutMetadata;
+import org.apache.isis.applib.layout.members.v1.ActionLayoutData;
 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.bookmarkpolicy.BookmarkPolicyFacetAbstract;
 
 public class BookmarkPolicyFacetForActionXml extends BookmarkPolicyFacetAbstract {
 
-    public static BookmarkPolicyFacet create(final ActionLayoutMetadata actionLayout, final FacetHolder holder) {
+    public static BookmarkPolicyFacet create(final ActionLayoutData actionLayout, final FacetHolder holder) {
         if (actionLayout == null) {
             return null;
         }

http://git-wip-us.apache.org/repos/asf/isis/blob/10d80f3a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/layout/CssClassFaFacetForActionXml.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/layout/CssClassFaFacetForActionXml.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/layout/CssClassFaFacetForActionXml.java
index b413266..95a62a2 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/layout/CssClassFaFacetForActionXml.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/layout/CssClassFaFacetForActionXml.java
@@ -21,7 +21,7 @@ package org.apache.isis.core.metamodel.facets.actions.layout;
 
 import com.google.common.base.Strings;
 
-import org.apache.isis.applib.layout.v1_0.ActionLayoutMetadata;
+import org.apache.isis.applib.layout.members.v1.ActionLayoutData;
 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;
@@ -29,7 +29,7 @@ import org.apache.isis.core.metamodel.facets.members.cssclassfa.CssClassFaPositi
 
 public class CssClassFaFacetForActionXml extends CssClassFaFacetAbstract {
 
-    public static CssClassFaFacet create(final ActionLayoutMetadata actionLayout, final FacetHolder holder) {
+    public static CssClassFaFacet create(final ActionLayoutData actionLayout, final FacetHolder holder) {
         if(actionLayout == null) {
             return null;
         }

http://git-wip-us.apache.org/repos/asf/isis/blob/10d80f3a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/layout/CssClassFacetForActionXml.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/layout/CssClassFacetForActionXml.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/layout/CssClassFacetForActionXml.java
index d50323f..f845680 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/layout/CssClassFacetForActionXml.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/layout/CssClassFacetForActionXml.java
@@ -21,14 +21,14 @@ package org.apache.isis.core.metamodel.facets.actions.layout;
 
 import com.google.common.base.Strings;
 
-import org.apache.isis.applib.layout.v1_0.ActionLayoutMetadata;
+import org.apache.isis.applib.layout.members.v1.ActionLayoutData;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 import org.apache.isis.core.metamodel.facets.members.cssclass.CssClassFacet;
 import org.apache.isis.core.metamodel.facets.members.cssclass.CssClassFacetAbstract;
 
 public class CssClassFacetForActionXml extends CssClassFacetAbstract {
 
-    public static CssClassFacet create(ActionLayoutMetadata actionLayout, FacetHolder holder) {
+    public static CssClassFacet create(ActionLayoutData actionLayout, FacetHolder holder) {
         if(actionLayout == null) {
             return null;
         }