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/03/09 17:51:00 UTC

[3/3] git commit: [OLINGO-194] V4 URIBuilder and FilterFactory implemented

[OLINGO-194] V4 URIBuilder and FilterFactory implemented


Project: http://git-wip-us.apache.org/repos/asf/incubator-olingo-odata4/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-olingo-odata4/commit/edf8ab9d
Tree: http://git-wip-us.apache.org/repos/asf/incubator-olingo-odata4/tree/edf8ab9d
Diff: http://git-wip-us.apache.org/repos/asf/incubator-olingo-odata4/diff/edf8ab9d

Branch: refs/heads/master
Commit: edf8ab9d3a4907e364148deaba53c38a99630117
Parents: a9f74a8
Author: Francesco Chicchiriccò <il...@apache.org>
Authored: Sun Mar 9 17:50:37 2014 +0100
Committer: Francesco Chicchiriccò <il...@apache.org>
Committed: Sun Mar 9 17:50:37 2014 +0100

----------------------------------------------------------------------
 .../olingo/odata4/client/api/Configuration.java |  18 --
 .../olingo/odata4/client/api/ODataClient.java   |   2 +-
 .../olingo/odata4/client/api/ODataV3Client.java |  39 ++++
 .../olingo/odata4/client/api/ODataV4Client.java |  39 ++++
 .../odata4/client/api/V3Configuration.java      |  44 +++++
 .../odata4/client/api/V4Configuration.java      |  24 +++
 .../odata4/client/api/data/ServiceDocument.java |   3 +-
 .../client/api/edm/xml/v4/XMLMetadata.java      |  36 ++++
 .../client/api/op/ODataV3Deserializer.java      |  23 +++
 .../client/api/op/ODataV4Deserializer.java      |  29 +++
 .../odata4/client/api/uri/QueryOption.java      |  40 ++--
 .../odata4/client/api/uri/SegmentType.java      |  21 ++-
 .../odata4/client/api/uri/URIBuilder.java       | 167 +++++++----------
 .../odata4/client/api/uri/V3URIBuilder.java     |  47 +++++
 .../odata4/client/api/uri/V4URIBuilder.java     |  87 +++++++++
 .../client/api/uri/filter/FilterArgFactory.java |  83 +++++++++
 .../client/api/uri/filter/FilterFactory.java    |   2 +
 .../api/uri/filter/V3FilterArgFactory.java      |  25 +++
 .../client/api/uri/filter/V3FilterFactory.java  |  26 +++
 .../api/uri/filter/V4FilterArgFactory.java      |  55 ++++++
 .../client/api/uri/filter/V4FilterFactory.java  |  32 ++++
 .../client/core/AbstractConfiguration.java      |  16 +-
 .../odata4/client/core/ODataClientFactory.java  |   8 +-
 .../odata4/client/core/ODataV3Client.java       | 138 --------------
 .../odata4/client/core/ODataV3ClientImpl.java   | 146 +++++++++++++++
 .../odata4/client/core/ODataV4Client.java       | 138 --------------
 .../odata4/client/core/ODataV4ClientImpl.java   | 146 +++++++++++++++
 .../odata4/client/core/V3Configuration.java     |  29 ---
 .../odata4/client/core/V3ConfigurationImpl.java |  57 ++++++
 .../odata4/client/core/V4Configuration.java     |  29 ---
 .../odata4/client/core/V4ConfigurationImpl.java |  31 ++++
 .../client/core/edm/xml/v4/XMLMetadataImpl.java |   3 +-
 .../client/core/op/impl/ODataV3BinderImpl.java  |  37 ++++
 .../core/op/impl/ODataV3DeserializerImpl.java   |  69 +++++++
 .../client/core/op/impl/ODataV3ReaderImpl.java  |  47 +++++
 .../core/op/impl/ODataV3SerializerImpl.java     |  32 ++++
 .../client/core/op/impl/ODataV4BinderImpl.java  |  62 +++++++
 .../core/op/impl/ODataV4DeserializerImpl.java   |  70 +++++++
 .../client/core/op/impl/ODataV4ReaderImpl.java  |  47 +++++
 .../core/op/impl/ODataV4SerializerImpl.java     |  32 ++++
 .../client/core/op/impl/v3/ODataBinderImpl.java |  37 ----
 .../core/op/impl/v3/ODataDeserializerImpl.java  |  68 -------
 .../client/core/op/impl/v3/ODataReaderImpl.java |  47 -----
 .../core/op/impl/v3/ODataSerializerImpl.java    |  32 ----
 .../client/core/op/impl/v4/ODataBinderImpl.java |  62 -------
 .../core/op/impl/v4/ODataDeserializerImpl.java  |  68 -------
 .../client/core/op/impl/v4/ODataReaderImpl.java |  47 -----
 .../core/op/impl/v4/ODataSerializerImpl.java    |  32 ----
 .../client/core/uri/AbstractURIBuilder.java     | 181 +++++++++++--------
 .../olingo/odata4/client/core/uri/URIUtils.java |   2 +-
 .../odata4/client/core/uri/V3URIBuilder.java    |  39 ----
 .../client/core/uri/V3URIBuilderImpl.java       |  93 ++++++++++
 .../odata4/client/core/uri/V4URIBuilder.java    |  39 ----
 .../client/core/uri/V4URIBuilderImpl.java       | 101 +++++++++++
 .../uri/filter/AbstractFilterArgFactory.java    | 178 ++++++++++++++++++
 .../core/uri/filter/AbstractFilterFactory.java  |  16 +-
 .../core/uri/filter/FilterArgFactory.java       | 155 ----------------
 .../client/core/uri/filter/FilterConst.java     |  41 +++++
 .../client/core/uri/filter/FilterFunction.java  |   6 +-
 .../client/core/uri/filter/FilterLambda.java    |  46 +++++
 .../client/core/uri/filter/HasFilter.java       |  34 ++++
 .../core/uri/filter/V3FilterArgFactoryImpl.java |  31 ++++
 .../client/core/uri/filter/V3FilterFactory.java |  25 ---
 .../core/uri/filter/V3FilterFactoryImpl.java    |  33 ++++
 .../core/uri/filter/V4FilterArgFactoryImpl.java | 107 +++++++++++
 .../client/core/uri/filter/V4FilterFactory.java |  25 ---
 .../core/uri/filter/V4FilterFactoryImpl.java    |  46 +++++
 .../olingo/odata4/client/core/AbstractTest.java |   2 +
 .../client/core/v3/FilterFactoryTest.java       | 112 +++++++-----
 .../odata4/client/core/v3/MetadataTest.java     |   8 +-
 .../client/core/v3/ServiceDocumentTest.java     |   2 +-
 .../odata4/client/core/v3/URIBuilderTest.java   |  87 ++++++---
 .../client/core/v4/FilterFactoryTest.java       |  84 +++++++++
 .../odata4/client/core/v4/MetadataTest.java     |  14 +-
 .../client/core/v4/ServiceDocumentTest.java     |   2 +-
 .../odata4/client/core/v4/URIBuilderTest.java   | 133 ++++++++++++++
 76 files changed, 2676 insertions(+), 1338 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-olingo-odata4/blob/edf8ab9d/odata4-lib/odata4-client-api/src/main/java/org/apache/olingo/odata4/client/api/Configuration.java
