You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@olingo.apache.org by il...@apache.org on 2014/04/17 14:56:37 UTC

[4/5] [OLINGO-175] More V4 CRUD tests for containment, deep insert and bind operation

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/3bb39def/lib/client-core/pom.xml
----------------------------------------------------------------------
diff --git a/lib/client-core/pom.xml b/lib/client-core/pom.xml
index e8c20b5..58025ee 100644
--- a/lib/client-core/pom.xml
+++ b/lib/client-core/pom.xml
@@ -81,7 +81,7 @@
         <configuration>
           <systemPropertyVariables>
             <propertyName>org.slf4j.simpleLogger.defaultLogLevel</propertyName>
-            <org.slf4j.simpleLogger.defaultLogLevel>ERROR</org.slf4j.simpleLogger.defaultLogLevel>
+            <org.slf4j.simpleLogger.defaultLogLevel>DEBUG</org.slf4j.simpleLogger.defaultLogLevel>
           </systemPropertyVariables>
         </configuration>
       </plugin>

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/3bb39def/lib/client-core/src/main/java/org/apache/olingo/client/core/communication/request/cud/AbstractCUDRequestFactory.java
----------------------------------------------------------------------
diff --git a/lib/client-core/src/main/java/org/apache/olingo/client/core/communication/request/cud/AbstractCUDRequestFactory.java b/lib/client-core/src/main/java/org/apache/olingo/client/core/communication/request/cud/AbstractCUDRequestFactory.java
index 73d39f9..a45afc7 100644
--- a/lib/client-core/src/main/java/org/apache/olingo/client/core/communication/request/cud/AbstractCUDRequestFactory.java
+++ b/lib/client-core/src/main/java/org/apache/olingo/client/core/communication/request/cud/AbstractCUDRequestFactory.java
@@ -36,9 +36,9 @@ public abstract class AbstractCUDRequestFactory<UT extends CommonUpdateType> imp
 
   private static final long serialVersionUID = -2723641791198745990L;
 
-  protected final CommonODataClient client;
+  protected final CommonODataClient<?> client;
 
