You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@isis.apache.org by da...@apache.org on 2013/02/26 00:28:30 UTC

[24/24] git commit: ISIS-233-ro: testing domainservices_services resource

Updated Branches:
  refs/heads/dan/ISIS-233-ro 0744aad24 -> 3c7b08fa5 (forced update)


ISIS-233-ro: testing domainservices_services resource


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

Branch: refs/heads/dan/ISIS-233-ro
Commit: 3c7b08fa51786cdefbc7794179006c5195774727
Parents: 6b9d42a
Author: Dan Haywood <da...@apache.org>
Authored: Mon Feb 25 23:16:38 2013 +0000
Committer: Dan Haywood <da...@apache.org>
Committed: Mon Feb 25 23:16:38 2013 +0000

----------------------------------------------------------------------
 .../isis/viewer/restfulobjects/applib/Rel.java     |   94 ++--
 .../restfulobjects/applib/RelDefinition.java       |   53 ++
 .../restfulobjects/applib/RepresentationType.java  |   25 +
 .../applib/client/RestfulRequest.java              |    2 +-
 .../applib/client/RestfulResponse.java             |   22 +-
 .../viewer/restfulobjects/applib/util/Parser.java  |    1 -
 .../RestfulRequestDomainModelTest_parser.java      |   40 --
 ...RestfulRequestRequestParameterTest_valueOf.java |   92 ----
 .../RestfulRequest_DomainModelTest_parser.java     |   40 ++
 ...equestParameterTest_valueOf_xrodomainmodel.java |   55 ++
 ...equestParameterTest_valueOf_xrofollowlinks.java |   94 ++++
 .../client/RestfulResponse_HeaderTest_Warning.java |   43 ++
 .../restfulobjects/rendering/ReprRenderer.java     |    4 +-
 .../rendering/ReprRendererAbstract.java            |   30 +-
 .../AbstractObjectMemberReprRenderer.java          |    2 +
 .../domainobjects/DomainObjectReprRenderer.java    |    4 +
 .../DomainServicesListReprRenderer.java            |   54 --
 .../rendering/domainobjects/ListReprRenderer.java  |   13 +-
 .../domainobjects/ScalarValueReprRenderer.java     |    6 +-
 .../AbstractTypeMemberReprRenderer.java            |    2 +-
 .../domaintypes/TypeActionResultReprRenderer.java  |    5 +
 .../rendering/LinkFollowSpecsTest_follow.java      |    1 -
 .../restfulobjects/server/ResourceContext.java     |   94 ++--
 .../RestfulObjectsApplicationExceptionMapper.java  |    4 +-
 .../resources/DomainServiceResourceServerside.java |   10 +-
 .../resources/DomainServicesListReprRenderer.java  |   70 +++
 .../resources/DomainTypeResourceServerside.java    |    1 +
 .../server/resources/ResourceAbstract.java         |    6 +-
 .../restfulobjects/tck/RepresentationMatchers.java |   12 +-
 ...Test_serverSideException_exceptionHandling.java |   65 +++
 ...sourceTest_serviceId_request_header_accept.java |  110 ++++
 ..._serviceId_request_queryarg_xrodomainmodel.java |   75 +++
 ..._serviceId_request_queryarg_xrofollowlinks.java |   99 ++++
 ...iceResourceTest_serviceId_response_headers.java |   66 +++
 ...urceTest_serviceId_response_representation.java |   88 ++++
 ...viceResourceTest_serviceId_status_notFound.java |   70 +++
 ...ServiceResourceTest_services_header_accept.java |  105 ++++
 ...ourceTest_services_queryarg_xrofollowlinks.java |  152 ++++++
 ...viceResourceTest_services_response_headers.java |   82 +++
 ...ourceTest_services_response_representation.java |  128 +++++
 .../restfulobjects/tck/domainservice/Util.java     |   49 ++
 .../HomePageResourceTest_root_header_accept.java   |  106 ++++
 ...ResourceTest_root_queryargs_xrofollowlinks.java |  168 ++++++
 ...HomePageResourceTest_root_response_headers.java |   79 +++
 ...eResourceTest_root_response_representation.java |  111 ++++
 ...Test_serverSideException_exceptionHandling.java |   72 ---
 ...nServiceResourceTest_services_acceptHeader.java |  106 ----
 ...erviceResourceTest_services_representation.java |  137 -----
 ...rviceResourceTest_services_responseHeaders.java |   82 ---
 ...erviceResourceTest_services_xrofollowlinks.java |  122 -----
 .../home/HomePageResourceTest_acceptHeader.java    |  106 ----
 .../home/HomePageResourceTest_representation.java  |  111 ----
 .../home/HomePageResourceTest_responseHeaders.java |   79 ---
 .../home/HomePageResourceTest_xrofollowlinks.java  |  168 ------
 .../resources/object/DomainObjectResourceTest.java |  401 ---------------
 .../DomainServiceResourceTest_invokeAction.java    |  265 ----------
 ...DomainServiceResourceTest_serviceId_accept.java |  102 ----
 ...mainServiceResourceTest_serviceId_notFound.java |   65 ---
 ...rceTest_serviceId_representationAndHeaders.java |  129 -----
 ...rviceResourceTest_serviceId_xrofollowlinks.java |   97 ----
 .../user/UserResourceTest_acceptHeader.java        |  105 ----
 .../user/UserResourceTest_representation.java      |  104 ----
 .../user/UserResourceTest_responseHeaders.java     |   96 ----
 .../user/UserResourceTest_xrofollowlinks.java      |   92 ----
 .../version/VersionResourceTest_acceptHeader.java  |  110 ----
 .../VersionResourceTest_representation.java        |  113 ----
 .../VersionResourceTest_responseHeaders.java       |   82 ---
 .../VersionResourceTest_xrofollowlinks.java        |   88 ----
 .../restfulobjects/tck/stories/UserStoryTest.java  |   86 ---
 ...serResourceTest_root_request_header_accept.java |  105 ++++
 ...Test_root_request_queryargs_xrofollowlinks.java |   92 ++++
 .../UserResourceTest_root_response_headers.java    |   96 ++++
 ...rResourceTest_root_response_representation.java |  104 ++++
 ...ionResourceTest_root_request_header_accept.java |  110 ++++
 ...Test_root_request_queryargs_xrofollowlinks.java |   88 ++++
 .../VersionResourceTest_root_response_headers.java |   82 +++
 ...nResourceTest_root_response_representation.java |  113 ++++
 ...nstanceid_get_response_header_cacheControl.java |   61 +++
 ...est_instanceid_get_response_representation.java |  401 +++++++++++++++
 ...ServiceResourceTest_serviceId_invokeAction.java |  265 ++++++++++
 ...rceTest_serviceId_invokeAction_returnsList.java |   13 +
 ...eTest_serviceId_invokeAction_returnsObject.java |   13 +
 ...eTest_serviceId_invokeAction_returnsScalar.java |   13 +
 ...rceTest_serviceId_invokeAction_returnsVoid.java |   13 +
 ...rceTest_serviceId_invokeAction_throwsError.java |   13 +
 ...bjectsOfTypeResourceTest_domainTypeId_post.java |   13 +
 .../tck/zzztodo/stories/UserStoryTest.java         |   86 +++
 87 files changed, 3808 insertions(+), 3223 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/isis/blob/3c7b08fa/component/viewer/restfulobjects/applib/src/main/java/org/apache/isis/viewer/restfulobjects/applib/Rel.java
