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:31 UTC

[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

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