You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@isis.apache.org by jo...@apache.org on 2021/01/27 16:03:11 UTC

[isis] 01/03: ObjectAggregator invokes object instance link to access properties

This is an automated email from the ASF dual-hosted git repository.

joergrade pushed a commit to branch ISIS-2465_Kroviz-Demo_Menu_Actions_Show_No_Output
in repository https://gitbox.apache.org/repos/asf/isis.git

commit efb6d006e80a74e4f704b63937646621e793e6de
Author: Jörg Rade <jo...@kuehne-nagel.com>
AuthorDate: Wed Jan 27 16:53:13 2021 +0100

    ObjectAggregator invokes object instance link to access properties
---
 .../kotlin/org/apache/isis/client/kroviz/App.kt    |   1 +
 .../kroviz/core/aggregator/ActionDispatcher.kt     |   5 +-
 .../kroviz/core/aggregator/BaseAggregator.kt       |   6 +
 .../core/aggregator/DomainTypesAggregator.kt       |  38 ++-
 .../kroviz/core/aggregator/ListAggregator.kt       |  36 +-
 .../kroviz/core/aggregator/ObjectAggregator.kt     |  53 +--
 .../kroviz/core/aggregator/RestfulDispatcher.kt    |  11 +-
 .../client/kroviz/core/event/RoXmlHttpRequest.kt   |  25 +-
 .../isis/client/kroviz/core/model/ObjectDM.kt      |  48 ++-
 .../isis/client/kroviz/to/PlainTransferObjects.kt  |   3 +-
 .../org/apache/isis/client/kroviz/to/TObject.kt    |  10 +-
 .../apache/isis/client/kroviz/ui/EventLogDetail.kt |   8 +-
 .../client/kroviz/ui/builder/FieldSetBuilder.kt    |  17 +-
 .../isis/client/kroviz/ui/kv/EventLogTable.kt      |   2 +-
 .../apache/isis/client/kroviz/ui/kv/LoginPrompt.kt |   2 +-
 .../apache/isis/client/kroviz/ui/kv/RoDialog.kt    |   4 +-
 .../apache/isis/client/kroviz/ui/kv/UiManager.kt   |   2 +-
 .../apache/isis/client/kroviz/utils/IconManager.kt |   2 +
 .../org/apache/isis/client/kroviz/TestUtil.kt      |   3 +-
 .../client/kroviz/snapshots/FR_OBJECT_LAYOUT.json  | 248 --------------
 .../isis/client/kroviz/snapshots/LAYOUT.adoc       | 380 ---------------------
 .../kroviz/snapshots/ResponseRegressionTest.kt     |  71 ++++
 .../isis/client/kroviz/snapshots/SyncRequest.kt    |  27 ++
 .../snapshots/demo2_0_0/ACTIONS_STRINGS_INVOKE.kt  | 140 ++++++--
 .../client/kroviz/snapshots/demo2_0_0/RESTFUL.kt   |  61 ++++
 .../kroviz/snapshots/demo2_0_0/Response2Handler.kt |  50 +++
 .../isis/client/kroviz/snapshots/sample.json       | 159 +++++++--
 .../apache/isis/client/kroviz/snapshots/sample.svg |  65 ----
 .../apache/isis/client/kroviz/snapshots/sample.xml |  88 -----
 .../snapshots/{action_string.json => sample2.json} | 121 +++++--
 .../kroviz/snapshots/simpleapp1_16_0/UrlsTest.kt   |  74 ----
 .../org/apache/isis/client/kroviz/to/LinkTest.kt   |  28 +-
 .../apache/isis/client/kroviz/to/TObjectTest.kt    |  13 +-
 33 files changed, 714 insertions(+), 1087 deletions(-)