----------------------------------------------------------------------
diff --git a/component/viewer/restfulobjects/applib/src/main/java/org/apache/isis/viewer/restfulobjects/applib/Rel.java b/component/viewer/restfulobjects/applib/src/main/java/org/apache/isis/viewer/restfulobjects/applib/Rel.java
index 7184f59..c52b49a 100644
--- a/component/viewer/restfulobjects/applib/src/main/java/org/apache/isis/viewer/restfulobjects/applib/Rel.java
+++ b/component/viewer/restfulobjects/applib/src/main/java/org/apache/isis/viewer/restfulobjects/applib/Rel.java
@@ -19,71 +19,67 @@
 package org.apache.isis.viewer.restfulobjects.applib;
 
 public enum Rel {
-    
-    // IANA registered
-    SELF("self"), 
-    DESCRIBEDBY("describedby"), 
-    UP("up"), 
-    PREVIOUS("previous"),
-    NEXT("next"),
-    HELP("help"), 
-    ICON("icon"),
+
+    SELF(RelDefinition.IANA, "self"), 
+    DESCRIBEDBY(RelDefinition.IANA, "describedby"), 
+    UP(RelDefinition.IANA,"up"), 
+    PREVIOUS(RelDefinition.IANA,"previous"),
+    NEXT(RelDefinition.IANA,"next"),
+    HELP(RelDefinition.IANA,"help"), 
+    ICON(RelDefinition.IANA,"icon"),
 
     // Restful Objects namespace
-    ACTION(Spec.REL_PREFIX + "action"), 
-    ACTION_PARAM(Spec.REL_PREFIX + "action-param"), 
-    ADD_TO(Spec.REL_PREFIX + "add-to"), 
-    ATTACHMENT(Spec.REL_PREFIX + "attachment"), 
-    CHOICE(Spec.REL_PREFIX + "choice"),
-    CLEAR(Spec.REL_PREFIX + "clear"), 
-    COLLECTION(Spec.REL_PREFIX + "collection"), 
-    DEFAULT(Spec.REL_PREFIX + "default"), 
-    DELETE(Spec.REL_PREFIX + "delete"), 
-    DETAILS(Spec.REL_PREFIX + "details"), 
-    DOMAIN_TYPE(Spec.REL_PREFIX + "domain-type"),
-    DOMAIN_TYPES(Spec.REL_PREFIX + "domain-types"), 
-    ELEMENT(Spec.REL_PREFIX + "element"), 
-    ELEMENT_TYPE(Spec.REL_PREFIX + "element-type"), 
-    INVOKE(Spec.REL_PREFIX + "invoke"), 
-    MODIFY(Spec.REL_PREFIX + "modify"), 
-    PERSIST(Spec.REL_PREFIX + "persist"), 
-    PROPERTY(Spec.REL_PREFIX + "property"), 
-    REMOVE_FROM(Spec.REL_PREFIX + "remove-from"), 
-    RETURN_TYPE(Spec.REL_PREFIX + "return-type"), 
-    SERVICE(Spec.REL_PREFIX + "service"), 
-    SERVICES(Spec.REL_PREFIX + "services"), 
-    UPDATE(Spec.REL_PREFIX + "update"), 
-    USER(Spec.REL_PREFIX + "user"), 
-    VALUE(Spec.REL_PREFIX + "value"), 
-    VERSION(Spec.REL_PREFIX + "version"), 
+    ACTION(RelDefinition.RO_SPEC, "action"), 
+    ACTION_PARAM(RelDefinition.RO_SPEC, "action-param"), 
+    ADD_TO(RelDefinition.RO_SPEC, "add-to"), 
+    ATTACHMENT(RelDefinition.RO_SPEC, "attachment"), 
+    CHOICE(RelDefinition.RO_SPEC, "choice"),
+    CLEAR(RelDefinition.RO_SPEC, "clear"), 
+    COLLECTION(RelDefinition.RO_SPEC, "collection"), 
+    DEFAULT(RelDefinition.RO_SPEC, "default"), 
+    DELETE(RelDefinition.RO_SPEC, "delete"), 
+    DETAILS(RelDefinition.RO_SPEC, "details"), 
+    DOMAIN_TYPE(RelDefinition.RO_SPEC, "domain-type"),
+    DOMAIN_TYPES(RelDefinition.RO_SPEC, "domain-types"), 
+    ELEMENT(RelDefinition.RO_SPEC, "element"), 
+    ELEMENT_TYPE(RelDefinition.RO_SPEC, "element-type"), 
+    INVOKE(RelDefinition.RO_SPEC, "invoke"), 
+    MODIFY(RelDefinition.RO_SPEC, "modify"), 
+    PERSIST(RelDefinition.RO_SPEC, "persist"), 
+    PROPERTY(RelDefinition.RO_SPEC, "property"), 
+    REMOVE_FROM(RelDefinition.RO_SPEC, "remove-from"), 
+    RETURN_TYPE(RelDefinition.RO_SPEC, "return-type"), 
+    SERVICE(RelDefinition.RO_SPEC, "service"), 
+    SERVICES(RelDefinition.RO_SPEC, "services"), 
+    UPDATE(RelDefinition.RO_SPEC, "update"), 
+    USER(RelDefinition.RO_SPEC, "user"), 
+    VALUE(RelDefinition.RO_SPEC, "value"), 
+    VERSION(RelDefinition.RO_SPEC, "version"), 
     
 
     // implementation specific
-    CONTRIBUTED_BY(Impl.REL_PREFIX + "contributed-by");
+    CONTRIBUTED_BY(RelDefinition.IMPL, "contributed-by");
 
-    private final String name;
+    private final RelDefinition relDef;
+    private final String relSuffix;
 
-    private Rel(final String name) {
-        this.name = name;
+    private Rel(final RelDefinition relDef, final String name) {
+        this.relDef = relDef;
+        this.relSuffix = name;
     }
 
     public String getName() {
-        return name;
+        return relDef.nameOf(relSuffix);
     }
 
     /**
      * For those {@link Rel}s that also take a param
      */
     public String andParam(String paramName, String paramValue) {
-        return name + ";" + paramName + "=" + "\"" + paramValue + "\"";
-    }
-
-    private static class Spec {
-        final static String REL_PREFIX = "urn:org.restfulobjects:rels/";
-    }
-
-    private static class Impl {
-        final static String REL_PREFIX = "urn:org.apache.isis.restfulobjects:rels/";
+        return getName() +
+                (relDef.canAddParams() 
+                 ?";" + paramName + "=" + "\"" + paramValue + "\""
+                 :"");
     }
 
 }

http://git-wip-us.apache.org/repos/asf/isis/blob/3c7b08fa/component/viewer/restfulobjects/applib/src/main/java/org/apache/isis/viewer/restfulobjects/applib/RelDefinition.java
----------------------------------------------------------------------
diff --git a/component/viewer/restfulobjects/applib/src/main/java/org/apache/isis/viewer/restfulobjects/applib/RelDefinition.java b/component/viewer/restfulobjects/applib/src/main/java/org/apache/isis/viewer/restfulobjects/applib/RelDefinition.java
new file mode 100644
index 0000000..efb269e
--- /dev/null
+++ b/component/viewer/restfulobjects/applib/src/main/java/org/apache/isis/viewer/restfulobjects/applib/RelDefinition.java
@@ -0,0 +1,53 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
+package org.apache.isis.viewer.restfulobjects.applib;
+
+/**
+ * Enumerates the organization that defined a {@link Rel}.
+ */
+public enum RelDefinition {
+
+    /**
+     * {@link Rel} defined by IANA.
+     */
+    IANA(null, false),
+    /**
+     * {@link Rel} defined by the Restful Objects spec.
+     */
+    RO_SPEC("urn:org.restfulobjects:rels/", true),
+    /**
+     * Proprietary rel defined by implementation.
+     */
+    IMPL("urn:org.apache.isis.restfulobjects:rels/", true);
+    
+    private final String relPrefix;
+    private final boolean addParams;
+
+    private RelDefinition(String relPrefix, boolean canAddParams) {
+        this.relPrefix = relPrefix;
+        this.addParams = canAddParams;
+    }
+    
+    public String nameOf(String relSuffix) {
+        return (relPrefix != null? relPrefix:"") +relSuffix;
+    }
+    public boolean canAddParams() {
+        return addParams;
+    }
+}

http://git-wip-us.apache.org/repos/asf/isis/blob/3c7b08fa/component/viewer/restfulobjects/applib/src/main/java/org/apache/isis/viewer/restfulobjects/applib/RepresentationType.java
----------------------------------------------------------------------
diff --git a/component/viewer/restfulobjects/applib/src/main/java/org/apache/isis/viewer/restfulobjects/applib/RepresentationType.java b/component/viewer/restfulobjects/applib/src/main/java/org/apache/isis/viewer/restfulobjects/applib/RepresentationType.java
index c0fd7f9..1a2a005 100644
--- a/component/viewer/restfulobjects/applib/src/main/java/org/apache/isis/viewer/restfulobjects/applib/RepresentationType.java
+++ b/component/viewer/restfulobjects/applib/src/main/java/org/apache/isis/viewer/restfulobjects/applib/RepresentationType.java
@@ -19,6 +19,9 @@
 package org.apache.isis.viewer.restfulobjects.applib;
 
 
+import java.util.Collections;
+import java.util.Map;
+
 import javax.ws.rs.core.MediaType;
 
 import org.apache.isis.applib.util.Enums;
@@ -41,6 +44,8 @@ import org.apache.isis.viewer.restfulobjects.applib.user.UserRepresentation;
 import org.apache.isis.viewer.restfulobjects.applib.util.Parser;
 import org.apache.isis.viewer.restfulobjects.applib.version.VersionRepresentation;
 
+import com.google.common.collect.Maps;
+
 public enum RepresentationType {
 
     HOME_PAGE(RestfulMediaType.APPLICATION_JSON_HOME_PAGE, HomePageRepresentation.class), 
@@ -84,6 +89,24 @@ public enum RepresentationType {
         return mediaType;
     }
 
+    /**
+     * Clones the (immutable) {@link #getMediaType() media type}, adding in one additional
+     * parameter value.
+     */
+    public MediaType getMediaType(String parameter, String paramValue) {
+        return getMediaType(Collections.singletonMap(parameter, paramValue));
+    }
+
+    /**
+     * Clones the (immutable) {@link #getMediaType() media type}, adding all provided
+     * parameters.
+     */
+    public MediaType getMediaType(Map<String, String> mediaTypeParams) {
+        Map<String, String> parameters = Maps.newHashMap(mediaType.getParameters());
+        parameters.putAll(mediaTypeParams);
+        return new MediaType(mediaType.getType(), mediaType.getSubtype(), parameters);
+    }
+
     public String getMediaTypeProfile() {
         return getMediaType().getParameters().get("profile");
     }
@@ -124,4 +147,6 @@ public enum RepresentationType {
         };
     }
 
+
+
 }