----------------------------------------------------------------------
diff --git a/odata4-lib/odata4-client-api/src/main/java/org/apache/olingo/odata4/client/api/Configuration.java b/odata4-lib/odata4-client-api/src/main/java/org/apache/olingo/odata4/client/api/Configuration.java
index 521c5a7..6e69032 100644
--- a/odata4-lib/odata4-client-api/src/main/java/org/apache/olingo/odata4/client/api/Configuration.java
+++ b/odata4-lib/odata4-client-api/src/main/java/org/apache/olingo/odata4/client/api/Configuration.java
@@ -137,24 +137,6 @@ public interface Configuration extends Serializable {
   void setUseXHTTPMethod(boolean value);
 
   /**
-   * Checks whether URIs contain entity key between parentheses (standard) or instead as additional segment. Example:
-   * http://services.odata.org/V4/OData/OData.svc/Products(0) or http://services.odata.org/V4/OData/OData.svc/Products/0
-   *
-   * @return whether URIs shall be built with entity key between parentheses (standard) or instead as additional
-   * segment.
-   */
-  boolean isKeyAsSegment();
-
-  /**
-   * Sets whether URIs shall be built with entity key between parentheses (standard) or instead as additional segment.
-   * Example: http://services.odata.org/V4/OData/OData.svc/Products(0) or
-   * http://services.odata.org/V4/OData/OData.svc/Products/0
-   * 
-   * @param value 'TRUE' to use this feature.
-   */
-  void setKeyAsSegment(boolean value);
-
-  /**
    * Checks whether Gzip compression (e.g. support for <tt>Accept-Encoding: gzip</tt> and
    * <tt>Content-Encoding: gzip</tt> HTTP headers) is enabled.
    *

http://git-wip-us.apache.org/repos/asf/incubator-olingo-odata4/blob/edf8ab9d/odata4-lib/odata4-client-api/src/main/java/org/apache/olingo/odata4/client/api/ODataClient.java
----------------------------------------------------------------------
diff --git a/odata4-lib/odata4-client-api/src/main/java/org/apache/olingo/odata4/client/api/ODataClient.java b/odata4-lib/odata4-client-api/src/main/java/org/apache/olingo/odata4/client/api/ODataClient.java
index ea78644..b13c866 100644
--- a/odata4-lib/odata4-client-api/src/main/java/org/apache/olingo/odata4/client/api/ODataClient.java
+++ b/odata4-lib/odata4-client-api/src/main/java/org/apache/olingo/odata4/client/api/ODataClient.java
@@ -33,7 +33,7 @@ public interface ODataClient {
   //ODataHeaders getVersionHeaders();
   Configuration getConfiguration();
 
-  URIBuilder getURIBuilder(String serviceRoot);
+  URIBuilder<?> getURIBuilder(String serviceRoot);
 
   FilterFactory getFilterFactory();
 

http://git-wip-us.apache.org/repos/asf/incubator-olingo-odata4/blob/edf8ab9d/odata4-lib/odata4-client-api/src/main/java/org/apache/olingo/odata4/client/api/ODataV3Client.java
----------------------------------------------------------------------
diff --git a/odata4-lib/odata4-client-api/src/main/java/org/apache/olingo/odata4/client/api/ODataV3Client.java b/odata4-lib/odata4-client-api/src/main/java/org/apache/olingo/odata4/client/api/ODataV3Client.java
new file mode 100644
index 0000000..ed2d413
--- /dev/null
+++ b/odata4-lib/odata4-client-api/src/main/java/org/apache/olingo/odata4/client/api/ODataV3Client.java
@@ -0,0 +1,39 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.olingo.odata4.client.api;
+
+import org.apache.olingo.odata4.client.api.op.ODataV3Deserializer;
+import org.apache.olingo.odata4.client.api.uri.V3URIBuilder;
+import org.apache.olingo.odata4.client.api.uri.filter.V3FilterFactory;
+
+public interface ODataV3Client extends ODataClient {
+
+  @Override
+  V3Configuration getConfiguration();
+
+  @Override
+  V3URIBuilder getURIBuilder(String serviceRoot);
+
+  @Override
+  V3FilterFactory getFilterFactory();
+
+  @Override
+  ODataV3Deserializer getDeserializer();
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-olingo-odata4/blob/edf8ab9d/odata4-lib/odata4-client-api/src/main/java/org/apache/olingo/odata4/client/api/ODataV4Client.java
----------------------------------------------------------------------
diff --git a/odata4-lib/odata4-client-api/src/main/java/org/apache/olingo/odata4/client/api/ODataV4Client.java b/odata4-lib/odata4-client-api/src/main/java/org/apache/olingo/odata4/client/api/ODataV4Client.java
new file mode 100644
index 0000000..1f493b3
--- /dev/null
+++ b/odata4-lib/odata4-client-api/src/main/java/org/apache/olingo/odata4/client/api/ODataV4Client.java
@@ -0,0 +1,39 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.olingo.odata4.client.api;
+
+import org.apache.olingo.odata4.client.api.op.ODataV4Deserializer;
+import org.apache.olingo.odata4.client.api.uri.V4URIBuilder;
+import org.apache.olingo.odata4.client.api.uri.filter.V4FilterFactory;
+
+public interface ODataV4Client extends ODataClient {
+
+  @Override
+  V4Configuration getConfiguration();
+
+  @Override
+  V4URIBuilder getURIBuilder(String serviceRoot);
+
+  @Override
+  V4FilterFactory getFilterFactory();
+
+  @Override
+  ODataV4Deserializer getDeserializer();
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-olingo-odata4/blob/edf8ab9d/odata4-lib/odata4-client-api/src/main/java/org/apache/olingo/odata4/client/api/V3Configuration.java
----------------------------------------------------------------------
diff --git a/odata4-lib/odata4-client-api/src/main/java/org/apache/olingo/odata4/client/api/V3Configuration.java b/odata4-lib/odata4-client-api/src/main/java/org/apache/olingo/odata4/client/api/V3Configuration.java
new file mode 100644
index 0000000..c391705
--- /dev/null
+++ b/odata4-lib/odata4-client-api/src/main/java/org/apache/olingo/odata4/client/api/V3Configuration.java
@@ -0,0 +1,44 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.olingo.odata4.client.api;
+
+public interface V3Configuration extends Configuration {
+
+  /**
+   * Checks whether URIs contain entity key between parentheses (standard) or instead as additional segment.
+   * <br/>
+   * Example: http://services.odata.org/V4/OData/OData.svc/Products(0) or
+   * http://services.odata.org/V4/OData/OData.svc/Products/0
+   *
+   * @return whether URIs shall be built with entity key between parentheses (standard) or instead as additional
+   * segment.
+   */
+  boolean isKeyAsSegment();
+
+  /**
+   * Sets whether URIs shall be built with entity key between parentheses (standard) or instead as additional segment.
+   * <br/>
+   * Example: http://services.odata.org/V4/OData/OData.svc/Products(0) or
+   * http://services.odata.org/V4/OData/OData.svc/Products/0
+   *
+   * @param value 'TRUE' to use this feature.
+   */
+  void setKeyAsSegment(boolean value);
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-olingo-odata4/blob/edf8ab9d/odata4-lib/odata4-client-api/src/main/java/org/apache/olingo/odata4/client/api/V4Configuration.java
----------------------------------------------------------------------
diff --git a/odata4-lib/odata4-client-api/src/main/java/org/apache/olingo/odata4/client/api/V4Configuration.java b/odata4-lib/odata4-client-api/src/main/java/org/apache/olingo/odata4/client/api/V4Configuration.java
new file mode 100644
index 0000000..668b0aa
--- /dev/null
+++ b/odata4-lib/odata4-client-api/src/main/java/org/apache/olingo/odata4/client/api/V4Configuration.java
@@ -0,0 +1,24 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.olingo.odata4.client.api;
+
+public interface V4Configuration extends Configuration {
+  
+}

http://git-wip-us.apache.org/repos/asf/incubator-olingo-odata4/blob/edf8ab9d/odata4-lib/odata4-client-api/src/main/java/org/apache/olingo/odata4/client/api/data/ServiceDocument.java
----------------------------------------------------------------------
diff --git a/odata4-lib/odata4-client-api/src/main/java/org/apache/olingo/odata4/client/api/data/ServiceDocument.java b/odata4-lib/odata4-client-api/src/main/java/org/apache/olingo/odata4/client/api/data/ServiceDocument.java
index b36e1c5..acd6103 100644
--- a/odata4-lib/odata4-client-api/src/main/java/org/apache/olingo/odata4/client/api/data/ServiceDocument.java
+++ b/odata4-lib/odata4-client-api/src/main/java/org/apache/olingo/odata4/client/api/data/ServiceDocument.java
@@ -20,12 +20,11 @@ package org.apache.olingo.odata4.client.api.data;
 
 import java.net.URI;
 import java.util.List;
-import org.apache.olingo.odata4.client.api.domain.ODataServiceDocument;
 
 /**
  * REST resource for an <tt>ODataServiceDocument</tt>.
  *
- * @see ODataServiceDocument
+ * @see org.apache.olingo.odata4.client.api.domain.ODataServiceDocument
  */
 public interface ServiceDocument {
 

http://git-wip-us.apache.org/repos/asf/incubator-olingo-odata4/blob/edf8ab9d/odata4-lib/odata4-client-api/src/main/java/org/apache/olingo/odata4/client/api/edm/xml/v4/XMLMetadata.java
----------------------------------------------------------------------
diff --git a/odata4-lib/odata4-client-api/src/main/java/org/apache/olingo/odata4/client/api/edm/xml/v4/XMLMetadata.java b/odata4-lib/odata4-client-api/src/main/java/org/apache/olingo/odata4/client/api/edm/xml/v4/XMLMetadata.java
new file mode 100644
index 0000000..5b8d851
--- /dev/null
+++ b/odata4-lib/odata4-client-api/src/main/java/org/apache/olingo/odata4/client/api/edm/xml/v4/XMLMetadata.java
@@ -0,0 +1,36 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.olingo.odata4.client.api.edm.xml.v4;
+
+import java.util.List;
+
+public interface XMLMetadata extends org.apache.olingo.odata4.client.api.edm.xml.XMLMetadata {
+
+  @Override
+  List<Schema> getSchemas();
+
+  @Override
+  Schema getSchema(int index);
+
+  @Override
+  Schema getSchema(String key);
+
+  List<Reference> getReferences();
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-olingo-odata4/blob/edf8ab9d/odata4-lib/odata4-client-api/src/main/java/org/apache/olingo/odata4/client/api/op/ODataV3Deserializer.java
----------------------------------------------------------------------
diff --git a/odata4-lib/odata4-client-api/src/main/java/org/apache/olingo/odata4/client/api/op/ODataV3Deserializer.java b/odata4-lib/odata4-client-api/src/main/java/org/apache/olingo/odata4/client/api/op/ODataV3Deserializer.java
new file mode 100644
index 0000000..0b9edc9
--- /dev/null
+++ b/odata4-lib/odata4-client-api/src/main/java/org/apache/olingo/odata4/client/api/op/ODataV3Deserializer.java
@@ -0,0 +1,23 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.olingo.odata4.client.api.op;
+
+public interface ODataV3Deserializer extends ODataDeserializer {
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-olingo-odata4/blob/edf8ab9d/odata4-lib/odata4-client-api/src/main/java/org/apache/olingo/odata4/client/api/op/ODataV4Deserializer.java
----------------------------------------------------------------------
diff --git a/odata4-lib/odata4-client-api/src/main/java/org/apache/olingo/odata4/client/api/op/ODataV4Deserializer.java b/odata4-lib/odata4-client-api/src/main/java/org/apache/olingo/odata4/client/api/op/ODataV4Deserializer.java
new file mode 100644
index 0000000..5d54130
--- /dev/null
+++ b/odata4-lib/odata4-client-api/src/main/java/org/apache/olingo/odata4/client/api/op/ODataV4Deserializer.java
@@ -0,0 +1,29 @@
+/*
+ * 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.olingo.odata4.client.api.op;
+
+import java.io.InputStream;
+import org.apache.olingo.odata4.client.api.edm.xml.v4.XMLMetadata;
+
+public interface ODataV4Deserializer extends ODataDeserializer {
+
+  @Override
+  XMLMetadata toMetadata(InputStream input);
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-olingo-odata4/blob/edf8ab9d/odata4-lib/odata4-client-api/src/main/java/org/apache/olingo/odata4/client/api/uri/QueryOption.java
----------------------------------------------------------------------
diff --git a/odata4-lib/odata4-client-api/src/main/java/org/apache/olingo/odata4/client/api/uri/QueryOption.java b/odata4-lib/odata4-client-api/src/main/java/org/apache/olingo/odata4/client/api/uri/QueryOption.java
index 067fec5..544a71a 100644
--- a/odata4-lib/odata4-client-api/src/main/java/org/apache/olingo/odata4/client/api/uri/QueryOption.java
+++ b/odata4-lib/odata4-client-api/src/main/java/org/apache/olingo/odata4/client/api/uri/QueryOption.java
@@ -24,64 +24,72 @@ package org.apache.olingo.odata4.client.api.uri;
 public enum QueryOption {
 
   /**
+   * The entity-id specified by $id may be expressed absolute or relative to the request URL.
+   */
+  ID,
+  /**
+   * The $count system query option allows clients to request a count of the matching resources included with the
+   * resources in the response. The $count query option has a Boolean value of true or false.
+   */
+  COUNT,
+  /**
    * This option indicates entities associated with the EntityType instance or EntitySet, identified by the resource
    * path section of the URI, and MUST be represented inline in the data service's response.
    */
-  EXPAND("expand"),
+  EXPAND,
   /**
    * This option specifies the media type acceptable in a response. If present, this value SHOULD take precedence over
    * value(s) specified in an Accept request header.
    */
-  FORMAT("format"),
+  FORMAT,
   /**
    * This option is used to specify that a subset of the properties of the entities identified by the path of the
    * request URI and $expand query option SHOULD be returned in the response from the data service.
    */
-  SELECT("select"),
+  SELECT,
   /**
    * This option specifies the sort properties and sort direction (ascending or descending) that the data service MUST
    * use to order the entities in the EntitySet, identified by the resource path section of the URI.
    */
-  ORDERBY("orderby"),
+  ORDERBY,
   /**
    * This option specifies a positive integer N that is the maximum number of entities in the EntitySet, identified by
    * the resource path section of the URI, that the data service MUST return.
    */
-  TOP("top"),
+  TOP,
   /**
    * This option specifies a positive integer N that represents the number of entities, counted from the first entity in
    * the EntitySet and ordered as specified by the $orderby option, that the data service should skip when returning the
    * entities in the EntitySet, which is identified by the resource path section of the URI. The data service SHOULD
    * return all subsequent entities, starting from the one in position N+1.
    */
-  SKIP("skip"),
+  SKIP,
   /**
    * This query option applies only to the OData 2.0 protocol to the AtomPub protocol. The value of a $skiptoken query
    * option is an opaque token which identifies an index into the collection of entities identified by the URI
    * containing the $skiptoken parameter.
    */
-  SKIPTOKEN("skiptoken"),
+  SKIPTOKEN,
   /**
    * This option specifies a predicate used to filter the elements from the EntitySet identified by the resource path
    * section of the URI.
    */
-  FILTER("filter"),
+  FILTER,
   /**
    * For a value of "allpages", this option indicates that the response to the request MUST include the count of the
    * number of entities in the EntitySet, identified by the resource path section of the URI after all $filter system
    * query options have been applied. For a value of "none", this option indicates that the response to the request MUST
    * NOT include the count value.
    */
-  INLINECOUNT("inlinecount");
-
-  final String option;
-
-  QueryOption(final String option) {
-    this.option = option;
-  }
+  INLINECOUNT,
+  /**
+   * Search expressions are used within the $search system query option to request entities matching the specified
+   * expression.
+   */
+  SEARCH;
 
   @Override
   public String toString() {
-    return option;
+    return name().toLowerCase();
   }
 }

http://git-wip-us.apache.org/repos/asf/incubator-olingo-odata4/blob/edf8ab9d/odata4-lib/odata4-client-api/src/main/java/org/apache/olingo/odata4/client/api/uri/SegmentType.java
----------------------------------------------------------------------
diff --git a/odata4-lib/odata4-client-api/src/main/java/org/apache/olingo/odata4/client/api/uri/SegmentType.java b/odata4-lib/odata4-client-api/src/main/java/org/apache/olingo/odata4/client/api/uri/SegmentType.java
index a029c0d..e3121b9 100644
--- a/odata4-lib/odata4-client-api/src/main/java/org/apache/olingo/odata4/client/api/uri/SegmentType.java
+++ b/odata4-lib/odata4-client-api/src/main/java/org/apache/olingo/odata4/client/api/uri/SegmentType.java
@@ -25,21 +25,32 @@ import org.apache.commons.lang3.StringUtils;
  */
 public enum SegmentType {
 
+  ENTITY("$entity"),
   ENTITYSET,
-  ENTITYTYPE,
+  SINGLETON,
   KEY,
   KEY_AS_SEGMENT,
+  PROPERTY,
   NAVIGATION,
-  STRUCTURAL,
+  DERIVED_ENTITY_TYPE,
   VALUE("$value"),
-  FUNCTIONIMPORT,
+  BOUND_OPERATION,
+  UNBOUND_OPERATION,
   METADATA("$metadata"),
   BATCH("$batch"),
   LINKS("$links"),
-  COUNT("$count"),
+  REF("$ref"),
+  CROSS_JOIN("$crossjoin"),
+  ALL("$all"),
+  /**
+   * For query options like as $count that needs to stay in their own segment, right after service root.
+   *
+   * @see QueryOption#COUNT
+   */
+  ROOT_QUERY_OPTION,
   SERVICEROOT;
 
-  private String value;
+  private final String value;
 
   private SegmentType() {
     this.value = StringUtils.EMPTY;

http://git-wip-us.apache.org/repos/asf/incubator-olingo-odata4/blob/edf8ab9d/odata4-lib/odata4-client-api/src/main/java/org/apache/olingo/odata4/client/api/uri/URIBuilder.java
----------------------------------------------------------------------
diff --git a/odata4-lib/odata4-client-api/src/main/java/org/apache/olingo/odata4/client/api/uri/URIBuilder.java b/odata4-lib/odata4-client-api/src/main/java/org/apache/olingo/odata4/client/api/uri/URIBuilder.java
index b3104ff..bf23b7d 100644
--- a/odata4-lib/odata4-client-api/src/main/java/org/apache/olingo/odata4/client/api/uri/URIBuilder.java
+++ b/odata4-lib/odata4-client-api/src/main/java/org/apache/olingo/odata4/client/api/uri/URIBuilder.java
@@ -19,231 +19,200 @@
 package org.apache.olingo.odata4.client.api.uri;
 
 import org.apache.olingo.odata4.client.api.uri.filter.URIFilter;
-import java.io.Serializable;
 import java.net.URI;
 import java.util.Map;
 
 /**
  * OData URI builder.
  */
-public interface URIBuilder extends Serializable {
-
-  public static class Segment {
-
-    private final SegmentType type;
-
-    private final String value;
-
-    public Segment(final SegmentType type, final String value) {
-      this.type = type;
-      this.value = value;
-    }
-
-    public SegmentType getType() {
-      return type;
-    }
-
-    public String getValue() {
-      return value;
-    }
-
-  }
+public interface URIBuilder<UB extends URIBuilder<?>> {
 
   /**
    * Adds the specified query option to the URI.
    *
    * @param option query option.
    * @param value query option value.
-   * @return current ODataURIBuilder object.
+   * @return current URIBuilder instance
    */
-  URIBuilder addQueryOption(QueryOption option, String value);
+  UB addQueryOption(QueryOption option, String value);
 
   /**
    * Adds the specified (custom) query option to the URI.
    *
    * @param option query option.
    * @param value query option value.
-   * @return current ODataURIBuilder object.
+   * @return current URIBuilder instance
    */
-  URIBuilder addQueryOption(String option, String value);
+  UB addQueryOption(String option, String value);
 
   /**
-   * Append EntitySet segment to the URI.
+   * Appends EntitySet segment to the URI.
    *
    * @param segmentValue segment value.
-   * @return current ODataURIBuilder object.
+   * @return current URIBuilder instance
    */
-  URIBuilder appendEntitySetSegment(String segmentValue);
+  UB appendEntitySetSegment(String segmentValue);
 
   /**
-   * Append EntityType segment to the URI.
+   * Appends key segment to the URI.
    *
-   * @param segmentValue segment value.
-   * @return current ODataURIBuilder object.
+   * @param val segment value.
+   * @return current URIBuilder instance
    */
-  URIBuilder appendEntityTypeSegment(String segmentValue);
+  UB appendKeySegment(Object val);
 
   /**
-   * Append key segment to the URI.
+   * Appends key segment to the URI, for multiple keys.
    *
-   * @param val segment value.
-   * @return current ODataURIBuilder object.
+   * @param segmentValues segment values.
+   * @return current URIBuilder instance
    */
-  URIBuilder appendKeySegment(Object val);
+  UB appendKeySegment(Map<String, Object> segmentValues);
 
   /**
-   * Append key segment to the URI, for multiple keys.
+   * Appends property segment to the URI.
    *
-   * @param segmentValues segment values.
-   * @return current ODataURIBuilder object.
+   * @param segmentValue segment value.
+   * @return current URIBuilder instance
    */
-  URIBuilder appendKeySegment(Map<String, Object> segmentValues);
+  UB appendPropertySegment(String segmentValue);
 
   /**
-   * Append navigation link segment to the URI.
+   * Appends navigation segment to the URI.
    *
    * @param segmentValue segment value.
-   * @return current ODataURIBuilder object.
+   * @return current URIBuilder instance
    */
-  URIBuilder appendNavigationLinkSegment(String segmentValue);
+  UB appendNavigationSegment(String segmentValue);
 
   /**
-   * Append structural segment to the URI.
+   * Appends derived entity type segment to the URI.
    *
    * @param segmentValue segment value.
-   * @return current ODataURIBuilder object.
+   * @return current URIBuilder instance
    */
-  URIBuilder appendStructuralSegment(String segmentValue);
-
-  URIBuilder appendLinksSegment(String segmentValue);
+  UB appendDerivedEntityTypeSegment(String segmentValue);
 
   /**
-   * Append value segment to the URI.
+   * Appends value segment to the URI.
    *
-   * @return current ODataURIBuilder object.
+   * @return current URIBuilder instance
    */
-  URIBuilder appendValueSegment();
+  UB appendValueSegment();
 
   /**
-   * Append count segment to the URI.
+   * Appends operation (action or function) segment to the URI.
    *
-   * @return current ODataURIBuilder object.
+   * @param operation Operation (action or function) name
+   * @param arguments Operation arguments
+   * @return current URIBuilder instance
    */
-  URIBuilder appendCountSegment();
+  UB appendOperationCallSegment(String operation, Map<String, Object> arguments);
 
   /**
-   * Append function import segment to the URI.
+   * Appends metadata segment to the URI.
    *
-   * @param segmentValue segment value.
-   * @return current ODataURIBuilder object.
+   * @return current URIBuilder instance
    */
-  URIBuilder appendFunctionImportSegment(String segmentValue);
+  UB appendMetadataSegment();
 
   /**
-   * Append metadata segment to the URI.
+   * Appends batch segment to the URI.
    *
-   * @return current ODataURIBuilder object.
+   * @return current URIBuilder instance
    */
-  URIBuilder appendMetadataSegment();
+  UB appendBatchSegment();
 
   /**
-   * Append batch segment to the URI.
+   * Adds count query option.
    *
-   * @return current ODataURIBuilder object.
+   * @return current URIBuilder instance
    */
-  URIBuilder appendBatchSegment();
+  UB count();
 
   /**
    * Adds expand query option.
    *
-   * @param entityName entity object to be in-line expanded.
-   * @return current ODataURIBuilder object.
+   * @param expandItems items to be expanded in-line
+   * @return current URIBuilder instance
    * @see QueryOption#EXPAND
    */
-  URIBuilder expand(String entityName);
+  UB expand(String... expandItems);
 
   /**
    * Adds format query option.
    *
    * @param format media type acceptable in a response.
-   * @return current ODataURIBuilder object.
+   * @return current URIBuilder instance
    * @see QueryOption#FORMAT
    */
-  URIBuilder format(String format);
+  UB format(String format);
 
   /**
    * Adds filter for filter query option.
    *
    * @param filter filter instance (to be obtained via <tt>ODataFilterFactory</tt>): note that <tt>build()</tt> method
    * will be immediately invoked.
-   * @return current ODataURIBuilder object.
+   * @return current URIBuilder instance
    * @see QueryOption#FILTER
-   * @see ODataFilter
-   * @see FilterFactory
+   * @see URIFilter
+   * @see org.apache.olingo.odata4.client.api.uri.filter.FilterFactory
    */
-  URIBuilder filter(URIFilter filter);
+  UB filter(URIFilter filter);
 
   /**
    * Adds filter query option.
    *
    * @param filter filter string.
-   * @return current ODataURIBuilder object.
+   * @return current URIBuilder instance
    * @see QueryOption#FILTER
    */
-  URIBuilder filter(String filter);
+  UB filter(String filter);
 
   /**
    * Adds select query option.
    *
-   * @param select select query option value.
-   * @return current ODataURIBuilder object.
+   * @param selectItems select items
+   * @return current URIBuilder instance
    * @see QueryOption#SELECT
    */
-  URIBuilder select(String select);
+  UB select(String... selectItems);
 
   /**
    * Adds orderby query option.
    *
    * @param order order string.
-   * @return current ODataURIBuilder object.
+   * @return current URIBuilder instance
    * @see QueryOption#ORDERBY
    */
-  URIBuilder orderBy(String order);
+  UB orderBy(String order);
 
   /**
    * Adds top query option.
    *
    * @param top maximum number of entities to be returned.
-   * @return current ODataURIBuilder object.
+   * @return current URIBuilder instance
    * @see QueryOption#TOP
    */
-  URIBuilder top(int top);
+  UB top(int top);
 
   /**
    * Adds skip query option.
    *
    * @param skip number of entities to be skipped into the response.
-   * @return current ODataURIBuilder object.
+   * @return current URIBuilder instance
    * @see QueryOption#SKIP
    */
-  URIBuilder skip(int skip);
+  UB skip(int skip);
 
   /**
    * Adds skiptoken query option.
    *
    * @param skipToken opaque token.
-   * @return current ODataURIBuilder object.
+   * @return current URIBuilder instance
    * @see QueryOption#SKIPTOKEN
    */
-  URIBuilder skipToken(String skipToken);
-
-  /**
-   * Adds inlinecount query option.
-   *
-   * @return current ODataURIBuilder object.
-   * @see QueryOption#INLINECOUNT
-   */
-  URIBuilder inlineCount();
+  UB skipToken(String skipToken);
 
   /**
    * Build OData URI.
@@ -252,10 +221,4 @@ public interface URIBuilder extends Serializable {
    */
   URI build();
 
-  /**
-   * ${@inheritDoc }
-   */
-  @Override
-  String toString();
-
 }

http://git-wip-us.apache.org/repos/asf/incubator-olingo-odata4/blob/edf8ab9d/odata4-lib/odata4-client-api/src/main/java/org/apache/olingo/odata4/client/api/uri/V3URIBuilder.java
----------------------------------------------------------------------
diff --git a/odata4-lib/odata4-client-api/src/main/java/org/apache/olingo/odata4/client/api/uri/V3URIBuilder.java b/odata4-lib/odata4-client-api/src/main/java/org/apache/olingo/odata4/client/api/uri/V3URIBuilder.java
new file mode 100644
index 0000000..ad0dfe4
--- /dev/null
+++ b/odata4-lib/odata4-client-api/src/main/java/org/apache/olingo/odata4/client/api/uri/V3URIBuilder.java
@@ -0,0 +1,47 @@
+/*
+ * 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.olingo.odata4.client.api.uri;
+
+public interface V3URIBuilder extends URIBuilder<V3URIBuilder> {
+
+  public enum InlineCount {
+
+    allpages,
+    none
+
+  }
+
+  /**
+   * Appends links segment to the URI.
+   *
+   * @param segmentValue segment value
+   * @return current URIBuilder instance
+   */
+  V3URIBuilder appendLinksSegment(String segmentValue);
+
+  /**
+   * Adds inlinecount query option.
+   *
+   * @param inlineCount value
+   * @return current URIBuilder instance
+   * @see QueryOption#INLINECOUNT
+   */
+  V3URIBuilder inlineCount(InlineCount inlineCount);
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-olingo-odata4/blob/edf8ab9d/odata4-lib/odata4-client-api/src/main/java/org/apache/olingo/odata4/client/api/uri/V4URIBuilder.java
----------------------------------------------------------------------
diff --git a/odata4-lib/odata4-client-api/src/main/java/org/apache/olingo/odata4/client/api/uri/V4URIBuilder.java b/odata4-lib/odata4-client-api/src/main/java/org/apache/olingo/odata4/client/api/uri/V4URIBuilder.java
new file mode 100644
index 0000000..c865846
--- /dev/null
+++ b/odata4-lib/odata4-client-api/src/main/java/org/apache/olingo/odata4/client/api/uri/V4URIBuilder.java
@@ -0,0 +1,87 @@
+/*
+ * 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.olingo.odata4.client.api.uri;
+
+public interface V4URIBuilder extends URIBuilder<V4URIBuilder> {
+
+  /**
+   * Appends Singleton segment to the URI.
+   *
+   * @param segmentValue segment value.
+   * @return current URIBuilder instance
+   */
+  V4URIBuilder appendSingletonSegment(String segmentValue);
+
+  /**
+   * Appends entity-id segment to the URI.
+   *
+   * @param segmentValue segment value
+   * @return current URIBuilder instance
+   */
+  V4URIBuilder appendEntityIdSegment(String segmentValue);
+
+  /**
+   * Appends ref segment to the URI.
+   *
+   * @return current URIBuilder instance
+   */
+  V4URIBuilder appendRefSegment();
+
+  /**
+   * Appends cross join segment to the URI.
+   *
+   * @param segmentValues segment values.
+   * @return current URIBuilder instance
+   */
+  V4URIBuilder appendCrossjoinSegment(String... segmentValues);
+
+  /**
+   * Appends all segment to the URI.
+   *
+   * @return current URIBuilder instance
+   */
+  V4URIBuilder appendAllSegment();
+
+  /**
+   * Adds id query option.
+   *
+   * @param idValue opaque token.
+   * @return current URIBuilder instance
+   * @see QueryOption#ID
+   */
+  V4URIBuilder id(String idValue);
+
+  /**
+   * Appends count query option.
+   *
+   * @param value true or false
+   * @return current URIBuilder instance
+   * @see QueryOption#COUNT
+   */
+  V4URIBuilder count(boolean value);
+
+  /**
+   * Appends search query option.
+   *
+   * @param expression search expression
+   * @return current URIBuilder instance
+   * @see QueryOption#SEARCH
+   */
+  V4URIBuilder search(String expression);
+}

http://git-wip-us.apache.org/repos/asf/incubator-olingo-odata4/blob/edf8ab9d/odata4-lib/odata4-client-api/src/main/java/org/apache/olingo/odata4/client/api/uri/filter/FilterArgFactory.java
----------------------------------------------------------------------
diff --git a/odata4-lib/odata4-client-api/src/main/java/org/apache/olingo/odata4/client/api/uri/filter/FilterArgFactory.java b/odata4-lib/odata4-client-api/src/main/java/org/apache/olingo/odata4/client/api/uri/filter/FilterArgFactory.java
new file mode 100644
index 0000000..0db93e7
--- /dev/null
+++ b/odata4-lib/odata4-client-api/src/main/java/org/apache/olingo/odata4/client/api/uri/filter/FilterArgFactory.java
@@ -0,0 +1,83 @@
+/*
+ * 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.olingo.odata4.client.api.uri.filter;
+
+public interface FilterArgFactory {
+
+  FilterArg _null();
+
+  FilterArg add(FilterArg first, FilterArg second);
+
+  FilterArg ceiling(FilterArg param);
+
+  FilterArg concat(FilterArg first, FilterArg second);
+
+  FilterArg day(FilterArg param);
+
+  FilterArg div(FilterArg first, FilterArg second);
+
+  FilterArg endswith(FilterArg first, FilterArg second);
+
+  FilterArg floor(FilterArg param);
+
+  FilterArg hour(FilterArg param);
+
+  FilterArg indexof(FilterArg first, FilterArg second);
+
+  FilterArg isof(FilterArg type);
+
+  FilterArg isof(FilterArg expression, FilterArg type);
+
+  FilterArg length(FilterArg param);
+
+  FilterArg literal(Object value);
+
+  FilterArg minute(FilterArg param);
+
+  FilterArg mod(FilterArg first, FilterArg second);
+
+  FilterArg month(FilterArg param);
+
+  FilterArg mul(FilterArg first, FilterArg second);
+
+  FilterArg property(String propertyPath);
+
+  FilterArg replace(FilterArg first, FilterArg second, FilterArg third);
+
+  FilterArg round(FilterArg param);
+
+  FilterArg second(FilterArg param);
+
+  FilterArg startswith(FilterArg first, FilterArg second);
+
+  FilterArg sub(FilterArg first, FilterArg second);
+
+  FilterArg substring(FilterArg arg, FilterArg pos);
+
+  FilterArg substring(FilterArg arg, FilterArg pos, FilterArg length);
+
+  FilterArg tolower(FilterArg param);
+
+  FilterArg toupper(FilterArg param);
+
+  FilterArg trim(FilterArg param);
+
+  FilterArg year(FilterArg param);
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-olingo-odata4/blob/edf8ab9d/odata4-lib/odata4-client-api/src/main/java/org/apache/olingo/odata4/client/api/uri/filter/FilterFactory.java
----------------------------------------------------------------------
diff --git a/odata4-lib/odata4-client-api/src/main/java/org/apache/olingo/odata4/client/api/uri/filter/FilterFactory.java b/odata4-lib/odata4-client-api/src/main/java/org/apache/olingo/odata4/client/api/uri/filter/FilterFactory.java
index cf1260c..7cab185 100644
--- a/odata4-lib/odata4-client-api/src/main/java/org/apache/olingo/odata4/client/api/uri/filter/FilterFactory.java
+++ b/odata4-lib/odata4-client-api/src/main/java/org/apache/olingo/odata4/client/api/uri/filter/FilterFactory.java
@@ -25,6 +25,8 @@ import java.io.Serializable;
  */
 public interface FilterFactory extends Serializable {
 
+  FilterArgFactory getArgFactory();
+
   URIFilter match(FilterArg arg);
 
   URIFilter eq(String key, Object value);

http://git-wip-us.apache.org/repos/asf/incubator-olingo-odata4/blob/edf8ab9d/odata4-lib/odata4-client-api/src/main/java/org/apache/olingo/odata4/client/api/uri/filter/V3FilterArgFactory.java
----------------------------------------------------------------------
diff --git a/odata4-lib/odata4-client-api/src/main/java/org/apache/olingo/odata4/client/api/uri/filter/V3FilterArgFactory.java b/odata4-lib/odata4-client-api/src/main/java/org/apache/olingo/odata4/client/api/uri/filter/V3FilterArgFactory.java
new file mode 100644
index 0000000..f12a970
--- /dev/null
+++ b/odata4-lib/odata4-client-api/src/main/java/org/apache/olingo/odata4/client/api/uri/filter/V3FilterArgFactory.java
@@ -0,0 +1,25 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.olingo.odata4.client.api.uri.filter;
+
+public interface V3FilterArgFactory extends FilterArgFactory {
+
+  FilterArg substringof(FilterArg first, FilterArg second);
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-olingo-odata4/blob/edf8ab9d/odata4-lib/odata4-client-api/src/main/java/org/apache/olingo/odata4/client/api/uri/filter/V3FilterFactory.java
----------------------------------------------------------------------
diff --git a/odata4-lib/odata4-client-api/src/main/java/org/apache/olingo/odata4/client/api/uri/filter/V3FilterFactory.java b/odata4-lib/odata4-client-api/src/main/java/org/apache/olingo/odata4/client/api/uri/filter/V3FilterFactory.java
new file mode 100644
index 0000000..66e7cc5
--- /dev/null
+++ b/odata4-lib/odata4-client-api/src/main/java/org/apache/olingo/odata4/client/api/uri/filter/V3FilterFactory.java
@@ -0,0 +1,26 @@
+/*
+ * 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.olingo.odata4.client.api.uri.filter;
+
+public interface V3FilterFactory extends FilterFactory {
+
+  @Override
+  V3FilterArgFactory getArgFactory();
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-olingo-odata4/blob/edf8ab9d/odata4-lib/odata4-client-api/src/main/java/org/apache/olingo/odata4/client/api/uri/filter/V4FilterArgFactory.java
----------------------------------------------------------------------
diff --git a/odata4-lib/odata4-client-api/src/main/java/org/apache/olingo/odata4/client/api/uri/filter/V4FilterArgFactory.java b/odata4-lib/odata4-client-api/src/main/java/org/apache/olingo/odata4/client/api/uri/filter/V4FilterArgFactory.java
new file mode 100644
index 0000000..acf9c5c
--- /dev/null
+++ b/odata4-lib/odata4-client-api/src/main/java/org/apache/olingo/odata4/client/api/uri/filter/V4FilterArgFactory.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.olingo.odata4.client.api.uri.filter;
+
+public interface V4FilterArgFactory extends FilterArgFactory {
+
+  FilterArg contains(FilterArg first, FilterArg second);
+
+  FilterArg fractionalseconds(FilterArg param);
+
+  FilterArg date(FilterArg param);
+
+  FilterArg time(FilterArg param);
+
+  FilterArg totaloffsetminutes(FilterArg param);
+
+  FilterArg now();
+
+  FilterArg mindatetime();
+
+  FilterArg maxdatetime();
+
+  FilterArg totalseconds(FilterArg param);
+
+  FilterArg cast(FilterArg type);
+
+  FilterArg cast(FilterArg expression, FilterArg type);
+
+  FilterArg geoDistance(FilterArg first, FilterArg second);
+
+  FilterArg geoIntersects(FilterArg first, FilterArg second);
+
+  FilterArg geoLength(FilterArg first, FilterArg second);
+
+  FilterArg any(FilterArg collection, URIFilter expression);
+
+  FilterArg all(FilterArg collection, URIFilter expression);
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-olingo-odata4/blob/edf8ab9d/odata4-lib/odata4-client-api/src/main/java/org/apache/olingo/odata4/client/api/uri/filter/V4FilterFactory.java
----------------------------------------------------------------------
diff --git a/odata4-lib/odata4-client-api/src/main/java/org/apache/olingo/odata4/client/api/uri/filter/V4FilterFactory.java b/odata4-lib/odata4-client-api/src/main/java/org/apache/olingo/odata4/client/api/uri/filter/V4FilterFactory.java
new file mode 100644
index 0000000..0328774
--- /dev/null
+++ b/odata4-lib/odata4-client-api/src/main/java/org/apache/olingo/odata4/client/api/uri/filter/V4FilterFactory.java
@@ -0,0 +1,32 @@
+/*
+ * 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.olingo.odata4.client.api.uri.filter;
+
+import org.apache.olingo.odata4.commons.api.edm.EdmEnumType;
+
+public interface V4FilterFactory extends FilterFactory {
+
+  @Override
+  V4FilterArgFactory getArgFactory();
+
+  URIFilter has(String key, EdmEnumType enumType, String memberName);
+
+  URIFilter has(FilterArg left, EdmEnumType enumType, String memberName);
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-olingo-odata4/blob/edf8ab9d/odata4-lib/odata4-client-core/src/main/java/org/apache/olingo/odata4/client/core/AbstractConfiguration.java
----------------------------------------------------------------------
diff --git a/odata4-lib/odata4-client-core/src/main/java/org/apache/olingo/odata4/client/core/AbstractConfiguration.java b/odata4-lib/odata4-client-core/src/main/java/org/apache/olingo/odata4/client/core/AbstractConfiguration.java
index 7ff6a89..787107b 100644
--- a/odata4-lib/odata4-client-core/src/main/java/org/apache/olingo/odata4/client/core/AbstractConfiguration.java
+++ b/odata4-lib/odata4-client-core/src/main/java/org/apache/olingo/odata4/client/core/AbstractConfiguration.java
@@ -46,8 +46,6 @@ public abstract class AbstractConfiguration implements Configuration {
 
   private static final String USE_XHTTP_METHOD = "useHTTPMethod";
 
-  private static final String KEY_AS_SEGMENT = "keyAsSegment";
-
   private static final String GZIP_COMPRESSION = "gzipCompression";
 
   private static final String CHUNKING = "chunking";
@@ -63,7 +61,7 @@ public abstract class AbstractConfiguration implements Configuration {
    * @param defaultValue default value to be used in case of the given key doesn't exist.
    * @return property value if exists; default value if does not exist.
    */
-  private Object getProperty(final String key, final Object defaultValue) {
+  protected Object getProperty(final String key, final Object defaultValue) {
     return CONF.containsKey(key) ? CONF.get(key) : defaultValue;
   }
 
@@ -74,7 +72,7 @@ public abstract class AbstractConfiguration implements Configuration {
    * @param value configuration property value.
    * @return given value.
    */
-  private Object setProperty(final String key, final Object value) {
+  protected Object setProperty(final String key, final Object value) {
     return CONF.put(key, value);
   }
 
@@ -167,16 +165,6 @@ public abstract class AbstractConfiguration implements Configuration {
   }
 
   @Override
-  public boolean isKeyAsSegment() {
-    return (Boolean) getProperty(KEY_AS_SEGMENT, false);
-  }
-
-  @Override
-  public void setKeyAsSegment(final boolean value) {
-    setProperty(KEY_AS_SEGMENT, value);
-  }
-
-  @Override
   public boolean isGzipCompression() {
     return (Boolean) getProperty(GZIP_COMPRESSION, false);
   }

http://git-wip-us.apache.org/repos/asf/incubator-olingo-odata4/blob/edf8ab9d/odata4-lib/odata4-client-core/src/main/java/org/apache/olingo/odata4/client/core/ODataClientFactory.java
----------------------------------------------------------------------
diff --git a/odata4-lib/odata4-client-core/src/main/java/org/apache/olingo/odata4/client/core/ODataClientFactory.java b/odata4-lib/odata4-client-core/src/main/java/org/apache/olingo/odata4/client/core/ODataClientFactory.java
index e8276f5..5871740 100644
--- a/odata4-lib/odata4-client-core/src/main/java/org/apache/olingo/odata4/client/core/ODataClientFactory.java
+++ b/odata4-lib/odata4-client-core/src/main/java/org/apache/olingo/odata4/client/core/ODataClientFactory.java
@@ -20,12 +20,12 @@ package org.apache.olingo.odata4.client.core;
 
 public final class ODataClientFactory {
 
-    public static ODataV3Client getV3() {
-        return new ODataV3Client();
+    public static ODataV3ClientImpl getV3() {
+        return new ODataV3ClientImpl();
     }
 
-    public static ODataV4Client getV4() {
-        return new ODataV4Client();
+    public static ODataV4ClientImpl getV4() {
+        return new ODataV4ClientImpl();
     }
 
     private ODataClientFactory() {

http://git-wip-us.apache.org/repos/asf/incubator-olingo-odata4/blob/edf8ab9d/odata4-lib/odata4-client-core/src/main/java/org/apache/olingo/odata4/client/core/ODataV3Client.java
----------------------------------------------------------------------
diff --git a/odata4-lib/odata4-client-core/src/main/java/org/apache/olingo/odata4/client/core/ODataV3Client.java b/odata4-lib/odata4-client-core/src/main/java/org/apache/olingo/odata4/client/core/ODataV3Client.java
deleted file mode 100644
index 15cc2d2..0000000
--- a/odata4-lib/odata4-client-core/src/main/java/org/apache/olingo/odata4/client/core/ODataV3Client.java
+++ /dev/null
@@ -1,138 +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.olingo.odata4.client.core;
-
-import org.apache.olingo.odata4.client.core.op.impl.v3.ODataBinderImpl;
-import org.apache.olingo.odata4.client.core.op.impl.v3.ODataDeserializerImpl;
-import org.apache.olingo.odata4.client.core.op.impl.v3.ODataReaderImpl;
-import org.apache.olingo.odata4.client.core.op.impl.v3.ODataSerializerImpl;
-import org.apache.olingo.odata4.client.core.uri.V3URIBuilder;
-import org.apache.olingo.odata4.client.core.uri.filter.V3FilterFactory;
-import org.apache.olingo.odata4.commons.api.edm.constants.ODataServiceVersion;
-
-public class ODataV3Client extends AbstractODataClient {
-
-  private static final long serialVersionUID = -1655712193243609209L;
-
-  private final V3Configuration configuration = new V3Configuration();
-
-  private final V3FilterFactory filterFactory = new V3FilterFactory();
-
-  private final ODataDeserializerImpl deserializer = new ODataDeserializerImpl(this);
-
-  private final ODataSerializerImpl serializer = new ODataSerializerImpl(this);
-
-  private final ODataReaderImpl reader = new ODataReaderImpl(this);
-
-//  private final ODataWriterImpl writer = new ODataWriterImpl(this);
-  private final ODataBinderImpl binder = new ODataBinderImpl(this);
-
-//  private final ODataObjectFactoryImpl objectFactory = new ODataObjectFactoryImpl(this);
-//
-//  private final V3RetrieveRequestFactory retrieveReqFact = new V3RetrieveRequestFactory(this);
-//
-//  private final V3CUDRequestFactory cudReqFact = new V3CUDRequestFactory(this);
-//
-//  private final V3StreamedRequestFactory streamedReqFact = new V3StreamedRequestFactory(this);
-//
-//  private final V3InvokeRequestFactory invokeReqFact = new V3InvokeRequestFactory(this);
-//
-//  private final V3BatchRequestFactory batchReqFact = new V3BatchRequestFactory(this);
-  @Override
-  public ODataServiceVersion getServiceVersion() {
-    return ODataServiceVersion.V30;
-  }
-
-//  @Override
-//  public ODataHeaders getVersionHeaders() {
-//    final ODataHeaders odataHeaders = new ODataHeaders();
-//    odataHeaders.setHeader(ODataHeaders.HeaderName.minDataServiceVersion, ODataVersion.V3.toString());
-//    odataHeaders.setHeader(ODataHeaders.HeaderName.maxDataServiceVersion, ODataVersion.V3.toString());
-//    odataHeaders.setHeader(ODataHeaders.HeaderName.dataServiceVersion, ODataVersion.V3.toString());
-//    return odataHeaders;
-//  }
-  @Override
-  public V3Configuration getConfiguration() {
-    return configuration;
-  }
-
-  @Override
-  public V3URIBuilder getURIBuilder(final String serviceRoot) {
-    return new V3URIBuilder(configuration, serviceRoot);
-  }
-
-  @Override
-  public V3FilterFactory getFilterFactory() {
-    return filterFactory;
-  }
-
-  @Override
-  public ODataDeserializerImpl getDeserializer() {
-    return deserializer;
-  }
-
-  @Override
-  public ODataSerializerImpl getSerializer() {
-    return serializer;
-  }
-
-  @Override
-  public ODataReaderImpl getReader() {
-    return reader;
-  }
-
-//  @Override
-//  public ODataWriterImpl getWriter() {
-//    return writer;
-//  }
-  @Override
-  public ODataBinderImpl getBinder() {
-    return binder;
-  }
-
-//  @Override
-//  public ODataObjectFactoryImpl getObjectFactory() {
-//    return objectFactory;
-//  }
-//
-//  @Override
-//  public V3RetrieveRequestFactory getRetrieveRequestFactory() {
-//    return retrieveReqFact;
-//  }
-//
-//  @Override
-//  public V3CUDRequestFactory getCUDRequestFactory() {
-//    return cudReqFact;
-//  }
-//
-//  @Override
-//  public V3StreamedRequestFactory getStreamedRequestFactory() {
-//    return streamedReqFact;
-//  }
-//
-//  @Override
-//  public V3InvokeRequestFactory getInvokeRequestFactory() {
-//    return invokeReqFact;
-//  }
-//
-//  @Override
-//  public V3BatchRequestFactory getBatchRequestFactory() {
-//    return batchReqFact;
-//  }
-}

http://git-wip-us.apache.org/repos/asf/incubator-olingo-odata4/blob/edf8ab9d/odata4-lib/odata4-client-core/src/main/java/org/apache/olingo/odata4/client/core/ODataV3ClientImpl.java
----------------------------------------------------------------------
diff --git a/odata4-lib/odata4-client-core/src/main/java/org/apache/olingo/odata4/client/core/ODataV3ClientImpl.java b/odata4-lib/odata4-client-core/src/main/java/org/apache/olingo/odata4/client/core/ODataV3ClientImpl.java
new file mode 100644
index 0000000..8c61eb9
--- /dev/null
+++ b/odata4-lib/odata4-client-core/src/main/java/org/apache/olingo/odata4/client/core/ODataV3ClientImpl.java
@@ -0,0 +1,146 @@
+/*
+ * 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.olingo.odata4.client.core;
+
+import org.apache.olingo.odata4.client.api.ODataV3Client;
+import org.apache.olingo.odata4.client.api.V3Configuration;
+import org.apache.olingo.odata4.client.api.op.ODataBinder;
+import org.apache.olingo.odata4.client.api.op.ODataReader;
+import org.apache.olingo.odata4.client.api.op.ODataSerializer;
+import org.apache.olingo.odata4.client.api.op.ODataV3Deserializer;
+import org.apache.olingo.odata4.client.api.uri.V3URIBuilder;
+import org.apache.olingo.odata4.client.api.uri.filter.V3FilterFactory;
+import org.apache.olingo.odata4.client.core.op.impl.ODataV3BinderImpl;
+import org.apache.olingo.odata4.client.core.op.impl.ODataV3DeserializerImpl;
+import org.apache.olingo.odata4.client.core.op.impl.ODataV3ReaderImpl;
+import org.apache.olingo.odata4.client.core.op.impl.ODataV3SerializerImpl;
+import org.apache.olingo.odata4.client.core.uri.V3URIBuilderImpl;
+import org.apache.olingo.odata4.client.core.uri.filter.V3FilterFactoryImpl;
+import org.apache.olingo.odata4.commons.api.edm.constants.ODataServiceVersion;
+
+public class ODataV3ClientImpl extends AbstractODataClient implements ODataV3Client {
+
+  private static final long serialVersionUID = -1655712193243609209L;
+
+  private final V3Configuration configuration = new V3ConfigurationImpl();
+
+  private final V3FilterFactory filterFactory = new V3FilterFactoryImpl();
+
+  private final ODataV3Deserializer deserializer = new ODataV3DeserializerImpl(this);
+
+  private final ODataSerializer serializer = new ODataV3SerializerImpl(this);
+
+  private final ODataReader reader = new ODataV3ReaderImpl(this);
+
+//  private final ODataWriterImpl writer = new ODataWriterImpl(this);
+  private final ODataBinder binder = new ODataV3BinderImpl(this);
+
+//  private final ODataObjectFactory objectFactory = new ODataObjectFactoryImpl(this);
+//
+//  private final V3RetrieveRequestFactory retrieveReqFact = new V3RetrieveRequestFactory(this);
+//
+//  private final V3CUDRequestFactory cudReqFact = new V3CUDRequestFactory(this);
+//
+//  private final V3StreamedRequestFactory streamedReqFact = new V3StreamedRequestFactory(this);
+//
+//  private final V3InvokeRequestFactory invokeReqFact = new V3InvokeRequestFactory(this);
+//
+//  private final V3BatchRequestFactory batchReqFact = new V3BatchRequestFactory(this);
+  @Override
+  public ODataServiceVersion getServiceVersion() {
+    return ODataServiceVersion.V30;
+  }
+
+//  @Override
+//  public ODataHeaders getVersionHeaders() {
+//    final ODataHeaders odataHeaders = new ODataHeaders();
+//    odataHeaders.setHeader(ODataHeaders.HeaderName.minDataServiceVersion, ODataVersion.V3.toString());
+//    odataHeaders.setHeader(ODataHeaders.HeaderName.maxDataServiceVersion, ODataVersion.V3.toString());
+//    odataHeaders.setHeader(ODataHeaders.HeaderName.dataServiceVersion, ODataVersion.V3.toString());
+//    return odataHeaders;
+//  }
+  @Override
+  public V3Configuration getConfiguration() {
+    return configuration;
+  }
+
+  @Override
+  public V3URIBuilder getURIBuilder(final String serviceRoot) {
+    return new V3URIBuilderImpl(configuration, serviceRoot);
+  }
+
+  @Override
+  public V3FilterFactory getFilterFactory() {
+    return filterFactory;
+  }
+
+  @Override
+  public ODataV3Deserializer getDeserializer() {
+    return deserializer;
+  }
+
+  @Override
+  public ODataSerializer getSerializer() {
+    return serializer;
+  }
+
+  @Override
+  public ODataReader getReader() {
+    return reader;
+  }
+
+//  @Override
+//  public ODataWriterImpl getWriter() {
+//    return writer;
+//  }
+  @Override
+  public ODataBinder getBinder() {
+    return binder;
+  }
+
+//  @Override
+//  public ODataObjectFactoryImpl getObjectFactory() {
+//    return objectFactory;
+//  }
+//
+//  @Override
+//  public V3RetrieveRequestFactory getRetrieveRequestFactory() {
+//    return retrieveReqFact;
+//  }
+//
+//  @Override
+//  public V3CUDRequestFactory getCUDRequestFactory() {
+//    return cudReqFact;
+//  }
+//
+//  @Override
+//  public V3StreamedRequestFactory getStreamedRequestFactory() {
+//    return streamedReqFact;
+//  }
+//
+//  @Override
+//  public V3InvokeRequestFactory getInvokeRequestFactory() {
+//    return invokeReqFact;
+//  }
+//
+//  @Override
+//  public V3BatchRequestFactory getBatchRequestFactory() {
+//    return batchReqFact;
+//  }
+}

http://git-wip-us.apache.org/repos/asf/incubator-olingo-odata4/blob/edf8ab9d/odata4-lib/odata4-client-core/src/main/java/org/apache/olingo/odata4/client/core/ODataV4Client.java
----------------------------------------------------------------------
diff --git a/odata4-lib/odata4-client-core/src/main/java/org/apache/olingo/odata4/client/core/ODataV4Client.java b/odata4-lib/odata4-client-core/src/main/java/org/apache/olingo/odata4/client/core/ODataV4Client.java
deleted file mode 100644
index 35e4809..0000000
--- a/odata4-lib/odata4-client-core/src/main/java/org/apache/olingo/odata4/client/core/ODataV4Client.java
+++ /dev/null
@@ -1,138 +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.olingo.odata4.client.core;
-
-import org.apache.olingo.odata4.client.core.op.impl.v4.ODataBinderImpl;
-import org.apache.olingo.odata4.client.core.op.impl.v4.ODataDeserializerImpl;
-import org.apache.olingo.odata4.client.core.op.impl.v4.ODataReaderImpl;
-import org.apache.olingo.odata4.client.core.op.impl.v4.ODataSerializerImpl;
-import org.apache.olingo.odata4.client.core.uri.V4URIBuilder;
-import org.apache.olingo.odata4.client.core.uri.filter.V4FilterFactory;
-import org.apache.olingo.odata4.commons.api.edm.constants.ODataServiceVersion;
-
-public class ODataV4Client extends AbstractODataClient {
-
-  private static final long serialVersionUID = -6653176125573631964L;
-
-  private final V4Configuration configuration = new V4Configuration();
-
-  private final V4FilterFactory filterFactory = new V4FilterFactory();
-
-  private final ODataDeserializerImpl deserializer = new ODataDeserializerImpl(this);
-
-  private final ODataSerializerImpl serializer = new ODataSerializerImpl(this);
-
-  private final ODataReaderImpl reader = new ODataReaderImpl(this);
-
-//    private final ODataWriterImpl writer = new ODataWriterImpl(this);
-  private final ODataBinderImpl binder = new ODataBinderImpl(this);
-
-//    private final ODataObjectFactoryImpl objectFactory = new ODataObjectFactoryImpl(this);
-//
-//    private final V4RetrieveRequestFactory retrieveReqFact = new V4RetrieveRequestFactory(this);
-//
-//    private final V4CUDRequestFactory cudReqFact = new V4CUDRequestFactory(this);
-//
-//    private final V4StreamedRequestFactory streamedReqFact = new V4StreamedRequestFactory(this);
-//
-//    private final V4InvokeRequestFactory invokeReqFact = new V4InvokeRequestFactory(this);
-//
-//    private final V4BatchRequestFactory batchReqFact = new V4BatchRequestFactory(this);
-  @Override
-  public ODataServiceVersion getServiceVersion() {
-    return ODataServiceVersion.V40;
-  }
-//
-//    @Override
-//    public ODataHeaders getVersionHeaders() {
-//        final ODataHeaders odataHeaders = new ODataHeaders();
-//        odataHeaders.setHeader(ODataHeaders.HeaderName.maxDataServiceVersion, ODataVersion.V4.toString());
-//        odataHeaders.setHeader(ODataHeaders.HeaderName.dataServiceVersion, ODataVersion.V4.toString());
-//        return odataHeaders;
-//    }
-
-  @Override
-  public V4Configuration getConfiguration() {
-    return configuration;
-  }
-
-  @Override
-  public V4URIBuilder getURIBuilder(final String serviceRoot) {
-    return new V4URIBuilder(configuration, serviceRoot);
-  }
-
-  @Override
-  public V4FilterFactory getFilterFactory() {
-    return filterFactory;
-  }
-
-  @Override
-  public ODataDeserializerImpl getDeserializer() {
-    return deserializer;
-  }
-
-  @Override
-  public ODataSerializerImpl getSerializer() {
-    return serializer;
-  }
-
-  @Override
-  public ODataReaderImpl getReader() {
-    return reader;
-  }
-
-//    @Override
-//    public ODataWriterImpl getWriter() {
-//        return writer;
-//    }
-  @Override
-  public ODataBinderImpl getBinder() {
-    return binder;
-  }
-
-//    @Override
-//    public ODataObjectFactoryImpl getObjectFactory() {
-//        return objectFactory;
-//    }
-//
-//    @Override
-//    public V4RetrieveRequestFactory getRetrieveRequestFactory() {
-//        return retrieveReqFact;
-//    }
-//
-//    @Override
-//    public V4CUDRequestFactory getCUDRequestFactory() {
-//        return cudReqFact;
-//    }
-//
-//    @Override
-//    public V4StreamedRequestFactory getStreamedRequestFactory() {
-//        return streamedReqFact;
-//    }
-//
-//    @Override
-//    public V4InvokeRequestFactory getInvokeRequestFactory() {
-//        return invokeReqFact;
-//    }
-//
-//    @Override
-//    public V4BatchRequestFactory getBatchRequestFactory() {
-//        return batchReqFact;
-//    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-olingo-odata4/blob/edf8ab9d/odata4-lib/odata4-client-core/src/main/java/org/apache/olingo/odata4/client/core/ODataV4ClientImpl.java
----------------------------------------------------------------------
diff --git a/odata4-lib/odata4-client-core/src/main/java/org/apache/olingo/odata4/client/core/ODataV4ClientImpl.java b/odata4-lib/odata4-client-core/src/main/java/org/apache/olingo/odata4/client/core/ODataV4ClientImpl.java
new file mode 100644
index 0000000..6d1c034
--- /dev/null
+++ b/odata4-lib/odata4-client-core/src/main/java/org/apache/olingo/odata4/client/core/ODataV4ClientImpl.java
@@ -0,0 +1,146 @@
+/*
+ * 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.olingo.odata4.client.core;
+
+import org.apache.olingo.odata4.client.api.ODataV4Client;
+import org.apache.olingo.odata4.client.api.V4Configuration;
+import org.apache.olingo.odata4.client.api.op.ODataBinder;
+import org.apache.olingo.odata4.client.api.op.ODataReader;
+import org.apache.olingo.odata4.client.api.op.ODataSerializer;
+import org.apache.olingo.odata4.client.api.op.ODataV4Deserializer;
+import org.apache.olingo.odata4.client.api.uri.V4URIBuilder;
+import org.apache.olingo.odata4.client.api.uri.filter.V4FilterFactory;
+import org.apache.olingo.odata4.client.core.op.impl.ODataV4BinderImpl;
+import org.apache.olingo.odata4.client.core.op.impl.ODataV4DeserializerImpl;
+import org.apache.olingo.odata4.client.core.op.impl.ODataV4ReaderImpl;
+import org.apache.olingo.odata4.client.core.op.impl.ODataV4SerializerImpl;
+import org.apache.olingo.odata4.client.core.uri.V4URIBuilderImpl;
+import org.apache.olingo.odata4.client.core.uri.filter.V4FilterFactoryImpl;
+import org.apache.olingo.odata4.commons.api.edm.constants.ODataServiceVersion;
+
+public class ODataV4ClientImpl extends AbstractODataClient implements ODataV4Client {
+
+  private static final long serialVersionUID = -6653176125573631964L;
+
+  private final V4Configuration configuration = new V4ConfigurationImpl();
+
+  private final V4FilterFactory filterFactory = new V4FilterFactoryImpl();
+
+  private final ODataV4Deserializer deserializer = new ODataV4DeserializerImpl(this);
+
+  private final ODataSerializer serializer = new ODataV4SerializerImpl(this);
+
+  private final ODataReader reader = new ODataV4ReaderImpl(this);
+
+//    private final ODataWriter writer = new ODataWriterImpl(this);
+  private final ODataBinder binder = new ODataV4BinderImpl(this);
+
+//    private final ODataObjectFactory objectFactory = new ODataObjectFactoryImpl(this);
+//
+//    private final V4RetrieveRequestFactory retrieveReqFact = new V4RetrieveRequestFactory(this);
+//
+//    private final V4CUDRequestFactory cudReqFact = new V4CUDRequestFactory(this);
+//
+//    private final V4StreamedRequestFactory streamedReqFact = new V4StreamedRequestFactory(this);
+//
+//    private final V4InvokeRequestFactory invokeReqFact = new V4InvokeRequestFactory(this);
+//
+//    private final V4BatchRequestFactory batchReqFact = new V4BatchRequestFactory(this);
+  @Override
+  public ODataServiceVersion getServiceVersion() {
+    return ODataServiceVersion.V40;
+  }
+//
+//    @Override
+//    public ODataHeaders getVersionHeaders() {
+//        final ODataHeaders odataHeaders = new ODataHeaders();
+//        odataHeaders.setHeader(ODataHeaders.HeaderName.maxDataServiceVersion, ODataVersion.V4.toString());
+//        odataHeaders.setHeader(ODataHeaders.HeaderName.dataServiceVersion, ODataVersion.V4.toString());
+//        return odataHeaders;
+//    }
+
+  @Override
+  public V4Configuration getConfiguration() {
+    return configuration;
+  }
+
+  @Override
+  public V4URIBuilder getURIBuilder(final String serviceRoot) {
+    return new V4URIBuilderImpl(serviceRoot);
+  }
+
+  @Override
+  public V4FilterFactory getFilterFactory() {
+    return filterFactory;
+  }
+
+  @Override
+  public ODataV4Deserializer getDeserializer() {
+    return deserializer;
+  }
+
+  @Override
+  public ODataSerializer getSerializer() {
+    return serializer;
+  }
+
+  @Override
+  public ODataReader getReader() {
+    return reader;
+  }
+
+//    @Override
+//    public ODataWriterImpl getWriter() {
+//        return writer;
+//    }
+  @Override
+  public ODataBinder getBinder() {
+    return binder;
+  }
+
+//    @Override
+//    public ODataObjectFactoryImpl getObjectFactory() {
+//        return objectFactory;
+//    }
+//
+//    @Override
+//    public V4RetrieveRequestFactory getRetrieveRequestFactory() {
+//        return retrieveReqFact;
+//    }
+//
+//    @Override
+//    public V4CUDRequestFactory getCUDRequestFactory() {
+//        return cudReqFact;
+//    }
+//
+//    @Override
+//    public V4StreamedRequestFactory getStreamedRequestFactory() {
+//        return streamedReqFact;
+//    }
+//
+//    @Override
+//    public V4InvokeRequestFactory getInvokeRequestFactory() {
+//        return invokeReqFact;
+//    }
+//
+//    @Override
+//    public V4BatchRequestFactory getBatchRequestFactory() {
+//        return batchReqFact;
+//    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-olingo-odata4/blob/edf8ab9d/odata4-lib/odata4-client-core/src/main/java/org/apache/olingo/odata4/client/core/V3Configuration.java
----------------------------------------------------------------------
diff --git a/odata4-lib/odata4-client-core/src/main/java/org/apache/olingo/odata4/client/core/V3Configuration.java b/odata4-lib/odata4-client-core/src/main/java/org/apache/olingo/odata4/client/core/V3Configuration.java
deleted file mode 100644
index 386cff7..0000000
--- a/odata4-lib/odata4-client-core/src/main/java/org/apache/olingo/odata4/client/core/V3Configuration.java
+++ /dev/null
@@ -1,29 +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.olingo.odata4.client.core;
-
-public class V3Configuration extends AbstractConfiguration {
-
-  private static final long serialVersionUID = -8719958537946884777L;
-
-  protected V3Configuration() {
-    super();
-  }
-
-}

http://git-wip-us.apache.org/repos/asf/incubator-olingo-odata4/blob/edf8ab9d/odata4-lib/odata4-client-core/src/main/java/org/apache/olingo/odata4/client/core/V3ConfigurationImpl.java
----------------------------------------------------------------------
diff --git a/odata4-lib/odata4-client-core/src/main/java/org/apache/olingo/odata4/client/core/V3ConfigurationImpl.java b/odata4-lib/odata4-client-core/src/main/java/org/apache/olingo/odata4/client/core/V3ConfigurationImpl.java
new file mode 100644
index 0000000..e84fdd1
--- /dev/null
+++ b/odata4-lib/odata4-client-core/src/main/java/org/apache/olingo/odata4/client/core/V3ConfigurationImpl.java
@@ -0,0 +1,57 @@
+/*
+ * 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.olingo.odata4.client.core;
+
+import org.apache.olingo.odata4.client.api.V3Configuration;
+
+public class V3ConfigurationImpl extends AbstractConfiguration implements V3Configuration {
+
+  private static final long serialVersionUID = -8719958537946884777L;
+
+  private static final String KEY_AS_SEGMENT = "keyAsSegment";
+
+  protected V3ConfigurationImpl() {
+    super();
+  }
+
+  /**
+   * Checks whether URIs contain entity key between parentheses (standard) or instead as additional segment. Example:
+   * http://services.odata.org/V4/OData/OData.svc/Products(0) or http://services.odata.org/V4/OData/OData.svc/Products/0
+   *
+   * @return whether URIs shall be built with entity key between parentheses (standard) or instead as additional
+   * segment.
+   */
+  @Override
+  public boolean isKeyAsSegment() {
+    return (Boolean) getProperty(KEY_AS_SEGMENT, false);
+  }
+
+  /**
+   * Sets whether URIs shall be built with entity key between parentheses (standard) or instead as additional segment.
+   * Example: http://services.odata.org/V4/OData/OData.svc/Products(0) or
+   * http://services.odata.org/V4/OData/OData.svc/Products/0
+   *
+   * @param value 'TRUE' to use this feature.
+   */
+  @Override
+  public void setKeyAsSegment(final boolean value) {
+    setProperty(KEY_AS_SEGMENT, value);
+  }
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-olingo-odata4/blob/edf8ab9d/odata4-lib/odata4-client-core/src/main/java/org/apache/olingo/odata4/client/core/V4Configuration.java
----------------------------------------------------------------------
diff --git a/odata4-lib/odata4-client-core/src/main/java/org/apache/olingo/odata4/client/core/V4Configuration.java b/odata4-lib/odata4-client-core/src/main/java/org/apache/olingo/odata4/client/core/V4Configuration.java
deleted file mode 100644
index 1aaf534..0000000
--- a/odata4-lib/odata4-client-core/src/main/java/org/apache/olingo/odata4/client/core/V4Configuration.java
+++ /dev/null
@@ -1,29 +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.olingo.odata4.client.core;
-
-public class V4Configuration extends AbstractConfiguration {
-
-  private static final long serialVersionUID = -1134213707190176857L;
-
-  protected V4Configuration() {
-    super();
-  }
-
-}

http://git-wip-us.apache.org/repos/asf/incubator-olingo-odata4/blob/edf8ab9d/odata4-lib/odata4-client-core/src/main/java/org/apache/olingo/odata4/client/core/V4ConfigurationImpl.java
----------------------------------------------------------------------
diff --git a/odata4-lib/odata4-client-core/src/main/java/org/apache/olingo/odata4/client/core/V4ConfigurationImpl.java b/odata4-lib/odata4-client-core/src/main/java/org/apache/olingo/odata4/client/core/V4ConfigurationImpl.java
new file mode 100644
index 0000000..f5f870c
--- /dev/null
+++ b/odata4-lib/odata4-client-core/src/main/java/org/apache/olingo/odata4/client/core/V4ConfigurationImpl.java
@@ -0,0 +1,31 @@
+/*
+ * 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.olingo.odata4.client.core;
+
+import org.apache.olingo.odata4.client.api.V4Configuration;
+
+public class V4ConfigurationImpl extends AbstractConfiguration implements V4Configuration {
+
+  private static final long serialVersionUID = -1134213707190176857L;
+
+  protected V4ConfigurationImpl() {
+    super();
+  }
+
+}