diff --git a/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/App.kt b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/App.kt
index 55b5cba..c2acf28 100644
--- a/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/App.kt
+++ b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/App.kt
@@ -31,6 +31,7 @@ class App : Application() {
 
     init {
         require("css/kroviz.css")
+        require("lodash")
     }
 
     override fun start() {
diff --git a/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/core/aggregator/ActionDispatcher.kt b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/core/aggregator/ActionDispatcher.kt
index fc1e3cf..5ee6df8 100644
--- a/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/core/aggregator/ActionDispatcher.kt
+++ b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/core/aggregator/ActionDispatcher.kt
@@ -19,7 +19,6 @@
 package org.apache.isis.client.kroviz.core.aggregator
 
 import org.apache.isis.client.kroviz.core.event.LogEntry
-import org.apache.isis.client.kroviz.core.event.RoXmlHttpRequest
 import org.apache.isis.client.kroviz.to.Action
 import org.apache.isis.client.kroviz.to.Link
 import org.apache.isis.client.kroviz.to.Method
@@ -47,13 +46,13 @@ class ActionDispatcher(private val at: Point = Point(100, 100)) : BaseAggregator
         when {
             link.hasArguments() -> ActionPrompt(action = action).open(at)
             link.relation() == Relation.INVOKE -> invoke(action, link)
-            else -> RoXmlHttpRequest().invoke(link, aggregator)
+            else -> invoke(link, aggregator)
         }
     }
 
     private fun invoke(action: Action, link: Link) {
         val title = Utils.deCamel(action.id)
-        RoXmlHttpRequest().invoke(link, ObjectAggregator(title))
+        invoke(link, ObjectAggregator(title))
     }
 
     /**
diff --git a/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/core/aggregator/BaseAggregator.kt b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/core/aggregator/BaseAggregator.kt
index 7544be9..8815925 100644
--- a/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/core/aggregator/BaseAggregator.kt
+++ b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/core/aggregator/BaseAggregator.kt
@@ -19,9 +19,11 @@
 package org.apache.isis.client.kroviz.core.aggregator
 
 import org.apache.isis.client.kroviz.core.event.LogEntry
+import org.apache.isis.client.kroviz.core.event.RoXmlHttpRequest
 import org.apache.isis.client.kroviz.core.model.DisplayModel
 import org.apache.isis.client.kroviz.to.Link
 import org.apache.isis.client.kroviz.to.TObject
+import org.apache.isis.client.kroviz.ui.kv.Constants
 
 /**
  * An Aggregator:
@@ -70,4 +72,8 @@ abstract class BaseAggregator {
         return href.isNotEmpty() && href.contains("layout")
     }
 
+    protected fun invoke(link:Link, aggregator: BaseAggregator, subType :String = Constants.subTypeJson) {
+        RoXmlHttpRequest().invoke(link, aggregator, subType)
+    }
+
 }
diff --git a/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/core/aggregator/DomainTypesAggregator.kt b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/core/aggregator/DomainTypesAggregator.kt
index aeee107..a23ccce 100644
--- a/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/core/aggregator/DomainTypesAggregator.kt
+++ b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/core/aggregator/DomainTypesAggregator.kt
@@ -19,7 +19,6 @@
 package org.apache.isis.client.kroviz.core.aggregator
 
 import org.apache.isis.client.kroviz.core.event.LogEntry
-import org.apache.isis.client.kroviz.core.event.RoXmlHttpRequest
 import org.apache.isis.client.kroviz.core.model.DiagramDM
 import org.apache.isis.client.kroviz.to.*
 import org.apache.isis.client.kroviz.ui.kv.RoStatusBar
@@ -65,7 +64,7 @@ class DomainTypesAggregator(val url: String) : BaseAggregator() {
             }
             (dpm as DiagramDM).incNumberOfProperties(propertyList.size)
             propertyList.forEach { p ->
-                RoXmlHttpRequest().invoke(p,this)
+                invoke(p, this)
             }
         }
     }
@@ -75,17 +74,28 @@ class DomainTypesAggregator(val url: String) : BaseAggregator() {
         obj.values.forEach { link ->
             val it = link.href
             when {
-                it.contains("/org.apache.isis") -> {}
-                it.contains("/isisApplib") -> {}
-                it.contains("/java") -> {}
-                it.contains("/void") -> {}
-                it.contains("/boolean") -> {}
-                it.contains("fixture") -> {}
-                it.contains("service") -> {}
-                it.contains("/homepage") -> {}
-                it.endsWith("Menu") -> {}
-                it.startsWith("demoapp.dom.annot") -> {}
-                it.startsWith("demoapp.dom.types.javatime") -> {}
+                it.contains("/org.apache.isis") -> {
+                }
+                it.contains("/isisApplib") -> {
+                }
+                it.contains("/java") -> {
+                }
+                it.contains("/void") -> {
+                }
+                it.contains("/boolean") -> {
+                }
+                it.contains("fixture") -> {
+                }
+                it.contains("service") -> {
+                }
+                it.contains("/homepage") -> {
+                }
+                it.endsWith("Menu") -> {
+                }
+                it.startsWith("demoapp.dom.annot") -> {
+                }
+                it.startsWith("demoapp.dom.types.javatime") -> {
+                }
                 else -> {
                     domainTypeLinkList.add(link)
                 }
@@ -93,7 +103,7 @@ class DomainTypesAggregator(val url: String) : BaseAggregator() {
         }
         (dpm as DiagramDM).numberOfClasses = domainTypeLinkList.size
         domainTypeLinkList.forEach {
-            RoXmlHttpRequest().invoke(it,this)
+            invoke(it, this)
         }
     }
 
diff --git a/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/core/aggregator/ListAggregator.kt b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/core/aggregator/ListAggregator.kt
index 0668c45..7832d17 100644
--- a/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/core/aggregator/ListAggregator.kt
+++ b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/core/aggregator/ListAggregator.kt
@@ -20,7 +20,6 @@ package org.apache.isis.client.kroviz.core.aggregator
 
 import org.apache.isis.client.kroviz.core.event.EventState
 import org.apache.isis.client.kroviz.core.event.LogEntry
-import org.apache.isis.client.kroviz.core.event.RoXmlHttpRequest
 import org.apache.isis.client.kroviz.core.model.ListDM
 import org.apache.isis.client.kroviz.layout.Layout
 import org.apache.isis.client.kroviz.to.*
@@ -43,8 +42,9 @@ class ListAggregator(actionTitle: String) : BaseAggregator() {
 
     override fun update(logEntry: LogEntry, subType: String) {
 
-        //TODO duplicates should no be propagated to handlers at all: IMPROVE
-        if (logEntry.state != EventState.DUPLICATE) {
+        if (logEntry.state == EventState.DUPLICATE) {
+            console.log("[LA.update] TODO duplicates should not be propagated to handlers")
+        } else {
             when (val obj = logEntry.getTransferObject()) {
                 null -> log(logEntry)
                 is ResultList -> handleList(obj)
@@ -62,10 +62,10 @@ class ListAggregator(actionTitle: String) : BaseAggregator() {
     }
 
     private fun handleList(resultList: ResultList) {
-        if (resultList.resulttype != "void") {
+        if (resultList.resulttype != ResultType.VOID.type) {
             val result = resultList.result!!
             result.value.forEach {
-                RoXmlHttpRequest().invoke(it,this)
+                invoke(it, this)
             }
         }
     }
@@ -73,10 +73,11 @@ class ListAggregator(actionTitle: String) : BaseAggregator() {
     private fun handleObject(obj: TObject) {
         dpm.addData(obj)
         val l = obj.getLayoutLink()!!
-        // Json.Layout is invoked first
-        RoXmlHttpRequest().invoke(l,this)
-        // then Xml.Layout is to be invoked as well
-        RoXmlHttpRequest().invoke(l,this, Constants.subTypeXml)
+        if (l.representation() == Represention.OBJECT_LAYOUT_BS3) {
+            invoke(l, this, Constants.subTypeXml)
+        } else {
+            invoke(l, this)
+        }
     }
 
     //TODO same code in ObjectAggregator? -> pullup refactoring to be applied
@@ -93,7 +94,7 @@ class ListAggregator(actionTitle: String) : BaseAggregator() {
                 dm.addPropertyDescription(id, id)
                 if (!isDn) {
                     //invoking DN links leads to an error
-                    RoXmlHttpRequest().invoke(l,this)
+                    invoke(l, this)
                 }
             }
         }
@@ -109,7 +110,7 @@ class ListAggregator(actionTitle: String) : BaseAggregator() {
             dm.addPropertyDescription(p)
         } else {
             dm.addProperty(p)
-            RoXmlHttpRequest().invoke(p.descriptionLink()!!,this)
+            invoke(p.descriptionLink()!!, this)
         }
     }
 
@@ -124,18 +125,11 @@ class ListAggregator(actionTitle: String) : BaseAggregator() {
         }
     }
 
-    /**
-     * property-description's have extensions.friendlyName whereas
-     * plain properties don't have them  cf.:
-     * FR_PROPERTY_DESCRIPTION
-     * FR_OBJECT_PROPERTY_
-     */
     private fun Property.isPropertyDescription(): Boolean {
-        val hasExtensions = extensions != null
-        if (!hasExtensions) {
-            return false
+        val selfLink = this.links.find { l ->
+            l.relation() == Relation.SELF
         }
-        return extensions!!.friendlyName.isNotEmpty()
+        return selfLink!!.representation() == Represention.PROPERTY_DESCRIPTION
     }
 
 }
diff --git a/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/core/aggregator/ObjectAggregator.kt b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/core/aggregator/ObjectAggregator.kt
index 83b1228..c335ea5 100644
--- a/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/core/aggregator/ObjectAggregator.kt
+++ b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/core/aggregator/ObjectAggregator.kt
@@ -19,7 +19,6 @@
 package org.apache.isis.client.kroviz.core.aggregator
 
 import org.apache.isis.client.kroviz.core.event.LogEntry
-import org.apache.isis.client.kroviz.core.event.RoXmlHttpRequest
 import org.apache.isis.client.kroviz.core.model.ObjectDM
 import org.apache.isis.client.kroviz.layout.Layout
 import org.apache.isis.client.kroviz.to.*
@@ -28,6 +27,13 @@ import org.apache.isis.client.kroviz.ui.ErrorDialog
 import org.apache.isis.client.kroviz.ui.kv.Constants
 import org.apache.isis.client.kroviz.ui.kv.UiManager
 
+/** sequence of operations:
+ * (0) Menu Action              User clicks BasicTypes.String -> handled by ActionDispatcher
+ * (1) OBJECT                TObjectHandler -> invoke()   -> passed on to ObjectAggregator
+ * (2) OBJECT_LAYOUT         layoutHandler -> invoke(layout.getProperties()[].getLink()) link can be null?
+ * (3) ???_OBJECT_PROPERTY       PropertyHandler -> invoke()
+ * (4) ???_PROPERTY_DESCRIPTION  <PropertyDescriptionHandler>
+ */
 class ObjectAggregator(val actionTitle: String) : BaseAggregator() {
 
     init {
@@ -35,20 +41,20 @@ class ObjectAggregator(val actionTitle: String) : BaseAggregator() {
     }
 
     override fun update(logEntry: LogEntry, subType: String) {
-
-        when (val obj = logEntry.getTransferObject()) {
+        val obj = logEntry.getTransferObject()
+        when (obj) {
             is TObject -> handleObject(obj)
             is ResultObject -> handleResultObject(obj)
             is Property -> handleProperty(obj)
-            is Collection -> handleCollection(obj)
             is Layout -> handleLayout(obj)
             is Grid -> handleGrid(obj)
             is HttpError -> ErrorDialog(logEntry).open()
             else -> log(logEntry)
         }
 
-        console.log("[ObjectAggregator.update]")
-        console.log(logEntry.getTransferObject())
+        console.log("[OA.update]")
+        console.log(obj)
+        console.log(dpm)
 
         if (dpm.canBeDisplayed()) {
             UiManager.openObjectView(this)
@@ -56,23 +62,31 @@ class ObjectAggregator(val actionTitle: String) : BaseAggregator() {
     }
 
     fun handleObject(obj: TObject) {
-        dpm.addData(obj)
+        // After ~/action/invoke is called, the actual object instance (containing properties) needs to be invoked as well.
+        // Note that rel.self/href is identical in both cases and both are of type TObject. logEntry.url is different, though.
+        if (obj.getProperties().size == 0) {
+            invokeInstance(obj)
+        } else {
+            dpm.addData(obj)
+        }
         val l = obj.getLayoutLink()!!
-        // Json.Layout is invoked first
-        RoXmlHttpRequest().invoke(l, this)
-        // then Xml.Layout is to be invoked as well
-        RoXmlHttpRequest().invoke(l, this, Constants.subTypeXml)
+        if (l.representation() == Represention.OBJECT_LAYOUT_BS3) {
+            invoke(l, this, Constants.subTypeXml)
+        } else {
+            invoke(l, this)
+        }
     }
 
-    fun handleCollection(obj: Collection) {
-        // TODO dsp.addData(obj)
-        console.log("[ObjectAggregator.handleCollection] TODO")
-        console.log(obj)
+    private fun invokeInstance(obj: TObject) {
+        val selfLink = obj.links.find { l ->
+            l.relation() == Relation.SELF
+        }
+        invoke(selfLink!!, this)
     }
 
+
     fun handleResultObject(obj: ResultObject) {
-        // TODO dsp.addData(obj)
-        console.log("[ObjectAggregator.handleResultObject] TODO")
+        console.log("[OA.handleResultObject] TODO implement")
         console.log(obj)
     }
 
@@ -81,8 +95,7 @@ class ObjectAggregator(val actionTitle: String) : BaseAggregator() {
     }
 
     private fun handleProperty(property: Property) {
-        //TODO  yet to be implemented
-        console.log("[ObjectAggregator.handleProperty] TODO")
+        console.log("[OA.handleProperty] TODO implement")
         console.log(property)
     }
 
@@ -95,7 +108,7 @@ class ObjectAggregator(val actionTitle: String) : BaseAggregator() {
                 val isDn = l.href.contains("datanucleus")
                 if (isDn) {
                     //invoking DN links leads to an error
-                    RoXmlHttpRequest().invoke(l, this)
+                    invoke(l, this)
                 }
             }
         }
diff --git a/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/core/aggregator/RestfulDispatcher.kt b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/core/aggregator/RestfulDispatcher.kt
index 970f585..1412c7f 100644
--- a/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/core/aggregator/RestfulDispatcher.kt
+++ b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/core/aggregator/RestfulDispatcher.kt
@@ -19,7 +19,6 @@
 package org.apache.isis.client.kroviz.core.aggregator
 
 import org.apache.isis.client.kroviz.core.event.LogEntry
-import org.apache.isis.client.kroviz.core.event.RoXmlHttpRequest
 import org.apache.isis.client.kroviz.to.Link
 import org.apache.isis.client.kroviz.to.Relation
 import org.apache.isis.client.kroviz.to.Restful
@@ -31,19 +30,21 @@ class RestfulDispatcher() : BaseAggregator() {
         restful.links.forEach {
             when {
                 it.rel.endsWith("/menuBars") -> invokeNavigation(it)
-                it.relation() == Relation.SELF -> {}
-                it.rel.endsWith("/services") -> {}
+                it.relation() == Relation.SELF -> {
+                }
+                it.rel.endsWith("/services") -> {
+                }
                 else -> invokeSystem(it)
             }
         }
     }
 
     private fun invokeNavigation(it: Link) {
-        RoXmlHttpRequest().invoke(it, NavigationDispatcher())
+        invoke(it, NavigationDispatcher())
     }
 
     private fun invokeSystem(it: Link) {
-        RoXmlHttpRequest().invoke(it, SystemAggregator())
+        invoke(it, SystemAggregator())
     }
 
 }
diff --git a/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/core/event/RoXmlHttpRequest.kt b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/core/event/RoXmlHttpRequest.kt
index a958aee..8f35b4d 100644
--- a/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/core/event/RoXmlHttpRequest.kt
+++ b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/core/event/RoXmlHttpRequest.kt
@@ -69,25 +69,26 @@ class RoXmlHttpRequest {
 
         val rs = buildResourceSpecificationAndSetupHandler(url, subType, xhr)
 
-        var body = ""
+        val body = buildBody(link, aggregator)
         when {
-            link.hasArguments() -> body = Utils.argumentsAsBody(link)
+            body.isEmpty() -> xhr.send()
+            else -> xhr.send(body)
+        }
+        EventStore.start(rs, method, body, aggregator)
+    }
+
+    private fun buildBody(link: Link, aggregator: BaseAggregator?): String {
+        return when {
+            link.hasArguments() -> Utils.argumentsAsBody(link)
             link.method == Method.PUT.operation -> {
                 val logEntry = EventStore.findBy(aggregator!!)
                 when (val obj = logEntry?.obj) {
-                    is TObject -> body = Utils.propertiesAsBody(obj)
-                    else -> {
-                    }
+                    is TObject -> Utils.propertiesAsBody(obj)
+                    else -> ""
                 }
             }
-            else -> {
-            }
-        }
-        when {
-            body.isEmpty() -> xhr.send()
-            else -> xhr.send(body)
+            else -> ""
         }
-        EventStore.start(rs, method, body, aggregator)
     }
 
     fun invokeAnonymous(link: Link, aggregator: BaseAggregator?, subType: String = Constants.subTypeXml) {
diff --git a/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/core/model/ObjectDM.kt b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/core/model/ObjectDM.kt
index fbe7be4..5f64014 100644
--- a/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/core/model/ObjectDM.kt
+++ b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/core/model/ObjectDM.kt
@@ -18,14 +18,10 @@
  */
 package org.apache.isis.client.kroviz.core.model
 
-import org.apache.isis.client.kroviz.core.aggregator.BaseAggregator
 import org.apache.isis.client.kroviz.core.event.EventStore
 import org.apache.isis.client.kroviz.core.event.ResourceSpecification
 import org.apache.isis.client.kroviz.core.event.RoXmlHttpRequest
-import org.apache.isis.client.kroviz.to.Link
-import org.apache.isis.client.kroviz.to.Method
-import org.apache.isis.client.kroviz.to.TObject
-import org.apache.isis.client.kroviz.to.TransferObject
+import org.apache.isis.client.kroviz.to.*
 
 class ObjectDM(override val title: String) : DisplayModelWithLayout() {
     var data: Exposer? = null
@@ -34,11 +30,8 @@ class ObjectDM(override val title: String) : DisplayModelWithLayout() {
     override fun canBeDisplayed(): Boolean {
         return when {
             isRendered -> false
-            layout == null -> false
-            grid == null -> false
-            else -> {
-                true
-            }
+            (layout == null) && (grid == null) -> false
+            else -> true
         }
     }
 
@@ -47,11 +40,24 @@ class ObjectDM(override val title: String) : DisplayModelWithLayout() {
     }
 
     override fun addData(obj: TransferObject) {
-        val exo = Exposer(obj as TObject)
+        console.log("[ODM.addData]")
+        (obj as TObject)
+        console.log(obj)
+        console.log(obj.members)
+        console.log(obj.getActions())
+        console.log(obj.getCollections())
+        console.log(obj.getProperties())
+        val exo = Exposer(obj)
         data = exo.dynamise() as? Exposer
+        obj.getProperties().forEach { m ->
+            console.log(m)
+            val p = createPropertyFrom(m)
+            console.log(p)
+            addProperty(p)
+        }
     }
 
-    override fun getObject(): TObject? {
+    override fun getObject(): TObject {
         return (data as Exposer).delegate
     }
 
@@ -68,10 +74,10 @@ class ObjectDM(override val title: String) : DisplayModelWithLayout() {
             val putLink = Link(method = Method.PUT.operation, href = href)
             val logEntry = EventStore.find(reSpec)
             val aggregator = logEntry?.getAggregator()!!
-            putLink.invokeWith(aggregator)
+            RoXmlHttpRequest().invoke(putLink, aggregator)
 
             // now data should be reloaded - wait for invoking PUT?
-            getLink.invokeWith(aggregator)
+            RoXmlHttpRequest().invoke(getLink, aggregator)
             //refresh of display to be triggered?
         }
     }
@@ -82,8 +88,18 @@ class ObjectDM(override val title: String) : DisplayModelWithLayout() {
         }
     }
 
-    fun Link.invokeWith(aggregator: BaseAggregator) {
-        RoXmlHttpRequest().invoke(this, aggregator)
+    private fun createPropertyFrom(m: Member): Property {
+        return Property(
+                id = m.id,
+                memberType = m.memberType,
+                links = m.links,
+                optional = m.optional,
+                title = m.id,
+                value = m.value,
+                extensions = m.extensions,
+                format = m.format,
+                disabledReason = m.disabledReason
+        )
     }
 
 }
diff --git a/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/to/PlainTransferObjects.kt b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/to/PlainTransferObjects.kt
index 1aca714..a0b62c8 100644
--- a/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/to/PlainTransferObjects.kt
+++ b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/to/PlainTransferObjects.kt
@@ -158,7 +158,8 @@ data class ResultObjectResult(
 enum class ResultType(val type: String) {
     LIST("list"),
     SCALARVALUE("scalarvalue"),
-    DOMAINOBJECT("domainobject")
+    DOMAINOBJECT("domainobject"),
+    VOID("void")
 }
 
 @Serializable
diff --git a/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/to/TObject.kt b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/to/TObject.kt
index e4f2bb8..211ede8 100644
--- a/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/to/TObject.kt
+++ b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/to/TObject.kt
@@ -30,21 +30,21 @@ data class TObject(override val links: List<Link> = emptyList(),
 ) : TransferObject, HasLinks {
 
     fun getProperties(): MutableList<Member> {
-        return getMembersOfType(MemberType.PROPERTY.type)
+        return getMembersOfType(MemberType.PROPERTY)
     }
 
     fun getActions(): MutableList<Member> {
-        return getMembersOfType(MemberType.ACTION.type)
+        return getMembersOfType(MemberType.ACTION)
     }
 
     fun getCollections(): MutableList<Member> {
-        return getMembersOfType(MemberType.COLLECTION.type)
+        return getMembersOfType(MemberType.COLLECTION)
     }
 
-    private fun getMembersOfType(type: String): MutableList<Member> {
+    private fun getMembersOfType(memberType: MemberType): MutableList<Member> {
         val result = mutableListOf<Member>()
         members.forEach {
-            if (it.value.memberType == type) {
+            if (it.value.memberType == memberType.type) {
                 result.add(it.value)
             }
         }
diff --git a/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/ui/EventLogDetail.kt b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/ui/EventLogDetail.kt
index 1717264..ef2f5d2 100644
--- a/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/ui/EventLogDetail.kt
+++ b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/ui/EventLogDetail.kt
@@ -44,11 +44,15 @@ class EventLogDetail(val logEntry: LogEntry) : Command() {
         formItems.add(FormItem("Aggregators", ValueType.TEXT_AREA, aggtStr, 5))
 
         RoDialog(
-                caption = "Error :" + logEntry.title,
+                caption = "Details :" + logEntry.title,
                 items = formItems,
                 command = this,
-                defaultAction = "Visualize",
+                defaultAction = "Debug",
                 widthPerc = 60).open()
     }
 
+    override fun execute() {
+        console.log(logEntry)
+    }
+
 }
diff --git a/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/ui/builder/FieldSetBuilder.kt b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/ui/builder/FieldSetBuilder.kt
index 4d0eb7b..fa47548 100644
--- a/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/ui/builder/FieldSetBuilder.kt
+++ b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/ui/builder/FieldSetBuilder.kt
@@ -20,7 +20,6 @@ package org.apache.isis.client.kroviz.ui.builder
 
 import org.apache.isis.client.kroviz.to.TObject
 import org.apache.isis.client.kroviz.to.TypeMapper
-import org.apache.isis.client.kroviz.to.ValueType
 import org.apache.isis.client.kroviz.to.bs3.FieldSet
 import org.apache.isis.client.kroviz.ui.FormItem
 import org.apache.isis.client.kroviz.ui.kv.FormPanelFactory
@@ -35,28 +34,32 @@ class FieldSetBuilder {
             tab: RoDisplay
     ): FormPanel<String>? {
 
+        console.log("[FSB.init]")
         val members = tObject.getProperties()
         val items = mutableListOf<FormItem>()
+        console.log("Members: " + members.size)
+        console.log("Layout-Properties: " + fieldSetLayout.propertyList.size)
+
         for (p in fieldSetLayout.propertyList) {
             val label = p.id
 
             val member = members.firstOrNull() { it.id == label }
 
             if (member != null) {
-                var size = 1
-                if (p.multiLine > 1) {
-                    member.type = ValueType.TEXT_AREA.type
-                    size = p.multiLine
-                }
+                val memberType = TypeMapper().forType(member.type!!)
+
+                val size = maxOf(1, p.multiLine)
 
                 val fi = FormItem(
                         label = label,
-                        type = TypeMapper().forType(member.type!!),
+                        type = memberType,
                         content = member.value?.content,
                         size = size,
                         description = p.describedAs,
                         member = member,
                         dspl = tab)
+                console.log(fi)
+
                 items.add(fi)
             }
         }
diff --git a/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/ui/kv/EventLogTable.kt b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/ui/kv/EventLogTable.kt
index 12ad2a6..ba494a9 100644
--- a/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/ui/kv/EventLogTable.kt
+++ b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/ui/kv/EventLogTable.kt
@@ -104,7 +104,7 @@ class EventLogTable(val model: List<LogEntry>) : VPanel() {
     private fun buildActionButton(data: LogEntry): Button {
         val b = Button(
                 text = "",
-                icon = "fa fa-ellipsis-v",
+                icon = "fa fa-info-circle",
                 style = data.state.style)
         return b
     }
diff --git a/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/ui/kv/LoginPrompt.kt b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/ui/kv/LoginPrompt.kt
index 38052b3..908dd43 100644
--- a/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/ui/kv/LoginPrompt.kt
+++ b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/ui/kv/LoginPrompt.kt
@@ -31,7 +31,7 @@ class LoginPrompt : Command() {
     private lateinit var form: RoDialog
 
     //Default values
-    private var url = "http://localhost:8080/"
+   private var url = "http://localhost:8080/"
 //    private var url = "https://demo-wicket.isis.incode.work/"
     private var username = "sven"
     private var password = "pass"
diff --git a/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/ui/kv/RoDialog.kt b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/ui/kv/RoDialog.kt
index 83bc7ed..256b8ee 100644
--- a/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/ui/kv/RoDialog.kt
+++ b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/ui/kv/RoDialog.kt
@@ -27,12 +27,12 @@ import org.apache.isis.client.kroviz.utils.Direction
 import org.apache.isis.client.kroviz.utils.IconManager
 import org.apache.isis.client.kroviz.utils.Point
 import pl.treksoft.kvision.core.CssSize
+import pl.treksoft.kvision.core.JustifyContent
 import pl.treksoft.kvision.core.UNIT
 import pl.treksoft.kvision.core.Widget
 import pl.treksoft.kvision.form.FormPanel
 import pl.treksoft.kvision.html.Button
 import pl.treksoft.kvision.html.ButtonStyle
-import pl.treksoft.kvision.panel.FlexJustify
 import pl.treksoft.kvision.panel.HPanel
 import pl.treksoft.kvision.panel.vPanel
 import pl.treksoft.kvision.utils.perc
@@ -90,7 +90,7 @@ class RoDialog(
         contentWidth = CssSize(widthPerc, UNIT.perc)
         contentHeight = CssSize(heightPerc, UNIT.perc)
 
-        vPanel(justify = FlexJustify.SPACEBETWEEN) {
+        vPanel(justify = JustifyContent.SPACEBETWEEN) {
             height = 100.perc
             formPanel = FormPanelFactory(items).panel
 
diff --git a/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/ui/kv/UiManager.kt b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/ui/kv/UiManager.kt
index ba7eb96..444889b 100644
--- a/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/ui/kv/UiManager.kt
+++ b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/ui/kv/UiManager.kt
@@ -18,6 +18,7 @@
  */
 package org.apache.isis.client.kroviz.ui.kv
 
+import kotlinx.browser.window
 import org.apache.isis.client.kroviz.core.Session
 import org.apache.isis.client.kroviz.core.aggregator.BaseAggregator
 import org.apache.isis.client.kroviz.core.aggregator.ObjectAggregator
@@ -36,7 +37,6 @@ import pl.treksoft.kvision.core.Widget
 import pl.treksoft.kvision.dropdown.ContextMenu
 import pl.treksoft.kvision.panel.SimplePanel
 import pl.treksoft.kvision.utils.ESC_KEY
-import kotlin.browser.window
 
 /**
  * Single point of contact for view components consisting of:
diff --git a/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/utils/IconManager.kt b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/utils/IconManager.kt
index c6c0c3a..35dfa89 100644
--- a/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/utils/IconManager.kt
+++ b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/utils/IconManager.kt
@@ -40,7 +40,9 @@ object IconManager {
             "Configuration" to "wrench",
             "Connect" to "plug",
             "Create" to "plus",
+            "Debug" to "bug",
             "Delete" to "trash",
+            "Details" to "info-circle",
             "Diagram" to "project-diagram",
             "Download" to "download",
             "Factory" to "industry",
diff --git a/incubator/clients/kroviz/src/test/kotlin/org/apache/isis/client/kroviz/TestUtil.kt b/incubator/clients/kroviz/src/test/kotlin/org/apache/isis/client/kroviz/TestUtil.kt
index 1ae740b..8450316 100644
--- a/incubator/clients/kroviz/src/test/kotlin/org/apache/isis/client/kroviz/TestUtil.kt
+++ b/incubator/clients/kroviz/src/test/kotlin/org/apache/isis/client/kroviz/TestUtil.kt
@@ -18,8 +18,7 @@
  */
 package org.apache.isis.client.kroviz
 
-import pl.treksoft.jquery.jQuery
-import kotlin.browser.document
+import kotlinx.browser.document
 
 interface TestSpec {
     fun beforeTest()
diff --git a/incubator/clients/kroviz/src/test/kotlin/org/apache/isis/client/kroviz/snapshots/FR_OBJECT_LAYOUT.json b/incubator/clients/kroviz/src/test/kotlin/org/apache/isis/client/kroviz/snapshots/FR_OBJECT_LAYOUT.json
deleted file mode 100644
index deb0cc7..0000000
--- a/incubator/clients/kroviz/src/test/kotlin/org/apache/isis/client/kroviz/snapshots/FR_OBJECT_LAYOUT.json
+++ /dev/null
@@ -1,248 +0,0 @@
-{
-    "row": [
-        {
-            "cols": [
-                {
-                    "col": {
-                        "domainObject": {
-                            "named": null,
-                            "describedAs": null,
-                            "plural": null,
-                            "metadataError": null,
-                            "link": {
-                                "rel": "urn:org.restfulobjects:rels/element",
-                                "method": "GET",
-                                "href": "http://localhost:8080/restful/objects/isisApplib.FixtureResult/PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPG1lbWVudG8-PGtleT5kb21haW4tYXBwLWRlbW8vcGVyc2lzdC1hbGwvaXRlbS01PC9rZXk-PG9iamVjdC5ib29rbWFyaz5zaW1wbGUuU2ltcGxlT2JqZWN0OjExNDwvb2JqZWN0LmJvb2ttYXJrPjwvbWVtZW50bz4=",
-                                "type": "application/jsonprofile=\"urn:org.restfulobjects:repr-types/object\""
-                            },
-                            "bookmarking": null,
-                            "cssClass": null,
-                            "cssClassFa": null,
-                            "cssClassFaPosition": null,
-                            "namedEscaped": null
-                        },
-                        "action": [
-                            {
-                                "named": null,
-                                "describedAs": null,
-                                "metadataError": null,
-                                "link": {
-                                    "rel": "urn:org.restfulobjects:rels/action",
-                                    "method": "GET",
-                                    "href": "http://localhost:8080/restful/objects/isisApplib.FixtureResult/PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPG1lbWVudG8-PGtleT5kb21haW4tYXBwLWRlbW8vcGVyc2lzdC1hbGwvaXRlbS01PC9rZXk-PG9iamVjdC5ib29rbWFyaz5zaW1wbGUuU2ltcGxlT2JqZWN0OjExNDwvb2JqZWN0LmJvb2ttYXJrPjwvbWVtZW50bz4=/actions/clearHints",
-                                    "type": "application/jsonprofile=\"urn:org.restfulobjects:repr-types/object-action\""
-                                },
-                                "id": "clearHints",
-                                "bookmarking": null,
-                                "cssClass": null,
-                                "cssClassFa": null,
-                                "cssClassFaPosition": null,
-                                "hidden": null,
-                                "namedEscaped": null,
-                                "position": null,
-                                "promptStyle": null
-                            },
-                            {
-                                "named": null,
-                                "describedAs": null,
-                                "metadataError": null,
-                                "link": {
-                                    "rel": "urn:org.restfulobjects:rels/action",
-                                    "method": "GET",
-                                    "href": "http://localhost:8080/restful/objects/isisApplib.FixtureResult/PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPG1lbWVudG8-PGtleT5kb21haW4tYXBwLWRlbW8vcGVyc2lzdC1hbGwvaXRlbS01PC9rZXk-PG9iamVjdC5ib29rbWFyaz5zaW1wbGUuU2ltcGxlT2JqZWN0OjExNDwvb2JqZWN0LmJvb2ttYXJrPjwvbWVtZW50bz4=/actions/downloadLayoutXml",
-                                    "type": "application/jsonprofile=\"urn:org.restfulobjects:repr-types/object-action\""
-                                },
-                                "id": "downloadLayoutXml",
-                                "bookmarking": null,
-                                "cssClass": null,
-                                "cssClassFa": null,
-                                "cssClassFaPosition": null,
-                                "hidden": null,
-                                "namedEscaped": null,
-                                "position": null,
-                                "promptStyle": null
-                            },
-                            {
-                                "named": null,
-                                "describedAs": null,
-                                "metadataError": null,
-                                "link": {
-                                    "rel": "urn:org.restfulobjects:rels/action",
-                                    "method": "GET",
-                                    "href": "http://localhost:8080/restful/objects/isisApplib.FixtureResult/PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPG1lbWVudG8-PGtleT5kb21haW4tYXBwLWRlbW8vcGVyc2lzdC1hbGwvaXRlbS01PC9rZXk-PG9iamVjdC5ib29rbWFyaz5zaW1wbGUuU2ltcGxlT2JqZWN0OjExNDwvb2JqZWN0LmJvb2ttYXJrPjwvbWVtZW50bz4=/actions/rebuildMetamodel",
-                                    "type": "application/jsonprofile=\"urn:org.restfulobjects:repr-types/object-action\""
-                                },
-                                "id": "rebuildMetamodel",
-                                "bookmarking": null,
-                                "cssClass": null,
-                                "cssClassFa": null,
-                                "cssClassFaPosition": null,
-                                "hidden": null,
-                                "namedEscaped": null,
-                                "position": null,
-                                "promptStyle": null
-                            },
-                            {
-                                "named": null,
-                                "describedAs": null,
-                                "metadataError": null,
-                                "link": {
-                                    "rel": "urn:org.restfulobjects:rels/action",
-                                    "method": "GET",
-                                    "href": "http://localhost:8080/restful/objects/isisApplib.FixtureResult/PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPG1lbWVudG8-PGtleT5kb21haW4tYXBwLWRlbW8vcGVyc2lzdC1hbGwvaXRlbS01PC9rZXk-PG9iamVjdC5ib29rbWFyaz5zaW1wbGUuU2ltcGxlT2JqZWN0OjExNDwvb2JqZWN0LmJvb2ttYXJrPjwvbWVtZW50bz4=/actions/openRestApi",
-                                    "type": "application/jsonprofile=\"urn:org.restfulobjects:repr-types/object-action\""
-                                },
-                                "id": "openRestApi",
-                                "bookmarking": null,
-                                "cssClass": null,
-                                "cssClassFa": null,
-                                "cssClassFaPosition": null,
-                                "hidden": null,
-                                "namedEscaped": null,
-                                "position": null,
-                                "promptStyle": null
-                            }
-                        ],
-                        "metadataError": null,
-                        "cssClass": null,
-                        "size": null,
-                        "id": null,
-                        "span": 12,
-                        "unreferencedActions": true,
-                        "unreferencedCollections": null
-                    }
-                }
-            ],
-            "metadataError": null,
-            "cssClass": null,
-            "id": null
-        },
-        {
-            "cols": [
-                {
-                    "col": {
-                        "domainObject": null,
-                        "fieldSet": [
-                            {
-                                "name": "General",
-                                "property": [
-                                    {
-                                        "named": null,
-                                        "describedAs": null,
-                                        "metadataError": null,
-                                        "link": {
-                                            "rel": "urn:org.restfulobjects:rels/property",
-                                            "method": "GET",
-                                            "href": "http://localhost:8080/restful/objects/isisApplib.FixtureResult/PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPG1lbWVudG8-PGtleT5kb21haW4tYXBwLWRlbW8vcGVyc2lzdC1hbGwvaXRlbS01PC9rZXk-PG9iamVjdC5ib29rbWFyaz5zaW1wbGUuU2ltcGxlT2JqZWN0OjExNDwvb2JqZWN0LmJvb2ttYXJrPjwvbWVtZW50bz4=/properties/className",
-                                            "type": "application/jsonprofile=\"urn:org.restfulobjects:repr-types/object-property\""
-                                        },
-                                        "id": "className",
-                                        "cssClass": null,
-                                        "hidden": null,
-                                        "labelPosition": null,
-                                        "multiLine": null,
-                                        "namedEscaped": null,
-                                        "promptStyle": null,
-                                        "renderedAsDayBefore": null,
-                                        "typicalLength": null,
-                                        "unchanging": null
-                                    },
-                                    {
-                                        "named": null,
-                                        "describedAs": null,
-                                        "metadataError": null,
-                                        "link": {
-                                            "rel": "urn:org.restfulobjects:rels/property",
-                                            "method": "GET",
-                                            "href": "http://localhost:8080/restful/objects/isisApplib.FixtureResult/PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPG1lbWVudG8-PGtleT5kb21haW4tYXBwLWRlbW8vcGVyc2lzdC1hbGwvaXRlbS01PC9rZXk-PG9iamVjdC5ib29rbWFyaz5zaW1wbGUuU2ltcGxlT2JqZWN0OjExNDwvb2JqZWN0LmJvb2ttYXJrPjwvbWVtZW50bz4=/properties/fixtureScriptClassName",
-                                            "type": "application/jsonprofile=\"urn:org.restfulobjects:repr-types/object-property\""
-                                        },
-                                        "id": "fixtureScriptClassName",
-                                        "cssClass": null,
-                                        "hidden": null,
-                                        "labelPosition": null,
-                                        "multiLine": null,
-                                        "namedEscaped": null,
-                                        "promptStyle": null,
-                                        "renderedAsDayBefore": null,
-                                        "typicalLength": null,
-                                        "unchanging": null
-                                    },
-                                    {
-                                        "named": null,
-                                        "describedAs": null,
-                                        "metadataError": null,
-                                        "link": {
-                                            "rel": "urn:org.restfulobjects:rels/property",
-                                            "method": "GET",
-                                            "href": "http://localhost:8080/restful/objects/isisApplib.FixtureResult/PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPG1lbWVudG8-PGtleT5kb21haW4tYXBwLWRlbW8vcGVyc2lzdC1hbGwvaXRlbS01PC9rZXk-PG9iamVjdC5ib29rbWFyaz5zaW1wbGUuU2ltcGxlT2JqZWN0OjExNDwvb2JqZWN0LmJvb2ttYXJrPjwvbWVtZW50bz4=/properties/key",
-                                            "type": "application/jsonprofile=\"urn:org.restfulobjects:repr-types/object-property\""
-                                        },
-                                        "id": "key",
-                                        "cssClass": null,
-                                        "hidden": null,
-                                        "labelPosition": null,
-                                        "multiLine": null,
-                                        "namedEscaped": null,
-                                        "promptStyle": null,
-                                        "renderedAsDayBefore": null,
-                                        "typicalLength": null,
-                                        "unchanging": null
-                                    },
-                                    {
-                                        "named": null,
-                                        "describedAs": null,
-                                        "metadataError": null,
-                                        "link": {
-                                            "rel": "urn:org.restfulobjects:rels/property",
-                                            "method": "GET",
-                                            "href": "http://localhost:8080/restful/objects/isisApplib.FixtureResult/PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPG1lbWVudG8-PGtleT5kb21haW4tYXBwLWRlbW8vcGVyc2lzdC1hbGwvaXRlbS01PC9rZXk-PG9iamVjdC5ib29rbWFyaz5zaW1wbGUuU2ltcGxlT2JqZWN0OjExNDwvb2JqZWN0LmJvb2ttYXJrPjwvbWVtZW50bz4=/properties/object",
-                                            "type": "application/jsonprofile=\"urn:org.restfulobjects:repr-types/object-property\""
-                                        },
-                                        "id": "object",
-                                        "cssClass": null,
-                                        "hidden": null,
-                                        "labelPosition": null,
-                                        "multiLine": null,
-                                        "namedEscaped": null,
-                                        "promptStyle": null,
-                                        "renderedAsDayBefore": null,
-                                        "typicalLength": null,
-                                        "unchanging": null
-                                    }
-                                ],
-                                "metadataError": null,
-                                "id": "general",
-                                "unreferencedActions": null,
-                                "unreferencedProperties": true
-                            }
-                        ],
-                        "metadataError": null,
-                        "cssClass": null,
-                        "size": null,
-                        "id": null,
-                        "span": 4,
-                        "unreferencedActions": null,
-                        "unreferencedCollections": null
-                    }
-                },
-                {
-                    "col": {
-                        "domainObject": null,
-                        "metadataError": null,
-                        "cssClass": null,
-                        "size": null,
-                        "id": null,
-                        "span": 8,
-                        "unreferencedActions": null,
-                        "unreferencedCollections": true
-                    }
-                }
-            ],
-            "metadataError": null,
-            "cssClass": null,
-            "id": null
-        }
-    ],
-    "cssClass": null
-}
diff --git a/incubator/clients/kroviz/src/test/kotlin/org/apache/isis/client/kroviz/snapshots/LAYOUT.adoc b/incubator/clients/kroviz/src/test/kotlin/org/apache/isis/client/kroviz/snapshots/LAYOUT.adoc
deleted file mode 100644
index a0ab5e2..0000000
--- a/incubator/clients/kroviz/src/test/kotlin/org/apache/isis/client/kroviz/snapshots/LAYOUT.adoc
+++ /dev/null
@@ -1,380 +0,0 @@
-[plantuml,file="LAYOUT.png"]
---
-
-@startuml
-class "root" as root {
-.. Properties ..
-cssClass: null
-.. Objects ..
-row: [Array]
-}
-class "row" as root.row {
-.. Properties ..
-.. Objects ..
-0: [object Object]
-1: [object Object]
-}
-class "0" as root.row.0 {
-.. Properties ..
-metadataError: null
-cssClass: null
-id: null
-.. Objects ..
-cols: [Array]
-}
-class "cols" as root.row.0.cols {
-.. Properties ..
-.. Objects ..
-0: [object Object]
-}
-class "0" as root.row.0.cols.0 {
-.. Properties ..
-.. Objects ..
-col: [object Object]
-}
-class "col" as root.row.0.cols.0.col {
-.. Properties ..
-metadataError: null
-cssClass: null
-size: null
-id: null
-span: 12
-unreferencedActions: true
-unreferencedCollections: null
-.. Objects ..
-domainObject: [object Object]
-action: [Array]
-}
-class "domainObject" as root.row.0.cols.0.col.domainObject {
-.. Properties ..
-named: null
-describedAs: null
-plural: null
-metadataError: null
-bookmarking: null
-cssClass: null
-cssClassFa: null
-cssClassFaPosition: null
-namedEscaped: null
-.. Objects ..
-link: [object Object]
-}
-class "link" as root.row.0.cols.0.col.domainObject.link {
-.. Properties ..
-rel: urn:org.restfulobjects:rels/element
-method: GET
-href: http://localhost:8080/restful/objects/isisApplib.FixtureResult/;
-type: application/jsonprofile&#x3D;&quot;urn:org.restfulobjects:repr-types/object&quot;
-}
-class "action" as root.row.0.cols.0.col.action {
-.. Properties ..
-.. Objects ..
-0: [object Object]
-1: [object Object]
-2: [object Object]
-3: [object Object]
-}
-class "0" as root.row.0.cols.0.col.action.0 {
-.. Properties ..
-named: null
-describedAs: null
-metadataError: null
-id: clearHints
-bookmarking: null
-cssClass: null
-cssClassFa: null
-cssClassFaPosition: null
-hidden: null
-namedEscaped: null
-position: null
-promptStyle: null
-.. Objects ..
-link: [object Object]
-}
-class "link" as root.row.0.cols.0.col.action.0.link {
-.. Properties ..
-rel: urn:org.restfulobjects:rels/action
-method: GET
-href: http://localhost:8080/restful/objects/isisApplib.FixtureResult/;/actions/clearHints
-type: application/jsonprofile&#x3D;&quot;urn:org.restfulobjects:repr-types/object-action&quot;
-}
-class "1" as root.row.0.cols.0.col.action.1 {
-.. Properties ..
-named: null
-describedAs: null
-metadataError: null
-id: downloadLayoutXml
-bookmarking: null
-cssClass: null
-cssClassFa: null
-cssClassFaPosition: null
-hidden: null
-namedEscaped: null
-position: null
-promptStyle: null
-.. Objects ..
-link: [object Object]
-}
-class "link" as root.row.0.cols.0.col.action.1.link {
-.. Properties ..
-rel: urn:org.restfulobjects:rels/action
-method: GET
-href: http://localhost:8080/restful/objects/isisApplib.FixtureResult/;/actions/downloadLayoutXml
-type: application/jsonprofile&#x3D;&quot;urn:org.restfulobjects:repr-types/object-action&quot;
-}
-class "2" as root.row.0.cols.0.col.action.2 {
-.. Properties ..
-named: null
-describedAs: null
-metadataError: null
-id: rebuildMetamodel
-bookmarking: null
-cssClass: null
-cssClassFa: null
-cssClassFaPosition: null
-hidden: null
-namedEscaped: null
-position: null
-promptStyle: null
-.. Objects ..
-link: [object Object]
-}
-class "link" as root.row.0.cols.0.col.action.2.link {
-.. Properties ..
-rel: urn:org.restfulobjects:rels/action
-method: GET
-href: http://localhost:8080/restful/objects/isisApplib.FixtureResult/;/actions/rebuildMetamodel
-type: application/jsonprofile&#x3D;&quot;urn:org.restfulobjects:repr-types/object-action&quot;
-}
-class "3" as root.row.0.cols.0.col.action.3 {
-.. Properties ..
-named: null
-describedAs: null
-metadataError: null
-id: openRestApi
-bookmarking: null
-cssClass: null
-cssClassFa: null
-cssClassFaPosition: null
-hidden: null
-namedEscaped: null
-position: null
-promptStyle: null
-.. Objects ..
-link: [object Object]
-}
-class "link" as root.row.0.cols.0.col.action.3.link {
-.. Properties ..
-rel: urn:org.restfulobjects:rels/action
-method: GET
-href: http://localhost:8080/restful/objects/isisApplib.FixtureResult/;/actions/openRestApi
-type: application/jsonprofile&#x3D;&quot;urn:org.restfulobjects:repr-types/object-action&quot;
-}
-class "1" as root.row.1 {
-.. Properties ..
-metadataError: null
-cssClass: null
-id: null
-.. Objects ..
-cols: [Array]
-}
-class "cols" as root.row.1.cols {
-.. Properties ..
-.. Objects ..
-0: [object Object]
-1: [object Object]
-}
-class "0" as root.row.1.cols.0 {
-.. Properties ..
-.. Objects ..
-col: [object Object]
-}
-class "col" as root.row.1.cols.0.col {
-.. Properties ..
-domainObject: null
-metadataError: null
-cssClass: null
-size: null
-id: null
-span: 4
-unreferencedActions: null
-unreferencedCollections: null
-.. Objects ..
-fieldSet: [Array]
-}
-class "fieldSet" as root.row.1.cols.0.col.fieldSet {
-.. Properties ..
-.. Objects ..
-0: [object Object]
-}
-class "0" as root.row.1.cols.0.col.fieldSet.0 {
-.. Properties ..
-name: General
-metadataError: null
-id: general
-unreferencedActions: null
-unreferencedProperties: true
-.. Objects ..
-property: [Array]
-}
-class "property" as root.row.1.cols.0.col.fieldSet.0.property {
-.. Properties ..
-.. Objects ..
-0: [object Object]
-1: [object Object]
-2: [object Object]
-3: [object Object]
-}
-class "0" as root.row.1.cols.0.col.fieldSet.0.property.0 {
-.. Properties ..
-named: null
-describedAs: null
-metadataError: null
-id: className
-cssClass: null
-hidden: null
-labelPosition: null
-multiLine: null
-namedEscaped: null
-promptStyle: null
-renderedAsDayBefore: null
-typicalLength: null
-unchanging: null
-.. Objects ..
-link: [object Object]
-}
-class "link" as root.row.1.cols.0.col.fieldSet.0.property.0.link {
-.. Properties ..
-rel: urn:org.restfulobjects:rels/property
-method: GET
-href: http://localhost:8080/restful/objects/isisApplib.FixtureResult/;/properties/className
-type: application/jsonprofile&#x3D;&quot;urn:org.restfulobjects:repr-types/object-property&quot;
-}
-class "1" as root.row.1.cols.0.col.fieldSet.0.property.1 {
-.. Properties ..
-named: null
-describedAs: null
-metadataError: null
-id: fixtureScriptClassName
-cssClass: null
-hidden: null
-labelPosition: null
-multiLine: null
-namedEscaped: null
-promptStyle: null
-renderedAsDayBefore: null
-typicalLength: null
-unchanging: null
-.. Objects ..
-link: [object Object]
-}
-class "link" as root.row.1.cols.0.col.fieldSet.0.property.1.link {
-.. Properties ..
-rel: urn:org.restfulobjects:rels/property
-method: GET
-href: http://localhost:8080/restful/objects/isisApplib.FixtureResult/;/properties/fixtureScriptClassName
-type: application/jsonprofile&#x3D;&quot;urn:org.restfulobjects:repr-types/object-property&quot;
-}
-class "2" as root.row.1.cols.0.col.fieldSet.0.property.2 {
-.. Properties ..
-named: null
-describedAs: null
-metadataError: null
-id: key
-cssClass: null
-hidden: null
-labelPosition: null
-multiLine: null
-namedEscaped: null
-promptStyle: null
-renderedAsDayBefore: null
-typicalLength: null
-unchanging: null
-.. Objects ..
-link: [object Object]
-}
-class "link" as root.row.1.cols.0.col.fieldSet.0.property.2.link {
-.. Properties ..
-rel: urn:org.restfulobjects:rels/property
-method: GET
-href: http://localhost:8080/restful/objects/isisApplib.FixtureResult/;/properties/key
-type: application/jsonprofile&#x3D;&quot;urn:org.restfulobjects:repr-types/object-property&quot;
-}
-class "3" as root.row.1.cols.0.col.fieldSet.0.property.3 {
-.. Properties ..
-named: null
-describedAs: null
-metadataError: null
-id: object
-cssClass: null
-hidden: null
-labelPosition: null
-multiLine: null
-namedEscaped: null
-promptStyle: null
-renderedAsDayBefore: null
-typicalLength: null
-unchanging: null
-.. Objects ..
-link: [object Object]
-}
-class "link" as root.row.1.cols.0.col.fieldSet.0.property.3.link {
-.. Properties ..
-rel: urn:org.restfulobjects:rels/property
-method: GET
-href: http://localhost:8080/restful/objects/isisApplib.FixtureResult/;/properties/object
-type: application/jsonprofile&#x3D;&quot;urn:org.restfulobjects:repr-types/object-property&quot;
-}
-class "1" as root.row.1.cols.1 {
-.. Properties ..
-.. Objects ..
-col: [object Object]
-}
-class "col" as root.row.1.cols.1.col {
-.. Properties ..
-domainObject: null
-metadataError: null
-cssClass: null
-size: null
-id: null
-span: 8
-unreferencedActions: null
-unreferencedCollections: true
-}
-root.row.0.cols.0.col.domainObject -- root.row.0.cols.0.col.domainObject.link
-root.row.0.cols.0.col.action.0 -- root.row.0.cols.0.col.action.0.link
-root.row.0.cols.0.col.action.1 -- root.row.0.cols.0.col.action.1.link
-root.row.0.cols.0.col.action.2 -- root.row.0.cols.0.col.action.2.link
-root.row.0.cols.0.col.action.3 -- root.row.0.cols.0.col.action.3.link
-root.row.0.cols.0.col.action -- root.row.0.cols.0.col.action.0
-root.row.0.cols.0.col.action -- root.row.0.cols.0.col.action.1
-root.row.0.cols.0.col.action -- root.row.0.cols.0.col.action.2
-root.row.0.cols.0.col.action -- root.row.0.cols.0.col.action.3
-root.row.0.cols.0.col -- root.row.0.cols.0.col.domainObject
-root.row.0.cols.0.col -- root.row.0.cols.0.col.action
-root.row.0.cols.0 -- root.row.0.cols.0.col
-root.row.0.cols -- root.row.0.cols.0
-root.row.0 -- root.row.0.cols
-root.row.1.cols.0.col.fieldSet.0.property.0 -- root.row.1.cols.0.col.fieldSet.0.property.0.link
-root.row.1.cols.0.col.fieldSet.0.property.1 -- root.row.1.cols.0.col.fieldSet.0.property.1.link
-root.row.1.cols.0.col.fieldSet.0.property.2 -- root.row.1.cols.0.col.fieldSet.0.property.2.link
-root.row.1.cols.0.col.fieldSet.0.property.3 -- root.row.1.cols.0.col.fieldSet.0.property.3.link
-root.row.1.cols.0.col.fieldSet.0.property -- root.row.1.cols.0.col.fieldSet.0.property.0
-root.row.1.cols.0.col.fieldSet.0.property -- root.row.1.cols.0.col.fieldSet.0.property.1
-root.row.1.cols.0.col.fieldSet.0.property -- root.row.1.cols.0.col.fieldSet.0.property.2
-root.row.1.cols.0.col.fieldSet.0.property -- root.row.1.cols.0.col.fieldSet.0.property.3
-root.row.1.cols.0.col.fieldSet.0 -- root.row.1.cols.0.col.fieldSet.0.property
-root.row.1.cols.0.col.fieldSet -- root.row.1.cols.0.col.fieldSet.0
-root.row.1.cols.0.col -- root.row.1.cols.0.col.fieldSet
-root.row.1.cols.0 -- root.row.1.cols.0.col
-root.row.1.cols.1 -- root.row.1.cols.1.col
-root.row.1.cols -- root.row.1.cols.0
-root.row.1.cols -- root.row.1.cols.1
-root.row.1 -- root.row.1.cols
-root.row -- root.row.0
-root.row -- root.row.1
-root -- root.row
-@enduml
-
---
-
diff --git a/incubator/clients/kroviz/src/test/kotlin/org/apache/isis/client/kroviz/snapshots/ResponseRegressionTest.kt b/incubator/clients/kroviz/src/test/kotlin/org/apache/isis/client/kroviz/snapshots/ResponseRegressionTest.kt
new file mode 100644
index 0000000..6fcdb38
--- /dev/null
+++ b/incubator/clients/kroviz/src/test/kotlin/org/apache/isis/client/kroviz/snapshots/ResponseRegressionTest.kt
@@ -0,0 +1,71 @@
+/*
+ *  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.client.kroviz.snapshots
+
+import org.apache.isis.client.kroviz.snapshots.demo2_0_0.Response2Handler
+import org.apache.isis.client.kroviz.to.Link
+import org.apache.isis.client.kroviz.to.Method
+import org.apache.isis.client.kroviz.ui.kv.UiManager
+import kotlin.test.BeforeTest
+import kotlin.test.Test
+import kotlin.test.assertEquals
+import kotlin.test.assertTrue
+
+/**
+ * This is an integration test that requires <Demo> running on http://localhost:8080
+ * automate via -> @link https://bmuschko.com/blog/docker-integration-testing/
+ * compare json -> @link https://stackoverflow.com/questions/26049303/how-to-compare-two-json-have-the-same-properties-without-order
+ */
+class ResponseRegressionTest {
+
+    @BeforeTest
+    fun setup() {
+        val user = "sven"
+        val pw = "pass"
+        val url = "http://${user}:${pw}@localhost:8080/restful/"
+        UiManager.login(url, user, pw)
+    }
+
+    //@Test  // invoking HttpRequest does not work - yet
+    fun testCompareSnapshotWithResponse() {
+        //given
+        val map = Response2Handler.map
+        val credentials = UiManager.getCredentials()
+        //when
+        console.log("[RRT.testCompareSnapshotWithResponse]")
+        map.forEach { rh ->
+            val handler = rh.value
+            val jsonStr = rh.key.str
+            val expected = handler.parse(jsonStr)
+
+            val href = rh.key.url
+            console.log(href)
+
+            val link = Link(method = Method.GET.operation, href = href)
+            val response = SyncRequest().invoke(link, credentials)
+
+            val actual = handler.parse(response)
+
+            assertEquals(expected, actual)
+        }
+        //then
+        assertTrue(true, "no exception in loop")
+    }
+
+}
diff --git a/incubator/clients/kroviz/src/test/kotlin/org/apache/isis/client/kroviz/snapshots/SyncRequest.kt b/incubator/clients/kroviz/src/test/kotlin/org/apache/isis/client/kroviz/snapshots/SyncRequest.kt
new file mode 100644
index 0000000..38859ec
--- /dev/null
+++ b/incubator/clients/kroviz/src/test/kotlin/org/apache/isis/client/kroviz/snapshots/SyncRequest.kt
@@ -0,0 +1,27 @@
+package org.apache.isis.client.kroviz.snapshots
+
+import org.apache.isis.client.kroviz.IntegrationTest
+import org.apache.isis.client.kroviz.to.Link
+import org.apache.isis.client.kroviz.ui.kv.Constants
+import org.w3c.xhr.XMLHttpRequest
+
+class SyncRequest : IntegrationTest() {
+
+    fun invoke(link: Link, credentials: String): String {
+        val method = link.method
+        val url = link.href
+
+        val xhr = XMLHttpRequest()
+        xhr.open(method, url, false)
+        xhr.setRequestHeader("Authorization", "Basic $credentials")
+        xhr.setRequestHeader("Content-Type", Constants.stdMimeType)
+        xhr.setRequestHeader("Accept", Constants.svgMimeType)
+
+        xhr.send()
+        while (xhr.readyState != XMLHttpRequest.DONE) {
+            wait(100)
+            console.log("[SyncRequest.invoke] wait")
+        }
+        return (xhr.responseText);
+    }
+}
diff --git a/incubator/clients/kroviz/src/test/kotlin/org/apache/isis/client/kroviz/snapshots/demo2_0_0/ACTIONS_STRINGS_INVOKE.kt b/incubator/clients/kroviz/src/test/kotlin/org/apache/isis/client/kroviz/snapshots/demo2_0_0/ACTIONS_STRINGS_INVOKE.kt
index f372abc..cfc56fb 100644
--- a/incubator/clients/kroviz/src/test/kotlin/org/apache/isis/client/kroviz/snapshots/demo2_0_0/ACTIONS_STRINGS_INVOKE.kt
+++ b/incubator/clients/kroviz/src/test/kotlin/org/apache/isis/client/kroviz/snapshots/demo2_0_0/ACTIONS_STRINGS_INVOKE.kt
@@ -22,36 +22,37 @@ import org.apache.isis.client.kroviz.snapshots.Response
 
 object ACTIONS_STRINGS_INVOKE : Response() {
     override val url = "http://localhost:8080/restful/objects/demo.JavaLangTypesMenu/1/actions/strings/invoke"
-    override val str = """{
+    override val str = """
+{
   "links": [
     {
       "rel": "self",
-      "href": "https://localhost:8080/restful/objects/demo.JavaLangStrings/PADw_eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04IiBzdGFuZGFsb25lPSJ5ZXMiPz4KPERlbW8vPgo=",
+      "href": "https://demo-wicket.isis.incode.work/restful/objects/demo.JavaLangStrings/PADw_eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04IiBzdGFuZGFsb25lPSJ5ZXMiPz4KPERlbW8vPgo=",
       "method": "GET",
       "type": "application/json;profile=\"urn:org.restfulobjects:repr-types/object\"",
       "title": "String data type"
     },
     {
       "rel": "describedby",
-      "href": "https://localhost:8080/restful/domain-types/demo.JavaLangStrings",
+      "href": "https://demo-wicket.isis.incode.work/restful/domain-types/demo.JavaLangStrings",
       "method": "GET",
       "type": "application/json;profile=\"urn:org.restfulobjects:repr-types/domain-type\""
     },
     {
       "rel": "urn:org.apache.isis.restfulobjects:rels/object-layout",
-      "href": "https://localhost:8080/restful/objects/demo.JavaLangStrings/PADw_eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04IiBzdGFuZGFsb25lPSJ5ZXMiPz4KPERlbW8vPgo=/object-layout",
+      "href": "https://demo-wicket.isis.incode.work/restful/objects/demo.JavaLangStrings/PADw_eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04IiBzdGFuZGFsb25lPSJ5ZXMiPz4KPERlbW8vPgo=/object-layout",
       "method": "GET",
       "type": "application/json;profile=\"urn:org.restfulobjects:repr-types/object-layout-bs3\""
     },
     {
       "rel": "urn:org.apache.isis.restfulobjects:rels/object-icon",
-      "href": "https://localhost:8080/restful/objects/demo.JavaLangStrings/PADw_eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04IiBzdGFuZGFsb25lPSJ5ZXMiPz4KPERlbW8vPgo=/image",
+      "href": "https://demo-wicket.isis.incode.work/restful/objects/demo.JavaLangStrings/PADw_eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04IiBzdGFuZGFsb25lPSJ5ZXMiPz4KPERlbW8vPgo=/image",
       "method": "GET",
       "type": "image/png"
     },
     {
       "rel": "urn:org.restfulobjects:rels/update",
-      "href": "https://localhost:8080/restful/objects/demo.JavaLangStrings:PADw_eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04IiBzdGFuZGFsb25lPSJ5ZXMiPz4KPERlbW8vPgo=",
+      "href": "https://demo-wicket.isis.incode.work/restful/objects/demo.JavaLangStrings:PADw_eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04IiBzdGFuZGFsb25lPSJ5ZXMiPz4KPERlbW8vPgo=",
       "method": "PUT",
       "type": "application/json;profile=\"urn:org.restfulobjects:repr-types/object\"",
       "arguments": {}
@@ -66,18 +67,87 @@ object ACTIONS_STRINGS_INVOKE : Response() {
   "domainType": "demo.JavaLangStrings",
   "instanceId": "PADw_eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04IiBzdGFuZGFsb25lPSJ5ZXMiPz4KPERlbW8vPgo=",
   "members": {
+    "description": {
+      "id": "description",
+      "memberType": "property",
+      "links": [
+        {
+          "rel": "urn:org.restfulobjects:rels/details;property=\"description\"",
+          "href": "https://demo-wicket.isis.incode.work/restful/objects/demo.JavaLangStrings/PADw_eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04IiBzdGFuZGFsb25lPSJ5ZXMiPz4KPERlbW8vPgo=/properties/description",
+          "method": "GET",
+          "type": "application/json;profile=\"urn:org.restfulobjects:repr-types/object-property\""
+        }
+      ],
+      "value": "<div class=\"paragraph\">\n<p>The framework has built-in support for the <code>String</code> data type.</p>\n</div>\n<div class=\"paragraph\">\n<p>From here you can:</p>\n</div>\n<div class=\"ulist\">\n<ul>\n<li>\n<p>navigate to an entity that uses the <code>String</code> datatype</p>\n</li>\n<li>\n<p>open a view model that uses the <code>String</code> datatype</p>\n</li>\n</ul>\n</div>\n<div class=\"paragraph\">\n<p>Some properties on these domain objects are mandatory,  [...]
+      "format": "string",
+      "extensions": {
+        "x-isis-format": "string"
+      },
+      "disabledReason": "Contributed property"
+    },
+    "objectType": {
+      "id": "objectType",
+      "memberType": "property",
+      "links": [
+        {
+          "rel": "urn:org.restfulobjects:rels/details;property=\"objectType\"",
+          "href": "https://demo-wicket.isis.incode.work/restful/objects/demo.JavaLangStrings/PADw_eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04IiBzdGFuZGFsb25lPSJ5ZXMiPz4KPERlbW8vPgo=/properties/objectType",
+          "method": "GET",
+          "type": "application/json;profile=\"urn:org.restfulobjects:repr-types/object-property\""
+        }
+      ],
+      "value": "demo.JavaLangStrings",
+      "extensions": {
+        "x-isis-format": "string"
+      },
+      "disabledReason": "Contributed property"
+    },
+    "objectIdentifier": {
+      "id": "objectIdentifier",
+      "memberType": "property",
+      "links": [
+        {
+          "rel": "urn:org.restfulobjects:rels/details;property=\"objectIdentifier\"",
+          "href": "https://demo-wicket.isis.incode.work/restful/objects/demo.JavaLangStrings/PADw_eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04IiBzdGFuZGFsb25lPSJ5ZXMiPz4KPERlbW8vPgo=/properties/objectIdentifier",
+          "method": "GET",
+          "type": "application/json;profile=\"urn:org.restfulobjects:repr-types/object-property\""
+        }
+      ],
+      "value": "»1a9012b0",
+      "extensions": {
+        "x-isis-format": "string"
+      },
+      "disabledReason": "Contributed property"
+    },
+    "sources": {
+      "id": "sources",
+      "memberType": "property",
+      "links": [
+        {
+          "rel": "urn:org.restfulobjects:rels/details;property=\"sources\"",
+          "href": "https://demo-wicket.isis.incode.work/restful/objects/demo.JavaLangStrings/PADw_eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04IiBzdGFuZGFsb25lPSJ5ZXMiPz4KPERlbW8vPgo=/properties/sources",
+          "method": "GET",
+          "type": "application/json;profile=\"urn:org.restfulobjects:repr-types/object-property\""
+        }
+      ],
+      "value": "<div class=\"paragraph\">\n<p><a href=\"https://github.com/apache/isis/tree/master/examples/demo/domain/src/main/java/demoapp/dom/types/javalang/strings\">Sources</a> for this demo</p>\n</div>",
+      "format": "string",
+      "extensions": {
+        "x-isis-format": "string"
+      },
+      "disabledReason": "Contributed property"
+    },
     "entities": {
       "id": "entities",
       "memberType": "collection",
       "links": [
         {
           "rel": "urn:org.restfulobjects:rels/details;collection=\"entities\"",
-          "href": "https://localhost:8080/restful/objects/demo.JavaLangStrings/PADw_eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04IiBzdGFuZGFsb25lPSJ5ZXMiPz4KPERlbW8vPgo=/collections/entities",
+          "href": "https://demo-wicket.isis.incode.work/restful/objects/demo.JavaLangStrings/PADw_eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04IiBzdGFuZGFsb25lPSJ5ZXMiPz4KPERlbW8vPgo=/collections/entities",
           "method": "GET",
           "type": "application/json;profile=\"urn:org.restfulobjects:repr-types/object-collection\""
         }
-      ],
-      "disabledReason": "Immutable"
+      ]
     },
     "openViewModel": {
       "id": "openViewModel",
@@ -85,7 +155,7 @@ object ACTIONS_STRINGS_INVOKE : Response() {
       "links": [
         {
           "rel": "urn:org.restfulobjects:rels/details;action=\"openViewModel\"",
-          "href": "https://localhost:8080/restful/objects/demo.JavaLangStrings/PADw_eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04IiBzdGFuZGFsb25lPSJ5ZXMiPz4KPERlbW8vPgo=/actions/openViewModel",
+          "href": "https://demo-wicket.isis.incode.work/restful/objects/demo.JavaLangStrings/PADw_eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04IiBzdGFuZGFsb25lPSJ5ZXMiPz4KPERlbW8vPgo=/actions/openViewModel",
           "method": "GET",
           "type": "application/json;profile=\"urn:org.restfulobjects:repr-types/object-action\""
         }
@@ -97,79 +167,79 @@ object ACTIONS_STRINGS_INVOKE : Response() {
       "links": [
         {
           "rel": "urn:org.restfulobjects:rels/details;action=\"clearHints\"",
-          "href": "https://localhost:8080/restful/objects/demo.JavaLangStrings/PADw_eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04IiBzdGFuZGFsb25lPSJ5ZXMiPz4KPERlbW8vPgo=/actions/clearHints",
+          "href": "https://demo-wicket.isis.incode.work/restful/objects/demo.JavaLangStrings/PADw_eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04IiBzdGFuZGFsb25lPSJ5ZXMiPz4KPERlbW8vPgo=/actions/clearHints",
           "method": "GET",
           "type": "application/json;profile=\"urn:org.restfulobjects:repr-types/object-action\""
         }
       ]
     },
-    "openRestApi": {
-      "id": "openRestApi",
+    "downloadMetamodelXml": {
+      "id": "downloadMetamodelXml",
       "memberType": "action",
       "links": [
         {
-          "rel": "urn:org.restfulobjects:rels/details;action=\"openRestApi\"",
-          "href": "https://localhost:8080/restful/objects/demo.JavaLangStrings/PADw_eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04IiBzdGFuZGFsb25lPSJ5ZXMiPz4KPERlbW8vPgo=/actions/openRestApi",
+          "rel": "urn:org.restfulobjects:rels/details;action=\"downloadMetamodelXml\"",
+          "href": "https://demo-wicket.isis.incode.work/restful/objects/demo.JavaLangStrings/PADw_eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04IiBzdGFuZGFsb25lPSJ5ZXMiPz4KPERlbW8vPgo=/actions/downloadMetamodelXml",
           "method": "GET",
           "type": "application/json;profile=\"urn:org.restfulobjects:repr-types/object-action\""
         }
       ]
     },
-    "downloadLayoutXml": {
-      "id": "downloadLayoutXml",
+    "rebuildMetamodel": {
+      "id": "rebuildMetamodel",
       "memberType": "action",
       "links": [
         {
-          "rel": "urn:org.restfulobjects:rels/details;action=\"downloadLayoutXml\"",
-          "href": "https://localhost:8080/restful/objects/demo.JavaLangStrings/PADw_eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04IiBzdGFuZGFsb25lPSJ5ZXMiPz4KPERlbW8vPgo=/actions/downloadLayoutXml",
+          "rel": "urn:org.restfulobjects:rels/details;action=\"rebuildMetamodel\"",
+          "href": "https://demo-wicket.isis.incode.work/restful/objects/demo.JavaLangStrings/PADw_eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04IiBzdGFuZGFsb25lPSJ5ZXMiPz4KPERlbW8vPgo=/actions/rebuildMetamodel",
           "method": "GET",
           "type": "application/json;profile=\"urn:org.restfulobjects:repr-types/object-action\""
         }
       ]
     },
-    "rebuildMetamodel": {
-      "id": "rebuildMetamodel",
+    "downloadLayoutXml": {
+      "id": "downloadLayoutXml",
       "memberType": "action",
       "links": [
         {
-          "rel": "urn:org.restfulobjects:rels/details;action=\"rebuildMetamodel\"",
-          "href": "https://localhost:8080/restful/objects/demo.JavaLangStrings/PADw_eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04IiBzdGFuZGFsb25lPSJ5ZXMiPz4KPERlbW8vPgo=/actions/rebuildMetamodel",
+          "rel": "urn:org.restfulobjects:rels/details;action=\"downloadLayoutXml\"",
+          "href": "https://demo-wicket.isis.incode.work/restful/objects/demo.JavaLangStrings/PADw_eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04IiBzdGFuZGFsb25lPSJ5ZXMiPz4KPERlbW8vPgo=/actions/downloadLayoutXml",
           "method": "GET",
           "type": "application/json;profile=\"urn:org.restfulobjects:repr-types/object-action\""
         }
       ]
     },
-    "recentCommands": {
-      "id": "recentCommands",
+    "openRestApi": {
+      "id": "openRestApi",
       "memberType": "action",
       "links": [
         {
-          "rel": "urn:org.restfulobjects:rels/details;action=\"recentCommands\"",
-          "href": "https://localhost:8080/restful/objects/demo.JavaLangStrings/PADw_eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04IiBzdGFuZGFsb25lPSJ5ZXMiPz4KPERlbW8vPgo=/actions/recentCommands",
+          "rel": "urn:org.restfulobjects:rels/details;action=\"openRestApi\"",
+          "href": "https://demo-wicket.isis.incode.work/restful/objects/demo.JavaLangStrings/PADw_eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04IiBzdGFuZGFsb25lPSJ5ZXMiPz4KPERlbW8vPgo=/actions/openRestApi",
           "method": "GET",
           "type": "application/json;profile=\"urn:org.restfulobjects:repr-types/object-action\""
         }
       ]
     },
-    "downloadMetamodelXml": {
-      "id": "downloadMetamodelXml",
+    "inspectMetamodel": {
+      "id": "inspectMetamodel",
       "memberType": "action",
       "links": [
         {
-          "rel": "urn:org.restfulobjects:rels/details;action=\"downloadMetamodelXml\"",
-          "href": "https://localhost:8080/restful/objects/demo.JavaLangStrings/PADw_eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04IiBzdGFuZGFsb25lPSJ5ZXMiPz4KPERlbW8vPgo=/actions/downloadMetamodelXml",
+          "rel": "urn:org.restfulobjects:rels/details;action=\"inspectMetamodel\"",
+          "href": "https://demo-wicket.isis.incode.work/restful/objects/demo.JavaLangStrings/PADw_eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04IiBzdGFuZGFsb25lPSJ5ZXMiPz4KPERlbW8vPgo=/actions/inspectMetamodel",
           "method": "GET",
           "type": "application/json;profile=\"urn:org.restfulobjects:repr-types/object-action\""
         }
       ]
     },
-    "inspectMetamodel": {
-      "id": "inspectMetamodel",
+    "recentCommands": {
+      "id": "recentCommands",
       "memberType": "action",
       "links": [
         {
-          "rel": "urn:org.restfulobjects:rels/details;action=\"inspectMetamodel\"",
-          "href": "https://localhost:8080/restful/objects/demo.JavaLangStrings/PADw_eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04IiBzdGFuZGFsb25lPSJ5ZXMiPz4KPERlbW8vPgo=/actions/inspectMetamodel",
+          "rel": "urn:org.restfulobjects:rels/details;action=\"recentCommands\"",
+          "href": "https://demo-wicket.isis.incode.work/restful/objects/demo.JavaLangStrings/PADw_eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04IiBzdGFuZGFsb25lPSJ5ZXMiPz4KPERlbW8vPgo=/actions/recentCommands",
           "method": "GET",
           "type": "application/json;profile=\"urn:org.restfulobjects:repr-types/object-action\""
         }
diff --git a/incubator/clients/kroviz/src/test/kotlin/org/apache/isis/client/kroviz/snapshots/demo2_0_0/RESTFUL.kt b/incubator/clients/kroviz/src/test/kotlin/org/apache/isis/client/kroviz/snapshots/demo2_0_0/RESTFUL.kt
new file mode 100644
index 0000000..8cb4c89
--- /dev/null
+++ b/incubator/clients/kroviz/src/test/kotlin/org/apache/isis/client/kroviz/snapshots/demo2_0_0/RESTFUL.kt
@@ -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.client.kroviz.snapshots.demo2_0_0
+
+import org.apache.isis.client.kroviz.snapshots.Response
+
+object RESTFUL : Response(){
+    override val url = "http://localhost:8080/restful/"
+    override val str = """
+{
+  "links" : [ {
+    "rel" : "self",
+    "href" : "http://localhost:8080/restful/",
+    "method" : "GET",
+    "type" : "application/json;profile=\"urn:org.restfulobjects:repr-types/homepage\""
+  }, {
+    "rel" : "urn:org.restfulobjects:rels/user",
+    "href" : "http://localhost:8080/restful/user",
+    "method" : "GET",
+    "type" : "application/json;profile=\"urn:org.restfulobjects:repr-types/user\""
+  }, {
+    "rel" : "urn:org.apache.isis.restfulobjects:rels/menuBars",
+    "href" : "http://localhost:8080/restful/menuBars",
+    "method" : "GET",
+    "type" : "application/json;profile=\"urn:org.restfulobjects:repr-types/layout-menubars\""
+  }, {
+    "rel" : "urn:org.restfulobjects:rels/services",
+    "href" : "http://localhost:8080/restful/services",
+    "method" : "GET",
+    "type" : "application/json;profile=\"urn:org.restfulobjects:repr-types/list\""
+  }, {
+    "rel" : "urn:org.restfulobjects:rels/version",
+    "href" : "http://localhost:8080/restful/version",
+    "method" : "GET",
+    "type" : "application/json;profile=\"urn:org.restfulobjects:repr-types/version\""
+  }, {
+    "rel" : "urn:org.restfulobjects:rels/domain-types",
+    "href" : "http://localhost:8080/restful/domain-types",
+    "method" : "GET",
+    "type" : "application/json;profile=\"urn:org.restfulobjects:repr-types/type-list\""
+  } ],
+  "extensions" : { }
+}        
+    """
+}
diff --git a/incubator/clients/kroviz/src/test/kotlin/org/apache/isis/client/kroviz/snapshots/demo2_0_0/Response2Handler.kt b/incubator/clients/kroviz/src/test/kotlin/org/apache/isis/client/kroviz/snapshots/demo2_0_0/Response2Handler.kt
new file mode 100644
index 0000000..84cb1f5
--- /dev/null
+++ b/incubator/clients/kroviz/src/test/kotlin/org/apache/isis/client/kroviz/snapshots/demo2_0_0/Response2Handler.kt
@@ -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.client.kroviz.snapshots.demo2_0_0
+
+import org.apache.isis.client.kroviz.handler.*
+
+object Response2Handler {
+
+    val map = mapOf(
+            RESTFUL to RestfulHandler(),
+            ACTIONS_STRINGS to ActionHandler(),
+            ACTIONS_STRINGS_INVOKE to TObjectHandler(),
+            ACTIONS_TEXT_INVOKE to TObjectHandler(),
+            ASSOCIATED_ACTION_OBJECT_LAYOUT to LayoutHandler(),
+            COLLECTIONS_ENTITIES to CollectionHandler(),
+            DOMAIN_TYPES_PROPERTY to PropertyHandler(),
+            FILE_NODE to DomainTypeHandler(),
+            HTTP_ERROR_405 to HttpErrorHandler(),
+            HTTP_ERROR_500 to HttpErrorHandler(),
+            MENUBARS to MenuBarsHandler(),
+            OBJECT_LAYOUT to LayoutHandler(),
+            PRIMITIVES to TObjectHandler(),
+            PROPERTY to PropertyHandler(),
+            PROPERTY_DESCRIPTION to PropertyHandler(),
+            RESTFUL_DOMAIN_TYPES to DomainTypesHandler(),
+            TAB_OBJECT_LAYOUT to LayoutHandler(),
+            TAB_LAYOUT_XML to LayoutXmlHandler(),
+            TEMPORALS to TObjectHandler(),
+            TEXT_LAYOUT to LayoutHandler(),
+            TOOLTIP_OBJECT_LAYOUT to LayoutHandler(),
+            TUPLE_OBJECT_LAYOUT to LayoutHandler(),
+    )
+
+}
diff --git a/incubator/clients/kroviz/src/test/kotlin/org/apache/isis/client/kroviz/snapshots/sample.json b/incubator/clients/kroviz/src/test/kotlin/org/apache/isis/client/kroviz/snapshots/sample.json
index 748e11b..d83647d 100644
--- a/incubator/clients/kroviz/src/test/kotlin/org/apache/isis/client/kroviz/snapshots/sample.json
+++ b/incubator/clients/kroviz/src/test/kotlin/org/apache/isis/client/kroviz/snapshots/sample.json
@@ -1,45 +1,154 @@
 {
-  "id": "entities",
-  "memberType": "collection",
   "links": [
     {
       "rel": "self",
-      "href": "http://localhost:8080/restful/objects/demo.JavaLangStrings/PADw_eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04IiBzdGFuZGFsb25lPSJ5ZXMiPz4KPERlbW8vPgo=/collections/entities",
-      "method": "GET",
-      "type": "application/json;profile=\"urn:org.restfulobjects:repr-types/object-collection\""
-    },
-    {
-      "rel": "up",
-      "href": "http://localhost:8080/restful/objects/demo.JavaLangStrings/PADw_eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04IiBzdGFuZGFsb25lPSJ5ZXMiPz4KPERlbW8vPgo=",
+      "href": "https://demo-wicket.isis.incode.work/restful/objects/demo.JavaLangStrings/PADw_eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04IiBzdGFuZGFsb25lPSJ5ZXMiPz4KPERlbW8vPgo=",
       "method": "GET",
       "type": "application/json;profile=\"urn:org.restfulobjects:repr-types/object\"",
       "title": "String data type"
     },
     {
       "rel": "describedby",
-      "href": "http://localhost:8080/restful/domain-types/demo.JavaLangStrings/collections/entities",
+      "href": "https://demo-wicket.isis.incode.work/restful/domain-types/demo.JavaLangStrings",
       "method": "GET",
-      "type": "application/json;profile=\"urn:org.restfulobjects:repr-types/collection-description\""
-    }
-  ],
-  "extensions": {
-    "collectionSemantics": "list"
-  },
-  "value": [
+      "type": "application/json;profile=\"urn:org.restfulobjects:repr-types/domain-type\""
+    },
     {
-      "rel": "urn:org.restfulobjects:rels/value",
-      "href": "http://localhost:8080/restful/objects/demo.JavaLangStringJdo/1",
+      "rel": "urn:org.apache.isis.restfulobjects:rels/object-layout",
+      "href": "https://demo-wicket.isis.incode.work/restful/objects/demo.JavaLangStrings/PADw_eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04IiBzdGFuZGFsb25lPSJ5ZXMiPz4KPERlbW8vPgo=/object-layout",
       "method": "GET",
-      "type": "application/json;profile=\"urn:org.restfulobjects:repr-types/object\"",
-      "title": "StringJDO entity: Hello"
+      "type": "application/json;profile=\"urn:org.restfulobjects:repr-types/object-layout-bs3\""
     },
     {
-      "rel": "urn:org.restfulobjects:rels/value",
-      "href": "http://localhost:8080/restful/objects/demo.JavaLangStringJdo/2",
+      "rel": "urn:org.apache.isis.restfulobjects:rels/object-icon",
+      "href": "https://demo-wicket.isis.incode.work/restful/objects/demo.JavaLangStrings/PADw_eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04IiBzdGFuZGFsb25lPSJ5ZXMiPz4KPERlbW8vPgo=/image",
       "method": "GET",
+      "type": "image/png"
+    },
+    {
+      "rel": "urn:org.restfulobjects:rels/update",
+      "href": "https://demo-wicket.isis.incode.work/restful/objects/demo.JavaLangStrings:PADw_eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04IiBzdGFuZGFsb25lPSJ5ZXMiPz4KPERlbW8vPgo=",
+      "method": "PUT",
       "type": "application/json;profile=\"urn:org.restfulobjects:repr-types/object\"",
-      "title": "StringJDO entity: world"
+      "arguments": {}
     }
   ],
-  "disabledReason": "Immutable"
+  "extensions": {
+    "oid": "demo.JavaLangStrings:PADw_eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04IiBzdGFuZGFsb25lPSJ5ZXMiPz4KPERlbW8vPgo=",
+    "isService": false,
+    "isPersistent": true
+  },
+  "title": "String data type",
+  "domainType": "demo.JavaLangStrings",
+  "instanceId": "PADw_eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04IiBzdGFuZGFsb25lPSJ5ZXMiPz4KPERlbW8vPgo=",
+  "members": {
+    "entities": {
+      "id": "entities",
+      "memberType": "collection",
+      "links": [
+        {
+          "rel": "urn:org.restfulobjects:rels/details;collection=\"entities\"",
+          "href": "https://demo-wicket.isis.incode.work/restful/objects/demo.JavaLangStrings/PADw_eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04IiBzdGFuZGFsb25lPSJ5ZXMiPz4KPERlbW8vPgo=/collections/entities",
+          "method": "GET",
+          "type": "application/json;profile=\"urn:org.restfulobjects:repr-types/object-collection\""
+        }
+      ]
+    },
+    "openViewModel": {
+      "id": "openViewModel",
+      "memberType": "action",
+      "links": [
+        {
+          "rel": "urn:org.restfulobjects:rels/details;action=\"openViewModel\"",
+          "href": "https://demo-wicket.isis.incode.work/restful/objects/demo.JavaLangStrings/PADw_eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04IiBzdGFuZGFsb25lPSJ5ZXMiPz4KPERlbW8vPgo=/actions/openViewModel",
+          "method": "GET",
+          "type": "application/json;profile=\"urn:org.restfulobjects:repr-types/object-action\""
+        }
+      ]
+    },
+    "clearHints": {
+      "id": "clearHints",
+      "memberType": "action",
+      "links": [
+        {
+          "rel": "urn:org.restfulobjects:rels/details;action=\"clearHints\"",
+          "href": "https://demo-wicket.isis.incode.work/restful/objects/demo.JavaLangStrings/PADw_eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04IiBzdGFuZGFsb25lPSJ5ZXMiPz4KPERlbW8vPgo=/actions/clearHints",
+          "method": "GET",
+          "type": "application/json;profile=\"urn:org.restfulobjects:repr-types/object-action\""
+        }
+      ]
+    },
+    "inspectMetamodel": {
+      "id": "inspectMetamodel",
+      "memberType": "action",
+      "links": [
+        {
+          "rel": "urn:org.restfulobjects:rels/details;action=\"inspectMetamodel\"",
+          "href": "https://demo-wicket.isis.incode.work/restful/objects/demo.JavaLangStrings/PADw_eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04IiBzdGFuZGFsb25lPSJ5ZXMiPz4KPERlbW8vPgo=/actions/inspectMetamodel",
+          "method": "GET",
+          "type": "application/json;profile=\"urn:org.restfulobjects:repr-types/object-action\""
+        }
+      ]
+    },
+    "downloadLayoutXml": {
+      "id": "downloadLayoutXml",
+      "memberType": "action",
+      "links": [
+        {
+          "rel": "urn:org.restfulobjects:rels/details;action=\"downloadLayoutXml\"",
+          "href": "https://demo-wicket.isis.incode.work/restful/objects/demo.JavaLangStrings/PADw_eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04IiBzdGFuZGFsb25lPSJ5ZXMiPz4KPERlbW8vPgo=/actions/downloadLayoutXml",
+          "method": "GET",
+          "type": "application/json;profile=\"urn:org.restfulobjects:repr-types/object-action\""
+        }
+      ]
+    },
+    "rebuildMetamodel": {
+      "id": "rebuildMetamodel",
+      "memberType": "action",
+      "links": [
+        {
+          "rel": "urn:org.restfulobjects:rels/details;action=\"rebuildMetamodel\"",
+          "href": "https://demo-wicket.isis.incode.work/restful/objects/demo.JavaLangStrings/PADw_eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04IiBzdGFuZGFsb25lPSJ5ZXMiPz4KPERlbW8vPgo=/actions/rebuildMetamodel",
+          "method": "GET",
+          "type": "application/json;profile=\"urn:org.restfulobjects:repr-types/object-action\""
+        }
+      ]
+    },
+    "recentCommands": {
+      "id": "recentCommands",
+      "memberType": "action",
+      "links": [
+        {
+          "rel": "urn:org.restfulobjects:rels/details;action=\"recentCommands\"",
+          "href": "https://demo-wicket.isis.incode.work/restful/objects/demo.JavaLangStrings/PADw_eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04IiBzdGFuZGFsb25lPSJ5ZXMiPz4KPERlbW8vPgo=/actions/recentCommands",
+          "method": "GET",
+          "type": "application/json;profile=\"urn:org.restfulobjects:repr-types/object-action\""
+        }
+      ]
+    },
+    "downloadMetamodelXml": {
+      "id": "downloadMetamodelXml",
+      "memberType": "action",
+      "links": [
+        {
+          "rel": "urn:org.restfulobjects:rels/details;action=\"downloadMetamodelXml\"",
+          "href": "https://demo-wicket.isis.incode.work/restful/objects/demo.JavaLangStrings/PADw_eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04IiBzdGFuZGFsb25lPSJ5ZXMiPz4KPERlbW8vPgo=/actions/downloadMetamodelXml",
+          "method": "GET",
+          "type": "application/json;profile=\"urn:org.restfulobjects:repr-types/object-action\""
+        }
+      ]
+    },
+    "openRestApi": {
+      "id": "openRestApi",
+      "memberType": "action",
+      "links": [
+        {
+          "rel": "urn:org.restfulobjects:rels/details;action=\"openRestApi\"",
+          "href": "https://demo-wicket.isis.incode.work/restful/objects/demo.JavaLangStrings/PADw_eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04IiBzdGFuZGFsb25lPSJ5ZXMiPz4KPERlbW8vPgo=/actions/openRestApi",
+          "method": "GET",
+          "type": "application/json;profile=\"urn:org.restfulobjects:repr-types/object-action\""
+        }
+      ]
+    }
+  }
 }
diff --git a/incubator/clients/kroviz/src/test/kotlin/org/apache/isis/client/kroviz/snapshots/sample.svg b/incubator/clients/kroviz/src/test/kotlin/org/apache/isis/client/kroviz/snapshots/sample.svg
deleted file mode 100644
index 1b2faa4..0000000
--- a/incubator/clients/kroviz/src/test/kotlin/org/apache/isis/client/kroviz/snapshots/sample.svg
+++ /dev/null
@@ -1,65 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<svg xmlns="http://www.w3.org/2000/svg" contentScriptType="application/ecmascript" contentStyleType="text/css"
-     height="203px" preserveAspectRatio="none" style="width:309px;height:203px;" version="1.1" viewBox="0 0 309 203"
-     width="309px" zoomAndPan="magnify">
-    <defs>
-        <filter height="300%" id="f1xj00ih3jrk7f" width="300%" x="-1" y="-1">
-            <feGaussianBlur result="blurOut" stdDeviation="2.0"/>
-            <feColorMatrix in="blurOut" result="blurOut2" type="matrix"
-                           values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 .4 0"/>
-            <feOffset dx="4.0" dy="4.0" in="blurOut2" result="blurOut3"/>
-            <feBlend in="SourceGraphic" in2="blurOut3" mode="normal"/>
-        </filter>
-    </defs>
-    <g><!--MD5=[f621a9b5735c62a9e50fa7c1e42ea0f4]↵cluster domainapp.modules.simple.dom.impl-->
-        <polygon fill="#FFFFFF" filter="url(#f1xj00ih3jrk7f)"
-                 points="14,16,277,16,284,38.7999,287,38.7999,287,191,14,191,14,16"
-                 style="stroke: #000000; stroke-width: 1.5;"/>
-        <line style="stroke: #000000; stroke-width: 1.5;" x1="14" x2="284" y1="38.7999" y2="38.7999"/>
-        <text fill="#000000" font-family="sans-serif" font-size="14" font-weight="bold" lengthAdjust="spacingAndGlyphs"
-              textLength="257" x="18" y="31.9999">domainapp.modules.simple.dom.impl
-        </text><!--MD5=[e6e8857f289496579330543e748c2106]↵class SimpleObject-->
-        <rect fill="#FEFECE" filter="url(#f1xj00ih3jrk7f)" height="140.3993" id="SimpleObject"
-              style="stroke: #A80036; stroke-width: 1.5;" width="129" x="85.5" y="43"/>
-        <ellipse cx="112.2" cy="59" fill="#ADD1B2" rx="11" ry="11" style="stroke: #A80036; stroke-width: 1.0;"/>
-        <path d="M111.5594,62.7813 Q112.3563,62.7813 112.9266,62.5859 Q113.4969,62.3906 113.7391,62.1641 Q113.9813,61.9375 114.2234,61.7422 Q114.4656,61.5469 114.6844,61.5469 Q115.0281,61.5469 115.2859,61.8047 Q115.5438,62.0625 115.5438,62.3906 Q115.5438,63.125 114.3797,63.8047 Q113.2156,64.4844 111.5125,64.4844 Q109.3563,64.4844 107.9344,63.2188 Q106.5125,61.9531 106.5125,60.0156 L106.5125,58.8906 Q106.5125,56.8594 107.8406,55.4766 Q109.1688,54.0938 111.1375,54.0938 Q112.325,54.0938 113 [...]
-        <text fill="#000000" font-family="sans-serif" font-size="12" lengthAdjust="spacingAndGlyphs" textLength="71"
-              x="128.8" y="63.8">SimpleObject
-        </text>
-        <line style="stroke: #A80036; stroke-width: 1.5;" x1="86.5" x2="213.5" y1="75" y2="75"/>
-        <line style="stroke: #A80036; stroke-width: 1.5;" x1="86.5" x2="213.5" y1="83" y2="83"/>
-        <text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="93"
-              x="91.5" y="97.9999">rebuildMetamodel()
-        </text>
-        <text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="117"
-              x="91.5" y="111.1998">downloadJdoMetadata()
-        </text>
-        <text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="69"
-              x="91.5" y="124.3997">openRestApi()
-        </text>
-        <text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="104"
-              x="91.5" y="137.5996">downloadLayoutXml()
-        </text>
-        <text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="37"
-              x="91.5" y="150.7995">delete()
-        </text>
-        <text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="70"
-              x="91.5" y="163.9994">updateName()
-        </text>
-        <text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="56"
-              x="91.5" y="177.1993">clearHints()
-        </text><!--MD5=[903507c5920b0ecb2f83cd94e1c42ae5]↵@startuml
-↵package domainapp.modules.simple.dom.impl {
-↵class SimpleObject
-↵SimpleObject : rebuildMetamodel()
-↵SimpleObject : downloadJdoMetadata()
-↵SimpleObject : openRestApi()
-↵SimpleObject : downloadLayoutXml()
-↵SimpleObject : delete()
-↵SimpleObject : updateName()
-↵SimpleObject : clearHints()
-↵}
-↵@enduml
-↵↵PlantUML version 1.2020.04(Thu Mar 19 10:16:49 GMT 2020)↵(GPL source distribution)↵Java Runtime: OpenJDK Runtime Environment↵JVM: OpenJDK 64-Bit Server VM↵Java Version: 1.8.0_191-b12↵Operating System: Linux↵Default Encoding: UTF-8↵Language: en↵Country: US↵-->
-    </g>
-</svg>
diff --git a/incubator/clients/kroviz/src/test/kotlin/org/apache/isis/client/kroviz/snapshots/sample.xml b/incubator/clients/kroviz/src/test/kotlin/org/apache/isis/client/kroviz/snapshots/sample.xml
deleted file mode 100644
index 73edc52..0000000
--- a/incubator/clients/kroviz/src/test/kotlin/org/apache/isis/client/kroviz/snapshots/sample.xml
+++ /dev/null
@@ -1,88 +0,0 @@
-<bs3:grid xmlns:cpt="http://isis.apache.org/applib/layout/component" xmlns:lnk="http://isis.apache.org/applib/layout/links" xmlns:bs3="http://isis.apache.org/applib/layout/grid/bootstrap3">
-    <bs3:row>
-        <bs3:col span="12" unreferencedActions="true">
-            <cpt:domainObject>
-                <cpt:link>
-                    <lnk:rel>urn:org.restfulobjects:rels/element</lnk:rel>
-                    <lnk:method>GET</lnk:method>
-                    <lnk:href>http://localhost:8080/restful/objects/isisApplib.ConfigurationProperty/PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9InllcyI_Pgo8Y29uZmlndXJhdGlvblByb3BlcnR5PgogICAgPGtleT5pc2lzLmFwcE1hbmlmZXN0PC9rZXk-CiAgICA8dmFsdWU-ZG9tYWluYXBwLmFwcGxpY2F0aW9uLm1hbmlmZXN0LkRvbWFpbkFwcEFwcE1hbmlmZXN0PC92YWx1ZT4KPC9jb25maWd1cmF0aW9uUHJvcGVydHk-Cg==</lnk:href>
-                    <lnk:type>application/json;profile="urn:org.restfulobjects:repr-types/object"</lnk:type>
-                </cpt:link>
-            </cpt:domainObject>
-            <cpt:action hidden="EVERYWHERE" id="clearHints">
-                <cpt:link>
-                    <lnk:rel>urn:org.restfulobjects:rels/action</lnk:rel>
-                    <lnk:method>GET</lnk:method>
-                    <lnk:href>http://localhost:8080/restful/objects/isisApplib.ConfigurationProperty/PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9InllcyI_Pgo8Y29uZmlndXJhdGlvblByb3BlcnR5PgogICAgPGtleT5pc2lzLmFwcE1hbmlmZXN0PC9rZXk-CiAgICA8dmFsdWU-ZG9tYWluYXBwLmFwcGxpY2F0aW9uLm1hbmlmZXN0LkRvbWFpbkFwcEFwcE1hbmlmZXN0PC92YWx1ZT4KPC9jb25maWd1cmF0aW9uUHJvcGVydHk-Cg==/actions/clearHints</lnk:href>
-                    <lnk:type>application/json;profile="urn:org.restfulobjects:repr-types/object-action"</lnk:type>
-                </cpt:link>
-            </cpt:action>
-            <cpt:action id="openRestApi">
-                <cpt:link>
-                    <lnk:rel>urn:org.restfulobjects:rels/action</lnk:rel>
-                    <lnk:method>GET</lnk:method>
-                    <lnk:href>http://localhost:8080/restful/objects/isisApplib.ConfigurationProperty/PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9InllcyI_Pgo8Y29uZmlndXJhdGlvblByb3BlcnR5PgogICAgPGtleT5pc2lzLmFwcE1hbmlmZXN0PC9rZXk-CiAgICA8dmFsdWU-ZG9tYWluYXBwLmFwcGxpY2F0aW9uLm1hbmlmZXN0LkRvbWFpbkFwcEFwcE1hbmlmZXN0PC92YWx1ZT4KPC9jb25maWd1cmF0aW9uUHJvcGVydHk-Cg==/actions/openRestApi</lnk:href>
-                    <lnk:type>application/json;profile="urn:org.restfulobjects:repr-types/object-action"</lnk:type>
-                </cpt:link>
-            </cpt:action>
-        </bs3:col>
-    </bs3:row>
-    <bs3:row>
-        <bs3:col span="12">
-            <bs3:tabGroup>
-                <bs3:tab name="General">
-                    <bs3:row>
-                        <bs3:col span="8">
-                            <cpt:fieldSet name="Property" id="key">
-                                <cpt:action id="downloadLayoutXml" position="PANEL_DROPDOWN">
-                                    <cpt:link>
-                                        <lnk:rel>urn:org.restfulobjects:rels/action</lnk:rel>
-                                        <lnk:method>GET</lnk:method>
-                                        <lnk:href>http://localhost:8080/restful/objects/isisApplib.ConfigurationProperty/PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9InllcyI_Pgo8Y29uZmlndXJhdGlvblByb3BlcnR5PgogICAgPGtleT5pc2lzLmFwcE1hbmlmZXN0PC9rZXk-CiAgICA8dmFsdWU-ZG9tYWluYXBwLmFwcGxpY2F0aW9uLm1hbmlmZXN0LkRvbWFpbkFwcEFwcE1hbmlmZXN0PC92YWx1ZT4KPC9jb25maWd1cmF0aW9uUHJvcGVydHk-Cg==/actions/downloadLayoutXml</lnk:href>
-                                        <lnk:type>application/json;profile="urn:org.restfulobjects:repr-types/object-action"</lnk:type>
-                                    </cpt:link>
-                                </cpt:action>
-                                <cpt:action id="rebuildMetamodel" position="PANEL_DROPDOWN">
-                                    <cpt:link>
-                                        <lnk:rel>urn:org.restfulobjects:rels/action</lnk:rel>
-                                        <lnk:method>GET</lnk:method>
-                                        <lnk:href>http://localhost:8080/restful/objects/isisApplib.ConfigurationProperty/PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9InllcyI_Pgo8Y29uZmlndXJhdGlvblByb3BlcnR5PgogICAgPGtleT5pc2lzLmFwcE1hbmlmZXN0PC9rZXk-CiAgICA8dmFsdWU-ZG9tYWluYXBwLmFwcGxpY2F0aW9uLm1hbmlmZXN0LkRvbWFpbkFwcEFwcE1hbmlmZXN0PC92YWx1ZT4KPC9jb25maWd1cmF0aW9uUHJvcGVydHk-Cg==/actions/rebuildMetamodel</lnk:href>
-                                        <lnk:type>application/json;profile="urn:org.restfulobjects:repr-types/object-action"</lnk:type>
-                                    </cpt:link>
-                                </cpt:action>
-                                <cpt:property id="key">
-                                    <cpt:link>
-                                        <lnk:rel>urn:org.restfulobjects:rels/property</lnk:rel>
-                                        <lnk:method>GET</lnk:method>
-                                        <lnk:href>http://localhost:8080/restful/objects/isisApplib.ConfigurationProperty/PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9InllcyI_Pgo8Y29uZmlndXJhdGlvblByb3BlcnR5PgogICAgPGtleT5pc2lzLmFwcE1hbmlmZXN0PC9rZXk-CiAgICA8dmFsdWU-ZG9tYWluYXBwLmFwcGxpY2F0aW9uLm1hbmlmZXN0LkRvbWFpbkFwcEFwcE1hbmlmZXN0PC92YWx1ZT4KPC9jb25maWd1cmF0aW9uUHJvcGVydHk-Cg==/properties/key</lnk:href>
-                                        <lnk:type>application/json;profile="urn:org.restfulobjects:repr-types/object-property"</lnk:type>
-                                    </cpt:link>
-                                </cpt:property>
-                                <cpt:property id="value" multiLine="5">
-                                    <cpt:link>
-                                        <lnk:rel>urn:org.restfulobjects:rels/property</lnk:rel>
-                                        <lnk:method>GET</lnk:method>
-                                        <lnk:href>http://localhost:8080/restful/objects/isisApplib.ConfigurationProperty/PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9InllcyI_Pgo8Y29uZmlndXJhdGlvblByb3BlcnR5PgogICAgPGtleT5pc2lzLmFwcE1hbmlmZXN0PC9rZXk-CiAgICA8dmFsdWU-ZG9tYWluYXBwLmFwcGxpY2F0aW9uLm1hbmlmZXN0LkRvbWFpbkFwcEFwcE1hbmlmZXN0PC92YWx1ZT4KPC9jb25maWd1cmF0aW9uUHJvcGVydHk-Cg==/properties/value</lnk:href>
-                                        <lnk:type>application/json;profile="urn:org.restfulobjects:repr-types/object-property"</lnk:type>
-                                    </cpt:link>
-                                </cpt:property>
-                            </cpt:fieldSet>
-                        </bs3:col>
-                    </bs3:row>
-                </bs3:tab>
-                <bs3:tab name="Other">
-                    <bs3:row>
-                        <bs3:col span="12">
-                            <cpt:fieldSet name="Other" id="other" unreferencedProperties="true"/>
-                        </bs3:col>
-                    </bs3:row>
-                </bs3:tab>
-            </bs3:tabGroup>
-        </bs3:col>
-    </bs3:row>
-    <bs3:row>
-        <bs3:col span="12">
-            <bs3:tabGroup unreferencedCollections="true"/>
-        </bs3:col>
-    </bs3:row>
-</bs3:grid>
diff --git a/incubator/clients/kroviz/src/test/kotlin/org/apache/isis/client/kroviz/snapshots/action_string.json b/incubator/clients/kroviz/src/test/kotlin/org/apache/isis/client/kroviz/snapshots/sample2.json
similarity index 58%
rename from incubator/clients/kroviz/src/test/kotlin/org/apache/isis/client/kroviz/snapshots/action_string.json
rename to incubator/clients/kroviz/src/test/kotlin/org/apache/isis/client/kroviz/snapshots/sample2.json
index fc8e52c..76f02a3 100644
--- a/incubator/clients/kroviz/src/test/kotlin/org/apache/isis/client/kroviz/snapshots/action_string.json
+++ b/incubator/clients/kroviz/src/test/kotlin/org/apache/isis/client/kroviz/snapshots/sample2.json
@@ -42,6 +42,76 @@
   "domainType": "demo.JavaLangStrings",
   "instanceId": "PADw_eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04IiBzdGFuZGFsb25lPSJ5ZXMiPz4KPERlbW8vPgo=",
   "members": {
+    "description": {
+      "id": "description",
+      "memberType": "property",
+      "links": [
+        {
+          "rel": "urn:org.restfulobjects:rels/details;property=\"description\"",
+          "href": "https://demo-wicket.isis.incode.work/restful/objects/demo.JavaLangStrings/PADw_eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04IiBzdGFuZGFsb25lPSJ5ZXMiPz4KPERlbW8vPgo=/properties/description",
+          "method": "GET",
+          "type": "application/json;profile=\"urn:org.restfulobjects:repr-types/object-property\""
+        }
+      ],
+      "value": "<div class=\"paragraph\">\n<p>The framework has built-in support for the <code>String</code> data type.</p>\n</div>\n<div class=\"paragraph\">\n<p>From here you can:</p>\n</div>\n<div class=\"ulist\">\n<ul>\n<li>\n<p>navigate to an entity that uses the <code>String</code> datatype</p>\n</li>\n<li>\n<p>open a view model that uses the <code>String</code> datatype</p>\n</li>\n</ul>\n</div>\n<div class=\"paragraph\">\n<p>Some properties on these domain objects are mandatory,  [...]
+      "format": "string",
+      "extensions": {
+        "x-isis-format": "string"
+      },
+      "disabledReason": "Contributed property"
+    },
+    "objectType": {
+      "id": "objectType",
+      "memberType": "property",
+      "links": [
+        {
+          "rel": "urn:org.restfulobjects:rels/details;property=\"objectType\"",
+          "href": "https://demo-wicket.isis.incode.work/restful/objects/demo.JavaLangStrings/PADw_eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04IiBzdGFuZGFsb25lPSJ5ZXMiPz4KPERlbW8vPgo=/properties/objectType",
+          "method": "GET",
+          "type": "application/json;profile=\"urn:org.restfulobjects:repr-types/object-property\""
+        }
+      ],
+      "value": "demo.JavaLangStrings",
+      "extensions": {
+        "x-isis-format": "string"
+      },
+      "disabledReason": "Contributed property"
+    },
+    "objectIdentifier": {
+      "id": "objectIdentifier",
+      "memberType": "property",
+      "links": [
+        {
+          "rel": "urn:org.restfulobjects:rels/details;property=\"objectIdentifier\"",
+          "href": "https://demo-wicket.isis.incode.work/restful/objects/demo.JavaLangStrings/PADw_eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04IiBzdGFuZGFsb25lPSJ5ZXMiPz4KPERlbW8vPgo=/properties/objectIdentifier",
+          "method": "GET",
+          "type": "application/json;profile=\"urn:org.restfulobjects:repr-types/object-property\""
+        }
+      ],
+      "value": "»1a9012b0",
+      "extensions": {
+        "x-isis-format": "string"
+      },
+      "disabledReason": "Contributed property"
+    },
+    "sources": {
+      "id": "sources",
+      "memberType": "property",
+      "links": [
+        {
+          "rel": "urn:org.restfulobjects:rels/details;property=\"sources\"",
+          "href": "https://demo-wicket.isis.incode.work/restful/objects/demo.JavaLangStrings/PADw_eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04IiBzdGFuZGFsb25lPSJ5ZXMiPz4KPERlbW8vPgo=/properties/sources",
+          "method": "GET",
+          "type": "application/json;profile=\"urn:org.restfulobjects:repr-types/object-property\""
+        }
+      ],
+      "value": "<div class=\"paragraph\">\n<p><a href=\"https://github.com/apache/isis/tree/master/examples/demo/domain/src/main/java/demoapp/dom/types/javalang/strings\">Sources</a> for this demo</p>\n</div>",
+      "format": "string",
+      "extensions": {
+        "x-isis-format": "string"
+      },
+      "disabledReason": "Contributed property"
+    },
     "entities": {
       "id": "entities",
       "memberType": "collection",
@@ -52,8 +122,7 @@
           "method": "GET",
           "type": "application/json;profile=\"urn:org.restfulobjects:repr-types/object-collection\""
         }
-      ],
-      "disabledReason": "Immutable"
+      ]
     },
     "openViewModel": {
       "id": "openViewModel",
@@ -79,25 +148,13 @@
         }
       ]
     },
-    "openRestApi": {
-      "id": "openRestApi",
-      "memberType": "action",
-      "links": [
-        {
-          "rel": "urn:org.restfulobjects:rels/details;action=\"openRestApi\"",
-          "href": "https://demo-wicket.isis.incode.work/restful/objects/demo.JavaLangStrings/PADw_eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04IiBzdGFuZGFsb25lPSJ5ZXMiPz4KPERlbW8vPgo=/actions/openRestApi",
-          "method": "GET",
-          "type": "application/json;profile=\"urn:org.restfulobjects:repr-types/object-action\""
-        }
-      ]
-    },
-    "downloadLayoutXml": {
-      "id": "downloadLayoutXml",
+    "downloadMetamodelXml": {
+      "id": "downloadMetamodelXml",
       "memberType": "action",
       "links": [
         {
-          "rel": "urn:org.restfulobjects:rels/details;action=\"downloadLayoutXml\"",
-          "href": "https://demo-wicket.isis.incode.work/restful/objects/demo.JavaLangStrings/PADw_eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04IiBzdGFuZGFsb25lPSJ5ZXMiPz4KPERlbW8vPgo=/actions/downloadLayoutXml",
+          "rel": "urn:org.restfulobjects:rels/details;action=\"downloadMetamodelXml\"",
+          "href": "https://demo-wicket.isis.incode.work/restful/objects/demo.JavaLangStrings/PADw_eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04IiBzdGFuZGFsb25lPSJ5ZXMiPz4KPERlbW8vPgo=/actions/downloadMetamodelXml",
           "method": "GET",
           "type": "application/json;profile=\"urn:org.restfulobjects:repr-types/object-action\""
         }
@@ -115,25 +172,25 @@
         }
       ]
     },
-    "recentCommands": {
-      "id": "recentCommands",
+    "downloadLayoutXml": {
+      "id": "downloadLayoutXml",
       "memberType": "action",
       "links": [
         {
-          "rel": "urn:org.restfulobjects:rels/details;action=\"recentCommands\"",
-          "href": "https://demo-wicket.isis.incode.work/restful/objects/demo.JavaLangStrings/PADw_eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04IiBzdGFuZGFsb25lPSJ5ZXMiPz4KPERlbW8vPgo=/actions/recentCommands",
+          "rel": "urn:org.restfulobjects:rels/details;action=\"downloadLayoutXml\"",
+          "href": "https://demo-wicket.isis.incode.work/restful/objects/demo.JavaLangStrings/PADw_eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04IiBzdGFuZGFsb25lPSJ5ZXMiPz4KPERlbW8vPgo=/actions/downloadLayoutXml",
           "method": "GET",
           "type": "application/json;profile=\"urn:org.restfulobjects:repr-types/object-action\""
         }
       ]
     },
-    "downloadMetamodelXml": {
-      "id": "downloadMetamodelXml",
+    "openRestApi": {
+      "id": "openRestApi",
       "memberType": "action",
       "links": [
         {
-          "rel": "urn:org.restfulobjects:rels/details;action=\"downloadMetamodelXml\"",
-          "href": "https://demo-wicket.isis.incode.work/restful/objects/demo.JavaLangStrings/PADw_eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04IiBzdGFuZGFsb25lPSJ5ZXMiPz4KPERlbW8vPgo=/actions/downloadMetamodelXml",
+          "rel": "urn:org.restfulobjects:rels/details;action=\"openRestApi\"",
+          "href": "https://demo-wicket.isis.incode.work/restful/objects/demo.JavaLangStrings/PADw_eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04IiBzdGFuZGFsb25lPSJ5ZXMiPz4KPERlbW8vPgo=/actions/openRestApi",
           "method": "GET",
           "type": "application/json;profile=\"urn:org.restfulobjects:repr-types/object-action\""
         }
@@ -150,6 +207,18 @@
           "type": "application/json;profile=\"urn:org.restfulobjects:repr-types/object-action\""
         }
       ]
+    },
+    "recentCommands": {
+      "id": "recentCommands",
+      "memberType": "action",
+      "links": [
+        {
+          "rel": "urn:org.restfulobjects:rels/details;action=\"recentCommands\"",
+          "href": "https://demo-wicket.isis.incode.work/restful/objects/demo.JavaLangStrings/PADw_eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04IiBzdGFuZGFsb25lPSJ5ZXMiPz4KPERlbW8vPgo=/actions/recentCommands",
+          "method": "GET",
+          "type": "application/json;profile=\"urn:org.restfulobjects:repr-types/object-action\""
+        }
+      ]
     }
   }
 }
diff --git a/incubator/clients/kroviz/src/test/kotlin/org/apache/isis/client/kroviz/snapshots/simpleapp1_16_0/UrlsTest.kt b/incubator/clients/kroviz/src/test/kotlin/org/apache/isis/client/kroviz/snapshots/simpleapp1_16_0/UrlsTest.kt
deleted file mode 100644
index f51e4fc..0000000
--- a/incubator/clients/kroviz/src/test/kotlin/org/apache/isis/client/kroviz/snapshots/simpleapp1_16_0/UrlsTest.kt
+++ /dev/null
@@ -1,74 +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.client.kroviz.snapshots.simpleapp1_16_0
-
-import org.apache.isis.client.kroviz.IntegrationTest
-import org.apache.isis.client.kroviz.core.aggregator.ActionDispatcher
-import org.apache.isis.client.kroviz.core.event.EventStore
-import org.apache.isis.client.kroviz.core.event.ResourceSpecification
-import org.apache.isis.client.kroviz.core.event.RoXmlHttpRequest
-import org.apache.isis.client.kroviz.to.Link
-import org.apache.isis.client.kroviz.to.Method
-import kotlin.test.assertEquals
-
-/**
- * This is an integration test that requires SimpleApp running on http://localhost:8080
- *
- * @item Iterate over all Objects defined in package 'urls',
- * @item check if the href 'self' can be invoked and
- * @item compare the response of invoking 'self' with what is hardcoded
- */
-class UrlsTest : IntegrationTest() {
-
-    //@Test
-    fun testUrls() {
-        if (isAppAvailable()) {
-            // given
-            val urls = mutableMapOf<String, String>()
-            urls.put(FR_OBJECT.url, FR_OBJECT.str)
-            urls.put(FR_OBJECT_BAZ.url, FR_OBJECT_BAZ.str)
-            urls.put(FR_OBJECT_LAYOUT.url, FR_OBJECT_LAYOUT.str)
-            urls.put(FR_OBJECT_PROPERTY.url, FR_OBJECT_PROPERTY.str)
-            urls.put(FR_PROPERTY_DESCRIPTION.url, FR_PROPERTY_DESCRIPTION.str)
-            urls.put(SO_0.url, SO_0.str)
-            urls.put(SO_LIST_ALL.url, SO_LIST_ALL.str)
-            urls.put(SO_LIST_ALL_INVOKE.url, SO_LIST_ALL_INVOKE.str)
-            urls.put(SO_LIST_ALL_OBJECTS.url, SO_LIST_ALL_OBJECTS.str)
-            urls.put(SO_MENU.url, SO_MENU.str)
-            urls.put(SO_OBJECT_LAYOUT.url, SO_OBJECT_LAYOUT.str)
-            urls.put(RESTFUL_SERVICES.url, RESTFUL_SERVICES.str)
-
-            //when
-            for (entry in urls) {
-                val href = entry.key
-                val link = Link(method = Method.GET.operation, href = href)
-                RoXmlHttpRequest().invoke(link, ActionDispatcher())
-            }
-
-            // then
-            wait(1000)
-            for (entry in urls) {
-                val hrefSpec = ResourceSpecification(entry.key)
-                val actual = EventStore.find(hrefSpec)!!.getResponse()
-                assertEquals(entry.value, actual)
-            }
-        }
-    }
-
-}
diff --git a/incubator/clients/kroviz/src/test/kotlin/org/apache/isis/client/kroviz/to/LinkTest.kt b/incubator/clients/kroviz/src/test/kotlin/org/apache/isis/client/kroviz/to/LinkTest.kt
index 4433000..d4f3bc2 100644
--- a/incubator/clients/kroviz/src/test/kotlin/org/apache/isis/client/kroviz/to/LinkTest.kt
+++ b/incubator/clients/kroviz/src/test/kotlin/org/apache/isis/client/kroviz/to/LinkTest.kt
@@ -79,36 +79,12 @@ class LinkTest {
         assertEquals(Relation.SERVICES, rel)
     }
 
-    val response2Handler = mapOf(
-            RESTFUL to RestfulHandler(),
-            ACTIONS_STRINGS to ActionHandler(),
-            ACTIONS_STRINGS_INVOKE to TObjectHandler(),
-            ACTIONS_TEXT_INVOKE to TObjectHandler(),
-            ASSOCIATED_ACTION_OBJECT_LAYOUT to LayoutHandler(),
-            COLLECTIONS_ENTITIES to CollectionHandler(),
-            DOMAIN_TYPES_PROPERTY to PropertyHandler(),
-            FILE_NODE to DomainTypeHandler(),
-            HTTP_ERROR_405 to HttpErrorHandler(),
-            HTTP_ERROR_500 to HttpErrorHandler(),
-            MENUBARS to MenuBarsHandler(),
-            OBJECT_LAYOUT to LayoutHandler(),
-            PRIMITIVES to TObjectHandler(),
-            PROPERTY to PropertyHandler(),
-            PROPERTY_DESCRIPTION to PropertyHandler(),
-            RESTFUL_DOMAIN_TYPES to DomainTypesHandler(),
-            TAB_OBJECT_LAYOUT to LayoutHandler(),
-            TAB_LAYOUT_XML to LayoutXmlHandler(),
-            TEMPORALS to TObjectHandler(),
-            TEXT_LAYOUT to LayoutHandler(),
-            TOOLTIP_OBJECT_LAYOUT to LayoutHandler(),
-            TUPLE_OBJECT_LAYOUT to LayoutHandler(),
-    )
-
     @Test
     fun testFindParsedLinkEnums() {
         //given
+        val map = Response2Handler.map
         //when
-        response2Handler.forEach { rh ->
+        map.forEach { rh ->
             val jsonStr = rh.key.str
             val ro = rh.value.parse(jsonStr)
             if (ro is HasLinks) {
diff --git a/incubator/clients/kroviz/src/test/kotlin/org/apache/isis/client/kroviz/to/TObjectTest.kt b/incubator/clients/kroviz/src/test/kotlin/org/apache/isis/client/kroviz/to/TObjectTest.kt
index c075451..dcc5e2a 100644
--- a/incubator/clients/kroviz/src/test/kotlin/org/apache/isis/client/kroviz/to/TObjectTest.kt
+++ b/incubator/clients/kroviz/src/test/kotlin/org/apache/isis/client/kroviz/to/TObjectTest.kt
@@ -112,16 +112,15 @@ class TObjectTest {
         val jsonStr = ACTIONS_STRINGS_INVOKE.str
         // when
         val to = TObjectHandler().parse(jsonStr) as TObject
-        val members = to.members
-        val properties = to.getProperties()
         // then
-        assertNotNull(to.links)
         assertEquals("String data type", to.links[0].title)
-        assertEquals(9, members.size)
-        assertEquals(0, properties.size)
+        assertEquals(13, to.members.size)
+        assertEquals(1, to.getCollections().size)
+        assertEquals(8, to.getActions().size)
+        assertEquals(4, to.getProperties().size)
 
-        val filteredProperties = properties.filter { it.id == "description" }
-        assertEquals(0, filteredProperties.size)
+        val filteredProperties = to.getProperties().filter { it.id == "description" }
+        assertEquals(1, filteredProperties.size)
     }
 
 }