http://git-wip-us.apache.org/repos/asf/isis/blob/3c7b08fa/component/viewer/restfulobjects/applib/src/main/java/org/apache/isis/viewer/restfulobjects/applib/client/RestfulRequest.java
----------------------------------------------------------------------
diff --git a/component/viewer/restfulobjects/applib/src/main/java/org/apache/isis/viewer/restfulobjects/applib/client/RestfulRequest.java b/component/viewer/restfulobjects/applib/src/main/java/org/apache/isis/viewer/restfulobjects/applib/client/RestfulRequest.java
index fa3f0e1..22e7bea 100644
--- a/component/viewer/restfulobjects/applib/src/main/java/org/apache/isis/viewer/restfulobjects/applib/client/RestfulRequest.java
+++ b/component/viewer/restfulobjects/applib/src/main/java/org/apache/isis/viewer/restfulobjects/applib/client/RestfulRequest.java
@@ -64,7 +64,7 @@ public final class RestfulRequest {
         public static RequestParameter<Integer> PAGE = new RequestParameter<Integer>("x-ro-page", Parser.forInteger(), 1);
         public static RequestParameter<Integer> PAGE_SIZE = new RequestParameter<Integer>("x-ro-page-size", Parser.forInteger(), 25);
         public static RequestParameter<List<String>> SORT_BY = new RequestParameter<List<String>>("x-ro-sort-by", Parser.forListOfStrings(), Collections.<String> emptyList());
-        public static RequestParameter<DomainModel> DOMAIN_MODEL = new RequestParameter<DomainModel>("x-ro-domain-model", DomainModel.parser(), DomainModel.SIMPLE);
+        public static RequestParameter<DomainModel> DOMAIN_MODEL = new RequestParameter<DomainModel>("x-ro-domain-model", DomainModel.parser(), DomainModel.FORMAL);
         public static RequestParameter<Boolean> VALIDATE_ONLY = new RequestParameter<Boolean>("x-ro-validate-only", Parser.forBoolean(), false);
 
         private final String name;

http://git-wip-us.apache.org/repos/asf/isis/blob/3c7b08fa/component/viewer/restfulobjects/applib/src/main/java/org/apache/isis/viewer/restfulobjects/applib/client/RestfulResponse.java
----------------------------------------------------------------------
diff --git a/component/viewer/restfulobjects/applib/src/main/java/org/apache/isis/viewer/restfulobjects/applib/client/RestfulResponse.java b/component/viewer/restfulobjects/applib/src/main/java/org/apache/isis/viewer/restfulobjects/applib/client/RestfulResponse.java
index 17b8818..6c96b1e 100644
--- a/component/viewer/restfulobjects/applib/src/main/java/org/apache/isis/viewer/restfulobjects/applib/client/RestfulResponse.java
+++ b/component/viewer/restfulobjects/applib/src/main/java/org/apache/isis/viewer/restfulobjects/applib/client/RestfulResponse.java
@@ -30,6 +30,7 @@ import javax.ws.rs.core.Response.Status;
 import javax.ws.rs.core.Response.Status.Family;
 import javax.ws.rs.core.Response.StatusType;
 
+import org.apache.isis.core.commons.lang.StringUtils;
 import org.apache.isis.viewer.restfulobjects.applib.JsonRepresentation;
 import org.apache.isis.viewer.restfulobjects.applib.RepresentationType;
 import org.apache.isis.viewer.restfulobjects.applib.util.JsonMapper;
@@ -37,6 +38,7 @@ import org.apache.isis.viewer.restfulobjects.applib.util.Parser;
 import org.codehaus.jackson.JsonParseException;
 import org.codehaus.jackson.map.JsonMappingException;
 
+import com.google.common.base.Strings;
 import com.google.common.collect.Maps;
 
 public class RestfulResponse<T> {
@@ -239,7 +241,7 @@ public class RestfulResponse<T> {
 
     public static class Header<X> {
 
-        public final static Header<String> WARNING = new Header<String>("Warning", Parser.forString());
+        public final static Header<String> WARNING = new Header<String>("Warning", warningParser());
         public final static Header<Date> LAST_MODIFIED = new Header<Date>("Last-Modified", Parser.forDate());
         public final static Header<CacheControl> CACHE_CONTROL = new Header<CacheControl>("Cache-Control", Parser.forCacheControl());
         public final static Header<MediaType> CONTENT_TYPE = new Header<MediaType>("Content-Type", Parser.forJaxRsMediaType());
@@ -260,6 +262,24 @@ public class RestfulResponse<T> {
             return parser.valueOf(value);
         }
 
+        private static Parser<String> warningParser() {
+            return new Parser<String>(){
+                private static final String PREFIX = "199 RestfulObjects ";
+
+                @Override
+                public String valueOf(String str) {
+                    return stripPrefix(str, PREFIX);
+                }
+
+                @Override
+                public String asString(String str) {
+                    return PREFIX + str;
+                }
+                private String stripPrefix(String str, String prefix) {
+                    return str.startsWith(prefix) ? str.substring(prefix.length()) : str;
+                }
+            };
+        }
     }
 
     private final Response response;

http://git-wip-us.apache.org/repos/asf/isis/blob/3c7b08fa/component/viewer/restfulobjects/applib/src/main/java/org/apache/isis/viewer/restfulobjects/applib/util/Parser.java
----------------------------------------------------------------------
diff --git a/component/viewer/restfulobjects/applib/src/main/java/org/apache/isis/viewer/restfulobjects/applib/util/Parser.java b/component/viewer/restfulobjects/applib/src/main/java/org/apache/isis/viewer/restfulobjects/applib/util/Parser.java
index 706de82..846e0ea 100644
--- a/component/viewer/restfulobjects/applib/src/main/java/org/apache/isis/viewer/restfulobjects/applib/util/Parser.java
+++ b/component/viewer/restfulobjects/applib/src/main/java/org/apache/isis/viewer/restfulobjects/applib/util/Parser.java
@@ -164,7 +164,6 @@ public abstract class Parser<T> {
             public String asString(final com.google.common.net.MediaType t) {
                 return t.toString();
             }
-
         };
     }
 

http://git-wip-us.apache.org/repos/asf/isis/blob/3c7b08fa/component/viewer/restfulobjects/applib/src/test/java/org/apache/isis/viewer/restfulobjects/applib/client/RestfulRequestDomainModelTest_parser.java
----------------------------------------------------------------------
diff --git a/component/viewer/restfulobjects/applib/src/test/java/org/apache/isis/viewer/restfulobjects/applib/client/RestfulRequestDomainModelTest_parser.java b/component/viewer/restfulobjects/applib/src/test/java/org/apache/isis/viewer/restfulobjects/applib/client/RestfulRequestDomainModelTest_parser.java
deleted file mode 100644
index a690927..0000000
--- a/component/viewer/restfulobjects/applib/src/test/java/org/apache/isis/viewer/restfulobjects/applib/client/RestfulRequestDomainModelTest_parser.java
+++ /dev/null
@@ -1,40 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *        http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- */
-package org.apache.isis.viewer.restfulobjects.applib.client;
-
-import static org.junit.Assert.assertSame;
-
-import org.apache.isis.viewer.restfulobjects.applib.client.RestfulRequest;
-import org.apache.isis.viewer.restfulobjects.applib.client.RestfulRequest.DomainModel;
-import org.apache.isis.viewer.restfulobjects.applib.util.Parser;
-import org.junit.Test;
-
-public class RestfulRequestDomainModelTest_parser {
-
-    @Test
-    public void parser_roundtrips() {
-        final Parser<DomainModel> parser = RestfulRequest.DomainModel.parser();
-        for (final DomainModel domainModel : DomainModel.values()) {
-            final String asString = parser.asString(domainModel);
-            final DomainModel roundtripped = parser.valueOf(asString);
-            assertSame(roundtripped, domainModel);
-        }
-    }
-
-}

http://git-wip-us.apache.org/repos/asf/isis/blob/3c7b08fa/component/viewer/restfulobjects/applib/src/test/java/org/apache/isis/viewer/restfulobjects/applib/client/RestfulRequestRequestParameterTest_valueOf.java
----------------------------------------------------------------------
diff --git a/component/viewer/restfulobjects/applib/src/test/java/org/apache/isis/viewer/restfulobjects/applib/client/RestfulRequestRequestParameterTest_valueOf.java b/component/viewer/restfulobjects/applib/src/test/java/org/apache/isis/viewer/restfulobjects/applib/client/RestfulRequestRequestParameterTest_valueOf.java
deleted file mode 100644
index 60b737f..0000000
--- a/component/viewer/restfulobjects/applib/src/test/java/org/apache/isis/viewer/restfulobjects/applib/client/RestfulRequestRequestParameterTest_valueOf.java
+++ /dev/null
@@ -1,92 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *        http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- */
-package org.apache.isis.viewer.restfulobjects.applib.client;
-
-import static org.hamcrest.CoreMatchers.is;
-import static org.junit.Assert.assertThat;
-
-import java.util.List;
-
-import org.apache.isis.viewer.restfulobjects.applib.JsonRepresentation;
-import org.apache.isis.viewer.restfulobjects.applib.client.RestfulRequest;
-import org.apache.isis.viewer.restfulobjects.applib.client.RestfulRequest.RequestParameter;
-import org.junit.Before;
-import org.junit.Test;
-
-public class RestfulRequestRequestParameterTest_valueOf {
-
-    private final RequestParameter<List<List<String>>> requestParameter = RestfulRequest.RequestParameter.FOLLOW_LINKS;
-
-    private JsonRepresentation repr;
-
-    @Before
-    public void setUp() throws Exception {
-        repr = JsonRepresentation.newMap();
-    }
-
-    @Test
-    public void mapContainsList() {
-        repr.mapPut("x-ro-follow-links", "a,b.c");
-        final List<List<String>> valueOf = requestParameter.valueOf(repr);
-
-        assertThat(valueOf.size(), is(2));
-        assertThat(valueOf.get(0).size(), is(1));
-        assertThat(valueOf.get(0).get(0), is("a"));
-        assertThat(valueOf.get(1).size(), is(2));
-        assertThat(valueOf.get(1).get(0), is("b"));
-        assertThat(valueOf.get(1).get(1), is("c"));
-    }
-
-    @Test
-    public void mapHasNoKey() {
-        repr.mapPut("something-else", "a,b.c");
-        final List<List<String>> valueOf = requestParameter.valueOf(repr);
-
-        assertThat(valueOf.size(), is(0));
-    }
-
-    @Test
-    public void mapIsEmpty() {
-        final List<List<String>> valueOf = requestParameter.valueOf(repr);
-
-        assertThat(valueOf.size(), is(0));
-    }
-
-    @Test
-    public void mapIsNull() {
-        final List<List<String>> valueOf = requestParameter.valueOf(null);
-
-        assertThat(valueOf.size(), is(0));
-    }
-
-    @Test
-    public void mapContainsCommaSeparatedList() {
-
-        repr.mapPut("x-ro-follow-links", "a,b.c");
-        final List<List<String>> valueOf = requestParameter.valueOf(repr);
-
-        assertThat(valueOf.size(), is(2));
-        assertThat(valueOf.get(0).size(), is(1));
-        assertThat(valueOf.get(0).get(0), is("a"));
-        assertThat(valueOf.get(1).size(), is(2));
-        assertThat(valueOf.get(1).get(0), is("b"));
-        assertThat(valueOf.get(1).get(1), is("c"));
-    }
-
-}

http://git-wip-us.apache.org/repos/asf/isis/blob/3c7b08fa/component/viewer/restfulobjects/applib/src/test/java/org/apache/isis/viewer/restfulobjects/applib/client/RestfulRequest_DomainModelTest_parser.java
----------------------------------------------------------------------
diff --git a/component/viewer/restfulobjects/applib/src/test/java/org/apache/isis/viewer/restfulobjects/applib/client/RestfulRequest_DomainModelTest_parser.java b/component/viewer/restfulobjects/applib/src/test/java/org/apache/isis/viewer/restfulobjects/applib/client/RestfulRequest_DomainModelTest_parser.java
new file mode 100644
index 0000000..2949bf0
--- /dev/null
+++ b/component/viewer/restfulobjects/applib/src/test/java/org/apache/isis/viewer/restfulobjects/applib/client/RestfulRequest_DomainModelTest_parser.java
@@ -0,0 +1,40 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
+package org.apache.isis.viewer.restfulobjects.applib.client;
+
+import static org.junit.Assert.assertSame;
+
+import org.apache.isis.viewer.restfulobjects.applib.client.RestfulRequest;
+import org.apache.isis.viewer.restfulobjects.applib.client.RestfulRequest.DomainModel;
+import org.apache.isis.viewer.restfulobjects.applib.util.Parser;
+import org.junit.Test;
+
+public class RestfulRequest_DomainModelTest_parser {
+
+    @Test
+    public void parser_roundtrips() {
+        final Parser<DomainModel> parser = RestfulRequest.DomainModel.parser();
+        for (final DomainModel domainModel : DomainModel.values()) {
+            final String asString = parser.asString(domainModel);
+            final DomainModel roundtripped = parser.valueOf(asString);
+            assertSame(roundtripped, domainModel);
+        }
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/isis/blob/3c7b08fa/component/viewer/restfulobjects/applib/src/test/java/org/apache/isis/viewer/restfulobjects/applib/client/RestfulRequest_RequestParameterTest_valueOf_xrodomainmodel.java
----------------------------------------------------------------------
diff --git a/component/viewer/restfulobjects/applib/src/test/java/org/apache/isis/viewer/restfulobjects/applib/client/RestfulRequest_RequestParameterTest_valueOf_xrodomainmodel.java b/component/viewer/restfulobjects/applib/src/test/java/org/apache/isis/viewer/restfulobjects/applib/client/RestfulRequest_RequestParameterTest_valueOf_xrodomainmodel.java
new file mode 100644
index 0000000..3d4da4a
--- /dev/null
+++ b/component/viewer/restfulobjects/applib/src/test/java/org/apache/isis/viewer/restfulobjects/applib/client/RestfulRequest_RequestParameterTest_valueOf_xrodomainmodel.java
@@ -0,0 +1,55 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
+package org.apache.isis.viewer.restfulobjects.applib.client;
+
+import static org.hamcrest.CoreMatchers.is;
+import static org.junit.Assert.assertThat;
+
+import org.apache.isis.viewer.restfulobjects.applib.JsonRepresentation;
+import org.apache.isis.viewer.restfulobjects.applib.client.RestfulRequest.DomainModel;
+import org.apache.isis.viewer.restfulobjects.applib.client.RestfulRequest.RequestParameter;
+import org.junit.Before;
+import org.junit.Test;
+
+public class RestfulRequest_RequestParameterTest_valueOf_xrodomainmodel {
+
+    private final RequestParameter<DomainModel> requestParameter = RestfulRequest.RequestParameter.DOMAIN_MODEL;
+
+    private JsonRepresentation repr;
+
+    @Before
+    public void setUp() throws Exception {
+        repr = JsonRepresentation.newMap();
+    }
+
+    @Test
+    public void simple() {
+        repr.mapPut("x-ro-domain-model", "simple");
+        final DomainModel valueOf = requestParameter.valueOf(repr);
+
+        assertThat(valueOf, is(DomainModel.SIMPLE));
+    }
+
+    @Test
+    public void whenNone() {
+        final DomainModel valueOf = requestParameter.valueOf(repr);
+
+        assertThat(valueOf, is(DomainModel.FORMAL));
+    }
+}

http://git-wip-us.apache.org/repos/asf/isis/blob/3c7b08fa/component/viewer/restfulobjects/applib/src/test/java/org/apache/isis/viewer/restfulobjects/applib/client/RestfulRequest_RequestParameterTest_valueOf_xrofollowlinks.java
----------------------------------------------------------------------
diff --git a/component/viewer/restfulobjects/applib/src/test/java/org/apache/isis/viewer/restfulobjects/applib/client/RestfulRequest_RequestParameterTest_valueOf_xrofollowlinks.java b/component/viewer/restfulobjects/applib/src/test/java/org/apache/isis/viewer/restfulobjects/applib/client/RestfulRequest_RequestParameterTest_valueOf_xrofollowlinks.java
new file mode 100644
index 0000000..4b32a8e
--- /dev/null
+++ b/component/viewer/restfulobjects/applib/src/test/java/org/apache/isis/viewer/restfulobjects/applib/client/RestfulRequest_RequestParameterTest_valueOf_xrofollowlinks.java
@@ -0,0 +1,94 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
+package org.apache.isis.viewer.restfulobjects.applib.client;
+
+import static org.hamcrest.CoreMatchers.is;
+import static org.junit.Assert.assertThat;
+
+import java.util.List;
+
+import org.apache.isis.viewer.restfulobjects.applib.JsonRepresentation;
+import org.apache.isis.viewer.restfulobjects.applib.client.RestfulRequest;
+import org.apache.isis.viewer.restfulobjects.applib.client.RestfulRequest.RequestParameter;
+import org.junit.Before;
+import org.junit.Test;
+
+public class RestfulRequest_RequestParameterTest_valueOf_xrofollowlinks {
+
+    private final RequestParameter<List<List<String>>> requestParameter = RestfulRequest.RequestParameter.FOLLOW_LINKS;
+
+    private JsonRepresentation repr;
+
+    @Before
+    public void setUp() throws Exception {
+        repr = JsonRepresentation.newMap();
+    }
+
+    @Test
+    public void mapContainsList() {
+        repr.mapPut("x-ro-follow-links", "a,b.c");
+        final List<List<String>> valueOf = requestParameter.valueOf(repr);
+
+        assertThat(valueOf.size(), is(2));
+        assertThat(valueOf.get(0).size(), is(1));
+        assertThat(valueOf.get(0).get(0), is("a"));
+        assertThat(valueOf.get(1).size(), is(2));
+        assertThat(valueOf.get(1).get(0), is("b"));
+        assertThat(valueOf.get(1).get(1), is("c"));
+    }
+
+    @Test
+    public void mapHasNoKey() {
+        repr.mapPut("something-else", "a,b.c");
+        final List<List<String>> valueOf = requestParameter.valueOf(repr);
+
+        assertThat(valueOf.size(), is(0));
+    }
+
+    @Test
+    public void mapIsEmpty() {
+        final List<List<String>> valueOf = requestParameter.valueOf(repr);
+
+        assertThat(valueOf.size(), is(0));
+    }
+
+    @Test
+    public void mapIsNull() {
+        final List<List<String>> valueOf = requestParameter.valueOf(null);
+
+        assertThat(valueOf.size(), is(0));
+    }
+
+    @Test
+    public void mapContainsCommaSeparatedList() {
+
+        repr.mapPut("x-ro-follow-links", "a,b.c");
+        final List<List<String>> valueOf = requestParameter.valueOf(repr);
+
+        assertThat(valueOf.size(), is(2));
+        assertThat(valueOf.get(0).size(), is(1));
+        assertThat(valueOf.get(0).get(0), is("a"));
+        assertThat(valueOf.get(1).size(), is(2));
+        assertThat(valueOf.get(1).get(0), is("b"));
+        assertThat(valueOf.get(1).get(1), is("c"));
+    }
+
+    
+    
+}

http://git-wip-us.apache.org/repos/asf/isis/blob/3c7b08fa/component/viewer/restfulobjects/applib/src/test/java/org/apache/isis/viewer/restfulobjects/applib/client/RestfulResponse_HeaderTest_Warning.java
----------------------------------------------------------------------
diff --git a/component/viewer/restfulobjects/applib/src/test/java/org/apache/isis/viewer/restfulobjects/applib/client/RestfulResponse_HeaderTest_Warning.java b/component/viewer/restfulobjects/applib/src/test/java/org/apache/isis/viewer/restfulobjects/applib/client/RestfulResponse_HeaderTest_Warning.java
new file mode 100644
index 0000000..294cab7
--- /dev/null
+++ b/component/viewer/restfulobjects/applib/src/test/java/org/apache/isis/viewer/restfulobjects/applib/client/RestfulResponse_HeaderTest_Warning.java
@@ -0,0 +1,43 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
+package org.apache.isis.viewer.restfulobjects.applib.client;
+
+import static org.hamcrest.CoreMatchers.is;
+import static org.junit.Assert.assertThat;
+
+import org.junit.Test;
+
+public class RestfulResponse_HeaderTest_Warning {
+
+    
+    @Test
+    public void nonEmptyString() throws Exception {
+        assertThat(RestfulResponse.Header.WARNING.parse("199 RestfulObjects abc"), is("abc"));
+    }
+
+    @Test
+    public void emptyString() throws Exception {
+        assertThat(RestfulResponse.Header.WARNING.parse("199 RestfulObjects "), is(""));
+    }
+
+    @Test
+    public void noPrefix() throws Exception {
+        assertThat(RestfulResponse.Header.WARNING.parse("199 RestfulObject prefix is missing an 's'"), is("199 RestfulObject prefix is missing an 's'"));
+    }
+}

http://git-wip-us.apache.org/repos/asf/isis/blob/3c7b08fa/component/viewer/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/ReprRenderer.java
----------------------------------------------------------------------
diff --git a/component/viewer/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/ReprRenderer.java b/component/viewer/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/ReprRenderer.java
index 81a03da..d0633ad 100644
--- a/component/viewer/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/ReprRenderer.java
+++ b/component/viewer/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/ReprRenderer.java
@@ -18,12 +18,14 @@
  */
 package org.apache.isis.viewer.restfulobjects.rendering;
 
+import javax.ws.rs.core.MediaType;
+
 import org.apache.isis.viewer.restfulobjects.applib.JsonRepresentation;
 import org.apache.isis.viewer.restfulobjects.applib.RepresentationType;
 
 public interface ReprRenderer<R extends ReprRenderer<R, T>, T> {
 
-    RepresentationType getRepresentationType();
+    MediaType getMediaType();
 
     R with(T t);
 

http://git-wip-us.apache.org/repos/asf/isis/blob/3c7b08fa/component/viewer/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/ReprRendererAbstract.java
----------------------------------------------------------------------
diff --git a/component/viewer/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/ReprRendererAbstract.java b/component/viewer/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/ReprRendererAbstract.java
index fe57485..155eb96 100644
--- a/component/viewer/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/ReprRendererAbstract.java
+++ b/component/viewer/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/ReprRendererAbstract.java
@@ -19,8 +19,10 @@
 package org.apache.isis.viewer.restfulobjects.rendering;
 
 import java.util.List;
+import java.util.Map;
+
+import javax.ws.rs.core.MediaType;
 
-import org.apache.isis.core.commons.authentication.AuthenticationSession;
 import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
 import org.apache.isis.core.metamodel.spec.ObjectSpecification;
 import org.apache.isis.core.runtime.system.context.IsisContext;
@@ -31,12 +33,15 @@ import org.apache.isis.viewer.restfulobjects.applib.RepresentationType;
 import org.apache.isis.viewer.restfulobjects.rendering.domainobjects.DomainObjectReprRenderer;
 import org.apache.isis.viewer.restfulobjects.rendering.domaintypes.DomainTypeReprRenderer;
 
+import com.google.common.collect.Maps;
+
 public abstract class ReprRendererAbstract<R extends ReprRendererAbstract<R, T>, T> implements ReprRenderer<R, T> {
 
     protected final RendererContext rendererContext;
     private final LinkFollowSpecs linkFollower;
     private final RepresentationType representationType;
     protected final JsonRepresentation representation;
+    private final Map<String,String> mediaTypeParams = Maps.newLinkedHashMap();
 
     protected boolean includesSelf;
 
@@ -63,8 +68,12 @@ public abstract class ReprRendererAbstract<R extends ReprRendererAbstract<R, T>,
     }
 
     @Override
-    public RepresentationType getRepresentationType() {
-        return representationType;
+    public MediaType getMediaType() {
+        return representationType.getMediaType(mediaTypeParams);
+    }
+
+    protected void addMediaTypeParams(String param, String paramValue) {
+        mediaTypeParams.put(param, paramValue);
     }
 
     @SuppressWarnings("unchecked")
@@ -73,10 +82,6 @@ public abstract class ReprRendererAbstract<R extends ReprRendererAbstract<R, T>,
         return (R) this;
     }
 
-    public R withSelf(final JsonRepresentation link) {
-        return withLink(Rel.SELF, link);
-    }
-
     public R withLink(final Rel rel, final String href) {
         if (href != null) {
             getLinks().arrayAdd(LinkBuilder.newBuilder(rendererContext, rel.getName(), representationType, href).build());
@@ -113,7 +118,16 @@ public abstract class ReprRendererAbstract<R extends ReprRendererAbstract<R, T>,
             return;
         }
         final LinkBuilder linkBuilder = DomainTypeReprRenderer.newLinkToBuilder(getRendererContext(), rel, objectSpec);
-        getLinks().arrayAdd(linkBuilder.build());
+        JsonRepresentation link = linkBuilder.build();
+        getLinks().arrayAdd(link);
+        
+        final LinkFollowSpecs linkFollower = getLinkFollowSpecs().follow("links");
+        if (linkFollower.matches(link)) {
+            final DomainTypeReprRenderer renderer = new DomainTypeReprRenderer(getRendererContext(), linkFollower, JsonRepresentation.newMap())
+                .with(objectSpec);
+            link.mapPut("value", renderer.render());
+        }
+
     }
 
     /**

http://git-wip-us.apache.org/repos/asf/isis/blob/3c7b08fa/component/viewer/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/domainobjects/AbstractObjectMemberReprRenderer.java
----------------------------------------------------------------------
diff --git a/component/viewer/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/domainobjects/AbstractObjectMemberReprRenderer.java b/component/viewer/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/domainobjects/AbstractObjectMemberReprRenderer.java
index d824d6a..47357d4 100644
--- a/component/viewer/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/domainobjects/AbstractObjectMemberReprRenderer.java
+++ b/component/viewer/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/domainobjects/AbstractObjectMemberReprRenderer.java
@@ -16,6 +16,8 @@
  */
 package org.apache.isis.viewer.restfulobjects.rendering.domainobjects;
 
+import javax.ws.rs.core.MediaType;
+
 import org.apache.isis.applib.annotation.Where;
 import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
 import org.apache.isis.core.metamodel.consent.Consent;

http://git-wip-us.apache.org/repos/asf/isis/blob/3c7b08fa/component/viewer/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/domainobjects/DomainObjectReprRenderer.java
----------------------------------------------------------------------
diff --git a/component/viewer/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/domainobjects/DomainObjectReprRenderer.java b/component/viewer/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/domainobjects/DomainObjectReprRenderer.java
index 65aef76..e8e8454 100644
--- a/component/viewer/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/domainobjects/DomainObjectReprRenderer.java
+++ b/component/viewer/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/domainobjects/DomainObjectReprRenderer.java
@@ -46,6 +46,8 @@ import org.apache.isis.viewer.restfulobjects.rendering.util.OidUtils;
 
 public class DomainObjectReprRenderer extends ReprRendererAbstract<DomainObjectReprRenderer, ObjectAdapter> {
 
+    private static final String X_RO_DOMAIN_TYPE = "x-ro-domain-type";
+
     public static LinkBuilder newLinkToBuilder(final RendererContext rendererContext, final Rel rel, final ObjectAdapter objectAdapter) {
         String domainType = OidUtils.getDomainType(objectAdapter);
         String instanceId = OidUtils.getInstanceId(rendererContext, objectAdapter);
@@ -104,9 +106,11 @@ public class DomainObjectReprRenderer extends ReprRendererAbstract<DomainObjectR
     @Override
     public DomainObjectReprRenderer with(final ObjectAdapter objectAdapter) {
         this.objectAdapter = objectAdapter;
+        addMediaTypeParams(X_RO_DOMAIN_TYPE, objectAdapter.getSpecification().getFullIdentifier());
         return this;
     }
 
+
     @Override
     public JsonRepresentation render() {
 

http://git-wip-us.apache.org/repos/asf/isis/blob/3c7b08fa/component/viewer/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/domainobjects/DomainServicesListReprRenderer.java
----------------------------------------------------------------------
diff --git a/component/viewer/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/domainobjects/DomainServicesListReprRenderer.java b/component/viewer/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/domainobjects/DomainServicesListReprRenderer.java
deleted file mode 100644
index 2cf08ae..0000000
--- a/component/viewer/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/domainobjects/DomainServicesListReprRenderer.java
+++ /dev/null
@@ -1,54 +0,0 @@
-/**
- *  Licensed to the Apache Software Foundation (ASF) under one or more
- *  contributor license agreements.  See the NOTICE file distributed with
- *  this work for additional information regarding copyright ownership.
- *  The ASF licenses this file to You under the Apache License, Version 2.0
- *  (the "License"); you may not use this file except in compliance with
- *  the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing, software
- *  distributed under the License is distributed on an "AS IS" BASIS,
- *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- *  See the License for the specific language governing permissions and
- *  limitations under the License.
- */
-package org.apache.isis.viewer.restfulobjects.rendering.domainobjects;
-
-import java.util.Collection;
-
-import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
-import org.apache.isis.core.metamodel.spec.ObjectSpecification;
-import org.apache.isis.viewer.restfulobjects.applib.JsonRepresentation;
-import org.apache.isis.viewer.restfulobjects.applib.Rel;
-import org.apache.isis.viewer.restfulobjects.applib.RepresentationType;
-import org.apache.isis.viewer.restfulobjects.rendering.LinkFollowSpecs;
-import org.apache.isis.viewer.restfulobjects.rendering.RendererContext;
-import org.apache.isis.viewer.restfulobjects.rendering.ReprRendererAbstract;
-
-public class DomainServicesListReprRenderer extends ListReprRenderer {
-
-    private ObjectAdapterLinkTo linkTo;
-    private Collection<ObjectAdapter> objectAdapters;
-    private ObjectSpecification elementType;
-    private ObjectSpecification returnType;
-
-    public DomainServicesListReprRenderer(final RendererContext resourceContext, final LinkFollowSpecs linkFollower, final JsonRepresentation representation) {
-        super(resourceContext, linkFollower, representation);
-    }
-
-    @Override
-    public JsonRepresentation render() {
-        super.render();
-
-        addLink(Rel.RETURN_TYPE, returnType);
-        addLink(Rel.ELEMENT_TYPE, elementType);
-
-        getExtensions();
-
-        return representation;
-    }
-    
-
-}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/isis/blob/3c7b08fa/component/viewer/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/domainobjects/ListReprRenderer.java
----------------------------------------------------------------------
diff --git a/component/viewer/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/domainobjects/ListReprRenderer.java b/component/viewer/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/domainobjects/ListReprRenderer.java
index 94e1e65..8896243 100644
--- a/component/viewer/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/domainobjects/ListReprRenderer.java
+++ b/component/viewer/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/domainobjects/ListReprRenderer.java
@@ -64,8 +64,8 @@ public class ListReprRenderer extends ReprRendererAbstract<ListReprRenderer, Col
     public JsonRepresentation render() {
         addValue();
 
-        addLink(Rel.RETURN_TYPE, returnType);
-        addLink(Rel.ELEMENT_TYPE, elementType);
+        addLinkToReturnType();
+        addLinkToElementType();
 
         getExtensions();
 
@@ -97,4 +97,13 @@ public class ListReprRenderer extends ReprRendererAbstract<ListReprRenderer, Col
         representation.mapPut("value", values);
     }
 
+
+    protected void addLinkToReturnType() {
+        addLink(Rel.RETURN_TYPE, returnType);
+    }
+
+    protected void addLinkToElementType() {
+        addLink(Rel.ELEMENT_TYPE, elementType);
+    }
+
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/isis/blob/3c7b08fa/component/viewer/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/domainobjects/ScalarValueReprRenderer.java
----------------------------------------------------------------------
diff --git a/component/viewer/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/domainobjects/ScalarValueReprRenderer.java b/component/viewer/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/domainobjects/ScalarValueReprRenderer.java
index f549211..f5eb48a 100644
--- a/component/viewer/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/domainobjects/ScalarValueReprRenderer.java
+++ b/component/viewer/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/domainobjects/ScalarValueReprRenderer.java
@@ -16,6 +16,8 @@
  */
 package org.apache.isis.viewer.restfulobjects.rendering.domainobjects;
 
+import javax.ws.rs.core.MediaType;
+
 import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
 import org.apache.isis.core.metamodel.facets.object.encodeable.EncodableFacet;
 import org.apache.isis.core.metamodel.spec.ObjectSpecification;
@@ -43,8 +45,8 @@ public class ScalarValueReprRenderer extends ReprRendererAbstract<ScalarValueRep
      * In case I forget in the future that scalar values don't have a representation.  
      */
     @Override
-    public RepresentationType getRepresentationType() {
-        throw new UnsupportedOperationException("no representationType defined for scalar values");
+    public MediaType getMediaType() {
+        throw new UnsupportedOperationException("no mediaType defined for scalar values");
     }
     
     @Override

http://git-wip-us.apache.org/repos/asf/isis/blob/3c7b08fa/component/viewer/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/domaintypes/AbstractTypeMemberReprRenderer.java
----------------------------------------------------------------------
diff --git a/component/viewer/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/domaintypes/AbstractTypeMemberReprRenderer.java b/component/viewer/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/domaintypes/AbstractTypeMemberReprRenderer.java
index 904b278..b449ddf 100644
--- a/component/viewer/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/domaintypes/AbstractTypeMemberReprRenderer.java
+++ b/component/viewer/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/domaintypes/AbstractTypeMemberReprRenderer.java
@@ -68,7 +68,7 @@ public abstract class AbstractTypeMemberReprRenderer<R extends ReprRendererAbstr
         }
 
         final ObjectMember objectMember = getObjectFeature();
-        final LinkBuilder linkBuilder = LinkBuilder.newBuilder(getRendererContext(), Rel.SELF.getName(), getRepresentationType(), "domainTypes/%s/%s%s", getParentSpecification().getFullIdentifier(), getMemberType().getUrlPart(), objectMember.getId());
+        final LinkBuilder linkBuilder = LinkBuilder.newBuilder(getRendererContext(), Rel.SELF.getName(), getMediaType(), "domainTypes/%s/%s%s", getParentSpecification().getFullIdentifier(), getMemberType().getUrlPart(), objectMember.getId());
         getLinks().arrayAdd(linkBuilder.build());
     }
 

http://git-wip-us.apache.org/repos/asf/isis/blob/3c7b08fa/component/viewer/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/domaintypes/TypeActionResultReprRenderer.java
----------------------------------------------------------------------
diff --git a/component/viewer/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/domaintypes/TypeActionResultReprRenderer.java b/component/viewer/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/domaintypes/TypeActionResultReprRenderer.java
index 62d69fc..1da62ab 100644
--- a/component/viewer/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/domaintypes/TypeActionResultReprRenderer.java
+++ b/component/viewer/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/domaintypes/TypeActionResultReprRenderer.java
@@ -19,6 +19,7 @@ package org.apache.isis.viewer.restfulobjects.rendering.domaintypes;
 import org.apache.isis.core.metamodel.spec.ObjectSpecification;
 import org.apache.isis.viewer.restfulobjects.applib.JsonRepresentation;
 import org.apache.isis.viewer.restfulobjects.applib.LinkRepresentation;
+import org.apache.isis.viewer.restfulobjects.applib.Rel;
 import org.apache.isis.viewer.restfulobjects.applib.RepresentationType;
 import org.apache.isis.viewer.restfulobjects.rendering.LinkFollowSpecs;
 import org.apache.isis.viewer.restfulobjects.rendering.RendererContext;
@@ -45,6 +46,10 @@ public class TypeActionResultReprRenderer extends ReprRendererAbstract<TypeActio
         return this;
     }
 
+    public TypeActionResultReprRenderer withSelf(final JsonRepresentation link) {
+        return withLink(Rel.SELF, link);
+    }
+
     @Override
     public JsonRepresentation render() {
         if (includesSelf && selfLink != null) {

http://git-wip-us.apache.org/repos/asf/isis/blob/3c7b08fa/component/viewer/restfulobjects/rendering/src/test/java/org/apache/isis/viewer/restfulobjects/rendering/LinkFollowSpecsTest_follow.java
----------------------------------------------------------------------
diff --git a/component/viewer/restfulobjects/rendering/src/test/java/org/apache/isis/viewer/restfulobjects/rendering/LinkFollowSpecsTest_follow.java b/component/viewer/restfulobjects/rendering/src/test/java/org/apache/isis/viewer/restfulobjects/rendering/LinkFollowSpecsTest_follow.java
index fab909e..3ad5e90 100644
--- a/component/viewer/restfulobjects/rendering/src/test/java/org/apache/isis/viewer/restfulobjects/rendering/LinkFollowSpecsTest_follow.java
+++ b/component/viewer/restfulobjects/rendering/src/test/java/org/apache/isis/viewer/restfulobjects/rendering/LinkFollowSpecsTest_follow.java
@@ -22,7 +22,6 @@ import static org.hamcrest.CoreMatchers.is;
 import static org.junit.Assert.assertThat;
 
 import java.util.List;
-import java.util.Map;
 
 import org.apache.isis.viewer.restfulobjects.applib.JsonRepresentation;
 import org.apache.isis.viewer.restfulobjects.applib.util.Parser;

http://git-wip-us.apache.org/repos/asf/isis/blob/3c7b08fa/component/viewer/restfulobjects/server/src/main/java/org/apache/isis/viewer/restfulobjects/server/ResourceContext.java
----------------------------------------------------------------------
diff --git a/component/viewer/restfulobjects/server/src/main/java/org/apache/isis/viewer/restfulobjects/server/ResourceContext.java b/component/viewer/restfulobjects/server/src/main/java/org/apache/isis/viewer/restfulobjects/server/ResourceContext.java
index e5c0ebd..016002d 100644
--- a/component/viewer/restfulobjects/server/src/main/java/org/apache/isis/viewer/restfulobjects/server/ResourceContext.java
+++ b/component/viewer/restfulobjects/server/src/main/java/org/apache/isis/viewer/restfulobjects/server/ResourceContext.java
@@ -39,6 +39,7 @@ import org.apache.isis.core.metamodel.spec.SpecificationLoader;
 import org.apache.isis.core.runtime.system.persistence.PersistenceSession;
 import org.apache.isis.viewer.restfulobjects.applib.JsonRepresentation;
 import org.apache.isis.viewer.restfulobjects.applib.RepresentationType;
+import org.apache.isis.viewer.restfulobjects.applib.client.RestfulRequest.DomainModel;
 import org.apache.isis.viewer.restfulobjects.applib.client.RestfulRequest.RequestParameter;
 import org.apache.isis.viewer.restfulobjects.applib.client.RestfulResponse.HttpStatusCode;
 import org.apache.isis.viewer.restfulobjects.rendering.RendererContext;
@@ -68,21 +69,13 @@ public class ResourceContext implements RendererContext {
 
     private List<List<String>> followLinks;
 
-    private final static Predicate<MediaType> MEDIA_TYPE_NOT_GENERIC_APPLICATION_JSON = new Predicate<MediaType>() {
-        @Override
-        public boolean apply(final MediaType mediaType) {
-            return !mediaType.equals(MediaType.APPLICATION_JSON_TYPE);
-        }
-    };
-    private final static Predicate<MediaType> MEDIA_TYPE_CONTAINS_PROFILE = new Predicate<MediaType>() {
-        @Override
-        public boolean apply(final MediaType mediaType) {
-            return mediaType.getParameters().containsKey("profile");
-        }
-    };
     private final Where where;
     private JsonRepresentation readQueryStringAsMap;
 
+    //////////////////////////////////////////////////////////////////
+    // constructor and init
+    //////////////////////////////////////////////////////////////////
+
     public ResourceContext(
             final RepresentationType representationType, 
             final HttpHeaders httpHeaders, final UriInfo uriInfo, 
@@ -112,9 +105,47 @@ public class ResourceContext implements RendererContext {
 
     void init(final RepresentationType representationType) {
         ensureCompatibleAcceptHeader(representationType);
+        ensureDomainModelQueryParamSupported();
+        
         this.followLinks = Collections.unmodifiableList(getArg(RequestParameter.FOLLOW_LINKS));
     }
 
+    private void ensureDomainModelQueryParamSupported() {
+        final DomainModel domainModel = getArg(RequestParameter.DOMAIN_MODEL);
+        if(domainModel != DomainModel.FORMAL) {
+            throw RestfulObjectsApplicationException.create(HttpStatusCode.BAD_REQUEST,  
+                                           "x-ro-domain-model of '%s' is not supported", domainModel);
+        }
+    }
+
+    private void ensureCompatibleAcceptHeader(final RepresentationType representationType) {
+        if (representationType == null) {
+            return;
+        }
+
+        // RestEasy will check the basic media types...
+        // ... so we just need to check the profile paramter
+        final String producedProfile = representationType.getMediaTypeProfile();
+        if(producedProfile != null) {
+            for (MediaType mediaType : httpHeaders.getAcceptableMediaTypes()) {
+                String acceptedProfileValue = mediaType.getParameters().get("profile");
+                if(acceptedProfileValue == null) {
+                    continue;
+                }
+                if(!producedProfile.equals(acceptedProfileValue)) {
+                    throw RestfulObjectsApplicationException.create(HttpStatusCode.NOT_ACCEPTABLE);
+                }
+            }
+        }
+    }
+
+
+    
+    //////////////////////////////////////////////////////////////////
+    //
+    //////////////////////////////////////////////////////////////////
+    
+    
     public HttpHeaders getHttpHeaders() {
         return httpHeaders;
     }
@@ -155,39 +186,13 @@ public class ResourceContext implements RendererContext {
         return securityContext;
     }
 
-    private void ensureCompatibleAcceptHeader(final RepresentationType representationType) {
-        if (representationType == null) {
-            return;
-        }
-
-        // RestEasy will check the basic media types...
-        // ... so we just need to check the profile paramter
-        final String producedProfile = representationType.getMediaTypeProfile();
-        if(producedProfile != null) {
-            for (MediaType mediaType : httpHeaders.getAcceptableMediaTypes()) {
-                String acceptedProfileValue = mediaType.getParameters().get("profile");
-                if(acceptedProfileValue == null) {
-                    continue;
-                }
-                if(!producedProfile.equals(acceptedProfileValue)) {
-                    throw RestfulObjectsApplicationException.create(HttpStatusCode.NOT_ACCEPTABLE);
-                }
-            }
-        }
-    }
-
-    protected boolean contains(final com.google.common.net.MediaType producedType, final List<MediaType> acceptableMediaTypes) {
-        return acceptableMediaTypes.contains(producedType);
-    }
 
     public List<List<String>> getFollowLinks() {
         return followLinks;
     }
 
-    public String urlFor(final String url) {
-        return getUriInfo().getBaseUri().toString() + url;
-    }
 
+    
     public Localization getLocalization() {
         return localization;
     }
@@ -215,5 +220,14 @@ public class ResourceContext implements RendererContext {
     public Where getWhere() {
         return where;
     }
-    
+
+
+    //////////////////////////////////////////////////////////////////
+    //
+    //////////////////////////////////////////////////////////////////
+
+    public String urlFor(final String url) {
+        return getUriInfo().getBaseUri().toString() + url;
+    }
+
 }

http://git-wip-us.apache.org/repos/asf/isis/blob/3c7b08fa/component/viewer/restfulobjects/server/src/main/java/org/apache/isis/viewer/restfulobjects/server/RestfulObjectsApplicationExceptionMapper.java
----------------------------------------------------------------------
diff --git a/component/viewer/restfulobjects/server/src/main/java/org/apache/isis/viewer/restfulobjects/server/RestfulObjectsApplicationExceptionMapper.java b/component/viewer/restfulobjects/server/src/main/java/org/apache/isis/viewer/restfulobjects/server/RestfulObjectsApplicationExceptionMapper.java
index d75a1ed..2b9bbc2 100644
--- a/component/viewer/restfulobjects/server/src/main/java/org/apache/isis/viewer/restfulobjects/server/RestfulObjectsApplicationExceptionMapper.java
+++ b/component/viewer/restfulobjects/server/src/main/java/org/apache/isis/viewer/restfulobjects/server/RestfulObjectsApplicationExceptionMapper.java
@@ -37,12 +37,14 @@ import org.apache.isis.viewer.restfulobjects.applib.util.JsonMapper;
 @Provider
 public class RestfulObjectsApplicationExceptionMapper implements ExceptionMapper<RestfulObjectsApplicationException> {
 
+    private static final String WARNING_HEADER_PREFIX = "199 RestfulObjects ";
+
     @Override
     public Response toResponse(final RestfulObjectsApplicationException ex) {
         final ResponseBuilder builder = Response.status(ex.getHttpStatusCode().getJaxrsStatusType()).type(RestfulMediaType.APPLICATION_JSON_ERROR).entity(jsonFor(ex));
         final String message = ex.getMessage();
         if (message != null) {
-            builder.header(RestfulResponse.Header.WARNING.getName(), message);
+            builder.header(RestfulResponse.Header.WARNING.getName(), WARNING_HEADER_PREFIX + message);
         }
         return builder.build();
     }

http://git-wip-us.apache.org/repos/asf/isis/blob/3c7b08fa/component/viewer/restfulobjects/server/src/main/java/org/apache/isis/viewer/restfulobjects/server/resources/DomainServiceResourceServerside.java
----------------------------------------------------------------------
diff --git a/component/viewer/restfulobjects/server/src/main/java/org/apache/isis/viewer/restfulobjects/server/resources/DomainServiceResourceServerside.java b/component/viewer/restfulobjects/server/src/main/java/org/apache/isis/viewer/restfulobjects/server/resources/DomainServiceResourceServerside.java
index c537b7b..9913481 100644
--- a/component/viewer/restfulobjects/server/src/main/java/org/apache/isis/viewer/restfulobjects/server/resources/DomainServiceResourceServerside.java
+++ b/component/viewer/restfulobjects/server/src/main/java/org/apache/isis/viewer/restfulobjects/server/resources/DomainServiceResourceServerside.java
@@ -32,13 +32,14 @@ import javax.ws.rs.core.Response;
 import org.apache.isis.applib.annotation.Where;
 import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
 import org.apache.isis.viewer.restfulobjects.applib.JsonRepresentation;
-import org.apache.isis.viewer.restfulobjects.applib.Rel;
 import org.apache.isis.viewer.restfulobjects.applib.RepresentationType;
 import org.apache.isis.viewer.restfulobjects.applib.RestfulMediaType;
+import org.apache.isis.viewer.restfulobjects.applib.client.RestfulRequest.DomainModel;
+import org.apache.isis.viewer.restfulobjects.applib.client.RestfulRequest.RequestParameter;
+import org.apache.isis.viewer.restfulobjects.applib.client.RestfulResponse.HttpStatusCode;
 import org.apache.isis.viewer.restfulobjects.applib.domainobjects.DomainServiceResource;
 import org.apache.isis.viewer.restfulobjects.rendering.domainobjects.DomainObjectReprRenderer;
 import org.apache.isis.viewer.restfulobjects.rendering.domainobjects.DomainServiceLinkTo;
-import org.apache.isis.viewer.restfulobjects.rendering.domainobjects.ListReprRenderer;
 import org.apache.isis.viewer.restfulobjects.server.resources.DomainResourceHelper.MemberMode;
 
 @Path("/services")
@@ -50,12 +51,13 @@ public class DomainServiceResourceServerside extends ResourceAbstract implements
     @Produces({ MediaType.APPLICATION_JSON, RestfulMediaType.APPLICATION_JSON_LIST, RestfulMediaType.APPLICATION_JSON_ERROR })
     public Response services() {
         init(RepresentationType.LIST, Where.STANDALONE_TABLES);
+        
 
         final List<ObjectAdapter> serviceAdapters = getResourceContext().getServiceAdapters();
 
-        final ListReprRenderer renderer = new ListReprRenderer(getResourceContext(), null, JsonRepresentation.newMap());
+        final DomainServicesListReprRenderer renderer = new DomainServicesListReprRenderer(getResourceContext(), null, JsonRepresentation.newMap());
         renderer.usingLinkToBuilder(new DomainServiceLinkTo())
-            .withLink(Rel.SELF, "services")
+            .includesSelf()
             .with(serviceAdapters);
 
         return responseOfOk(renderer, Caching.ONE_DAY).build();

http://git-wip-us.apache.org/repos/asf/isis/blob/3c7b08fa/component/viewer/restfulobjects/server/src/main/java/org/apache/isis/viewer/restfulobjects/server/resources/DomainServicesListReprRenderer.java
----------------------------------------------------------------------
diff --git a/component/viewer/restfulobjects/server/src/main/java/org/apache/isis/viewer/restfulobjects/server/resources/DomainServicesListReprRenderer.java b/component/viewer/restfulobjects/server/src/main/java/org/apache/isis/viewer/restfulobjects/server/resources/DomainServicesListReprRenderer.java
new file mode 100644
index 0000000..815aba4
--- /dev/null
+++ b/component/viewer/restfulobjects/server/src/main/java/org/apache/isis/viewer/restfulobjects/server/resources/DomainServicesListReprRenderer.java
@@ -0,0 +1,70 @@
+/**
+ *  Licensed to the Apache Software Foundation (ASF) under one or more
+ *  contributor license agreements.  See the NOTICE file distributed with
+ *  this work for additional information regarding copyright ownership.
+ *  The ASF licenses this file to You under the Apache License, Version 2.0
+ *  (the "License"); you may not use this file except in compliance with
+ *  the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ */
+package org.apache.isis.viewer.restfulobjects.server.resources;
+
+import org.apache.isis.viewer.restfulobjects.applib.JsonRepresentation;
+import org.apache.isis.viewer.restfulobjects.applib.Rel;
+import org.apache.isis.viewer.restfulobjects.applib.RepresentationType;
+import org.apache.isis.viewer.restfulobjects.rendering.LinkBuilder;
+import org.apache.isis.viewer.restfulobjects.rendering.LinkFollowSpecs;
+import org.apache.isis.viewer.restfulobjects.rendering.RendererContext;
+import org.apache.isis.viewer.restfulobjects.rendering.domainobjects.ListReprRenderer;
+
+public class DomainServicesListReprRenderer extends ListReprRenderer {
+
+    public DomainServicesListReprRenderer(final RendererContext resourceContext, final LinkFollowSpecs linkFollower, final JsonRepresentation representation) {
+        super(resourceContext, linkFollower, representation);
+    }
+
+    
+    @Override
+    public JsonRepresentation render() {
+        super.render();
+        if (includesSelf) {
+            addLinkToSelf();
+            addLinkToUp();
+        }
+        getExtensions();
+        return representation;
+    }
+
+
+    private void addLinkToSelf() {
+        final JsonRepresentation link = LinkBuilder.newBuilder(getRendererContext(), Rel.SELF.getName(), RepresentationType.LIST, "services").build();
+
+        final LinkFollowSpecs linkFollower = getLinkFollowSpecs().follow("links");
+        if (linkFollower.matches(link)) {
+            final DomainServicesListReprRenderer renderer = new DomainServicesListReprRenderer(getRendererContext(), linkFollower, JsonRepresentation.newMap());
+            renderer.with(getServiceAdapters());
+            link.mapPut("value", renderer.render());
+        }
+
+        getLinks().arrayAdd(link);
+    }
+
+    private void addLinkToUp() {
+        final JsonRepresentation link = LinkBuilder.newBuilder(rendererContext, Rel.UP.getName(), RepresentationType.HOME_PAGE, "").build();
+
+        final LinkFollowSpecs linkFollower = getLinkFollowSpecs().follow("links");
+        if (linkFollower.matches(link)) {
+            final HomePageReprRenderer renderer = new HomePageReprRenderer(getRendererContext(), linkFollower, JsonRepresentation.newMap());
+            link.mapPut("value", renderer.render());
+        }
+        getLinks().arrayAdd(link);
+    }
+
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/isis/blob/3c7b08fa/component/viewer/restfulobjects/server/src/main/java/org/apache/isis/viewer/restfulobjects/server/resources/DomainTypeResourceServerside.java
----------------------------------------------------------------------
diff --git a/component/viewer/restfulobjects/server/src/main/java/org/apache/isis/viewer/restfulobjects/server/resources/DomainTypeResourceServerside.java b/component/viewer/restfulobjects/server/src/main/java/org/apache/isis/viewer/restfulobjects/server/resources/DomainTypeResourceServerside.java
index 7835356..4bfcbef 100644
--- a/component/viewer/restfulobjects/server/src/main/java/org/apache/isis/viewer/restfulobjects/server/resources/DomainTypeResourceServerside.java
+++ b/component/viewer/restfulobjects/server/src/main/java/org/apache/isis/viewer/restfulobjects/server/resources/DomainTypeResourceServerside.java
@@ -237,6 +237,7 @@ public class DomainTypeResourceServerside extends ResourceAbstract implements Do
         return responseOfOk(renderer, Caching.ONE_DAY).build();
     }
 
+
     @Override
     @GET
     @Path("/{domainType}/typeactions/isSupertypeOf/invoke")

http://git-wip-us.apache.org/repos/asf/isis/blob/3c7b08fa/component/viewer/restfulobjects/server/src/main/java/org/apache/isis/viewer/restfulobjects/server/resources/ResourceAbstract.java
----------------------------------------------------------------------
diff --git a/component/viewer/restfulobjects/server/src/main/java/org/apache/isis/viewer/restfulobjects/server/resources/ResourceAbstract.java b/component/viewer/restfulobjects/server/src/main/java/org/apache/isis/viewer/restfulobjects/server/resources/ResourceAbstract.java
index 5a8d4ca..5d1e6fb 100644
--- a/component/viewer/restfulobjects/server/src/main/java/org/apache/isis/viewer/restfulobjects/server/resources/ResourceAbstract.java
+++ b/component/viewer/restfulobjects/server/src/main/java/org/apache/isis/viewer/restfulobjects/server/resources/ResourceAbstract.java
@@ -191,12 +191,12 @@ public abstract class ResourceAbstract {
     }
 
     public static ResponseBuilder responseOfOk(final ReprRenderer<?, ?> renderer, final Caching caching, final Version version) {
-        final RepresentationType representationType = renderer.getRepresentationType();
-        final ResponseBuilder response = responseOf(HttpStatusCode.OK).type(representationType.getMediaType()).cacheControl(caching.getCacheControl()).entity(jsonFor(renderer.render()));
+        final MediaType mediaType = renderer.getMediaType();
+        final ResponseBuilder response = responseOf(HttpStatusCode.OK).type(mediaType).cacheControl(caching.getCacheControl()).entity(jsonFor(renderer.render()));
         return addLastModifiedAndETagIfAvailable(response, version);
     }
 
-    private static ResponseBuilder responseOf(final HttpStatusCode httpStatusCode) {
+    protected static ResponseBuilder responseOf(final HttpStatusCode httpStatusCode) {
         return Response.status(httpStatusCode.getJaxrsStatusType()).type(MediaType.APPLICATION_JSON_TYPE);
     }
 

http://git-wip-us.apache.org/repos/asf/isis/blob/3c7b08fa/component/viewer/restfulobjects/tck/src/test/java/org/apache/isis/viewer/restfulobjects/tck/RepresentationMatchers.java
----------------------------------------------------------------------
diff --git a/component/viewer/restfulobjects/tck/src/test/java/org/apache/isis/viewer/restfulobjects/tck/RepresentationMatchers.java b/component/viewer/restfulobjects/tck/src/test/java/org/apache/isis/viewer/restfulobjects/tck/RepresentationMatchers.java
index 117dc1f..b8a0c2c 100644
--- a/component/viewer/restfulobjects/tck/src/test/java/org/apache/isis/viewer/restfulobjects/tck/RepresentationMatchers.java
+++ b/component/viewer/restfulobjects/tck/src/test/java/org/apache/isis/viewer/restfulobjects/tck/RepresentationMatchers.java
@@ -254,6 +254,10 @@ public class RepresentationMatchers {
                     if (rel != null) {
                         description.appendText(" with rel '").appendText(rel).appendText("'");
                     }
+                    if (relNameMatcher != null) {
+                        description.appendText(" with rel '");
+                        relNameMatcher.describeTo(description);
+                    }
                     if (href != null) {
                         description.appendText(" with href '").appendText(href).appendText("'");
                     }
@@ -292,7 +296,7 @@ public class RepresentationMatchers {
                             description.appendText(" and");
                         }
                         if (selfHref != null) {
-                            description.appendText(" an response whose self.href is " + selfHref);
+                            description.appendText(" has a response whose self.href is " + selfHref);
                         }
                     }
                 }
@@ -306,7 +310,7 @@ public class RepresentationMatchers {
                     if (rel != null && !rel.equals(link.getRel())) {
                         return false;
                     }
-                    if (relNameMatcher != null && !relNameMatcher.matches(link.getHref())) {
+                    if (relNameMatcher != null && !relNameMatcher.matches(link.getRel())) {
                         return false;
                     }
                     if (href != null && !href.equals(link.getHref())) {
@@ -331,7 +335,7 @@ public class RepresentationMatchers {
                     if (novalue != null && novalue && link.getValue() != null) {
                         return false;
                     }
-                    if (valueMatcher != null && !valueMatcher.matches(link)) {
+                    if (valueMatcher != null && !valueMatcher.matches(link.getValue())) {
                         return false;
                     }
 
@@ -364,7 +368,7 @@ public class RepresentationMatchers {
                         if(entity == null) {
                             return false;
                         }
-                        LinkRepresentation selfLink = entity.getLink("self");
+                        LinkRepresentation selfLink = entity.getLink("links[rel=self]");
                         if(selfLink == null) {
                             return false;
                         }

http://git-wip-us.apache.org/repos/asf/isis/blob/3c7b08fa/component/viewer/restfulobjects/tck/src/test/java/org/apache/isis/viewer/restfulobjects/tck/any/AnyResourceTest_serverSideException_exceptionHandling.java
----------------------------------------------------------------------
diff --git a/component/viewer/restfulobjects/tck/src/test/java/org/apache/isis/viewer/restfulobjects/tck/any/AnyResourceTest_serverSideException_exceptionHandling.java b/component/viewer/restfulobjects/tck/src/test/java/org/apache/isis/viewer/restfulobjects/tck/any/AnyResourceTest_serverSideException_exceptionHandling.java
new file mode 100644
index 0000000..f71fc48
--- /dev/null
+++ b/component/viewer/restfulobjects/tck/src/test/java/org/apache/isis/viewer/restfulobjects/tck/any/AnyResourceTest_serverSideException_exceptionHandling.java
@@ -0,0 +1,65 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
+package org.apache.isis.viewer.restfulobjects.tck.any;
+
+import static org.hamcrest.CoreMatchers.is;
+import static org.junit.Assert.assertThat;
+
+import org.apache.isis.core.webserver.WebServer;
+import org.apache.isis.viewer.restfulobjects.applib.JsonRepresentation;
+import org.apache.isis.viewer.restfulobjects.applib.RestfulHttpMethod;
+import org.apache.isis.viewer.restfulobjects.applib.client.RestfulClient;
+import org.apache.isis.viewer.restfulobjects.applib.client.RestfulRequest;
+import org.apache.isis.viewer.restfulobjects.applib.client.RestfulRequest.Header;
+import org.apache.isis.viewer.restfulobjects.applib.client.RestfulResponse;
+import org.apache.isis.viewer.restfulobjects.applib.client.RestfulResponse.HttpStatusCode;
+import org.apache.isis.viewer.restfulobjects.applib.util.Parser;
+import org.apache.isis.viewer.restfulobjects.tck.IsisWebServerRule;
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+
+public class AnyResourceTest_serverSideException_exceptionHandling {
+
+    @Rule
+    public IsisWebServerRule webServerRule = new IsisWebServerRule();
+
+    private RestfulClient client;
+
+    @Before
+    public void setUp() throws Exception {
+        final WebServer webServer = webServerRule.getWebServer();
+        client = new RestfulClient(webServer.getBase());
+    }
+
+    @Test
+    public void runtimeException_isMapped() throws Exception {
+
+        // given
+        final RestfulRequest restfulReq = client.createRequest(RestfulHttpMethod.GET, "version");
+        final Header<Boolean> header = new Header<Boolean>("X-FAIL", Parser.forBoolean());
+        restfulReq.withHeader(header, true);
+
+        // when
+        final RestfulResponse<JsonRepresentation> jsonResp = restfulReq.execute();
+
+        // then
+        assertThat(jsonResp.getStatus(), is(HttpStatusCode.METHOD_FAILURE));
+    }
+}