-  protected AbstractCUDRequestFactory(final CommonODataClient client) {
+  protected AbstractCUDRequestFactory(final CommonODataClient<?> client) {
     this.client = client;
   }
 

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/3bb39def/lib/client-core/src/main/java/org/apache/olingo/client/core/communication/request/streamed/AbstractODataStreamedEntityRequest.java
----------------------------------------------------------------------
diff --git a/lib/client-core/src/main/java/org/apache/olingo/client/core/communication/request/streamed/AbstractODataStreamedEntityRequest.java b/lib/client-core/src/main/java/org/apache/olingo/client/core/communication/request/streamed/AbstractODataStreamedEntityRequest.java
index ace08d3..ec5f773 100644
--- a/lib/client-core/src/main/java/org/apache/olingo/client/core/communication/request/streamed/AbstractODataStreamedEntityRequest.java
+++ b/lib/client-core/src/main/java/org/apache/olingo/client/core/communication/request/streamed/AbstractODataStreamedEntityRequest.java
@@ -45,8 +45,9 @@ public abstract class AbstractODataStreamedEntityRequest<V extends ODataResponse
    * @param method HTTP request method.
    * @param uri request URI.
    */
-  public AbstractODataStreamedEntityRequest(final CommonODataClient odataClient, final HttpMethod method,
-          URI uri) {
+  public AbstractODataStreamedEntityRequest(final CommonODataClient<?> odataClient, final HttpMethod method,
+          final URI uri) {
+
     super(odataClient, method, uri);
     setAccept(getFormat().toString(odataClient.getServiceVersion()));
   }

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/3bb39def/lib/client-core/src/main/java/org/apache/olingo/client/core/communication/request/streamed/AbstractStreamedRequestFactory.java
----------------------------------------------------------------------
diff --git a/lib/client-core/src/main/java/org/apache/olingo/client/core/communication/request/streamed/AbstractStreamedRequestFactory.java b/lib/client-core/src/main/java/org/apache/olingo/client/core/communication/request/streamed/AbstractStreamedRequestFactory.java
index 014e1bc..cf15fcb 100644
--- a/lib/client-core/src/main/java/org/apache/olingo/client/core/communication/request/streamed/AbstractStreamedRequestFactory.java
+++ b/lib/client-core/src/main/java/org/apache/olingo/client/core/communication/request/streamed/AbstractStreamedRequestFactory.java
@@ -26,22 +26,23 @@ import org.apache.olingo.client.api.communication.request.streamed.ODataMediaEnt
 import org.apache.olingo.client.api.communication.request.streamed.ODataStreamUpdateRequest;
 import org.apache.olingo.client.api.communication.request.streamed.CommonStreamedRequestFactory;
 import org.apache.olingo.client.api.http.HttpMethod;
+import org.apache.olingo.commons.api.domain.CommonODataEntity;
 
 public abstract class AbstractStreamedRequestFactory implements CommonStreamedRequestFactory {
 
   private static final long serialVersionUID = -2438839640443961168L;
 
-  protected final CommonODataClient client;
+  protected final CommonODataClient<?> client;
 
-  protected AbstractStreamedRequestFactory(final CommonODataClient client) {
+  protected AbstractStreamedRequestFactory(final CommonODataClient<?> client) {
     this.client = client;
   }
 
   @Override
-  public ODataMediaEntityCreateRequest getMediaEntityCreateRequest(
+  public <E extends CommonODataEntity> ODataMediaEntityCreateRequest<E> getMediaEntityCreateRequest(
           final URI targetURI, final InputStream media) {
 
-    return new ODataMediaEntityCreateRequestImpl(client, targetURI, media);
+    return new ODataMediaEntityCreateRequestImpl<E>(client, targetURI, media);
   }
 
   @Override
@@ -59,16 +60,16 @@ public abstract class AbstractStreamedRequestFactory implements CommonStreamedRe
   }
 
   @Override
-  public ODataMediaEntityUpdateRequest getMediaEntityUpdateRequest(
+  public <E extends CommonODataEntity> ODataMediaEntityUpdateRequest<E> getMediaEntityUpdateRequest(
           final URI editURI, final InputStream media) {
 
-    final ODataMediaEntityUpdateRequest req;
+    final ODataMediaEntityUpdateRequest<E> req;
 
     if (client.getConfiguration().isUseXHTTPMethod()) {
-      req = new ODataMediaEntityUpdateRequestImpl(client, HttpMethod.POST, editURI, media);
+      req = new ODataMediaEntityUpdateRequestImpl<E>(client, HttpMethod.POST, editURI, media);
       req.setXHTTPMethod(HttpMethod.PUT.name());
     } else {
-      req = new ODataMediaEntityUpdateRequestImpl(client, HttpMethod.PUT, editURI, media);
+      req = new ODataMediaEntityUpdateRequestImpl<E>(client, HttpMethod.PUT, editURI, media);
     }
 
     return req;

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/3bb39def/lib/client-core/src/main/java/org/apache/olingo/client/core/communication/request/streamed/ODataMediaEntityCreateRequestImpl.java
----------------------------------------------------------------------
diff --git a/lib/client-core/src/main/java/org/apache/olingo/client/core/communication/request/streamed/ODataMediaEntityCreateRequestImpl.java b/lib/client-core/src/main/java/org/apache/olingo/client/core/communication/request/streamed/ODataMediaEntityCreateRequestImpl.java
index 2c1dd22..cbd292d 100644
--- a/lib/client-core/src/main/java/org/apache/olingo/client/core/communication/request/streamed/ODataMediaEntityCreateRequestImpl.java
+++ b/lib/client-core/src/main/java/org/apache/olingo/client/core/communication/request/streamed/ODataMediaEntityCreateRequestImpl.java
@@ -37,10 +37,12 @@ import org.apache.olingo.commons.api.data.Entry;
 
 /**
  * This class implements an OData Media Entity create request. Get instance by using ODataStreamedRequestFactory.
+ *
+ * @param <E> concrete ODataEntity implementation
  */
-public class ODataMediaEntityCreateRequestImpl
-        extends AbstractODataStreamedEntityRequest<ODataMediaEntityCreateResponse, MediaEntityCreateStreamManager>
-        implements ODataMediaEntityCreateRequest, ODataBatchableRequest {
+public class ODataMediaEntityCreateRequestImpl<E extends CommonODataEntity>
+        extends AbstractODataStreamedEntityRequest<ODataMediaEntityCreateResponse<E>, MediaEntityCreateStreamManager<E>>
+        implements ODataMediaEntityCreateRequest<E>, ODataBatchableRequest {
 
   private final InputStream media;
 
@@ -51,27 +53,26 @@ public class ODataMediaEntityCreateRequestImpl
    * @param targetURI target entity set.
    * @param media media entity blob to be created.
    */
-  ODataMediaEntityCreateRequestImpl(final CommonODataClient odataClient, final URI targetURI, final InputStream media) {
+  ODataMediaEntityCreateRequestImpl(final CommonODataClient<?> odataClient, final URI targetURI,
+          final InputStream media) {
+
     super(odataClient, HttpMethod.POST, targetURI);
     this.media = media;
   }
 
-  /**
-   * {@inheritDoc }
-   */
   @Override
-  protected MediaEntityCreateStreamManager getStreamManager() {
+  protected MediaEntityCreateStreamManager<E> getStreamManager() {
     if (streamManager == null) {
       streamManager = new MediaEntityCreateStreamManagerImpl(media);
     }
-    return (MediaEntityCreateStreamManager) streamManager;
+    return (MediaEntityCreateStreamManager<E>) streamManager;
   }
 
   /**
    * Media entity payload object.
    */
-  public class MediaEntityCreateStreamManagerImpl extends AbstractODataStreamManager<ODataMediaEntityCreateResponse>
-          implements MediaEntityCreateStreamManager {
+  public class MediaEntityCreateStreamManagerImpl extends AbstractODataStreamManager<ODataMediaEntityCreateResponse<E>>
+          implements MediaEntityCreateStreamManager<E> {
 
     /**
      * Private constructor.
@@ -82,11 +83,8 @@ public class ODataMediaEntityCreateRequestImpl
       super(ODataMediaEntityCreateRequestImpl.this.futureWrapper, input);
     }
 
-    /**
-     * {@inheritDoc }
-     */
     @Override
-    protected ODataMediaEntityCreateResponse getResponse(final long timeout, final TimeUnit unit) {
+    protected ODataMediaEntityCreateResponse<E> getResponse(final long timeout, final TimeUnit unit) {
       finalizeBody();
       return new ODataMediaEntityCreateResponseImpl(httpClient, getHttpResponse(timeout, unit));
     }
@@ -96,9 +94,9 @@ public class ODataMediaEntityCreateRequestImpl
    * Response class about an ODataMediaEntityCreateRequest.
    */
   private class ODataMediaEntityCreateResponseImpl extends AbstractODataResponse
-          implements ODataMediaEntityCreateResponse {
+          implements ODataMediaEntityCreateResponse<E> {
 
-    private CommonODataEntity entity = null;
+    private E entity = null;
 
     /**
      * Constructor.
@@ -122,11 +120,12 @@ public class ODataMediaEntityCreateRequestImpl
      * {@inheritDoc }
      */
     @Override
-    public CommonODataEntity getBody() {
+    @SuppressWarnings("unchecked")
+    public E getBody() {
       if (entity == null) {
         try {
           final Container<Entry> container = odataClient.getDeserializer().toEntry(getRawResponse(), getFormat());
-          entity = odataClient.getBinder().getODataEntity(extractFromContainer(container));
+          entity = (E) odataClient.getBinder().getODataEntity(extractFromContainer(container));
         } finally {
           this.close();
         }

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/3bb39def/lib/client-core/src/main/java/org/apache/olingo/client/core/communication/request/streamed/ODataMediaEntityUpdateRequestImpl.java
----------------------------------------------------------------------
diff --git a/lib/client-core/src/main/java/org/apache/olingo/client/core/communication/request/streamed/ODataMediaEntityUpdateRequestImpl.java b/lib/client-core/src/main/java/org/apache/olingo/client/core/communication/request/streamed/ODataMediaEntityUpdateRequestImpl.java
index 614baa1..5967906 100644
--- a/lib/client-core/src/main/java/org/apache/olingo/client/core/communication/request/streamed/ODataMediaEntityUpdateRequestImpl.java
+++ b/lib/client-core/src/main/java/org/apache/olingo/client/core/communication/request/streamed/ODataMediaEntityUpdateRequestImpl.java
@@ -37,10 +37,12 @@ import org.apache.olingo.commons.api.data.Entry;
 
 /**
  * This class implements an OData Media Entity create request. Get instance by using ODataStreamedRequestFactory.
+ *
+ * @param <E> concrete ODataEntity implementation
  */
-public class ODataMediaEntityUpdateRequestImpl
-        extends AbstractODataStreamedEntityRequest<ODataMediaEntityUpdateResponse, MediaEntityUpdateStreamManager>
-        implements ODataMediaEntityUpdateRequest, ODataBatchableRequest {
+public class ODataMediaEntityUpdateRequestImpl<E extends CommonODataEntity>
+        extends AbstractODataStreamedEntityRequest<ODataMediaEntityUpdateResponse<E>, MediaEntityUpdateStreamManager<E>>
+        implements ODataMediaEntityUpdateRequest<E>, ODataBatchableRequest {
 
   private final InputStream media;
 
@@ -52,29 +54,26 @@ public class ODataMediaEntityUpdateRequestImpl
    * @param editURI edit URI of the entity to be updated.
    * @param media media entity blob to be created.
    */
-  ODataMediaEntityUpdateRequestImpl(final CommonODataClient odataClient,
+  ODataMediaEntityUpdateRequestImpl(final CommonODataClient<?> odataClient,
           final HttpMethod method, final URI editURI, final InputStream media) {
 
     super(odataClient, method, editURI);
     this.media = media;
   }
 
-  /**
-   * {@inheritDoc }
-   */
   @Override
-  protected MediaEntityUpdateStreamManager getStreamManager() {
+  protected MediaEntityUpdateStreamManager<E> getStreamManager() {
     if (streamManager == null) {
       streamManager = new MediaEntityUpdateStreamManagerImpl(media);
     }
-    return (MediaEntityUpdateStreamManager) streamManager;
+    return (MediaEntityUpdateStreamManager<E>) streamManager;
   }
 
   /**
    * Media entity payload object.
    */
-  public class MediaEntityUpdateStreamManagerImpl extends AbstractODataStreamManager<ODataMediaEntityUpdateResponse>
-          implements MediaEntityUpdateStreamManager {
+  public class MediaEntityUpdateStreamManagerImpl extends AbstractODataStreamManager<ODataMediaEntityUpdateResponse<E>>
+          implements MediaEntityUpdateStreamManager<E> {
 
     /**
      * Private constructor.
@@ -85,11 +84,8 @@ public class ODataMediaEntityUpdateRequestImpl
       super(ODataMediaEntityUpdateRequestImpl.this.futureWrapper, input);
     }
 
-    /**
-     * {@inheritDoc }
-     */
     @Override
-    protected ODataMediaEntityUpdateResponse getResponse(final long timeout, final TimeUnit unit) {
+    protected ODataMediaEntityUpdateResponse<E> getResponse(final long timeout, final TimeUnit unit) {
       finalizeBody();
       return new ODataMediaEntityUpdateResponseImpl(httpClient, getHttpResponse(timeout, unit));
     }
@@ -99,16 +95,17 @@ public class ODataMediaEntityUpdateRequestImpl
    * Response class about an ODataMediaEntityUpdateRequest.
    */
   private class ODataMediaEntityUpdateResponseImpl extends AbstractODataResponse
-          implements ODataMediaEntityUpdateResponse {
+          implements ODataMediaEntityUpdateResponse<E> {
 
-    private CommonODataEntity entity = null;
+    private E entity = null;
 
     /**
      * Constructor.
-     * <p>
+     * <br/>
      * Just to create response templates to be initialized from batch.
      */
     private ODataMediaEntityUpdateResponseImpl() {
+      super();
     }
 
     /**
@@ -121,15 +118,13 @@ public class ODataMediaEntityUpdateRequestImpl
       super(client, res);
     }
 
-    /**
-     * {@inheritDoc }
-     */
     @Override
-    public CommonODataEntity getBody() {
+    @SuppressWarnings("unchecked")
+    public E getBody() {
       if (entity == null) {
         try {
           final Container<Entry> container = odataClient.getDeserializer().toEntry(getRawResponse(), getFormat());
-          entity = odataClient.getBinder().getODataEntity(extractFromContainer(container));
+          entity = (E) odataClient.getBinder().getODataEntity(extractFromContainer(container));
         } finally {
           this.close();
         }

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/3bb39def/lib/client-core/src/main/java/org/apache/olingo/client/core/communication/request/streamed/ODataStreamUpdateRequestImpl.java
----------------------------------------------------------------------
diff --git a/lib/client-core/src/main/java/org/apache/olingo/client/core/communication/request/streamed/ODataStreamUpdateRequestImpl.java b/lib/client-core/src/main/java/org/apache/olingo/client/core/communication/request/streamed/ODataStreamUpdateRequestImpl.java
index aa27b2e..cf8eaa3 100644
--- a/lib/client-core/src/main/java/org/apache/olingo/client/core/communication/request/streamed/ODataStreamUpdateRequestImpl.java
+++ b/lib/client-core/src/main/java/org/apache/olingo/client/core/communication/request/streamed/ODataStreamUpdateRequestImpl.java
@@ -49,7 +49,7 @@ public class ODataStreamUpdateRequestImpl
    * @param targetURI target URI.
    * @param stream stream to be updated.
    */
-  ODataStreamUpdateRequestImpl(final CommonODataClient odataClient,
+  ODataStreamUpdateRequestImpl(final CommonODataClient<?> odataClient,
           final HttpMethod method, final URI targetURI, final InputStream stream) {
 
     super(odataClient, method, targetURI);

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/3bb39def/lib/client-core/src/main/java/org/apache/olingo/client/core/data/JSONServiceDocumentDeserializer.java
----------------------------------------------------------------------
diff --git a/lib/client-core/src/main/java/org/apache/olingo/client/core/data/JSONServiceDocumentDeserializer.java b/lib/client-core/src/main/java/org/apache/olingo/client/core/data/JSONServiceDocumentDeserializer.java
index f949e16..7cff539 100644
--- a/lib/client-core/src/main/java/org/apache/olingo/client/core/data/JSONServiceDocumentDeserializer.java
+++ b/lib/client-core/src/main/java/org/apache/olingo/client/core/data/JSONServiceDocumentDeserializer.java
@@ -48,8 +48,6 @@ public class JSONServiceDocumentDeserializer extends ODataJacksonDeserializer<Co
             : new org.apache.olingo.client.core.data.v4.JSONServiceDocumentImpl();
 
     final String metadataETag;
-    final URI contextURL;
-
     if (tree.hasNonNull(Constants.JSON_METADATA_ETAG)) {
       metadataETag = tree.get(Constants.JSON_METADATA_ETAG).textValue();
       tree.remove(Constants.JSON_METADATA_ETAG);
@@ -57,6 +55,7 @@ public class JSONServiceDocumentDeserializer extends ODataJacksonDeserializer<Co
       metadataETag = null;
     }
 
+    final URI contextURL;
     if (tree.hasNonNull(Constants.JSON_CONTEXT)) {
       contextURL = URI.create(tree.get(Constants.JSON_CONTEXT).textValue());
       tree.remove(Constants.JSON_CONTEXT);

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/3bb39def/lib/client-core/src/main/java/org/apache/olingo/client/core/op/AbstractODataBinder.java
----------------------------------------------------------------------
diff --git a/lib/client-core/src/main/java/org/apache/olingo/client/core/op/AbstractODataBinder.java b/lib/client-core/src/main/java/org/apache/olingo/client/core/op/AbstractODataBinder.java
index ad58ab4..5b74502 100644
--- a/lib/client-core/src/main/java/org/apache/olingo/client/core/op/AbstractODataBinder.java
+++ b/lib/client-core/src/main/java/org/apache/olingo/client/core/op/AbstractODataBinder.java
@@ -291,18 +291,20 @@ public abstract class AbstractODataBinder implements CommonODataBinder {
                 ? ODataLinkType.ENTITY_NAVIGATION
                 : ODataLinkType.fromString(client.getServiceVersion(), link.getRel(), link.getType());
         odataLinked.addLink(linkType == ODataLinkType.ENTITY_NAVIGATION
-                ? client.getObjectFactory().newEntityNavigationLink(link.getTitle(), base, link.getHref())
-                : client.getObjectFactory().newEntitySetNavigationLink(link.getTitle(), base, link.getHref()));
+                ? client.getObjectFactory().
+                newEntityNavigationLink(link.getTitle(), URIUtils.getURI(base, link.getHref()))
+                : client.getObjectFactory().
+                newEntitySetNavigationLink(link.getTitle(), URIUtils.getURI(base, link.getHref())));
       } else if (inlineEntry != null) {
-        odataLinked.addLink(client.getObjectFactory().newInlineEntity(
-                link.getTitle(), base, link.getHref(),
+        odataLinked.addLink(new ODataInlineEntity(client.getServiceVersion(),
+                URIUtils.getURI(base, link.getHref()), ODataLinkType.ENTITY_NAVIGATION, link.getTitle(),
                 getODataEntity(inlineEntry,
-                inlineEntry.getBaseURI() == null ? base : inlineEntry.getBaseURI())));
+                        inlineEntry.getBaseURI() == null ? base : inlineEntry.getBaseURI())));
       } else {
-        odataLinked.addLink(client.getObjectFactory().newInlineEntitySet(
-                link.getTitle(), base, link.getHref(),
+        odataLinked.addLink(new ODataInlineEntitySet(client.getServiceVersion(),
+                URIUtils.getURI(base, link.getHref()), ODataLinkType.ENTITY_SET_NAVIGATION, link.getTitle(),
                 getODataEntitySet(inlineFeed,
-                inlineFeed.getBaseURI() == null ? base : inlineFeed.getBaseURI())));
+                        inlineFeed.getBaseURI() == null ? base : inlineFeed.getBaseURI())));
       }
     }
   }
@@ -337,13 +339,17 @@ public abstract class AbstractODataBinder implements CommonODataBinder {
     }
 
     for (Link link : resource.getAssociationLinks()) {
-      entity.addLink(client.getObjectFactory().newAssociationLink(link.getTitle(), base, link.getHref()));
+      entity.addLink(new ODataLink.Builder().setVersion(client.getServiceVersion()).
+              setURI(URIUtils.getURI(base, link.getHref())).
+              setType(ODataLinkType.ASSOCIATION).setTitle(link.getTitle()).build());
     }
 
     odataLinks(resource, entity, base);
 
     for (Link link : resource.getMediaEditLinks()) {
-      entity.addLink(client.getObjectFactory().newMediaEditLink(link.getTitle(), base, link.getHref()));
+      entity.addLink(new ODataLink.Builder().setVersion(client.getServiceVersion()).
+              setURI(URIUtils.getURI(base, link.getHref())).
+              setType(ODataLinkType.MEDIA_EDIT).setTitle(link.getTitle()).build());
     }
 
     for (ODataOperation operation : resource.getOperations()) {
@@ -373,18 +379,18 @@ public abstract class AbstractODataBinder implements CommonODataBinder {
       value = client.getObjectFactory().newPrimitiveValueBuilder().
               setText(resource.getValue().asPrimitive().get()).
               setType(typeInfo == null
-              ? null
-              : EdmPrimitiveTypeKind.valueOfFQN(
-              client.getServiceVersion(), typeInfo.getFullQualifiedName().toString())).build();
+                      ? null
+                      : EdmPrimitiveTypeKind.valueOfFQN(
+                              client.getServiceVersion(), typeInfo.getFullQualifiedName().toString())).build();
     } else if (resource.getValue().isGeospatial()) {
       value = client.getObjectFactory().newPrimitiveValueBuilder().
               setValue(resource.getValue().asGeospatial().get()).
               setType(typeInfo == null
-              || EdmPrimitiveTypeKind.Geography.getFullQualifiedName().equals(typeInfo.getFullQualifiedName())
-              || EdmPrimitiveTypeKind.Geometry.getFullQualifiedName().equals(typeInfo.getFullQualifiedName())
-              ? resource.getValue().asGeospatial().get().getEdmPrimitiveTypeKind()
-              : EdmPrimitiveTypeKind.valueOfFQN(
-              client.getServiceVersion(), typeInfo.getFullQualifiedName().toString())).build();
+                      || EdmPrimitiveTypeKind.Geography.getFullQualifiedName().equals(typeInfo.getFullQualifiedName())
+                      || EdmPrimitiveTypeKind.Geometry.getFullQualifiedName().equals(typeInfo.getFullQualifiedName())
+                      ? resource.getValue().asGeospatial().get().getEdmPrimitiveTypeKind()
+                      : EdmPrimitiveTypeKind.valueOfFQN(
+                              client.getServiceVersion(), typeInfo.getFullQualifiedName().toString())).build();
     } else if (resource.getValue().isComplex()) {
       value = client.getObjectFactory().newComplexValue(typeInfo == null
               ? null : typeInfo.getFullQualifiedName().toString());

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/3bb39def/lib/client-core/src/test/java/org/apache/olingo/client/core/it/v3/AbstractTestITCase.java
----------------------------------------------------------------------
diff --git a/lib/client-core/src/test/java/org/apache/olingo/client/core/it/v3/AbstractTestITCase.java b/lib/client-core/src/test/java/org/apache/olingo/client/core/it/v3/AbstractTestITCase.java
index f9405ec..36f45b9 100644
--- a/lib/client-core/src/test/java/org/apache/olingo/client/core/it/v3/AbstractTestITCase.java
+++ b/lib/client-core/src/test/java/org/apache/olingo/client/core/it/v3/AbstractTestITCase.java
@@ -283,9 +283,8 @@ public abstract class AbstractTestITCase extends AbstractBaseTestITCase {
     contactAliasValue.add(getClient().getObjectFactory().newCollectionProperty("AlternativeNames", aliasAltNamesValue));
 
     if (withInlineInfo) {
-      final ODataInlineEntity inlineInfo = getClient().getObjectFactory().newInlineEntity(
+      final ODataInlineEntity inlineInfo = getClient().getObjectFactory().newDeepInsertEntity(
               "Info",
-              URI.create("Customer(" + id + ")/Info"),
               getSampleCustomerInfo(id, sampleName + "_Info"));
       inlineInfo.getEntity().setMediaEntity(true);
       entity.addLink(inlineInfo);

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/3bb39def/lib/client-core/src/test/java/org/apache/olingo/client/core/it/v3/AsyncTestITCase.java
----------------------------------------------------------------------
diff --git a/lib/client-core/src/test/java/org/apache/olingo/client/core/it/v3/AsyncTestITCase.java b/lib/client-core/src/test/java/org/apache/olingo/client/core/it/v3/AsyncTestITCase.java
index 18dd57e..a5a60b9 100644
--- a/lib/client-core/src/test/java/org/apache/olingo/client/core/it/v3/AsyncTestITCase.java
+++ b/lib/client-core/src/test/java/org/apache/olingo/client/core/it/v3/AsyncTestITCase.java
@@ -102,11 +102,11 @@ public class AsyncTestITCase extends AbstractTestITCase {
     final String TO_BE_UPDATED = "async buffered stream sample";
     final InputStream input = IOUtils.toInputStream(TO_BE_UPDATED);
 
-    final ODataMediaEntityCreateRequest createReq =
+    final ODataMediaEntityCreateRequest<ODataEntity> createReq =
             client.getStreamedRequestFactory().getMediaEntityCreateRequest(builder.build(), input);
 
-    final MediaEntityCreateStreamManager streamManager = createReq.execute();
-    final Future<ODataMediaEntityCreateResponse> futureCreateRes = streamManager.getAsyncResponse();
+    final MediaEntityCreateStreamManager<ODataEntity> streamManager = createReq.execute();
+    final Future<ODataMediaEntityCreateResponse<ODataEntity>> futureCreateRes = streamManager.getAsyncResponse();
 
     while (!futureCreateRes.isDone()) {
       Thread.sleep(1000L);

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/3bb39def/lib/client-core/src/test/java/org/apache/olingo/client/core/it/v3/EntityCreateTestITCase.java
----------------------------------------------------------------------
diff --git a/lib/client-core/src/test/java/org/apache/olingo/client/core/it/v3/EntityCreateTestITCase.java b/lib/client-core/src/test/java/org/apache/olingo/client/core/it/v3/EntityCreateTestITCase.java
index 2329aae..f57b443 100644
--- a/lib/client-core/src/test/java/org/apache/olingo/client/core/it/v3/EntityCreateTestITCase.java
+++ b/lib/client-core/src/test/java/org/apache/olingo/client/core/it/v3/EntityCreateTestITCase.java
@@ -118,8 +118,8 @@ public class EntityCreateTestITCase extends AbstractTestITCase {
     final int id = 5;
     final ODataEntity original = getSampleCustomerProfile(id, "Sample customer", false);
 
-    original.addLink(client.getObjectFactory().newInlineEntity(
-            "Info", null, getSampleCustomerInfo(id, "Sample Customer_Info")));
+    original.addLink(client.getObjectFactory().newDeepInsertEntity(
+            "Info", getSampleCustomerInfo(id, "Sample Customer_Info")));
 
     createEntity(getServiceRoot(), format, original, "Customer");
     final ODataEntity actual =
@@ -145,8 +145,8 @@ public class EntityCreateTestITCase extends AbstractTestITCase {
     final int id = 6;
     final ODataEntity original = getSampleCustomerProfile(id, "Sample customer", false);
 
-    original.addLink(client.getObjectFactory().newInlineEntity(
-            "Info", null, getSampleCustomerInfo(id, "Sample Customer_Info")));
+    original.addLink(client.getObjectFactory().newDeepInsertEntity(
+            "Info", getSampleCustomerInfo(id, "Sample Customer_Info")));
 
     createEntity(getServiceRoot(), format, original, "Customer");
     final ODataEntity actual =
@@ -224,7 +224,7 @@ public class EntityCreateTestITCase extends AbstractTestITCase {
   @Test
   public void createReturnNoContent() {
     final int id = 1;
-    final ODataEntity original = (ODataEntity) getSampleCustomerProfile(id, "Sample customer", false);
+    final ODataEntity original = getSampleCustomerProfile(id, "Sample customer", false);
 
     final ODataEntityCreateRequest<ODataEntity> createReq = client.getCUDRequestFactory().getEntityCreateRequest(
             client.getURIBuilder(getServiceRoot()).appendEntitySetSegment("Customer").build(), original);
@@ -251,7 +251,7 @@ public class EntityCreateTestITCase extends AbstractTestITCase {
   @Test
   public void issue135() {
     final int id = 2;
-    final ODataEntity original = (ODataEntity) getSampleCustomerProfile(id, "Sample customer for issue 135", false);
+    final ODataEntity original = getSampleCustomerProfile(id, "Sample customer for issue 135", false);
 
     final URIBuilder uriBuilder = client.getURIBuilder(getServiceRoot()).appendEntitySetSegment("Customer");
     final ODataEntityCreateRequest<ODataEntity> createReq =
@@ -278,7 +278,7 @@ public class EntityCreateTestITCase extends AbstractTestITCase {
           throws EdmPrimitiveTypeException {
 
     final String sampleName = "Sample customer";
-    final ODataEntity original = (ODataEntity) getSampleCustomerProfile(id, sampleName, false);
+    final ODataEntity original = getSampleCustomerProfile(id, sampleName, false);
 
     final Set<Integer> keys = new HashSet<Integer>();
     keys.add(-100);
@@ -288,12 +288,10 @@ public class EntityCreateTestITCase extends AbstractTestITCase {
       final ODataEntity order = client.getObjectFactory().
               newEntity(new FullQualifiedName("Microsoft.Test.OData.Services.AstoriaDefaultService.Order"));
 
-      getClient().getBinder().add(order,
-              client.getObjectFactory().newPrimitiveProperty("OrderId",
-                      client.getObjectFactory().newPrimitiveValueBuilder().buildInt32(key)));
-      getClient().getBinder().add(order,
-              client.getObjectFactory().newPrimitiveProperty("CustomerId",
-                      client.getObjectFactory().newPrimitiveValueBuilder().buildInt32(id)));
+      order.getProperties().add(client.getObjectFactory().newPrimitiveProperty("OrderId",
+              client.getObjectFactory().newPrimitiveValueBuilder().buildInt32(key)));
+      order.getProperties().add(client.getObjectFactory().newPrimitiveProperty("CustomerId",
+              client.getObjectFactory().newPrimitiveValueBuilder().buildInt32(id)));
 
       final ODataEntityCreateRequest<ODataEntity> createReq = client.getCUDRequestFactory().getEntityCreateRequest(
               client.getURIBuilder(getServiceRoot()).appendEntitySetSegment("Order").build(), order);
@@ -304,9 +302,9 @@ public class EntityCreateTestITCase extends AbstractTestITCase {
               createReq.execute().getBody().getEditLink()));
     }
 
-    final ODataEntity created = (ODataEntity) createEntity(getServiceRoot(), format, original, "Customer");
+    final ODataEntity created = createEntity(getServiceRoot(), format, original, "Customer");
     // now, compare the created one with the actual one and go deeply into the associated customer info.....
-    final ODataEntity actual = (ODataEntity) compareEntities(getServiceRoot(), format, created, id, null);
+    final ODataEntity actual = compareEntities(getServiceRoot(), format, created, id, null);
 
     final URIBuilder uriBuilder = client.getURIBuilder(getServiceRoot());
     uriBuilder.appendEntitySetSegment("Customer").appendKeySegment(id).appendEntitySetSegment("Orders");
@@ -381,8 +379,8 @@ public class EntityCreateTestITCase extends AbstractTestITCase {
 
     final String sampleName = "Sample customer";
 
-    ODataEntity customer = (ODataEntity) getSampleCustomerProfile(id, sampleName, false);
-    customer = (ODataEntity) createEntity(getServiceRoot(), format, customer, "Customer");
+    ODataEntity customer = getSampleCustomerProfile(id, sampleName, false);
+    customer = createEntity(getServiceRoot(), format, customer, "Customer");
 
     ODataEntity order = client.getObjectFactory().newEntity(new FullQualifiedName(
             "Microsoft.Test.OData.Services.AstoriaDefaultService.Order"));
@@ -396,9 +394,9 @@ public class EntityCreateTestITCase extends AbstractTestITCase {
     order.addLink(client.getObjectFactory().newEntityNavigationLink(
             "Customer", URIUtils.getURI(getServiceRoot(), customer.getEditLink().toASCIIString())));
 
-    order = (ODataEntity) createEntity(getServiceRoot(), format, order, "Order");
+    order = createEntity(getServiceRoot(), format, order, "Order");
 
-    ODataEntity changes = client.getObjectFactory().newEntity(new FullQualifiedName(
+    final ODataEntity changes = client.getObjectFactory().newEntity(new FullQualifiedName(
             "Microsoft.Test.OData.Services.AstoriaDefaultService.Customer"));
     changes.setEditLink(customer.getEditLink());
     changes.addLink(client.getObjectFactory().newEntitySetNavigationLink(

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/3bb39def/lib/client-core/src/test/java/org/apache/olingo/client/core/it/v3/LinkTestITCase.java
----------------------------------------------------------------------
diff --git a/lib/client-core/src/test/java/org/apache/olingo/client/core/it/v3/LinkTestITCase.java b/lib/client-core/src/test/java/org/apache/olingo/client/core/it/v3/LinkTestITCase.java
index 17e66a2..a1476a5 100644
--- a/lib/client-core/src/test/java/org/apache/olingo/client/core/it/v3/LinkTestITCase.java
+++ b/lib/client-core/src/test/java/org/apache/olingo/client/core/it/v3/LinkTestITCase.java
@@ -36,7 +36,6 @@ import org.apache.olingo.client.api.communication.response.ODataRetrieveResponse
 import org.apache.olingo.commons.api.domain.ODataLink;
 import org.apache.olingo.client.api.domain.v3.ODataLinkCollection;
 import org.apache.olingo.commons.api.format.ODataFormat;
-import org.apache.olingo.client.api.uri.CommonURIBuilder;
 import org.apache.olingo.client.api.uri.v3.URIBuilder;
 import org.junit.Test;
 
@@ -50,7 +49,7 @@ public class LinkTestITCase extends AbstractTestITCase {
   }
 
   private ODataLinkCollection doRetrieveLinkURIs(final ODataFormat format, final String linkname) throws IOException {
-    final CommonURIBuilder<?> uriBuilder = client.getURIBuilder(getServiceRoot()).
+    final URIBuilder uriBuilder = client.getURIBuilder(getServiceRoot()).
             appendEntitySetSegment("Customer").appendKeySegment(-10);
 
     final ODataLinkCollectionRequest req =
@@ -94,9 +93,9 @@ public class LinkTestITCase extends AbstractTestITCase {
 
     // 2. create new link
     final ODataLink newLink = client.getObjectFactory().
-            newAssociationLink(null, URI.create(getServiceRoot() + "/Login('3')"));
+            newAssociationLink(URI.create(getServiceRoot() + "/Login('3')"));
 
-    final CommonURIBuilder<?> uriBuilder = client.getURIBuilder(getServiceRoot()).
+    final URIBuilder uriBuilder = client.getURIBuilder(getServiceRoot()).
             appendEntitySetSegment("Customer").appendKeySegment(-10).appendLinksSegment("Logins");
 
     final ODataLinkCreateRequest req =
@@ -133,8 +132,8 @@ public class LinkTestITCase extends AbstractTestITCase {
     final URI before = doRetrieveLinkURIs(format, "Info").getLinks().get(0);
 
     // 2. update the link
-    ODataLink newLink =
-            client.getObjectFactory().newAssociationLink(null, URI.create(getServiceRoot() + "/CustomerInfo(12)"));
+    ODataLink newLink = client.getObjectFactory().
+            newAssociationLink(URI.create(getServiceRoot() + "/CustomerInfo(12)"));
 
     final URIBuilder uriBuilder = client.getURIBuilder(getServiceRoot());
     uriBuilder.appendEntitySetSegment("Customer").appendKeySegment(-10).appendLinksSegment("Info");
@@ -151,7 +150,7 @@ public class LinkTestITCase extends AbstractTestITCase {
     assertEquals(newLink.getLink(), after);
 
     // 3. reset back the link value
-    newLink = client.getObjectFactory().newAssociationLink(null, before);
+    newLink = client.getObjectFactory().newAssociationLink(before);
     req = client.getCUDRequestFactory().getLinkUpdateRequest(uriBuilder.build(), updateType, newLink);
     req.setFormat(format);
 

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/3bb39def/lib/client-core/src/test/java/org/apache/olingo/client/core/it/v3/MediaEntityTestITCase.java
----------------------------------------------------------------------
diff --git a/lib/client-core/src/test/java/org/apache/olingo/client/core/it/v3/MediaEntityTestITCase.java b/lib/client-core/src/test/java/org/apache/olingo/client/core/it/v3/MediaEntityTestITCase.java
index 03bdf00..133e950 100644
--- a/lib/client-core/src/test/java/org/apache/olingo/client/core/it/v3/MediaEntityTestITCase.java
+++ b/lib/client-core/src/test/java/org/apache/olingo/client/core/it/v3/MediaEntityTestITCase.java
@@ -18,9 +18,6 @@
  */
 package org.apache.olingo.client.core.it.v3;
 
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNotNull;
-
 import java.io.ByteArrayInputStream;
 import java.io.InputStream;
 import org.apache.commons.io.IOUtils;
@@ -36,18 +33,23 @@ import org.apache.olingo.client.api.communication.response.ODataMediaEntityCreat
 import org.apache.olingo.client.api.communication.response.ODataMediaEntityUpdateResponse;
 import org.apache.olingo.client.api.communication.response.ODataRetrieveResponse;
 import org.apache.olingo.client.api.communication.response.ODataStreamUpdateResponse;
-import org.apache.olingo.commons.api.domain.CommonODataEntity;
-import org.apache.olingo.commons.api.domain.CommonODataProperty;
+import org.apache.olingo.client.api.uri.v3.URIBuilder;
+import org.apache.olingo.commons.api.domain.v3.ODataEntity;
+import org.apache.olingo.commons.api.domain.v3.ODataProperty;
 import org.apache.olingo.commons.api.format.ODataMediaFormat;
 import org.apache.olingo.commons.api.format.ODataPubFormat;
-import org.apache.olingo.client.api.uri.CommonURIBuilder;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertNotNull;
+
 import org.junit.Test;
 
 public class MediaEntityTestITCase extends AbstractTestITCase {
 
   @Test
   public void read() throws Exception {
-    final CommonURIBuilder<?> builder = client.getURIBuilder(testStaticServiceRootURL).
+    final URIBuilder builder = client.getURIBuilder(testStaticServiceRootURL).
             appendEntitySetSegment("Car").appendKeySegment(12).appendValueSegment();
 
     final ODataMediaRequest retrieveReq = client.getRetrieveRequestFactory().getMediaRequest(builder.build());
@@ -62,7 +64,7 @@ public class MediaEntityTestITCase extends AbstractTestITCase {
 
   @Test(expected = ODataClientErrorException.class)
   public void readWithXmlError() throws Exception {
-    final CommonURIBuilder<?> builder = client.getURIBuilder(testStaticServiceRootURL).
+    final URIBuilder builder = client.getURIBuilder(testStaticServiceRootURL).
             appendEntitySetSegment("Car").appendKeySegment(12).appendValueSegment();
 
     final ODataMediaRequest retrieveReq = client.getRetrieveRequestFactory().getMediaRequest(builder.build());
@@ -73,7 +75,7 @@ public class MediaEntityTestITCase extends AbstractTestITCase {
 
   @Test(expected = ODataClientErrorException.class)
   public void readWithJsonError() throws Exception {
-    final CommonURIBuilder<?> builder = client.getURIBuilder(testStaticServiceRootURL).
+    final URIBuilder builder = client.getURIBuilder(testStaticServiceRootURL).
             appendEntitySetSegment("Car").appendKeySegment(12).appendValueSegment();
 
     final ODataMediaRequest retrieveReq = client.getRetrieveRequestFactory().getMediaRequest(builder.build());
@@ -109,7 +111,7 @@ public class MediaEntityTestITCase extends AbstractTestITCase {
 
   @Test
   public void updateNamedStream() throws Exception {
-    CommonURIBuilder<?> builder = client.getURIBuilder(testStaticServiceRootURL).
+    URIBuilder builder = client.getURIBuilder(testStaticServiceRootURL).
             appendEntitySetSegment("Car").appendKeySegment(16).appendNavigationSegment("Photo");
 
     final String TO_BE_UPDATED = "buffered stream sample";
@@ -131,18 +133,18 @@ public class MediaEntityTestITCase extends AbstractTestITCase {
   }
 
   private void updateMediaEntity(final ODataPubFormat format, final int id) throws Exception {
-    CommonURIBuilder<?> builder = client.getURIBuilder(testStaticServiceRootURL).
+    URIBuilder builder = client.getURIBuilder(testStaticServiceRootURL).
             appendEntitySetSegment("Car").appendKeySegment(id).appendValueSegment();
 
     final String TO_BE_UPDATED = "new buffered stream sample";
     final InputStream input = IOUtils.toInputStream(TO_BE_UPDATED);
 
-    final ODataMediaEntityUpdateRequest updateReq =
+    final ODataMediaEntityUpdateRequest<ODataEntity> updateReq =
             client.getStreamedRequestFactory().getMediaEntityUpdateRequest(builder.build(), input);
     updateReq.setFormat(format);
 
-    final MediaEntityUpdateStreamManager streamManager = updateReq.execute();
-    final ODataMediaEntityUpdateResponse updateRes = streamManager.getResponse();
+    final MediaEntityUpdateStreamManager<ODataEntity> streamManager = updateReq.execute();
+    final ODataMediaEntityUpdateResponse<ODataEntity> updateRes = streamManager.getResponse();
     assertEquals(204, updateRes.getStatusCode());
 
     final ODataMediaRequest retrieveReq = client.getRetrieveRequestFactory().getMediaRequest(builder.build());
@@ -153,23 +155,23 @@ public class MediaEntityTestITCase extends AbstractTestITCase {
   }
 
   private void createMediaEntity(final ODataPubFormat format, final InputStream input) throws Exception {
-    final CommonURIBuilder<?> builder = client.getURIBuilder(testStaticServiceRootURL).
+    final URIBuilder builder = client.getURIBuilder(testStaticServiceRootURL).
             appendEntitySetSegment("Car");
 
-    final ODataMediaEntityCreateRequest createReq =
+    final ODataMediaEntityCreateRequest<ODataEntity> createReq =
             client.getStreamedRequestFactory().getMediaEntityCreateRequest(builder.build(), input);
     createReq.setFormat(format);
 
-    final MediaEntityCreateStreamManager streamManager = createReq.execute();
-    final ODataMediaEntityCreateResponse createRes = streamManager.getResponse();
+    final MediaEntityCreateStreamManager<ODataEntity> streamManager = createReq.execute();
+    final ODataMediaEntityCreateResponse<ODataEntity> createRes = streamManager.getResponse();
     assertEquals(201, createRes.getStatusCode());
 
-    final CommonODataEntity created = createRes.getBody();
+    final ODataEntity created = createRes.getBody();
     assertNotNull(created);
     assertEquals(2, created.getProperties().size());
 
     Integer id = null;
-    for (CommonODataProperty prop : created.getProperties()) {
+    for (ODataProperty prop : created.getProperties()) {
       if ("VIN".equals(prop.getName())) {
         id = prop.getPrimitiveValue().toCastValue(Integer.class);
       }

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/3bb39def/lib/client-core/src/test/java/org/apache/olingo/client/core/it/v4/BatchTestITCase.java
----------------------------------------------------------------------
diff --git a/lib/client-core/src/test/java/org/apache/olingo/client/core/it/v4/BatchTestITCase.java b/lib/client-core/src/test/java/org/apache/olingo/client/core/it/v4/BatchTestITCase.java
index d9465a5..b1d2194 100644
--- a/lib/client-core/src/test/java/org/apache/olingo/client/core/it/v4/BatchTestITCase.java
+++ b/lib/client-core/src/test/java/org/apache/olingo/client/core/it/v4/BatchTestITCase.java
@@ -159,7 +159,7 @@ public class BatchTestITCase extends AbstractTestITCase {
     final ODataChangeset changeset = streamManager.addChangeset();
     ODataEntity order = newOrder(20);
 
-    URIBuilder uriBuilder = client.getURIBuilder(testStaticServiceRootURL).appendEntitySetSegment("Orders");
+    final URIBuilder uriBuilder = client.getURIBuilder(testStaticServiceRootURL).appendEntitySetSegment("Orders");
 
     // add create request
     final ODataEntityCreateRequest<ODataEntity> createReq =
@@ -176,13 +176,13 @@ public class BatchTestITCase extends AbstractTestITCase {
             "OrderDetails",
             client.getURIBuilder(testStaticServiceRootURL).appendEntitySetSegment("OrderDetails").
             appendKeySegment(new HashMap<String, Object>() {
-      private static final long serialVersionUID = 3109256773218160485L;
+              private static final long serialVersionUID = 3109256773218160485L;
 
-      {
-        put("OrderID", 7);
-        put("ProductID", 5);
-      }
-    }).build()));
+              {
+                put("OrderID", 7);
+                put("ProductID", 5);
+              }
+            }).build()));
 
     final ODataEntityUpdateRequest<ODataEntity> updateReq = client.getCUDRequestFactory().getEntityUpdateRequest(
             URI.create("$" + createRequestRef), UpdateType.PATCH, customerChanges);
@@ -206,7 +206,7 @@ public class BatchTestITCase extends AbstractTestITCase {
     assertTrue(res instanceof ODataEntityCreateResponse);
 
     order = ((ODataEntityCreateResponse<ODataEntity>) res).getBody();
-    ODataEntitySetRequest<ODataEntitySet> req = client.getRetrieveRequestFactory().getEntitySetRequest(
+    final ODataEntitySetRequest<ODataEntitySet> req = client.getRetrieveRequestFactory().getEntitySetRequest(
             URIUtils.getURI(testStaticServiceRootURL, order.getEditLink().toASCIIString() + "/OrderDetails"));
 
     assertEquals(Integer.valueOf(7),
@@ -274,7 +274,7 @@ public class BatchTestITCase extends AbstractTestITCase {
             "LastName",
             client.getObjectFactory().newPrimitiveValueBuilder().buildString("new last name")));
 
-    final ODataEntityUpdateRequest changeReq =
+    final ODataEntityUpdateRequest<ODataEntity> changeReq =
             client.getCUDRequestFactory().getEntityUpdateRequest(UpdateType.PATCH, patch);
     changeReq.setFormat(ODataPubFormat.JSON_FULL_METADATA);
 
@@ -295,8 +295,7 @@ public class BatchTestITCase extends AbstractTestITCase {
     retrieve = streamManager.addRetrieve();
 
     // prepare URI
-    targetURI = client.getURIBuilder(testStaticServiceRootURL).
-            appendEntitySetSegment("Customers").appendKeySegment(1);
+    targetURI = client.getURIBuilder(testStaticServiceRootURL).appendEntitySetSegment("Customers").appendKeySegment(1);
 
     // create new request
     queryReq = client.getRetrieveRequestFactory().getEntityRequest(targetURI.build());
@@ -309,7 +308,7 @@ public class BatchTestITCase extends AbstractTestITCase {
     assertEquals("OK", response.getStatusMessage());
     final Iterator<ODataBatchResponseItem> iter = response.getBody();
 
-    // retrive the first item (ODataRetrieve)
+    // retrieve the first item (ODataRetrieve)
     ODataBatchResponseItem item = iter.next();
     assertTrue(item instanceof ODataRetrieveResponseItem);
 
@@ -368,13 +367,13 @@ public class BatchTestITCase extends AbstractTestITCase {
       super(new Wrapper<Future<HttpResponse>>());
     }
 
-    public ODataStreamManager<ODataBatchResponse> addObject(byte[] src) {
+    public ODataStreamManager<ODataBatchResponse> addObject(final byte[] src) {
       stream(src);
       return this;
     }
 
     @Override
-    protected ODataBatchResponse getResponse(long timeout, TimeUnit unit) {
+    protected ODataBatchResponse getResponse(final long timeout, final TimeUnit unit) {
       throw new UnsupportedOperationException("Not supported yet.");
     }
   };
@@ -387,6 +386,7 @@ public class BatchTestITCase extends AbstractTestITCase {
     private final TestStreamManager streaming;
 
     public StreamingThread(final TestStreamManager streaming) {
+      super();
       this.streaming = streaming;
     }
 
@@ -422,6 +422,7 @@ public class BatchTestITCase extends AbstractTestITCase {
     private final BatchStreamManager streaming;
 
     public BatchStreamingThread(final BatchStreamManager streaming) {
+      super();
       this.streaming = streaming;
     }
 
@@ -430,7 +431,7 @@ public class BatchTestITCase extends AbstractTestITCase {
       try {
         final StringBuilder builder = new StringBuilder();
 
-        byte[] buff = new byte[1024];
+        final byte[] buff = new byte[1024];
 
         int len;
 

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/3bb39def/lib/client-core/src/test/java/org/apache/olingo/client/core/it/v4/EntityCreateTestITCase.java
----------------------------------------------------------------------
diff --git a/lib/client-core/src/test/java/org/apache/olingo/client/core/it/v4/EntityCreateTestITCase.java b/lib/client-core/src/test/java/org/apache/olingo/client/core/it/v4/EntityCreateTestITCase.java
index 9385daa..6a736c6 100644
--- a/lib/client-core/src/test/java/org/apache/olingo/client/core/it/v4/EntityCreateTestITCase.java
+++ b/lib/client-core/src/test/java/org/apache/olingo/client/core/it/v4/EntityCreateTestITCase.java
@@ -32,10 +32,13 @@ import org.apache.olingo.client.api.communication.request.cud.ODataEntityCreateR
 import org.apache.olingo.client.api.communication.response.ODataDeleteResponse;
 import org.apache.olingo.client.api.communication.response.ODataEntityCreateResponse;
 import org.apache.olingo.commons.api.domain.ODataCollectionValue;
+import org.apache.olingo.commons.api.domain.ODataInlineEntitySet;
+import org.apache.olingo.commons.api.domain.ODataLink;
 import org.apache.olingo.commons.api.domain.v4.ODataEntity;
 import org.apache.olingo.commons.api.domain.v4.ODataEntitySet;
 import org.apache.olingo.commons.api.domain.v4.ODataProperty;
 import org.apache.olingo.commons.api.domain.v4.ODataValue;
+import org.apache.olingo.commons.api.edm.EdmPrimitiveTypeException;
 import org.apache.olingo.commons.api.edm.EdmPrimitiveTypeKind;
 import org.apache.olingo.commons.api.edm.FullQualifiedName;
 import org.apache.olingo.commons.api.format.ODataPubFormat;
@@ -167,4 +170,83 @@ public class EntityCreateTestITCase extends AbstractTestITCase {
   public void jsonOnContained() {
     onContained(ODataPubFormat.JSON);
   }
+
+  private void deepInsert(final ODataPubFormat format) throws EdmPrimitiveTypeException {
+    final int productId = RandomUtils.nextInt(10, 20);
+    final ODataEntity product = getClient().getObjectFactory().
+            newEntity(new FullQualifiedName("Microsoft.Test.OData.Services.ODataWCFService.Product"));
+    product.getProperties().add(getClient().getObjectFactory().newPrimitiveProperty("ProductID",
+            getClient().getObjectFactory().newPrimitiveValueBuilder().buildInt32(productId)));
+    product.getProperties().add(getClient().getObjectFactory().newPrimitiveProperty("Name",
+            getClient().getObjectFactory().newPrimitiveValueBuilder().buildString("Latte")));
+    product.getProperties().add(getClient().getObjectFactory().newPrimitiveProperty("QuantityPerUnit",
+            getClient().getObjectFactory().newPrimitiveValueBuilder().buildString("100g Bag")));
+    product.getProperties().add(getClient().getObjectFactory().newPrimitiveProperty("UnitPrice",
+            getClient().getObjectFactory().newPrimitiveValueBuilder().buildSingle(3.24f)));
+    product.getProperties().add(getClient().getObjectFactory().newPrimitiveProperty("QuantityInStock",
+            getClient().getObjectFactory().newPrimitiveValueBuilder().buildInt32(100)));
+    product.getProperties().add(getClient().getObjectFactory().newPrimitiveProperty("Discontinued",
+            getClient().getObjectFactory().newPrimitiveValueBuilder().buildBoolean(false)));
+    product.getProperties().add(getClient().getObjectFactory().newEnumProperty("UserAccess",
+            getClient().getObjectFactory().
+            newEnumValue("Microsoft.Test.OData.Services.ODataWCFService.AccessLevel", "Execute")));
+    product.getProperties().add(getClient().getObjectFactory().newEnumProperty("SkinColor",
+            getClient().getObjectFactory().
+            newEnumValue("Microsoft.Test.OData.Services.ODataWCFService.Color", "Blue")));
+    product.getProperties().add(getClient().getObjectFactory().newCollectionProperty("CoverColors",
+            getClient().getObjectFactory().
+            newCollectionValue("Collection(Microsoft.Test.OData.Services.ODataWCFService.ProductDetail)")));
+    product.getProperty("CoverColors").getCollectionValue().add(getClient().getObjectFactory().
+            newEnumValue("Microsoft.Test.OData.Services.ODataWCFService.Color", "Green"));
+    product.getProperty("CoverColors").getCollectionValue().add(getClient().getObjectFactory().
+            newEnumValue("Microsoft.Test.OData.Services.ODataWCFService.Color", "Red"));
+
+    final int productDetailId = RandomUtils.nextInt(10, 20);
+    final ODataEntity detail = getClient().getObjectFactory().
+            newEntity(new FullQualifiedName("Microsoft.Test.OData.Services.ODataWCFService.ProductDetail"));
+    detail.getProperties().add(getClient().getObjectFactory().newPrimitiveProperty("ProductID",
+            getClient().getObjectFactory().newPrimitiveValueBuilder().buildInt32(productId)));
+    detail.getProperties().add(getClient().getObjectFactory().newPrimitiveProperty("ProductDetailID",
+            getClient().getObjectFactory().newPrimitiveValueBuilder().buildInt32(productDetailId)));
+    detail.getProperties().add(getClient().getObjectFactory().newPrimitiveProperty("ProductName",
+            getClient().getObjectFactory().newPrimitiveValueBuilder().buildString("LatteHQ")));
+    detail.getProperties().add(getClient().getObjectFactory().newPrimitiveProperty("Description",
+            getClient().getObjectFactory().newPrimitiveValueBuilder().buildString("High-Quality Milk")));
+
+    final ODataEntitySet details = getClient().getObjectFactory().newEntitySet();
+    details.getEntities().add(detail);
+
+    final ODataInlineEntitySet inlineDetails = getClient().getObjectFactory().
+            newDeepInsertEntitySet("Details", details);
+    product.addLink(inlineDetails);
+
+    final ODataEntityCreateRequest<ODataEntity> req = getClient().getCUDRequestFactory().getEntityCreateRequest(
+            getClient().getURIBuilder(testStaticServiceRootURL).appendEntitySetSegment("Products").build(), product);
+    req.setFormat(format);
+    final ODataEntityCreateResponse<ODataEntity> res = req.execute();
+    assertEquals(201, res.getStatusCode());
+
+    final ODataEntity createdProduct = res.getBody();
+    assertEquals(productId,
+            createdProduct.getProperty("ProductID").getPrimitiveValue().toCastValue(Integer.class), 0);
+
+    final ODataLink createdLink = createdProduct.getNavigationLink("Details");
+    assertNotNull(createdLink);
+
+    final ODataEntitySet createdProductDetails =
+            getClient().getRetrieveRequestFactory().getEntitySetRequest(createdLink.getLink()).execute().getBody();
+    assertNotNull(createdProductDetails);
+    assertEquals(productDetailId, createdProductDetails.getEntities().iterator().next().
+            getProperty("ProductDetailID").getPrimitiveValue().toCastValue(Integer.class), 0);
+  }
+
+  @Test
+  public void atomDeepInsert() throws EdmPrimitiveTypeException {
+    deepInsert(ODataPubFormat.ATOM);
+  }
+
+  @Test
+  public void jsonDeepInsert() throws EdmPrimitiveTypeException {
+    deepInsert(ODataPubFormat.JSON_FULL_METADATA);
+  }
 }

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/3bb39def/lib/client-core/src/test/java/org/apache/olingo/client/core/it/v4/EntityUpdateTestITCase.java
----------------------------------------------------------------------
diff --git a/lib/client-core/src/test/java/org/apache/olingo/client/core/it/v4/EntityUpdateTestITCase.java b/lib/client-core/src/test/java/org/apache/olingo/client/core/it/v4/EntityUpdateTestITCase.java
index e1e6331..36a9e65 100644
--- a/lib/client-core/src/test/java/org/apache/olingo/client/core/it/v4/EntityUpdateTestITCase.java
+++ b/lib/client-core/src/test/java/org/apache/olingo/client/core/it/v4/EntityUpdateTestITCase.java
@@ -18,19 +18,21 @@
  */
 package org.apache.olingo.client.core.it.v4;
 
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNotNull;
-
 import java.net.URI;
 import java.util.Calendar;
 import java.util.UUID;
 import org.apache.olingo.client.api.communication.request.cud.ODataEntityUpdateRequest;
 import org.apache.olingo.client.api.communication.request.cud.v4.UpdateType;
 import org.apache.olingo.client.api.communication.response.ODataEntityUpdateResponse;
+import org.apache.olingo.commons.api.domain.ODataLink;
 import org.apache.olingo.commons.api.domain.v4.ODataEntity;
+import org.apache.olingo.commons.api.edm.EdmPrimitiveTypeException;
 import org.apache.olingo.commons.api.edm.EdmPrimitiveTypeKind;
 import org.apache.olingo.commons.api.edm.FullQualifiedName;
 import org.apache.olingo.commons.api.format.ODataPubFormat;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+
 import org.junit.Test;
 
 public class EntityUpdateTestITCase extends AbstractTestITCase {
@@ -112,4 +114,41 @@ public class EntityUpdateTestITCase extends AbstractTestITCase {
     onContained(ODataPubFormat.JSON);
   }
 
+  private void bindOperation(final ODataPubFormat format) throws EdmPrimitiveTypeException {
+    final ODataEntity changes = getClient().getObjectFactory().newEntity(
+            new FullQualifiedName("Microsoft.Test.OData.Services.ODataWCFService.Customer"));
+    final ODataLink parent = getClient().getObjectFactory().newEntityNavigationLink("Parent",
+            getClient().getURIBuilder(testStaticServiceRootURL).
+            appendEntitySetSegment("People").appendKeySegment(1).build());
+    changes.getNavigationLinks().add(parent);
+
+    final URI uri = getClient().getURIBuilder(testStaticServiceRootURL).
+            appendEntitySetSegment("People").appendKeySegment(5).build();
+    final ODataEntityUpdateRequest<ODataEntity> req = getClient().getCUDRequestFactory().
+            getEntityUpdateRequest(uri, UpdateType.PATCH, changes);
+    req.setFormat(format);
+
+    final ODataEntityUpdateResponse<ODataEntity> res = req.execute();
+    assertEquals(204, res.getStatusCode());
+
+    final ODataEntity updated = getClient().getRetrieveRequestFactory().getEntityRequest(uri).execute().getBody();
+    assertNotNull(updated);
+    final ODataLink updatedLink = updated.getNavigationLink("Parent");
+    assertNotNull(updatedLink);
+
+    final ODataEntity updatedEntity = getClient().getRetrieveRequestFactory().getEntityRequest(updatedLink.getLink()).
+            execute().getBody();
+    assertNotNull(updatedEntity);
+    assertEquals(1, updatedEntity.getProperty("PersonID").getPrimitiveValue().toCastValue(Integer.class), 0);
+  }
+
+  @Test
+  public void atomBindOperation() throws EdmPrimitiveTypeException {
+    bindOperation(ODataPubFormat.ATOM);
+  }
+
+  @Test
+  public void jsonBindOperation() throws EdmPrimitiveTypeException {
+    bindOperation(ODataPubFormat.JSON);
+  }
 }

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/3bb39def/lib/commons-api/src/main/java/org/apache/olingo/commons/api/domain/CommonODataObjectFactory.java
----------------------------------------------------------------------
diff --git a/lib/commons-api/src/main/java/org/apache/olingo/commons/api/domain/CommonODataObjectFactory.java b/lib/commons-api/src/main/java/org/apache/olingo/commons/api/domain/CommonODataObjectFactory.java
index b3945bf..eead623 100644
--- a/lib/commons-api/src/main/java/org/apache/olingo/commons/api/domain/CommonODataObjectFactory.java
+++ b/lib/commons-api/src/main/java/org/apache/olingo/commons/api/domain/CommonODataObjectFactory.java
@@ -59,65 +59,22 @@ public interface CommonODataObjectFactory {
   CommonODataEntity newEntity(FullQualifiedName typeName, URI link);
 
   /**
-   * Instantiates a new in-line entity set.
+   * Instantiates a new entity set (for deep insert).
    *
    * @param name name.
-   * @param link edit link.
    * @param entitySet entity set.
    * @return in-line entity set.
    */
-  ODataInlineEntitySet newInlineEntitySet(String name, URI link, CommonODataEntitySet entitySet);
+  ODataInlineEntitySet newDeepInsertEntitySet(String name, CommonODataEntitySet entitySet);
 
   /**
-   * Instantiates a new in-line entity set.
+   * Instantiates a new entity (for deep insert).
    *
    * @param name name.
-   * @param baseURI base URI.
-   * @param href href.
-   * @param entitySet entity set.
-   * @return in-line entity set.
-   */
-  ODataInlineEntitySet newInlineEntitySet(String name, URI baseURI, String href, CommonODataEntitySet entitySet);
-
-  /**
-   * Instantiates a new in-line entity.
-   *
-   * @param name name.
-   * @param link edit link.
-   * @param entity entity.
-   * @return in-line entity.
-   */
-  ODataInlineEntity newInlineEntity(String name, URI link, CommonODataEntity entity);
-
-  /**
-   * Instantiates a new in-line entity.
-   *
-   * @param name name.
-   * @param baseURI base URI.
-   * @param href href.
    * @param entity entity.
    * @return in-line entity.
    */
-  ODataInlineEntity newInlineEntity(String name, URI baseURI, String href, CommonODataEntity entity);
-
-  /**
-   * Instantiates a new entity navigation link.
-   *
-   * @param name name.
-   * @param link link.
-   * @return entity navigation link.
-   */
-  ODataLink newEntityNavigationLink(String name, URI link);
-
-  /**
-   * Instantiates a new entity navigation link.
-   *
-   * @param name name.
-   * @param baseURI base URI.
-   * @param href href.
-   * @return entity navigation link.
-   */
-  ODataLink newEntityNavigationLink(String name, URI baseURI, String href);
+  ODataInlineEntity newDeepInsertEntity(String name, CommonODataEntity entity);
 
   /**
    * Instantiates a new entity set navigation link.
@@ -129,52 +86,13 @@ public interface CommonODataObjectFactory {
   ODataLink newEntitySetNavigationLink(String name, URI link);
 
   /**
-   * Instantiates a new entity set navigation link.
-   *
-   * @param name name.
-   * @param baseURI base URI.
-   * @param href href.
-   * @return entity set navigation link.
-   */
-  ODataLink newEntitySetNavigationLink(String name, URI baseURI, String href);
-
-  /**
-   * Instantiates a new association link.
-   *
-   * @param name name.
-   * @param link link.
-   * @return association link.
-   */
-  ODataLink newAssociationLink(String name, URI link);
-
-  /**
-   * Instantiates a new association link.
-   *
-   * @param name name.
-   * @param baseURI base URI.
-   * @param href href.
-   * @return association link.
-   */
-  ODataLink newAssociationLink(String name, URI baseURI, String href);
-
-  /**
-   * Instantiates a new media-edit link.
+   * Instantiates a new entity navigation link.
    *
    * @param name name.
    * @param link link.
-   * @return media-edit link.
-   */
-  ODataLink newMediaEditLink(String name, URI link);
-
-  /**
-   * Instantiates a new media-edit link.
-   *
-   * @param name name.
-   * @param baseURI base URI.
-   * @param href href.
-   * @return media-edit link.
+   * @return entity navigation link.
    */
-  ODataLink newMediaEditLink(String name, URI baseURI, String href);
+  ODataLink newEntityNavigationLink(String name, URI link);
 
   ODataPrimitiveValue.Builder newPrimitiveValueBuilder();
 

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/3bb39def/lib/commons-api/src/main/java/org/apache/olingo/commons/api/domain/v3/ODataObjectFactory.java
----------------------------------------------------------------------
diff --git a/lib/commons-api/src/main/java/org/apache/olingo/commons/api/domain/v3/ODataObjectFactory.java b/lib/commons-api/src/main/java/org/apache/olingo/commons/api/domain/v3/ODataObjectFactory.java
index 28b4c9e..096e8e9 100644
--- a/lib/commons-api/src/main/java/org/apache/olingo/commons/api/domain/v3/ODataObjectFactory.java
+++ b/lib/commons-api/src/main/java/org/apache/olingo/commons/api/domain/v3/ODataObjectFactory.java
@@ -23,6 +23,7 @@ import org.apache.olingo.commons.api.domain.CommonODataObjectFactory;
 import org.apache.olingo.commons.api.domain.CommonODataProperty;
 import org.apache.olingo.commons.api.domain.ODataCollectionValue;
 import org.apache.olingo.commons.api.domain.ODataComplexValue;
+import org.apache.olingo.commons.api.domain.ODataLink;
 import org.apache.olingo.commons.api.domain.ODataPrimitiveValue;
 import org.apache.olingo.commons.api.domain.ODataValue;
 import org.apache.olingo.commons.api.edm.FullQualifiedName;
@@ -41,6 +42,14 @@ public interface ODataObjectFactory extends CommonODataObjectFactory {
   @Override
   ODataEntity newEntity(FullQualifiedName typeName, URI link);
 
+  /**
+   * Instantiates a new association link.
+   *
+   * @param link link.
+   * @return association link.
+   */
+  ODataLink newAssociationLink(URI link);
+
   @Override
   ODataComplexValue<ODataProperty> newComplexValue(String typeName);
 

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/3bb39def/lib/commons-core/src/main/java/org/apache/olingo/commons/core/data/AbstractJsonSerializer.java
----------------------------------------------------------------------
diff --git a/lib/commons-core/src/main/java/org/apache/olingo/commons/core/data/AbstractJsonSerializer.java b/lib/commons-core/src/main/java/org/apache/olingo/commons/core/data/AbstractJsonSerializer.java
index 2fa89d4..362552f 100644
--- a/lib/commons-core/src/main/java/org/apache/olingo/commons/core/data/AbstractJsonSerializer.java
+++ b/lib/commons-core/src/main/java/org/apache/olingo/commons/core/data/AbstractJsonSerializer.java
@@ -77,7 +77,9 @@ abstract class AbstractJsonSerializer<T> extends ODataJacksonSerializer<T> {
           uris = new ArrayList<String>();
           entitySetLinks.put(link.getTitle(), uris);
         }
-        uris.add(link.getHref());
+        if (StringUtils.isNotBlank(link.getHref())) {
+          uris.add(link.getHref());
+        }
       } else {
         if (StringUtils.isNotBlank(link.getHref())) {
           jgen.writeStringField(link.getTitle() + Constants.JSON_BIND_LINK_SUFFIX, link.getHref());
@@ -95,11 +97,13 @@ abstract class AbstractJsonSerializer<T> extends ODataJacksonSerializer<T> {
       }
     }
     for (Map.Entry<String, List<String>> entitySetLink : entitySetLinks.entrySet()) {
-      jgen.writeArrayFieldStart(entitySetLink.getKey() + Constants.JSON_BIND_LINK_SUFFIX);
-      for (String uri : entitySetLink.getValue()) {
-        jgen.writeString(uri);
+      if (!entitySetLink.getValue().isEmpty()) {
+        jgen.writeArrayFieldStart(entitySetLink.getKey() + Constants.JSON_BIND_LINK_SUFFIX);
+        for (String uri : entitySetLink.getValue()) {
+          jgen.writeString(uri);
+        }
+        jgen.writeEndArray();
       }
-      jgen.writeEndArray();
     }
   }
 

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/3bb39def/lib/commons-core/src/main/java/org/apache/olingo/commons/core/data/AtomSerializer.java
----------------------------------------------------------------------
diff --git a/lib/commons-core/src/main/java/org/apache/olingo/commons/core/data/AtomSerializer.java b/lib/commons-core/src/main/java/org/apache/olingo/commons/core/data/AtomSerializer.java
index e953948..65cb6b2 100644
--- a/lib/commons-core/src/main/java/org/apache/olingo/commons/core/data/AtomSerializer.java
+++ b/lib/commons-core/src/main/java/org/apache/olingo/commons/core/data/AtomSerializer.java
@@ -445,6 +445,14 @@ public class AtomSerializer extends AbstractAtomDealer {
           final XMLStreamWriter writer, final Container<T> container) throws XMLStreamException {
 
     if (container.getContextURL() != null) {
+      final String base = StringUtils.substringBefore(container.getContextURL().toASCIIString(), Constants.METADATA);
+      if (container.getObject() instanceof AtomFeedImpl) {
+        ((AtomFeedImpl) container.getObject()).setBaseURI(base);
+      }
+      if (container.getObject() instanceof AtomEntryImpl) {
+        ((AtomEntryImpl) container.getObject()).setBaseURI(base);
+      }
+
       writer.writeAttribute(
               version.getNamespaceMap().get(ODataServiceVersion.NS_METADATA),
               Constants.CONTEXT,

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/3bb39def/lib/commons-core/src/main/java/org/apache/olingo/commons/core/data/JSONEntryDeserializer.java
----------------------------------------------------------------------
diff --git a/lib/commons-core/src/main/java/org/apache/olingo/commons/core/data/JSONEntryDeserializer.java b/lib/commons-core/src/main/java/org/apache/olingo/commons/core/data/JSONEntryDeserializer.java
index 5730ee9..3493648 100644
--- a/lib/commons-core/src/main/java/org/apache/olingo/commons/core/data/JSONEntryDeserializer.java
+++ b/lib/commons-core/src/main/java/org/apache/olingo/commons/core/data/JSONEntryDeserializer.java
@@ -30,6 +30,7 @@ import java.util.HashSet;
 import java.util.Iterator;
 import java.util.Map;
 import java.util.Set;
+import org.apache.commons.lang3.StringUtils;
 import org.apache.olingo.commons.api.Constants;
 import org.apache.olingo.commons.api.data.Container;
 import org.apache.olingo.commons.api.data.Link;
@@ -55,17 +56,9 @@ public class JSONEntryDeserializer extends AbstractJsonDeserializer<JSONEntryImp
       throw new JsonParseException("Expected OData Entity, found EntitySet", parser.getCurrentLocation());
     }
 
-    final String metadataETag;
-    final URI contextURL;
     final JSONEntryImpl entry = new JSONEntryImpl();
 
-    if (tree.hasNonNull(Constants.JSON_METADATA_ETAG)) {
-      metadataETag = tree.get(Constants.JSON_METADATA_ETAG).textValue();
-      tree.remove(Constants.JSON_METADATA_ETAG);
-    } else {
-      metadataETag = null;
-    }
-
+    final URI contextURL;
     if (tree.hasNonNull(Constants.JSON_CONTEXT)) {
       contextURL = URI.create(tree.get(Constants.JSON_CONTEXT).textValue());
       tree.remove(Constants.JSON_CONTEXT);
@@ -75,10 +68,16 @@ public class JSONEntryDeserializer extends AbstractJsonDeserializer<JSONEntryImp
     } else {
       contextURL = null;
     }
-
     if (contextURL != null) {
-      String url = contextURL.toASCIIString();
-      entry.setBaseURI(url.substring(0, url.indexOf(Constants.METADATA)));
+      entry.setBaseURI(StringUtils.substringBefore(contextURL.toASCIIString(), Constants.METADATA));
+    }
+
+    final String metadataETag;
+    if (tree.hasNonNull(Constants.JSON_METADATA_ETAG)) {
+      metadataETag = tree.get(Constants.JSON_METADATA_ETAG).textValue();
+      tree.remove(Constants.JSON_METADATA_ETAG);
+    } else {
+      metadataETag = null;
     }
 
     if (tree.hasNonNull(jsonETag)) {

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/3bb39def/lib/commons-core/src/main/java/org/apache/olingo/commons/core/data/JSONEntrySerializer.java
----------------------------------------------------------------------
diff --git a/lib/commons-core/src/main/java/org/apache/olingo/commons/core/data/JSONEntrySerializer.java b/lib/commons-core/src/main/java/org/apache/olingo/commons/core/data/JSONEntrySerializer.java
index bdfa439..d12bdad 100644
--- a/lib/commons-core/src/main/java/org/apache/olingo/commons/core/data/JSONEntrySerializer.java
+++ b/lib/commons-core/src/main/java/org/apache/olingo/commons/core/data/JSONEntrySerializer.java
@@ -58,8 +58,15 @@ public class JSONEntrySerializer extends AbstractJsonSerializer<JSONEntryImpl> {
     }
 
     if (serverMode) {
-      if (version.compareTo(ODataServiceVersion.V40) >= 0 && StringUtils.isNotBlank(container.getMetadataETag())) {
-        jgen.writeStringField(Constants.JSON_METADATA_ETAG, container.getMetadataETag());
+      if (container.getContextURL() != null) {
+        jgen.writeStringField(version.compareTo(ODataServiceVersion.V40) >= 0
+                ? Constants.JSON_CONTEXT : Constants.JSON_METADATA,
+                container.getContextURL().toASCIIString());
+      }
+      if (version.compareTo(ODataServiceVersion.V40) >= 0) {
+        if (StringUtils.isNotBlank(container.getMetadataETag())) {
+          jgen.writeStringField(Constants.JSON_METADATA_ETAG, container.getMetadataETag());
+        }
       }
 
       if (StringUtils.isNotBlank(entry.getETag())) {

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/3bb39def/lib/commons-core/src/main/java/org/apache/olingo/commons/core/data/JSONFeedDeserializer.java
----------------------------------------------------------------------
diff --git a/lib/commons-core/src/main/java/org/apache/olingo/commons/core/data/JSONFeedDeserializer.java b/lib/commons-core/src/main/java/org/apache/olingo/commons/core/data/JSONFeedDeserializer.java
index 3c180b9..238e56b 100644
--- a/lib/commons-core/src/main/java/org/apache/olingo/commons/core/data/JSONFeedDeserializer.java
+++ b/lib/commons-core/src/main/java/org/apache/olingo/commons/core/data/JSONFeedDeserializer.java
@@ -47,17 +47,9 @@ public class JSONFeedDeserializer extends AbstractJsonDeserializer<JSONFeedImpl>
       return null;
     }
 
-    final String metadataETag;
-    final URI contextURL;
     final JSONFeedImpl feed = new JSONFeedImpl();
 
-    if (tree.hasNonNull(Constants.JSON_METADATA_ETAG)) {
-      metadataETag = tree.get(Constants.JSON_METADATA_ETAG).textValue();
-      tree.remove(Constants.JSON_METADATA_ETAG);
-    } else {
-      metadataETag = null;
-    }
-
+    final URI contextURL;
     if (tree.hasNonNull(Constants.JSON_CONTEXT)) {
       contextURL = URI.create(tree.get(Constants.JSON_CONTEXT).textValue());
       tree.remove(Constants.JSON_CONTEXT);
@@ -67,9 +59,16 @@ public class JSONFeedDeserializer extends AbstractJsonDeserializer<JSONFeedImpl>
     } else {
       contextURL = null;
     }
-
     feed.setMetadataContextURL(contextURL);
 
+    final String metadataETag;
+    if (tree.hasNonNull(Constants.JSON_METADATA_ETAG)) {
+      metadataETag = tree.get(Constants.JSON_METADATA_ETAG).textValue();
+      tree.remove(Constants.JSON_METADATA_ETAG);
+    } else {
+      metadataETag = null;
+    }
+
     if (tree.hasNonNull(Constants.JSON_COUNT)) {
       feed.setCount(tree.get(Constants.JSON_COUNT).asInt());
     }
@@ -81,8 +80,8 @@ public class JSONFeedDeserializer extends AbstractJsonDeserializer<JSONFeedImpl>
       for (final Iterator<JsonNode> itor = tree.get(Constants.VALUE).iterator(); itor.hasNext();) {
         feed.getEntries().add(
                 itor.next().traverse(parser.getCodec()).<Container<JSONEntryImpl>>readValueAs(
-                new TypeReference<JSONEntryImpl>() {
-        }).getObject());
+                        new TypeReference<JSONEntryImpl>() {
+                        }).getObject());
       }
     }
 

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/3bb39def/lib/commons-core/src/main/java/org/apache/olingo/commons/core/domain/AbstractODataObjectFactory.java
----------------------------------------------------------------------
diff --git a/lib/commons-core/src/main/java/org/apache/olingo/commons/core/domain/AbstractODataObjectFactory.java b/lib/commons-core/src/main/java/org/apache/olingo/commons/core/domain/AbstractODataObjectFactory.java
index 43853fa..0e438c5 100644
--- a/lib/commons-core/src/main/java/org/apache/olingo/commons/core/domain/AbstractODataObjectFactory.java
+++ b/lib/commons-core/src/main/java/org/apache/olingo/commons/core/domain/AbstractODataObjectFactory.java
@@ -39,29 +39,13 @@ public abstract class AbstractODataObjectFactory implements CommonODataObjectFac
   }
 
   @Override
-  public ODataInlineEntitySet newInlineEntitySet(final String name, final URI link,
-          final CommonODataEntitySet entitySet) {
-
-    return new ODataInlineEntitySet(version, link, ODataLinkType.ENTITY_SET_NAVIGATION, name, entitySet);
-  }
-
-  @Override
-  public ODataInlineEntitySet newInlineEntitySet(final String name, final URI baseURI, final String href,
-          final CommonODataEntitySet entitySet) {
-
-    return new ODataInlineEntitySet(version, baseURI, href, ODataLinkType.ENTITY_SET_NAVIGATION, name, entitySet);
-  }
-
-  @Override
-  public ODataInlineEntity newInlineEntity(final String name, final URI link, final CommonODataEntity entity) {
-    return new ODataInlineEntity(version, link, ODataLinkType.ENTITY_NAVIGATION, name, entity);
+  public ODataInlineEntitySet newDeepInsertEntitySet(final String name, final CommonODataEntitySet entitySet) {
+    return new ODataInlineEntitySet(version, null, ODataLinkType.ENTITY_SET_NAVIGATION, name, entitySet);
   }
 
   @Override
-  public ODataInlineEntity newInlineEntity(final String name, final URI baseURI, final String href,
-          final CommonODataEntity entity) {
-
-    return new ODataInlineEntity(version, baseURI, href, ODataLinkType.ENTITY_NAVIGATION, name, entity);
+  public ODataInlineEntity newDeepInsertEntity(final String name, final CommonODataEntity entity) {
+    return new ODataInlineEntity(version, null, ODataLinkType.ENTITY_NAVIGATION, name, entity);
   }
 
   @Override
@@ -71,45 +55,8 @@ public abstract class AbstractODataObjectFactory implements CommonODataObjectFac
   }
 
   @Override
-  public ODataLink newEntityNavigationLink(final String name, final URI baseURI, final String href) {
-    return new ODataLink.Builder().setVersion(version).setURI(baseURI, href).
-            setType(ODataLinkType.ENTITY_NAVIGATION).setTitle(name).build();
-  }
-
-  @Override
   public ODataLink newEntitySetNavigationLink(final String name, final URI link) {
     return new ODataLink.Builder().setVersion(version).setURI(link).
             setType(ODataLinkType.ENTITY_SET_NAVIGATION).setTitle(name).build();
   }
-
-  @Override
-  public ODataLink newEntitySetNavigationLink(final String name, final URI baseURI, final String href) {
-    return new ODataLink.Builder().setVersion(version).setURI(baseURI, href).
-            setType(ODataLinkType.ENTITY_SET_NAVIGATION).setTitle(name).build();
-  }
-
-  @Override
-  public ODataLink newAssociationLink(final String name, final URI link) {
-    return new ODataLink.Builder().setVersion(version).setURI(link).
-            setType(ODataLinkType.ASSOCIATION).setTitle(name).build();
-  }
-
-  @Override
-  public ODataLink newAssociationLink(final String name, final URI baseURI, final String href) {
-    return new ODataLink.Builder().setVersion(version).setURI(baseURI, href).
-            setType(ODataLinkType.ASSOCIATION).setTitle(name).build();
-  }
-
-  @Override
-  public ODataLink newMediaEditLink(final String name, final URI link) {
-    return new ODataLink.Builder().setVersion(version).setURI(link).
-            setType(ODataLinkType.MEDIA_EDIT).setTitle(name).build();
-  }
-
-  @Override
-  public ODataLink newMediaEditLink(final String name, final URI baseURI, final String href) {
-    return new ODataLink.Builder().setVersion(version).setURI(baseURI, href).
-            setType(ODataLinkType.MEDIA_EDIT).setTitle(name).build();
-  }
-
 }

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/3bb39def/lib/commons-core/src/main/java/org/apache/olingo/commons/core/domain/v3/ODataObjectFactoryImpl.java
----------------------------------------------------------------------
diff --git a/lib/commons-core/src/main/java/org/apache/olingo/commons/core/domain/v3/ODataObjectFactoryImpl.java b/lib/commons-core/src/main/java/org/apache/olingo/commons/core/domain/v3/ODataObjectFactoryImpl.java
index 1f41c59..f488ed9 100644
--- a/lib/commons-core/src/main/java/org/apache/olingo/commons/core/domain/v3/ODataObjectFactoryImpl.java
+++ b/lib/commons-core/src/main/java/org/apache/olingo/commons/core/domain/v3/ODataObjectFactoryImpl.java
@@ -22,6 +22,8 @@ import java.net.URI;
 import org.apache.olingo.commons.api.domain.CommonODataProperty;
 import org.apache.olingo.commons.api.domain.ODataCollectionValue;
 import org.apache.olingo.commons.api.domain.ODataComplexValue;
+import org.apache.olingo.commons.api.domain.ODataLink;
+import org.apache.olingo.commons.api.domain.ODataLinkType;
 import org.apache.olingo.commons.api.domain.ODataPrimitiveValue;
 import org.apache.olingo.commons.api.domain.ODataValue;
 import org.apache.olingo.commons.api.domain.v3.ODataEntitySet;
@@ -61,6 +63,11 @@ public class ODataObjectFactoryImpl extends AbstractODataObjectFactory implement
   }
 
   @Override
+  public ODataLink newAssociationLink(final URI link) {
+    return new ODataLink.Builder().setVersion(version).setURI(link).setType(ODataLinkType.ASSOCIATION).build();
+  }
+
+  @Override
   public ODataPrimitiveValue.Builder newPrimitiveValueBuilder() {
     return new ODataPrimitiveValueImpl.BuilderImpl(version);
   }