You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@olingo.apache.org by ko...@apache.org on 2014/01/23 12:30:36 UTC

[05/12] [OLINGO-63] Uri Parser: Add support for II

http://git-wip-us.apache.org/repos/asf/incubator-olingo-odata4/blob/7955eadf/odata4-lib/odata4-producer-core/src/test/java/org/apache/olingo/odata4/producer/core/testutil/EdmTechProvider.java
----------------------------------------------------------------------
diff --git a/odata4-lib/odata4-producer-core/src/test/java/org/apache/olingo/odata4/producer/core/testutil/EdmTechProvider.java b/odata4-lib/odata4-producer-core/src/test/java/org/apache/olingo/odata4/producer/core/testutil/EdmTechProvider.java
index 59164e2..3c2bc79 100644
--- a/odata4-lib/odata4-producer-core/src/test/java/org/apache/olingo/odata4/producer/core/testutil/EdmTechProvider.java
+++ b/odata4-lib/odata4-producer-core/src/test/java/org/apache/olingo/odata4/producer/core/testutil/EdmTechProvider.java
@@ -18,11 +18,13 @@
  ******************************************************************************/
 package org.apache.olingo.odata4.producer.core.testutil;
 
+import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.List;
 
 import org.apache.olingo.odata4.commons.api.edm.provider.Action;
 import org.apache.olingo.odata4.commons.api.edm.provider.ActionImport;
+import org.apache.olingo.odata4.commons.api.edm.provider.AliasInfo;
 import org.apache.olingo.odata4.commons.api.edm.provider.ComplexType;
 import org.apache.olingo.odata4.commons.api.edm.provider.EdmProvider;
 import org.apache.olingo.odata4.commons.api.edm.provider.EntityContainerInfo;
@@ -34,12 +36,14 @@ import org.apache.olingo.odata4.commons.api.edm.provider.FullQualifiedName;
 import org.apache.olingo.odata4.commons.api.edm.provider.Function;
 import org.apache.olingo.odata4.commons.api.edm.provider.FunctionImport;
 import org.apache.olingo.odata4.commons.api.edm.provider.NavigationProperty;
+import org.apache.olingo.odata4.commons.api.edm.provider.NavigationPropertyBinding;
 import org.apache.olingo.odata4.commons.api.edm.provider.Parameter;
 import org.apache.olingo.odata4.commons.api.edm.provider.Property;
 import org.apache.olingo.odata4.commons.api.edm.provider.PropertyRef;
 import org.apache.olingo.odata4.commons.api.edm.provider.ReferentialConstraint;
 import org.apache.olingo.odata4.commons.api.edm.provider.ReturnType;
 import org.apache.olingo.odata4.commons.api.edm.provider.Singleton;
+import org.apache.olingo.odata4.commons.api.edm.provider.Target;
 import org.apache.olingo.odata4.commons.api.exception.ODataException;
 import org.apache.olingo.odata4.commons.core.edm.primitivetype.EdmPrimitiveTypeKind;
 
@@ -47,6 +51,21 @@ public class EdmTechProvider extends EdmProvider {
 
   public static final String nameSpace = "com.sap.odata.test1";
 
+  public static final FullQualifiedName nameBAESAllPrimRTETAllPrim =
+      new FullQualifiedName(nameSpace, "BAESAllPrimRTETAllPrim");
+
+  public static final FullQualifiedName nameBAESTwoKeyNavRTESTwoKeyNav =
+      new FullQualifiedName(nameSpace, "BAESTwoKeyNavRTESTwoKeyNav");
+
+  public static final FullQualifiedName nameBAETBaseTwoKeyNavRTETBaseTwoKeyNav =
+      new FullQualifiedName(nameSpace, "BAETBaseTwoKeyNavRTETBaseTwoKeyNav");
+
+  public static final FullQualifiedName nameBAETTwoBaseTwoKeyNavRTETBaseTwoKeyNav =
+      new FullQualifiedName(nameSpace, "BAETTwoBaseTwoKeyNavRTETBaseTwoKeyNav");
+
+  public static final FullQualifiedName nameBAETTwoKeyNavRTETTwoKeyNav =
+      new FullQualifiedName(nameSpace, "BAETTwoKeyNavRTETTwoKeyNav");
+
   public static final FullQualifiedName nameBFCCollCTPrimCompRTESAllPrim =
       new FullQualifiedName(nameSpace, "BFCCollCTPrimCompRTESAllPrim");
 
@@ -59,6 +78,9 @@ public class EdmTechProvider extends EdmProvider {
   public static final FullQualifiedName nameBFCCTPrimCompRTESTwoKeyNav =
       new FullQualifiedName(nameSpace, "BFCCTPrimCompRTESTwoKeyNav");
 
+  public static final FullQualifiedName nameBFCCTPrimCompRTESTwoKeyNavParam =
+      new FullQualifiedName(nameSpace, "BFCCTPrimCompRTESTwoKeyNavParam");
+
   public static final FullQualifiedName nameBFCCTPrimCompRTETTwoKeyNavParam =
       new FullQualifiedName(nameSpace, "BFCCTPrimCompRTETTwoKeyNavParam");
 
@@ -125,44 +147,50 @@ public class EdmTechProvider extends EdmProvider {
   public static final FullQualifiedName nameBFESTwoKeyNavRTESTwoKeyNav =
       new FullQualifiedName(nameSpace, "BFESTwoKeyNavRTESTwoKeyNav");
 
+  public static final FullQualifiedName nameBinary = EdmPrimitiveTypeKind.Binary.getFullQualifiedName();
+  public static final FullQualifiedName nameBoolean = EdmPrimitiveTypeKind.Boolean.getFullQualifiedName();
+  public static final FullQualifiedName nameByte = EdmPrimitiveTypeKind.Byte.getFullQualifiedName();
+  public static final FullQualifiedName nameContainer = new FullQualifiedName(nameSpace, "Container");
   public static final FullQualifiedName nameCTAllPrim = new FullQualifiedName(nameSpace, "CTAllPrim");
   public static final FullQualifiedName nameCTBase = new FullQualifiedName(nameSpace, "CTBase");
+  public static final FullQualifiedName nameCTBasePrimCompNav = new FullQualifiedName(nameSpace, "CTBasePrimCompNav");
   public static final FullQualifiedName nameCTCollAllPrim = new FullQualifiedName(nameSpace, "CTCollAllPrim");
   public static final FullQualifiedName nameCTCompCollComp = new FullQualifiedName(nameSpace, "CTCompCollComp");
   public static final FullQualifiedName nameCTCompComp = new FullQualifiedName(nameSpace, "CTCompComp");
+  public static final FullQualifiedName nameCTCompNav = new FullQualifiedName(nameSpace, "CTCompNav");
+
   public static final FullQualifiedName nameCTMixPrimCollComp = new FullQualifiedName(nameSpace, "CTMixPrimCollComp");
   public static final FullQualifiedName nameCTNavFiveProp = new FullQualifiedName(nameSpace, "CTNavFiveProp");
   public static final FullQualifiedName nameCTPrim = new FullQualifiedName(nameSpace, "CTPrim");
   public static final FullQualifiedName nameCTPrimComp = new FullQualifiedName(nameSpace, "CTPrimComp");
   public static final FullQualifiedName nameCTPrimEnum = new FullQualifiedName(nameSpace, "CTPrimEnum");
   public static final FullQualifiedName nameCTTwoBase = new FullQualifiedName(nameSpace, "CTTwoBase");
+  public static final FullQualifiedName nameCTTwoBasePrimCompNav =
+      new FullQualifiedName(nameSpace, "CTTwoBasePrimCompNav");
   public static final FullQualifiedName nameCTTwoPrim = new FullQualifiedName(nameSpace, "CTTwoPrim");
-
-  public static final FullQualifiedName nameBinary = EdmPrimitiveTypeKind.Binary.getFullQualifiedName();
-  public static final FullQualifiedName nameBoolean = EdmPrimitiveTypeKind.Boolean.getFullQualifiedName();
-  public static final FullQualifiedName nameByte = EdmPrimitiveTypeKind.Byte.getFullQualifiedName();
-  public static final FullQualifiedName nameContainer = new FullQualifiedName(nameSpace, "Container");
   public static final FullQualifiedName nameDate = EdmPrimitiveTypeKind.Date.getFullQualifiedName();
-  public static final FullQualifiedName nameDateTimeOffset = EdmPrimitiveTypeKind.DateTimeOffset.getFullQualifiedName();
+  public static final FullQualifiedName nameDateTimeOffset =
+      EdmPrimitiveTypeKind.DateTimeOffset.getFullQualifiedName();
+
   public static final FullQualifiedName nameDecimal = EdmPrimitiveTypeKind.Decimal.getFullQualifiedName();
   public static final FullQualifiedName nameDouble = EdmPrimitiveTypeKind.Double.getFullQualifiedName();
   public static final FullQualifiedName nameDuration = EdmPrimitiveTypeKind.Duration.getFullQualifiedName();
   public static final FullQualifiedName nameENString = new FullQualifiedName(nameSpace, "ENString");
-
   public static final FullQualifiedName nameETAllKey = new FullQualifiedName(nameSpace, "ETAllKey");
   public static final FullQualifiedName nameETAllNullable = new FullQualifiedName(nameSpace, "ETAllNullable");
   public static final FullQualifiedName nameETAllPrim = new FullQualifiedName(nameSpace, "ETAllPrim");
   public static final FullQualifiedName nameETBase = new FullQualifiedName(nameSpace, "ETBase");
   public static final FullQualifiedName nameETBaseTwoKeyNav = new FullQualifiedName(nameSpace, "ETBaseTwoKeyNav");
-  public static final FullQualifiedName nameETBaseTwoKeyTwoPrim = new FullQualifiedName(nameSpace,
-      "ETBaseTwoKeyTwoPrim");
+  public static final FullQualifiedName nameETBaseTwoKeyTwoPrim =
+      new FullQualifiedName(nameSpace, "ETBaseTwoKeyTwoPrim");
   public static final FullQualifiedName nameETCollAllPrim = new FullQualifiedName(nameSpace, "ETCollAllPrim");
   public static final FullQualifiedName nameETCompAllPrim = new FullQualifiedName(nameSpace, "ETCompAllPrim");
   public static final FullQualifiedName nameETCompCollAllPrim = new FullQualifiedName(nameSpace, "ETCompCollAllPrim");
   public static final FullQualifiedName nameETCompCollComp = new FullQualifiedName(nameSpace, "ETCompCollComp");
   public static final FullQualifiedName nameETCompComp = new FullQualifiedName(nameSpace, "ETCompComp");
-  public static final FullQualifiedName nameETCompMixPrimCollComp = new FullQualifiedName(nameSpace,
-      "ETCompMixPrimCollComp");
+  public static final FullQualifiedName nameETCompMixPrimCollComp =
+      new FullQualifiedName(nameSpace, "ETCompMixPrimCollComp");
+  public static final FullQualifiedName nameETFourKeyAlias = new FullQualifiedName(nameSpace, "ETFourKeyAlias");
   public static final FullQualifiedName nameETKeyNav = new FullQualifiedName(nameSpace, "ETKeyNav");
   public static final FullQualifiedName nameETKeyTwoKeyComp = new FullQualifiedName(nameSpace, "ETKeyTwoKeyComp");
   public static final FullQualifiedName nameETMedia = new FullQualifiedName(nameSpace, "ETMedia");
@@ -170,56 +198,67 @@ public class EdmTechProvider extends EdmProvider {
   public static final FullQualifiedName nameETServerSidePaging =
       new FullQualifiedName(nameSpace, "ETServerSidePaging");
   public static final FullQualifiedName nameETTwoBase = new FullQualifiedName(nameSpace, "ETTwoBase");
-  public static final FullQualifiedName nameETTwoBaseTwoKeyTwoPrim = new FullQualifiedName(nameSpace,
-      "ETTwoBaseTwoKeyTwoPrim");
+  public static final FullQualifiedName nameETTwoBaseTwoKeyNav =
+      new FullQualifiedName(nameSpace, "ETTwoBaseTwoKeyNav");
+  public static final FullQualifiedName nameETTwoBaseTwoKeyTwoPrim =
+      new FullQualifiedName(nameSpace, "ETTwoBaseTwoKeyTwoPrim");
   public static final FullQualifiedName nameETTwoKeyNav = new FullQualifiedName(nameSpace, "ETTwoKeyNav");
   public static final FullQualifiedName nameETTwoKeyTwoPrim = new FullQualifiedName(nameSpace, "ETTwoKeyTwoPrim");
   public static final FullQualifiedName nameETTwoPrim = new FullQualifiedName(nameSpace, "ETTwoPrim");
-
   public static final FullQualifiedName nameGuid = EdmPrimitiveTypeKind.Guid.getFullQualifiedName();
   public static final FullQualifiedName nameInt16 = EdmPrimitiveTypeKind.Int16.getFullQualifiedName();
   public static final FullQualifiedName nameInt32 = EdmPrimitiveTypeKind.Int32.getFullQualifiedName();
   public static final FullQualifiedName nameInt64 = EdmPrimitiveTypeKind.Int64.getFullQualifiedName();
+
   public static final FullQualifiedName nameSByte = EdmPrimitiveTypeKind.SByte.getFullQualifiedName();
   public static final FullQualifiedName nameSingle = EdmPrimitiveTypeKind.Single.getFullQualifiedName();
+
   public static final FullQualifiedName nameString = EdmPrimitiveTypeKind.String.getFullQualifiedName();
   public static final FullQualifiedName nameTimeOfDay = EdmPrimitiveTypeKind.TimeOfDay.getFullQualifiedName();
-
   public static final FullQualifiedName nameUARTCompCollParam = new FullQualifiedName(nameSpace, "UARTCompCollParam");
   public static final FullQualifiedName nameUARTCompParam = new FullQualifiedName(nameSpace, "UARTCompParam");
-  public static final FullQualifiedName nameUARTETCollAllPrimParam = new FullQualifiedName(nameSpace,
-      "UARTETCollAllPrimParam");
+  public static final FullQualifiedName nameUARTETCollAllPrimParam =
+      new FullQualifiedName(nameSpace, "UARTETCollAllPrimParam");
+
   public static final FullQualifiedName nameUARTETParam = new FullQualifiedName(nameSpace, "UARTETParam");
   public static final FullQualifiedName nameUARTPrimCollParam = new FullQualifiedName(nameSpace, "UARTPrimCollParam");
   public static final FullQualifiedName nameUARTPrimParam = new FullQualifiedName(nameSpace, "UARTPrimParam");
   public static final FullQualifiedName nameUFCRTCollCTTwoPrim =
       new FullQualifiedName(nameSpace, "UFCRTCollCTTwoPrim");
+  public static final FullQualifiedName nameUFCRTCollCTTwoPrimParam =
+      new FullQualifiedName(nameSpace, "UFCRTCollCTTwoPrimParam");
   public static final FullQualifiedName nameUFCRTCollString = new FullQualifiedName(nameSpace, "UFCRTCollString");
-  public static final FullQualifiedName nameUFCRTCollStringTwoParam = new FullQualifiedName(nameSpace,
-      "UFCRTCollStringTwoParam");
-  public static final FullQualifiedName nameUFCRTCTAllPrimTwoParam = new FullQualifiedName(nameSpace,
-      "UFCRTCTAllPrimTwoParam");
+  public static final FullQualifiedName nameUFCRTCollStringTwoParam =
+      new FullQualifiedName(nameSpace, "UFCRTCollStringTwoParam");
+  public static final FullQualifiedName nameUFCRTCTAllPrimTwoParam =
+      new FullQualifiedName(nameSpace, "UFCRTCTAllPrimTwoParam");
   public static final FullQualifiedName nameUFCRTCTTwoPrim = new FullQualifiedName(nameSpace, "UFCRTCTTwoPrim");
-  public static final FullQualifiedName nameUFCRTCTTwoPrimParam = new FullQualifiedName(nameSpace,
-      "UFCRTCTTwoPrimParam");
-  public static final FullQualifiedName nameUFCRTESMixPrimCollCompTwoParam = new FullQualifiedName(nameSpace,
-      "UFCRTESMixPrimCollCompTwoParam");
-  public static final FullQualifiedName nameUFCRTESTwoKeyNavParam = new FullQualifiedName(nameSpace,
-      "UFCRTESTwoKeyNavParam");
-  public static final FullQualifiedName nameUFCRTETAllPrimTwoParam = new FullQualifiedName(nameSpace,
-      "UFCRTETAllPrimTwoParam");
+  public static final FullQualifiedName nameUFCRTCTTwoPrimParam =
+      new FullQualifiedName(nameSpace, "UFCRTCTTwoPrimParam");
+  public static final FullQualifiedName nameUFCRTESMixPrimCollCompTwoParam =
+      new FullQualifiedName(nameSpace, "UFCRTESMixPrimCollCompTwoParam");
+  public static final FullQualifiedName nameUFCRTESTwoKeyNavParam =
+      new FullQualifiedName(nameSpace, "UFCRTESTwoKeyNavParam");
+  public static final FullQualifiedName nameUFCRTETAllPrimTwoParam =
+      new FullQualifiedName(nameSpace, "UFCRTETAllPrimTwoParam");
   public static final FullQualifiedName nameUFCRTETKeyNav = new FullQualifiedName(nameSpace, "UFCRTETKeyNav");
   public static final FullQualifiedName nameUFCRTETMedia = new FullQualifiedName(nameSpace, "UFCRTETMedia");
-  public static final FullQualifiedName nameUFCRTETTwoKeyNavParam = new FullQualifiedName(nameSpace,
-      "UFCRTETTwoKeyNavParam");
-  public static final FullQualifiedName nameUFCRTETTwoKeyNavParamCTTwoPrim = new FullQualifiedName(nameSpace,
-      "UFCRTETTwoKeyNavParamCTTwoPrim");
+
+  public static final FullQualifiedName nameUFCRTETTwoKeyNavParam =
+      new FullQualifiedName(nameSpace, "UFCRTETTwoKeyNavParam");
+
+  public static final FullQualifiedName nameUFCRTETTwoKeyNavParamCTTwoPrim =
+      new FullQualifiedName(nameSpace, "UFCRTETTwoKeyNavParamCTTwoPrim");
+
   public static final FullQualifiedName nameUFCRTString = new FullQualifiedName(nameSpace, "UFCRTString");
-  public static final FullQualifiedName nameUFCRTStringTwoParam = new FullQualifiedName(nameSpace,
-      "UFCRTStringTwoParam");
-  public static final FullQualifiedName nameUFNRTESMixPrimCollCompTwoParam = new FullQualifiedName(nameSpace,
-      "UFNRTESMixPrimCollCompTwoParam");
-  public static final FullQualifiedName nameUFNRTInt16 = new FullQualifiedName(nameSpace, "UFNRTInt16");
+
+  public static final FullQualifiedName nameUFCRTStringTwoParam =
+      new FullQualifiedName(nameSpace, "UFCRTStringTwoParam");
+
+  public static final FullQualifiedName nameUFNRTESMixPrimCollCompTwoParam =
+      new FullQualifiedName(nameSpace, "UFNRTESMixPrimCollCompTwoParam");
+  public static final FullQualifiedName nameUFNRTInt16 =
+      new FullQualifiedName(nameSpace, "UFNRTInt16");
 
   NavigationProperty collectionNavPropertyETKeyNavMany_ETKeyNav = new NavigationProperty()
       .setName("NavPropertyETKeyNavMany")
@@ -237,6 +276,10 @@ public class EdmTechProvider extends EdmProvider {
       .setCollection(true)
       .setPartner("NavPropertyETKeyNavOne");
 
+  NavigationProperty collectionNavPropertyETTwoKeyNavOne_ETTwoKeyNav = new NavigationProperty()
+      .setName("NavPropertyETTwoKeyNavOne")
+      .setType(nameETTwoKeyNav);
+
   Property collPropertyBinary = new Property()
       .setName("CollPropertyBinary")
       .setType(nameBinary)
@@ -286,30 +329,28 @@ public class EdmTechProvider extends EdmProvider {
       .setName("CollPropertyDuration")
       .setType(nameDuration)
       .setCollection(true);
-
   Property collPropertyGuid = new Property()
       .setName("CollPropertyGuid")
       .setType(nameGuid)
       .setCollection(true);
-
   Property collPropertyInt16 = new Property()
       .setName("CollPropertyInt16")
       .setType(nameInt16)
       .setCollection(true);
-
   Property collPropertyInt32 = new Property()
       .setName("CollPropertyInt32")
       .setType(nameInt32)
       .setCollection(true);
-
   Property collPropertyInt64 = new Property()
       .setName("CollPropertyInt64")
       .setType(nameInt64)
       .setCollection(true);
+
   Property collPropertySByte = new Property()
       .setName("CollPropertySByte")
       .setType(nameSByte)
       .setCollection(true);
+
   Property collPropertySingle = new Property()
       .setName("CollPropertySingle")
       .setType(nameSingle)
@@ -322,21 +363,25 @@ public class EdmTechProvider extends EdmProvider {
       .setName("CollPropertyTimeOfDay")
       .setType(nameTimeOfDay)
       .setCollection(true);
-
   EntityContainerInfo entityContainerInfoTest1 =
       new EntityContainerInfo().setContainerName(nameContainer);
-
   NavigationProperty navPropertyETKeyNavOne_ETKeyNav = new NavigationProperty()
       .setName("NavPropertyETKeyNavOne")
       .setType(nameETKeyNav);
   NavigationProperty navPropertyETMediaOne_ETMedia = new NavigationProperty()
       .setName("NavPropertyETMediaOne")
       .setType(nameETMedia);
+
+  /*
+   * TODO add stream property
+   * Property propertyStream = new Property()
+   * .setName("PropertyStream")
+   * .setType(EdmStream.getFullQualifiedName());
+   */
+
   NavigationProperty navPropertyETTwoKeyNavOne_ETTwoKeyNav = new NavigationProperty()
       .setName("NavPropertyETTwoKeyNavOne")
-      .setType(nameETTwoKeyNav)
-      .setNullable(false);
-
+      .setType(nameETTwoKeyNav);
   Property propertyBinary = new Property()
       .setName("PropertyBinary")
       .setType(nameBinary);
@@ -355,14 +400,6 @@ public class EdmTechProvider extends EdmProvider {
   Property propertyComplex_CTCompCollComp = new Property()
       .setName("PropertyComplex")
       .setType(nameCTCompCollComp);
-
-  /*
-   * TODO add stream property
-   * Property propertyStream = new Property()
-   * .setName("PropertyStream")
-   * .setType(EdmStream.getFullQualifiedName());
-   */
-
   Property propertyComplex_CTCompComp = new Property()
       .setName("PropertyComplex")
       .setType(nameCTCompComp);
@@ -371,8 +408,7 @@ public class EdmTechProvider extends EdmProvider {
       .setType(nameCTNavFiveProp);
   Property propertyComplex_CTPrimComp_NotNullable = new Property()
       .setName("PropertyComplex")
-      .setType(nameCTPrimComp)
-      .setNullable(false);
+      .setType(nameCTPrimComp);
   Property propertyComplex_CTTwoPrim = new Property()
       .setName("PropertyComplex")
       .setType(nameCTTwoPrim);
@@ -384,41 +420,45 @@ public class EdmTechProvider extends EdmProvider {
       .setType(nameCTCompComp);
   Property propertyComplexEnum_CTPrimEnum_NotNullable = new Property()
       .setName("PropertyComplexEnum")
-      .setType(nameCTPrimEnum)
-      .setNullable(false);
+      .setType(nameCTPrimEnum);
   Property propertyComplexTwoPrim_CTTwoPrim = new Property()
       .setName("PropertyComplexTwoPrim")
       .setType(nameCTTwoPrim);
   Property propertyDate = new Property()
       .setName("PropertyDate")
       .setType(nameDate);
+
   Property propertyDateTimeOffset = new Property()
       .setName("PropertyDateTimeOffset")
       .setType(nameDateTimeOffset);
+
   Property propertyDecimal = new Property()
       .setName("PropertyDecimal")
       .setType(nameDecimal);
+
   Property propertyDouble = new Property()
       .setName("PropertyDouble")
       .setType(nameDouble);
+
   Property propertyDuration = new Property()
       .setName("PropertyDuration")
       .setType(nameDuration);
+
   Property propertyEnumString_ENString = new Property()
       .setName("PropertyEnumString")
       .setType(nameENString);
+
   Property propertyGuid = new Property()
       .setName("PropertyGuid")
       .setType(nameGuid);
+
   Property propertyInt16 = new Property()
       .setName("PropertyInt16")
       .setType(nameInt16);
 
   Property propertyInt16_NotNullable = new Property()
       .setName("PropertyInt16")
-      .setType(nameInt16)
-      .setNullable(false);
-
+      .setType(nameInt16);
   Property propertyInt32 = new Property()
       .setName("PropertyInt32")
       .setType(nameInt32);
@@ -446,8 +486,8 @@ public class EdmTechProvider extends EdmProvider {
 
   Property propertyString_NotNullable = new Property()
       .setName("PropertyString")
-      .setType(nameString)
-      .setNullable(false);
+      .setType(nameString);
+
   Property propertyTimeOfDay = new Property().setName("PropertyTimeOfDay")
       .setType(nameTimeOfDay);
 
@@ -459,28 +499,34 @@ public class EdmTechProvider extends EdmProvider {
         return new ActionImport()
             .setName("AIRTPrimParam")
             .setAction(nameUARTPrimParam);
+
       } else if (name.equals("AIRTPrimCollParam")) {
         return new ActionImport()
             .setName("AIRTPrimCollParam")
             .setAction(nameUARTPrimCollParam);
+
       } else if (name.equals("AIRTCompParam")) {
         return new ActionImport()
             .setName("AIRTCompParam")
             .setAction(nameUARTCompParam);
+
       } else if (name.equals("AIRTCompCollParam")) {
         return new ActionImport()
             .setName("AIRTCompCollParam")
             .setAction(nameUARTCompCollParam);
+
       } else if (name.equals("AIRTETParam")) {
         return new ActionImport()
             .setName("AIRTETParam")
             .setAction(nameUARTETParam);
+
       } else if (name.equals("AIRTETCollAllPrimParam")) {
         return new ActionImport()
             .setName("AIRTETCollAllPrimParam")
             .setAction(nameUARTETCollAllPrimParam);
       }
     }
+
     return null;
   }
 
@@ -489,71 +535,137 @@ public class EdmTechProvider extends EdmProvider {
     if (actionName.equals(nameUARTPrimParam)) {
       return Arrays.asList(
           new Action().setName("UARTPrimParam")
-              .setBound(false)
-              .setReturnType(new ReturnType().setType(nameString))
               .setParameters(Arrays.asList(
                   new Parameter().setName("ParameterInt16").setType(nameInt16)))
+
+              .setReturnType(new ReturnType().setType(nameString))
           );
+
     } else if (actionName.equals(nameUARTPrimCollParam)) {
       return Arrays.asList(
           new Action().setName("UARTPrimCollParam")
-              .setBound(false)
-              .setReturnType(
-                  new ReturnType().setType(nameString).setCollection(true))
               .setParameters(Arrays.asList(
                   new Parameter().setName("ParameterInt16").setType(nameInt16)))
+
+              .setReturnType(
+                  new ReturnType().setType(nameString).setCollection(true))
           );
+
     } else if (actionName.equals(nameUARTCompParam)) {
       return Arrays.asList(
           new Action().setName("UARTCompParam")
-              .setBound(false)
-              .setReturnType(
-                  new ReturnType().setType(nameCTTwoPrim))
               .setParameters(Arrays.asList(
                   new Parameter().setName("ParameterInt16").setType(nameInt16)))
+
+              .setReturnType(
+                  new ReturnType().setType(nameCTTwoPrim))
           );
+
     } else if (actionName.equals(nameUARTCompCollParam)) {
       return Arrays.asList(
           new Action().setName("UARTCompCollParam")
-              .setBound(false)
-              .setReturnType(
-                  new ReturnType().setCollection(true).setType(nameCTTwoPrim))
               .setParameters(Arrays.asList(
                   new Parameter().setName("ParameterInt16").setType(nameInt16)))
+
+              .setReturnType(
+                  new ReturnType().setCollection(true).setType(nameCTTwoPrim))
           );
+
     } else if (actionName.equals(nameUARTETParam)) {
       return Arrays.asList(
           new Action().setName("UARTCompCollParam")
-              .setBound(false)
-              .setReturnType(
-                  new ReturnType().setType(nameETTwoKeyTwoPrim))
               .setParameters(Arrays.asList(
                   new Parameter().setName("ParameterInt16").setType(nameInt16)))
+              .setReturnType(
+                  new ReturnType().setType(nameETTwoKeyTwoPrim))
           );
+
     } else if (actionName.equals(nameUARTETCollAllPrimParam)) {
       return Arrays.asList(
           new Action().setName("UARTETCollAllPrimParam")
-              .setBound(false)
+              .setParameters(Arrays.asList(
+                  new Parameter().setName("ParameterInt16").setType(nameInt16)))
+
               .setReturnType(
                   new ReturnType().setType(nameETCollAllPrim).setCollection(true))
+          );
+
+    } else if (actionName.equals(nameBAETTwoKeyNavRTETTwoKeyNav)) {
+      return Arrays.asList(
+          new Action().setName("BAETTwoKeyNavRTETTwoKeyNav")
               .setParameters(Arrays.asList(
-                  new Parameter().setName("ParameterInt16").setType(nameInt16)))
+                  new Parameter().setName("ParameterETTwoKeyNav").setType(nameETTwoKeyNav)))
+              .setBound(true)
+              .setReturnType(
+                  new ReturnType().setType(nameETTwoKeyNav))
+          ,
+          new Action().setName("BAETTwoKeyNavRTETTwoKeyNav")
+              .setParameters(Arrays.asList(
+                  new Parameter().setName("ParameterETKeyNav").setType(nameETKeyNav)))
+              .setBound(true)
+              .setReturnType(
+                  new ReturnType().setType(nameETTwoKeyNav))
+          );
+
+    } else if (actionName.equals(nameBAESAllPrimRTETAllPrim)) {
+      return Arrays.asList(
+          new Action().setName("BAESAllPrimRTETAllPrim")
+              .setParameters(Arrays.asList(
+                  new Parameter().setName("ParameterESAllPrim").setType(nameETAllPrim).setCollection(true)))
+              .setBound(true)
+              .setReturnType(
+                  new ReturnType().setType(nameETAllPrim))
+          );
+
+    } else if (actionName.equals(nameBAESTwoKeyNavRTESTwoKeyNav)) {
+      return Arrays.asList(
+          new Action().setName("BAESTwoKeyNavRTESTwoKeyNav")
+              .setParameters(Arrays.asList(
+                  new Parameter().setName("ParameterETTwoKeyNav").setType(nameETTwoKeyNav).setCollection(true)))
+              .setBound(true)
+              .setReturnType(
+                  new ReturnType().setType(nameETTwoKeyNav).setCollection(true))
+          );
+
+    } else if (actionName.equals(nameBAETBaseTwoKeyNavRTETBaseTwoKeyNav)) {
+      return Arrays.asList(
+          new Action().setName("BAETBaseTwoKeyNavRTETBaseTwoKeyNav")
+              .setParameters(Arrays.asList(
+                  new Parameter().setName("ParameterETTwoKeyNav").setType(nameETBaseTwoKeyNav)))
+              .setBound(true)
+              .setReturnType(
+                  new ReturnType().setType(nameETTwoKeyNav))
+          );
+
+    } else if (actionName.equals(nameBAETTwoBaseTwoKeyNavRTETBaseTwoKeyNav)) {
+      return Arrays.asList(
+          new Action().setName("BAETTwoBaseTwoKeyNavRTETBaseTwoKeyNav")
+              .setParameters(Arrays.asList(
+                  new Parameter().setName("ParameterETTwoBaseTwoKeyNav").setType(nameETTwoBaseTwoKeyNav)))
+              .setBound(true)
+              .setReturnType(
+                  new ReturnType().setType(nameETBaseTwoKeyNav))
           );
     }
 
-    // complete 20131209
     return null;
   }
 
   @Override
-  public ComplexType
-      getComplexType(final FullQualifiedName
-          complexTypeName) throws
-          ODataException {
+  public List<AliasInfo> getAliasInfos() throws ODataException {
+    return Arrays.asList(
+        new AliasInfo().setAlias("Namespace1_Alias").setNamespace(nameSpace)
+        );
+  }
+
+  @Override
+  public ComplexType getComplexType(final FullQualifiedName complexTypeName) throws ODataException {
+
     if (complexTypeName.equals(nameCTPrim)) {
       return new ComplexType()
           .setName("CTPrim")
           .setProperties(Arrays.asList(propertyInt16));
+
     } else if (complexTypeName.equals(nameCTAllPrim)) {
       return new ComplexType()
           .setName("CTAllPrim")
@@ -562,8 +674,7 @@ public class EdmTechProvider extends EdmProvider {
               propertyDecimal, propertySingle, propertyDouble,
               propertyDuration, propertyGuid, propertyInt16,
               propertyInt32, propertyInt64, propertySByte,
-              propertyTimeOfDay/* ,TODO propertyStream */
-              ));
+              propertyTimeOfDay/* ,TODO propertyStream */));
 
     } else if (complexTypeName.equals(nameCTCollAllPrim)) {
       return new ComplexType()
@@ -578,49 +689,91 @@ public class EdmTechProvider extends EdmProvider {
               collPropertyDate, collPropertyDateTimeOffset,
               collPropertyDuration, collPropertyGuid,
               collPropertyTimeOfDay /* ,TODO collectionPropertyStream */));
+
     } else if (complexTypeName.equals(nameCTTwoPrim)) {
       return new ComplexType()
           .setName("CTTwoPrim")
           .setProperties(Arrays.asList(propertyInt16, propertyString));
+
+    } else if (complexTypeName.equals(nameCTCompNav)) {
+      return new ComplexType()
+          .setName("CTCompNav")
+          .setProperties(Arrays.asList(propertyInt16, propertyComplex_CTNavFiveProp));
+
     } else if (complexTypeName.equals(nameCTMixPrimCollComp)) {
       return new ComplexType()
           .setName("CTMixPrimCollComp")
           .setProperties(Arrays.asList(
               propertyInt16, collPropertyString, propertyComplex_CTTwoPrim, collPropertyComplex_CTTwoPrim));
+
     } else if (complexTypeName.equals(nameCTBase)) {
       return new ComplexType()
           .setName("CTBase")
+          .setBaseType(nameCTTwoPrim)
           .setProperties(Arrays.asList(
-              new Property().setName("AdditionalPropString")
+              new Property()
+                  .setName("AdditionalPropString")
                   .setType(new FullQualifiedName("Edm", "String"))));
+
     } else if (complexTypeName.equals(nameCTTwoBase)) {
       return new ComplexType()
           .setName("CTTwoBase")
+          .setBaseType(nameCTBase)
           .setProperties(Arrays.asList(
-              new Property().setName("AdditionalPropString")
+              new Property()
+                  .setName("AdditionalPropString")
                   .setType(new FullQualifiedName("Edm", "String"))));
+
     } else if (complexTypeName.equals(nameCTCompComp)) {
       return new ComplexType()
           .setName("CTCompComp")
           .setProperties(Arrays.asList(propertyComplex_CTTwoPrim));
+
     } else if (complexTypeName.equals(nameCTCompCollComp)) {
       return new ComplexType()
           .setName("CTCompComp")
           .setProperties(Arrays.asList(collPropertyComplex_CTTwoPrim));
+
     } else if (complexTypeName.equals(nameCTPrimComp)) {
       return new ComplexType()
           .setName("CTPrimComp")
           .setProperties(Arrays.asList(propertyInt16, propertyComplex_CTAllPrim));
+
     } else if (complexTypeName.equals(nameCTNavFiveProp)) {
       return new ComplexType()
           .setName("CTNavFiveProp")
-          .setProperties(Arrays.asList(propertyInt16) /* TODO add nav prop */);
+          .setProperties(Arrays.asList(propertyInt16))
+          .setNavigationProperties((Arrays.asList(
+              collectionNavPropertyETTwoKeyNavOne_ETTwoKeyNav,
+              collectionNavPropertyETTwoKeyNavMany_ETTwoKeyNav,
+              new NavigationProperty()
+                  .setName("NavPropertyETMediaOne")
+                  .setType(nameETMedia),
+              new NavigationProperty()
+                  .setName("NavPropertyETMediaMany")
+                  .setType(nameETMedia).setCollection(true)
+              )));
+
+    } else if (complexTypeName.equals(nameCTBasePrimCompNav)) {
+      return new ComplexType()
+          .setName("CTBasePrimCompNav")
+          .setBaseType(nameCTPrimComp)
+          .setNavigationProperties(Arrays.asList(
+              collectionNavPropertyETTwoKeyNavMany_ETTwoKeyNav,
+              collectionNavPropertyETTwoKeyNavOne_ETTwoKeyNav));
+
     } else if (complexTypeName.equals(nameCTPrimEnum)) {
       return new ComplexType()
           .setName("CTPrimEnum")
-          .setProperties(Arrays.asList(propertyInt16, propertyEnumString_ENString) /* TODO add nav prop */);
+          .setProperties(Arrays.asList(propertyInt16, propertyEnumString_ENString));
+
+    } else if (complexTypeName.equals(nameCTTwoBasePrimCompNav)) {
+      return new ComplexType()
+          .setName("CTTwoBasePrimCompNav")
+          .setBaseType(nameCTBasePrimCompNav);
+
     }
-    // complete 20131205
+
     return null;
   }
 
@@ -631,6 +784,7 @@ public class EdmTechProvider extends EdmProvider {
     } else if (entityContainerName.equals(nameContainer)) {
       return entityContainerInfoTest1;
     }
+
     return null;
   }
 
@@ -641,63 +795,78 @@ public class EdmTechProvider extends EdmProvider {
         return new EntitySet()
             .setName("ESAllPrim")
             .setType(nameETAllPrim);
+
       } else if (name.equals("ESCollAllPrim")) {
         return new EntitySet()
             .setName("ESCollAllPrim")
             .setType(nameETCollAllPrim);
+
       } else if (name.equals("ESTwoPrim")) {
         return new EntitySet()
             .setName("ESTwoPrim")
             .setType(nameETTwoPrim);
+
       } else if (name.equals("ESMixPrimCollComp")) {
         return new EntitySet()
             .setName("ESMixPrimCollComp")
             .setType(nameETMixPrimCollComp);
+
       } else if (name.equals("ESBase")) {
         return new EntitySet()
             .setName("ESBase")
             .setType(nameETBase);
+
       } else if (name.equals("ESTwoBase")) {
         return new EntitySet()
             .setName("ESTwoBase")
             .setType(nameETTwoBase);
+
       } else if (name.equals("ESTwoKeyTwoPrim")) {
         return new EntitySet()
             .setName("ESTwoKeyTwoPrim")
             .setType(nameETTwoKeyTwoPrim);
+
       } else if (name.equals("ESBaseTwoKeyTwoPrim")) {
         return new EntitySet()
             .setName("ESBaseTwoKeyTwoPrim")
             .setType(nameETBaseTwoKeyTwoPrim);
+
       } else if (name.equals("ESTwoBaseTwoKeyTwoPrim")) {
         return new EntitySet()
             .setName("ESTwoBaseTwoKeyTwoPrim")
             .setType(nameETTwoBaseTwoKeyTwoPrim);
+
       } else if (name.equals("ESAllKey")) {
         return new EntitySet()
             .setName("ESAllKey")
             .setType(nameETAllKey);
+
       } else if (name.equals("ESCompAllPrim")) {
         return new EntitySet()
             .setName("ESCompAllPrim")
             .setType(nameETCompAllPrim);
+
       } else if (name.equals("ESCompCollAllPrim")) {
         return new EntitySet()
             .setName("ESCompCollAllPrim")
             .setType(nameETCompCollAllPrim);
+
       } else if (name.equals("ESCompComp")) {
         return new EntitySet()
             .setName("ESCompComp")
             .setType(nameETCompComp);
+
       } else if (name.equals("ESCompCollComp")) {
         return new EntitySet()
             .setName("ESCompCollComp")
             .setType(nameETCompCollComp);
+
       } else if (name.equals("ESMedia")) {
         return new EntitySet()
             .setName("ESMedia")
             .setType(nameETMedia)
             .setIncludeInServiceDocument(true);
+
       } else if (name.equals("ESKeyTwoKeyComp")) {
         return new EntitySet()
             .setName("ESKeyTwoKeyComp")
@@ -705,8 +874,7 @@ public class EdmTechProvider extends EdmProvider {
       } else if (name.equals("ESInvisible")) {
         return new EntitySet()
             .setName("ESInvisible")
-            .setType(nameETAllPrim)
-            .setIncludeInServiceDocument(false);
+            .setType(nameETAllPrim);
       } else if (name.equals("ESServerSidePaging")) {
         return new EntitySet()
             .setName("ESServerSidePaging")
@@ -731,6 +899,10 @@ public class EdmTechProvider extends EdmProvider {
         return new EntitySet()
             .setName("ESCompMixPrimCollComp")
             .setType(nameETCompMixPrimCollComp);
+      } else if (name.equals("ESFourKeyAlias")) {
+        return new EntitySet()
+            .setName("ESFourKeyAlias")
+            .setType(nameETFourKeyAlias);
       }
     }
 
@@ -739,11 +911,12 @@ public class EdmTechProvider extends EdmProvider {
 
   @Override
   public EntityType getEntityType(final FullQualifiedName entityTypeName) throws ODataException {
-    List<PropertyRef> oneKeyPropertyInt16 = Arrays.asList(new PropertyRef().setPropertyName("PropertyInt16"));
 
     if (entityTypeName.equals(nameETAllPrim)) {
       return new EntityType()
           .setName("ETAllPrim")
+          .setKey(Arrays.asList(
+              new PropertyRef().setPropertyName("PropertyInt16")))
           .setProperties(Arrays.asList(
               propertyInt16_NotNullable, propertyString,
               propertyBoolean, propertyByte, propertySByte,
@@ -751,12 +924,13 @@ public class EdmTechProvider extends EdmProvider {
               propertySingle, propertyDouble, propertyDecimal,
               propertyBinary, propertyDate, propertyDateTimeOffset,
               propertyDuration, propertyGuid,
-              propertyTimeOfDay /* TODO add stream property */))
-          .setKey(oneKeyPropertyInt16);
+              propertyTimeOfDay /* TODO add stream property */));
 
     } else if (entityTypeName.equals(nameETCollAllPrim)) {
       return new EntityType()
           .setName("ETCollAllPrim")
+          .setKey(Arrays.asList(new PropertyRef().setPropertyName("PropertyInt16")))
+
           .setProperties(Arrays.asList(
               propertyInt16_NotNullable,
               collPropertyString, collPropertyBoolean,
@@ -764,31 +938,34 @@ public class EdmTechProvider extends EdmProvider {
               collPropertyInt16, collPropertyInt32, collPropertyInt64,
               collPropertySingle, collPropertyDouble, collPropertyDecimal,
               collPropertyBinary, collPropertyDate, collPropertyDateTimeOffset,
-              collPropertyDuration,
-              collPropertyGuid,
-              collPropertyTimeOfDay /* TODO add stream property */))
-          .setKey(oneKeyPropertyInt16);
+              collPropertyDuration, collPropertyGuid, collPropertyTimeOfDay /* TODO add stream property */));
+
     } else if (entityTypeName.equals(nameETTwoPrim)) {
       return new EntityType()
           .setName("ETTwoPrim")
+          .setKey(Arrays.asList(new PropertyRef().setPropertyName("PropertyInt16")))
+
           .setProperties(Arrays.asList(
-              propertyInt16_NotNullable, propertyString))
-          .setKey(oneKeyPropertyInt16);
+              propertyInt16_NotNullable, propertyString));
+
     } else if (entityTypeName.equals(nameETMixPrimCollComp)) {
       return new EntityType()
           .setName("ETMixPrimCollComp")
+          .setKey(Arrays.asList(new PropertyRef().setPropertyName("PropertyInt16")))
+
           .setProperties(Arrays.asList(
               propertyInt16_NotNullable, collPropertyString,
-              propertyComplex_CTTwoPrim, collPropertyComplex_CTTwoPrim))
-          .setKey(oneKeyPropertyInt16);
+              propertyComplex_CTTwoPrim, collPropertyComplex_CTTwoPrim));
+
     } else if (entityTypeName.equals(nameETTwoKeyTwoPrim)) {
       return new EntityType()
           .setName("ETTwoKeyTwoPrim")
-          .setProperties(Arrays.asList(
-              propertyInt16_NotNullable, propertyString))
           .setKey(Arrays.asList(
               new PropertyRef().setPropertyName("PropertyInt16"),
-              new PropertyRef().setPropertyName("PropertyString")));
+              new PropertyRef().setPropertyName("PropertyString")))
+          .setProperties(Arrays.asList(
+              propertyInt16_NotNullable, propertyString));
+
     } else if (entityTypeName.equals(nameETBaseTwoKeyTwoPrim)) {
       return new EntityType()
           .setName("ETBaseTwoKeyTwoPrim")
@@ -798,6 +975,7 @@ public class EdmTechProvider extends EdmProvider {
       return new EntityType()
           .setName("ETTwoBaseTwoKeyTwoPrim")
           .setBaseType(nameETTwoKeyTwoPrim);
+
     } else if (entityTypeName.equals(nameETBase)) {
       return new EntityType()
           .setName("ETBase")
@@ -805,24 +983,19 @@ public class EdmTechProvider extends EdmProvider {
           .setProperties(Arrays.asList(new Property()
               .setName("AdditionalPropertyString_5")
               .setType(nameString)));
+
     } else if (entityTypeName.equals(nameETTwoBase)) {
       return new EntityType()
           .setName("ETTwoBase")
+          .setBaseType(nameETBase)
           .setProperties(Arrays.asList(new Property()
               .setName("AdditionalPropertyString_6")
               .setType(nameString))
           );
+
     } else if (entityTypeName.equals(nameETAllKey)) {
       return new EntityType()
           .setName("ETAllKey")
-          .setProperties(Arrays.asList(
-              propertyString, propertyBoolean,
-              propertyByte, propertySByte,
-              propertyInt16, propertyInt32, propertyInt64,
-              propertyDecimal, propertyDate,
-              propertySingle, propertyDouble, propertyDateTimeOffset,
-              propertyDuration, propertyGuid,
-              propertyTimeOfDay /* TODO add stream property */))
           .setKey(Arrays.asList(
               new PropertyRef().setPropertyName("PropertyString"),
               new PropertyRef().setPropertyName("PropertyBoolean"),
@@ -836,55 +1009,79 @@ public class EdmTechProvider extends EdmProvider {
               new PropertyRef().setPropertyName("PropertyDateTimeOffset"),
               new PropertyRef().setPropertyName("PropertyDuration"),
               new PropertyRef().setPropertyName("PropertyGuid"),
-              new PropertyRef().setPropertyName("PropertyTimeOfDay")));
+              new PropertyRef().setPropertyName("PropertyTimeOfDay")))
+          .setProperties(Arrays.asList(
+              propertyString, propertyBoolean,
+              propertyByte, propertySByte,
+              propertyInt16, propertyInt32, propertyInt64,
+              propertyDecimal, propertyDate,
+              propertySingle, propertyDouble, propertyDateTimeOffset,
+              propertyDuration, propertyGuid,
+              propertyTimeOfDay /* TODO add stream property */));
+
     } else if (entityTypeName.equals(nameETCompAllPrim)) {
       return new EntityType()
           .setName("ETCompAllPrim")
-          .setProperties(Arrays.asList(propertyInt16_NotNullable, propertyComplex_CTAllPrim))
-          .setKey(oneKeyPropertyInt16);
+          .setKey(Arrays.asList(new PropertyRef().setPropertyName("PropertyInt16")))
+          .setProperties(Arrays.asList(propertyInt16_NotNullable, propertyComplex_CTAllPrim));
+
     } else if (entityTypeName.equals(nameETCompCollAllPrim)) {
       return new EntityType()
           .setName("ETCompAllPrim")
-          .setProperties(Arrays.asList(propertyInt16_NotNullable, propertyComplex_CTCollAllPrim))
-          .setKey(oneKeyPropertyInt16);
+          .setKey(Arrays.asList(new PropertyRef().setPropertyName("PropertyInt16")))
+
+          .setProperties(Arrays.asList(propertyInt16_NotNullable, propertyComplex_CTCollAllPrim));
+
     } else if (entityTypeName.equals(nameETCompComp)) {
       return new EntityType()
           .setName("ETCompComp")
-          .setProperties(Arrays.asList(propertyInt16_NotNullable, propertyComplex_CTCompComp))
-          .setKey(oneKeyPropertyInt16);
+          .setKey(Arrays.asList(new PropertyRef().setPropertyName("PropertyInt16")))
+          .setProperties(Arrays.asList(propertyInt16_NotNullable, propertyComplex_CTCompComp));
+
     } else if (entityTypeName.equals(nameETCompCollComp)) {
       return new EntityType()
           .setName("ETCompCollComp")
-          .setProperties(Arrays.asList(propertyInt16_NotNullable, propertyComplex_CTCompCollComp))
-          .setKey(oneKeyPropertyInt16);
+          .setKey(Arrays.asList(new PropertyRef().setPropertyName("PropertyInt16")))
+          .setProperties(Arrays.asList(propertyInt16_NotNullable, propertyComplex_CTCompCollComp));
+
     } else if (entityTypeName.equals(nameETMedia)) {
       return new EntityType()
           .setName("ETCompCollComp")
+          .setKey(Arrays.asList(new PropertyRef().setPropertyName("PropertyInt16")))
           .setProperties(Arrays.asList(propertyInt16_NotNullable))
-          .setKey(oneKeyPropertyInt16)
           .setHasStream(true);
+
     } else if (entityTypeName.equals(nameETKeyTwoKeyComp)) {
       return new EntityType()
           .setName("ETKeyTwoKeyComp")
-          .setProperties(Arrays.asList(
-              propertyInt16_NotNullable, propertyComplex_CTTwoPrim, propertyComplexComplex_CTCompComp))
           .setKey(Arrays.asList(
-              new PropertyRef().setPropertyName("PropertyInt16"),
-              new PropertyRef().setPropertyName("PropertyComplex/PropertyInt16").setAlias("KeyAlias1"),
-              new PropertyRef().setPropertyName("PropertyComplex/PropertyString").setAlias("KeyAlias2"),
-              new PropertyRef().setPropertyName("PropertyComplexComplex/PropertyComplex/PropertyString")
-                  .setAlias("KeyAlias3")));
+              new PropertyRef()
+                  .setPropertyName("PropertyInt16"),
+              new PropertyRef()
+                  .setPropertyName("PropertyComplex/PropertyInt16")
+                  .setAlias("KeyAlias1"),
+              new PropertyRef()
+                  .setPropertyName("PropertyComplex/PropertyString")
+                  .setAlias("KeyAlias2"),
+              new PropertyRef()
+                  .setPropertyName("PropertyComplexComplex/PropertyComplex/PropertyString")
+                  .setAlias("KeyAlias3")))
+          .setProperties(Arrays.asList(
+              propertyInt16_NotNullable, propertyComplex_CTTwoPrim, propertyComplexComplex_CTCompComp));
+
     } else if (entityTypeName.equals(nameETServerSidePaging)) {
       return new EntityType()
           .setName("ETKeyTwoKeyComp")
-          .setProperties(Arrays.asList(propertyInt16_NotNullable, propertyString))
-          .setKey(oneKeyPropertyInt16);
+          .setKey(Arrays.asList(new PropertyRef().setPropertyName("PropertyInt16")))
+          .setProperties(Arrays.asList(propertyInt16_NotNullable, propertyString));
+
     } else if (entityTypeName.equals(nameETAllNullable)) {
       return new EntityType()
           .setName("ETAllNullable")
+          .setKey(Arrays.asList(new PropertyRef().setPropertyName("PropertyKey")))
           .setProperties(Arrays.asList(
               new Property()
-                  .setName("PropertyKey").setType(nameInt16).setNullable(false),
+                  .setName("PropertyKey").setType(nameInt16),
               propertyInt16,
               propertyString, propertyBoolean,
               propertyByte, propertySByte,
@@ -900,29 +1097,37 @@ public class EdmTechProvider extends EdmProvider {
               collPropertySingle, collPropertyDouble,
               collPropertyDecimal, collPropertyBinary, collPropertyDate,
               collPropertyDateTimeOffset,
-              collPropertyDuration, collPropertyGuid, collPropertyTimeOfDay /* TODO add stream, */
-              ))
-          .setKey(Arrays.asList(new PropertyRef().setPropertyName("PropertyKey")));
+              collPropertyDuration, collPropertyGuid, collPropertyTimeOfDay /* TODO add stream, */));
+
     } else if (entityTypeName.equals(nameETKeyNav)) {
       return new EntityType()
-          .setName("ETCollAllPrim")
+          .setName("ETKeyNav")
+          .setKey(Arrays.asList(new PropertyRef().setPropertyName("PropertyInt16")))
           .setProperties(Arrays.asList(
               propertyInt16_NotNullable, propertyString_NotNullable, propertyComplex_CTNavFiveProp,
               propertyComplexAllPrim_CTAllPrim, propertyComplexTwoPrim_CTTwoPrim,
-              collPropertyString, collPropertyInt16, collPropertyComplex_CTPrimComp))
+              collPropertyString, collPropertyInt16, collPropertyComplex_CTPrimComp,
+              new Property()
+                  .setName("PropertyComplexComplex").setType(nameCTCompNav)
+              ))
           .setNavigationProperties(Arrays.asList(
               navPropertyETTwoKeyNavOne_ETTwoKeyNav, collectionNavPropertyETTwoKeyNavMany_ETTwoKeyNav,
               navPropertyETKeyNavOne_ETKeyNav, collectionNavPropertyETKeyNavMany_ETKeyNav,
               navPropertyETMediaOne_ETMedia, collectionNavPropertyETMediaMany_ETMedia
-              ))
-          .setKey(Arrays.asList(new PropertyRef().setPropertyName("PropertyInt16")));
+              ));
+
     } else if (entityTypeName.equals(nameETTwoKeyNav)) {
       return new EntityType()
           .setName("ETTwoKeyNav")
+          .setKey(Arrays.asList(
+              new PropertyRef().setPropertyName("PropertyInt16"),
+              new PropertyRef().setPropertyName("PropertyString")))
           .setProperties(Arrays.asList(
               propertyInt16, propertyString, propertyComplex_CTPrimComp_NotNullable,
+              new Property().setName("PropertyComplexNav").setType(nameCTBasePrimCompNav),
               propertyComplexEnum_CTPrimEnum_NotNullable,
               collPropertyComplex_CTPrimComp,
+              new Property().setName("CollPropertyComplexNav").setType(nameCTNavFiveProp).setCollection(true),
               collPropertyString, propertyComplexTwoPrim_CTTwoPrim,
               propertyEnumString_ENString
               ))
@@ -935,32 +1140,55 @@ public class EdmTechProvider extends EdmProvider {
                           .setProperty("PropertyInt16")
                           .setReferencedProperty("PropertyInt16"))),
               collectionNavPropertyETKeyNavMany_ETKeyNav,
-              collectionNavPropertyETTwoKeyNavMany_ETTwoKeyNav,
-              navPropertyETTwoKeyNavOne_ETTwoKeyNav
-              ))
-          .setKey(Arrays.asList(
-              new PropertyRef().setPropertyName("PropertyInt16"),
-              new PropertyRef().setPropertyName("PropertyString")));
+              navPropertyETTwoKeyNavOne_ETTwoKeyNav,
+              collectionNavPropertyETTwoKeyNavMany_ETTwoKeyNav));
+
     } else if (entityTypeName.equals(nameETBaseTwoKeyNav)) {
       return new EntityType()
           .setName("ETBaseTwoKeyNav")
-          .setProperties(Arrays.asList(
-              propertyDate, propertyComplex_CTPrimComp_NotNullable))
+          .setBaseType(nameETTwoKeyNav)
+          .setProperties(Arrays.asList(propertyDate))
           .setNavigationProperties(Arrays.asList(
-              collectionNavPropertyETKeyNavMany_ETKeyNav,
-              navPropertyETKeyNavOne_ETKeyNav,
-              collectionNavPropertyETTwoKeyNavMany_ETTwoKeyNav,
-              navPropertyETTwoKeyNavOne_ETTwoKeyNav
-              ))
+              new NavigationProperty()
+                  .setName("NavPropertyETBaseTwoKeyNav")
+                  .setType(nameETBaseTwoKeyNav),
+              new NavigationProperty()
+                  .setName("NavPropertyETTwoBaseTwoKeyNav")
+                  .setType(nameETTwoBaseTwoKeyNav)))
           .setHasStream(true);
+
+    } else if (entityTypeName.equals(nameETTwoBaseTwoKeyNav)) {
+      return new EntityType()
+          .setName("ETTwoBaseTwoKeyNav")
+          .setBaseType(nameETBaseTwoKeyNav)
+          .setKey(Arrays.asList(new PropertyRef().setPropertyName("PropertyInt16")))
+          .setProperties(Arrays.asList(propertyGuid))
+          .setNavigationProperties(Arrays.asList(
+              new NavigationProperty()
+                  .setName("NavPropertyETBaseTwoKeyNavOne")
+                  .setType(nameETBaseTwoKeyNav),
+              new NavigationProperty()
+                  .setName("NavPropertyETBaseTwoKeyNavMany")
+                  .setType(nameETBaseTwoKeyNav)
+                  .setCollection(true)
+              ));
+
     } else if (entityTypeName.equals(nameETCompMixPrimCollComp)) {
       return new EntityType()
-          .setName("ETCompMixPrimCollComp")
-          .setProperties(Arrays.asList(propertyInt16, propertyMixedPrimCollComp_CTMixPrimCollComp))
-          .setKey(oneKeyPropertyInt16);
+          .setName("ETFourKeyAlias")
+          .setKey(Arrays.asList(
+              new PropertyRef()
+                  .setPropertyName("PropertyInt16"),
+              new PropertyRef()
+                  .setPropertyName("PropertyComplex/PropertyInt16").setAlias("KeyAlias1"),
+              new PropertyRef()
+                  .setPropertyName("PropertyComplex/PropertyString").setAlias("KeyAlias2"),
+              new PropertyRef()
+                  .setPropertyName("PropertyComplexComplex/PropertyComplex/PropertyString")
+                  .setAlias("KeyAlias3")))
+          .setProperties(Arrays.asList(propertyGuid, propertyComplex_CTTwoPrim, propertyComplexComplex_CTCompComp));
     }
 
-    // complete 20131205
     return null;
   }
 
@@ -974,7 +1202,7 @@ public class EdmTechProvider extends EdmProvider {
               new EnumMember().setName("String2").setValue("2"),
               new EnumMember().setName("String3").setValue("3")));
     }
-    // complete 20131205
+
     return null;
   }
 
@@ -989,777 +1217,688 @@ public class EdmTechProvider extends EdmProvider {
             .setFunction(nameUFNRTInt16)
             .setIncludeInServiceDocument(true);
 
-      }
-    } else if (entityContainer.equals(nameContainer)) {
-      if (name.equals("FINInvisibleRTInt16")) {
+      } else if (name.equals("FINInvisibleRTInt16")) {
         return new FunctionImport()
             .setName("FINInvisibleRTInt16")
-            .setFunction(nameUFNRTInt16)
-            .setIncludeInServiceDocument(false);
+            .setFunction(nameUFNRTInt16);
 
-      }
-    } else if (entityContainer.equals(nameContainer)) {
-      if (name.equals("FINInvisible2RTInt16")) {
+      } else if (name.equals("FINInvisible2RTInt16")) {
         return new FunctionImport()
             .setName("FINInvisible2RTInt16")
             .setFunction(nameUFNRTInt16);
 
-      }
-    } else if (entityContainer.equals(nameContainer)) {
-      if (name.equals("FICRTETKeyNav")) {
+      } else if (name.equals("FICRTETKeyNav")) {
         return new FunctionImport()
             .setName("FICRTETKeyNav")
             .setFunction(nameUFCRTETKeyNav);
 
-      }
-    } else if (entityContainer.equals(nameContainer)) {
-      if (name.equals("FICRTETTwoKeyNavParam")) {
+      } else if (name.equals("FICRTETTwoKeyNavParam")) {
         return new FunctionImport()
             .setName("FICRTETTwoKeyNavParam")
             .setFunction(nameUFCRTETTwoKeyNavParam)
             .setIncludeInServiceDocument(true);
 
-      }
-    } else if (entityContainer.equals(nameContainer)) {
-      if (name.equals("FICRTStringTwoParam")) {
+      } else if (name.equals("FICRTStringTwoParam")) {
         return new FunctionImport()
             .setName("FICRTStringTwoParam")
             .setFunction(nameUFCRTStringTwoParam)
             .setIncludeInServiceDocument(true);
 
-      }
-    } else if (entityContainer.equals(nameContainer)) {
-      if (name.equals("FICRTCollStringTwoParam")) {
+      } else if (name.equals("FICRTCollStringTwoParam")) {
         return new FunctionImport()
             .setName("FICRTCollStringTwoParam")
             .setFunction(nameUFCRTCollStringTwoParam)
             .setIncludeInServiceDocument(true);
 
-      }
-    } else if (entityContainer.equals(nameContainer)) {
-      if (name.equals("FICRTCTAllPrimTwoParam")) {
+      } else if (name.equals("FICRTCTAllPrimTwoParam")) {
         return new FunctionImport()
             .setName("FICRTCTAllPrimTwoParam")
             .setFunction(nameUFCRTCTAllPrimTwoParam)
             .setIncludeInServiceDocument(true);
 
-      }
-    } else if (entityContainer.equals(nameContainer)) {
-      if (name.equals("FICRTESMixPrimCollCompTwoParam")) {
+      } else if (name.equals("FICRTESMixPrimCollCompTwoParam")) {
         return new FunctionImport()
             .setName("FICRTESMixPrimCollCompTwoParam")
             .setFunction(nameUFCRTESMixPrimCollCompTwoParam)
             .setIncludeInServiceDocument(true);
 
-      }
-    } else if (entityContainer.equals(nameContainer)) {
-      if (name.equals("FINRTESMixPrimCollCompTwoParam")) {
+      } else if (name.equals("FINRTESMixPrimCollCompTwoParam")) {
         return new FunctionImport()
             .setName("FINRTESMixPrimCollCompTwoParam")
             .setFunction(nameUFNRTESMixPrimCollCompTwoParam)
             .setIncludeInServiceDocument(true);
 
-      }
-    } else if (entityContainer.equals(nameContainer)) {
-      if (name.equals("FICRTCollCTTwoPrim")) {
+      } else if (name.equals("FICRTCollCTTwoPrim")) {
         return new FunctionImport()
             .setName("FICRTCollCTTwoPrim")
             .setFunction(nameUFCRTCollCTTwoPrim)
             .setIncludeInServiceDocument(true);
 
-      }
-    } else if (entityContainer.equals(nameContainer)) {
-      if (name.equals("FICRTETMedia")) {
+      } else if (name.equals("FICRTETMedia")) {
         return new FunctionImport()
             .setName("FICRTETMedia")
             .setFunction(nameUFCRTETMedia)
             .setIncludeInServiceDocument(true);
 
-      }
-    } else if (entityContainer.equals(nameContainer)) {
-      if (name.equals("FICRTCTTwoPrimParam")) {
+      } else if (name.equals("FICRTCTTwoPrimParam")) {
         return new FunctionImport()
             .setName("FICRTCTTwoPrimParam")
             .setFunction(nameUFCRTCTTwoPrimParam)
             .setIncludeInServiceDocument(true);
 
-      }
-    } else if (entityContainer.equals(nameContainer)) {
-      if (name.equals("FICRTCTTwoPrim")) {
+      } else if (name.equals("FICRTCTTwoPrim")) {
         return new FunctionImport()
             .setName("FICRTCTTwoPrim")
             .setFunction(nameUFCRTCTTwoPrim)
             .setIncludeInServiceDocument(true);
 
-      }
-    } else if (entityContainer.equals(nameContainer)) {
-      if (name.equals("FICRTCollString")) {
+      } else if (name.equals("FICRTCollString")) {
         return new FunctionImport()
             .setName("FICRTCollString")
             .setFunction(nameUFCRTCollString)
             .setIncludeInServiceDocument(true);
 
-      }
-    } else if (entityContainer.equals(nameContainer)) {
-      if (name.equals("FICRTString")) {
+      } else if (name.equals("FICRTString")) {
         return new FunctionImport()
             .setName("FICRTString")
             .setFunction(nameUFCRTString)
             .setIncludeInServiceDocument(true);
 
-      }
-    } else if (entityContainer.equals(nameContainer)) {
-      if (name.equals("FICRTESTwoKeyNavParam")) {
+      } else if (name.equals("FICRTESTwoKeyNavParam")) {
         return new FunctionImport()
             .setName("FICRTESTwoKeyNavParam")
             .setFunction(nameUFCRTESTwoKeyNavParam)
             .setIncludeInServiceDocument(true);
 
+      } else if (name.equals("FICRTCollCTTwoPrimParam")) {
+        return new FunctionImport()
+            .setName("FICRTCollCTTwoPrimParam")
+            .setFunction(nameUFCRTCollCTTwoPrimParam)
+            .setIncludeInServiceDocument(true);
+
       }
     }
+
     return null;
   }
 
   @Override
   public List<Function> getFunctions(final FullQualifiedName functionName) throws ODataException {
-    ReturnType returnTypeString = new ReturnType()
-        .setType(nameString);
-
-    ReturnType returnTypeString_NotNullable = new ReturnType()
-        .setType(nameString)
-        .setNullable(false);
-
-    ReturnType returnTypeETTwoKeyNav_NotNullable = new ReturnType()
-        .setType(nameETTwoKeyNav)
-        .setNullable(false);
-
-    ReturnType returnTypeCollectionETTwoKeyNav_NotNullable = new ReturnType()
-        .setType(nameETTwoKeyNav)
-        .setNullable(false)
-        .setCollection(true);
 
     if (functionName.equals(nameUFNRTInt16)) {
       return Arrays.asList(
           new Function()
               .setName("UFNRTInt16")
-              .setBound(false)
-              .setReturnType(returnTypeString)
+              .setParameters(new ArrayList<Parameter>())
+              .setReturnType(
+                  new ReturnType().setType(nameString))
           );
+
     } else if (functionName.equals(nameUFCRTETKeyNav)) {
       return Arrays.asList(
           new Function()
               .setName("UFCRTETKeyNav")
-              .setBound(true)
+              .setParameters(new ArrayList<Parameter>())
               .setComposable(true)
               .setReturnType(
-                  new ReturnType().setType(nameETKeyNav).setNullable(false))
+                  new ReturnType().setType(nameETKeyNav))
           );
+
     } else if (functionName.equals(nameUFCRTETTwoKeyNavParam)) {
       return Arrays.asList(
-          new Function().setName("UFCRTETTwoKeyNavParam")
-              .setBound(false)
-              .setComposable(true)
+          new Function()
+              .setName("UFCRTETTwoKeyNavParam")
               .setParameters(Arrays.asList(
-                  new Parameter()
-                      .setName("ParameterInt16")
-                      .setType(nameInt16)
-                      .setNullable(false)))
-              .setReturnType(returnTypeETTwoKeyNav_NotNullable)
+                  new Parameter().setName("ParameterInt16").setType(nameInt16)))
+              .setComposable(true)
+              .setReturnType(
+                  new ReturnType().setType(nameETTwoKeyNav)
+              )
           );
+
     } else if (functionName.equals(nameUFCRTETTwoKeyNavParamCTTwoPrim)) {
       return Arrays.asList(
-          new Function().setName("UFCRTETTwoKeyNavParamCTTwoPrim")
-              .setBound(false)
-              .setComposable(true)
+          new Function()
+              .setName("UFCRTETTwoKeyNavParamCTTwoPrim")
               .setParameters(Arrays.asList(
-                  new Parameter()
-                      .setName("ParameterCTTwoPrim")
-                      .setType(nameCTTwoPrim)
-                      .setNullable(false)))
-              .setReturnType(returnTypeETTwoKeyNav_NotNullable)
-
+                  new Parameter().setName("ParameterCTTwoPrim").setType(nameCTTwoPrim)))
+              .setComposable(true)
+              .setReturnType(
+                  new ReturnType().setType(nameETTwoKeyNav)
+              )
           );
+
     } else if (functionName.equals(nameUFCRTStringTwoParam)) {
       return Arrays.asList(
           new Function()
               .setName("UFCRTStringTwoParam")
-              .setBound(false)
-              .setComposable(true)
               .setParameters(Arrays.asList(
                   new Parameter()
                       .setName("ParameterString")
-                      .setType(nameString)
-                      .setNullable(false),
+                      .setType(nameString),
                   new Parameter()
                       .setName("ParameterInt16")
-                      .setType(nameInt16)
-                      .setNullable(false)))
-              .setReturnType(returnTypeString_NotNullable)
-
+                      .setType(nameInt16)))
+              .setComposable(true)
+              .setReturnType(
+                  new ReturnType().setType(nameString))
           );
+
     } else if (functionName.equals(nameUFCRTESTwoKeyNavParam)) {
       return Arrays.asList(
           new Function()
               .setName("UFCRTESTwoKeyNavParam")
-              .setBound(false)
-              .setComposable(true)
               .setParameters(Arrays.asList(
                   new Parameter()
                       .setName("ParameterInt16")
-                      .setType(nameInt16)
-                      .setNullable(false)))
+                      .setType(nameInt16)))
+              .setComposable(true)
               .setReturnType(
-                  new ReturnType().setType(nameETTwoKeyNav).setNullable(false).setCollection(true))
-
+                  new ReturnType().setType(nameETTwoKeyNav).setCollection(true))
           );
+
     } else if (functionName.equals(nameUFCRTString)) {
       return Arrays.asList(
           new Function()
               .setName("UFCRTString")
-              .setBound(true)
+
+              .setComposable(true)
+              .setParameters(new ArrayList<Parameter>())
               .setComposable(true)
-              .setReturnType(returnTypeString_NotNullable)
+              .setReturnType(
+                  new ReturnType().setType(nameString)
+              )
           );
+
     } else if (functionName.equals(nameUFCRTCollStringTwoParam)) {
       return Arrays.asList(
           new Function()
               .setName("UFCRTCollStringTwoParam")
-              .setBound(false)
-              .setComposable(true)
               .setParameters(Arrays.asList(
-                  new Parameter()
-                      .setName("ParameterString")
-                      .setType(nameString)
-                      .setNullable(false),
-                  new Parameter()
-                      .setName("ParameterInt16")
-                      .setType(nameInt16)
-                      .setNullable(false)))
+                  new Parameter().setName("ParameterString").setType(nameString),
+                  new Parameter().setName("ParameterInt16").setType(nameInt16)))
+              .setComposable(true)
               .setReturnType(
-                  new ReturnType().setType(nameString).setNullable(false).setCollection(true))
-
+                  new ReturnType().setType(nameString).setCollection(true))
           );
+
     } else if (functionName.equals(nameUFCRTCollString)) {
       return Arrays.asList(
           new Function()
               .setName("UFCRTCollString")
-              .setBound(false)
+              .setParameters(new ArrayList<Parameter>())
               .setComposable(true)
               .setReturnType(
-                  new ReturnType().setType(nameString).setNullable(false).setCollection(true))
-
+                  new ReturnType().setType(nameString).setCollection(true))
           );
+
     } else if (functionName.equals(nameUFCRTCTAllPrimTwoParam)) {
       return Arrays.asList(
           new Function()
               .setName("UFCRTCTAllPrimTwoParam")
-              .setBound(false)
-              .setComposable(true)
               .setParameters(Arrays.asList(
-                  new Parameter()
-                      .setName("ParameterString")
-                      .setType(nameString)
-                      .setNullable(false),
-                  new Parameter()
-                      .setName("ParameterInt16")
-                      .setType(nameInt16)
-                      .setNullable(false)))
+                  new Parameter().setName("ParameterString").setType(nameString),
+                  new Parameter().setName("ParameterInt16").setType(nameInt16)))
+              .setComposable(true)
               .setReturnType(
-                  new ReturnType().setType(nameCTAllPrim).setNullable(false))
-
+                  new ReturnType().setType(nameCTAllPrim))
           );
+
     } else if (functionName.equals(nameUFCRTCTTwoPrimParam)) {
       return Arrays.asList(
           new Function()
               .setName("UFCRTCTTwoPrimParam")
-              .setBound(false)
-              .setComposable(true)
               .setParameters(Arrays.asList(
-                  new Parameter()
-                      .setName("ParameterString")
-                      .setType(nameString)
-                      .setNullable(false),
-                  new Parameter()
-                      .setName("ParameterInt16")
-                      .setType(nameInt16)
-                      .setNullable(false)))
+                  new Parameter().setName("ParameterString").setType(nameString),
+                  new Parameter().setName("ParameterInt16").setType(nameInt16)))
+              .setComposable(true)
               .setReturnType(
-                  new ReturnType().setType(nameCTTwoPrim).setNullable(false))
-
+                  new ReturnType().setType(nameCTTwoPrim))
           );
+
     } else if (functionName.equals(nameUFCRTCTTwoPrim)) {
       return Arrays.asList(
           new Function()
               .setName("UFCRTCTTwoPrim")
-              .setBound(false)
+              .setParameters(new ArrayList<Parameter>())
               .setComposable(true)
               .setReturnType(
-                  new ReturnType().setType(nameCTTwoPrim).setNullable(false))
+                  new ReturnType().setType(nameCTTwoPrim))
           );
+
     } else if (functionName.equals(nameUFCRTCollCTTwoPrim)) {
       return Arrays.asList(
           new Function()
               .setName("UFCRTCTTwoPrim")
-              .setBound(false)
+
+              .setParameters(new ArrayList<Parameter>())
               .setReturnType(
-                  new ReturnType().setType(nameCTTwoPrim).setNullable(false).setCollection(true))
+                  new ReturnType().setType(nameCTTwoPrim).setCollection(true))
           );
+
     } else if (functionName.equals(nameUFCRTETMedia)) {
       return Arrays.asList(
           new Function()
               .setName("UFCRTETMedia")
-              .setBound(false)
+              .setParameters(new ArrayList<Parameter>())
               .setReturnType(
-                  new ReturnType().setType(nameETMedia).setNullable(false))
+                  new ReturnType().setType(nameETMedia))
           );
+
     } else if (functionName.equals(nameUFCRTString)) {
       return Arrays.asList(
           new Function()
               .setName("UFCRTString")
-              .setBound(false)
-              .setReturnType(returnTypeString_NotNullable)
+              .setParameters(new ArrayList<Parameter>())
+              .setReturnType(new ReturnType()
+                  .setType(nameString)
+              )
           );
+
     } else if (functionName.equals(nameUFCRTCollCTTwoPrim)) {
       return Arrays.asList(
           new Function()
               .setName("UFCRTCollCTTwoPrim")
-              .setBound(false)
               .setComposable(true)
+              .setParameters(new ArrayList<Parameter>())
               .setReturnType(
-                  new ReturnType().setType(nameCTTwoPrim).setNullable(false).setCollection(true))
+                  new ReturnType().setType(nameCTTwoPrim).setCollection(true))
           );
+
     } else if (functionName.equals(nameUFNRTESMixPrimCollCompTwoParam)) {
       return Arrays.asList(
           new Function()
               .setName("UFNRTESMixPrimCollCompTwoParam")
-              .setBound(false)
-              .setComposable(false)
               .setParameters(Arrays.asList(
-                  new Parameter()
-                      .setName("ParameterString")
-                      .setType(nameString)
-                      .setNullable(false),
-                  new Parameter()
-                      .setName("ParameterInt16")
-                      .setType(nameInt16)
-                      .setNullable(false)))
+                  new Parameter().setName("ParameterString").setType(nameString),
+                  new Parameter().setName("ParameterInt16").setType(nameInt16)))
+              .setComposable(false)
               .setReturnType(
-                  new ReturnType().setType(nameETMixPrimCollComp).setNullable(false).setCollection(true))
+                  new ReturnType().setType(nameETMixPrimCollComp).setCollection(true))
           );
 
     } else if (functionName.equals(nameUFCRTETAllPrimTwoParam)) {
       return Arrays.asList(
           new Function()
               .setName("UFCRTETAllPrimTwoParam")
-              .setBound(false)
-              .setComposable(true)
               .setParameters(Arrays.asList(
-                  new Parameter()
-                      .setName("ParameterString")
-                      .setType(nameString)
-                      .setNullable(false),
-                  new Parameter()
-                      .setName("ParameterInt16")
-                      .setType(nameInt16)
-                      .setNullable(false)))
+                  new Parameter().setName("ParameterString").setType(nameString),
+                  new Parameter().setName("ParameterInt16").setType(nameInt16)))
+              .setComposable(true)
               .setReturnType(
-                  new ReturnType().setType(nameETAllPrim).setNullable(false))
+                  new ReturnType().setType(nameETAllPrim))
           );
+
     } else if (functionName.equals(nameUFCRTESMixPrimCollCompTwoParam)) {
       return Arrays.asList(
           new Function()
               .setName("UFCRTESMixPrimCollCompTwoParam")
-              .setBound(false)
-              .setComposable(true)
               .setParameters(Arrays.asList(
-                  new Parameter()
-                      .setName("ParameterString")
-                      .setType(nameString)
-                      .setNullable(false),
-                  new Parameter()
-                      .setName("ParameterInt16")
-                      .setType(nameInt16)
-                      .setNullable(false)))
+                  new Parameter().setName("ParameterString").setType(nameString),
+                  new Parameter().setName("ParameterInt16").setType(nameInt16)
+                  ))
+              .setComposable(true)
               .setReturnType(
-                  new ReturnType().setType(nameETMixPrimCollComp).setNullable(false).setCollection(true))
+                  new ReturnType().setType(nameETMixPrimCollComp).setCollection(true))
           );
+
     } else if (functionName.equals(nameBFCESTwoKeyNavRTESTwoKeyNav)) {
       return Arrays.asList(
           new Function()
               .setName("BFCESTwoKeyNavRTESTwoKeyNav")
               .setBound(true)
+              .setParameters(Arrays.asList(
+                  new Parameter().setName("BindingParam").setType(nameETTwoKeyNav).setCollection(true),
+                  new Parameter().setName("ParameterString").setType(nameString).setCollection(false)))
               .setComposable(true)
+              .setReturnType(
+                  new ReturnType().setType(nameETTwoKeyNav).setCollection(true)),
+          new Function()
+              .setName("BFCESTwoKeyNavRTESTwoKeyNav")
+              .setBound(true)
+
+              .setParameters(Arrays.asList(
+                  new Parameter().setName("BindingParam").setType(nameETTwoKeyNav).setCollection(true)))
+              .setComposable(true)
+              .setReturnType(
+                  new ReturnType().setType(nameETTwoKeyNav).setCollection(true)),
+          new Function()
+              .setName("BFCESTwoKeyNavRTESTwoKeyNav")
+              .setBound(true)
               .setParameters(
-                  Arrays.asList(
-                      new Parameter()
-                          .setName("BindingParam")
-                          .setType(nameETTwoKeyNav)
-                          .setNullable(false)
-                          .setCollection(false)))
+                  Arrays.asList(new Parameter().setName("BindingParam").setType(nameETKeyNav).setCollection(true)))
+              .setComposable(true)
               .setReturnType(
-                  new ReturnType().setType(nameETTwoKeyNav).setNullable(false).setCollection(true))
+                  new ReturnType().setType(nameETTwoKeyNav).setCollection(true))
           );
+
     } else if (functionName.equals(nameBFCStringRTESTwoKeyNav)) {
       return Arrays.asList(
           new Function().setName("BFCStringRTESTwoKeyNav")
               .setBound(true)
-              .setComposable(true)
               .setParameters(Arrays.asList(
-                  new Parameter().setName("BindingParam").setType(nameString).setNullable(false)))
-              .setReturnType(returnTypeCollectionETTwoKeyNav_NotNullable)
+                  new Parameter().setName("BindingParam").setType(nameString)))
+              .setComposable(true)
+              .setReturnType(
+                  new ReturnType().setType(nameETTwoKeyNav).setCollection(true))
           );
+
     } else if (functionName.equals(nameBFCETBaseTwoKeyNavRTETTwoKeyNav)) {
       return Arrays.asList(
           new Function()
               .setName("BFCETBaseTwoKeyNavRTETTwoKeyNav")
               .setBound(true)
-              .setComposable(true)
               .setParameters(Arrays.asList(
-                  new Parameter().setName("BindingParam").setType(nameETBaseTwoKeyNav).setNullable(false)))
-              .setReturnType(returnTypeETTwoKeyNav_NotNullable)
+                  new Parameter().setName("BindingParam").setType(nameETBaseTwoKeyNav)))
+              .setComposable(true)
+              .setReturnType(
+                  new ReturnType().setType(nameETTwoKeyNav)
+              )
           );
+
     } else if (functionName.equals(nameBFCESBaseTwoKeyNavRTESBaseTwoKey)) {
       return Arrays.asList(
           new Function()
               .setName("BFCESBaseTwoKeyNavRTESBaseTwoKey")
               .setBound(true)
-              .setComposable(true)
               .setParameters(Arrays.asList(
-                  new Parameter()
-                      .setName("BindingParam")
-                      .setType(nameETBaseTwoKeyNav)
-                      .setNullable(false)
+                  new Parameter().setName("BindingParam").setType(nameETBaseTwoKeyNav)
                       .setCollection(true)))
+              .setComposable(true)
               .setReturnType(
-                  new ReturnType().setType(nameETBaseTwoKeyNav).setNullable(false).setCollection(true))
+                  new ReturnType().setType(nameETBaseTwoKeyNav).setCollection(true))
           );
+
     } else if (functionName.equals(nameBFCESAllPrimRTCTAllPrim)) {
       return Arrays.asList(
           new Function()
               .setName("BFCESAllPrimRTCTAllPrim")
               .setBound(true)
-              .setComposable(true)
               .setParameters(Arrays.asList(
-                  new Parameter()
-                      .setName("BindingParam")
-                      .setType(nameETAllPrim)
-                      .setNullable(false)
-                      .setCollection(true)))
+                  new Parameter().setName("BindingParam").setType(nameETAllPrim).setCollection(true)))
+              .setComposable(true)
               .setReturnType(
-                  new ReturnType().setType(nameCTAllPrim).setNullable(false))
+                  new ReturnType().setType(nameCTAllPrim))
           );
+
     } else if (functionName.equals(nameBFCESTwoKeyNavRTCTTwoPrim)) {
       return Arrays.asList(
           new Function()
               .setName("BFCESTwoKeyNavRTCTTwoPrim")
               .setBound(true)
-              .setComposable(true)
               .setParameters(Arrays.asList(
-                  new Parameter()
-                      .setName("BindingParam")
-                      .setType(nameETTwoKeyNav)
-                      .setNullable(false)
-                      .setCollection(true)))
+                  new Parameter().setName("BindingParam").setType(nameETTwoKeyNav).setCollection(true)))
+              .setComposable(true)
               .setReturnType(
-                  new ReturnType().setType(nameCTTwoPrim).setNullable(false))
+                  new ReturnType().setType(nameCTTwoPrim))
           );
+
     } else if (functionName.equals(nameBFCESTwoKeyNavRTCollCTTwoPrim)) {
       return Arrays.asList(
           new Function()
               .setName("BFCESTwoKeyNavRTCollCTTwoPrim")
               .setBound(true)
-              .setComposable(true)
               .setParameters(Arrays.asList(
-                  new Parameter()
-                      .setName("BindingParam")
-                      .setType(nameETTwoKeyNav)
-                      .setNullable(false)
-                      .setCollection(true)))
+                  new Parameter().setName("BindingParam").setType(nameETTwoKeyNav).setCollection(true)))
+              .setComposable(true)
               .setReturnType(
-                  new ReturnType().setType(nameCTTwoPrim).setNullable(false).setCollection(true))
+                  new ReturnType().setType(nameCTTwoPrim).setCollection(true))
           );
+
     } else if (functionName.equals(nameBFCESTwoKeyNavRTString)) {
       return Arrays.asList(
           new Function()
               .setName("BFCESTwoKeyNavRTString")
               .setBound(true)
-              .setComposable(true)
               .setParameters(Arrays.asList(
-                  new Parameter()
-                      .setName("BindingParam")
-                      .setType(nameETTwoKeyNav)
-                      .setNullable(false)
-                      .setCollection(true)))
-              .setReturnType(returnTypeString_NotNullable)
+                  new Parameter().setName("BindingParam").setType(nameETTwoKeyNav).setCollection(true)))
+              .setComposable(true)
+              .setReturnType(
+                  new ReturnType().setType(nameString))
           );
+
     } else if (functionName.equals(nameBFCESTwoKeyNavRTCollString)) {
       return Arrays.asList(
           new Function()
               .setName("BFCESTwoKeyNavRTCollString")
               .setBound(true)
-              .setComposable(true)
               .setParameters(Arrays.asList(
-                  new Parameter()
-                      .setName("BindingParam")
-                      .setType(nameETTwoKeyNav)
-                      .setNullable(false)))
+                  new Parameter().setName("BindingParam").setType(nameETTwoKeyNav).setCollection(true)))
+              .setComposable(true)
               .setReturnType(
-                  new ReturnType().setType(nameString).setNullable(false).setCollection(true))
+                  new ReturnType().setType(nameString).setCollection(true))
           );
+
     } else if (functionName.equals(nameBFCETTwoKeyNavRTESTwoKeyNav)) {
       return Arrays.asList(
           new Function()
               .setName("BFCETTwoKeyNavRTESTwoKeyNav")
               .setBound(true)
-              .setComposable(true)
               .setParameters(Arrays.asList(
-                  new Parameter()
-                      .setName("BindingParam")
-                      .setType(nameETTwoKeyNav)
-                      .setNullable(false)))
-              .setReturnType(returnTypeCollectionETTwoKeyNav_NotNullable)
+                  new Parameter().setName("BindingParam").setType(nameETTwoKeyNav)))
+              .setComposable(true)
+              .setReturnType(
+                  new ReturnType().setType(nameETTwoKeyNav).setCollection(true))
           );
+
     } else if (functionName.equals(nameBFCETBaseTwoKeyNavRTESTwoKeyNav)) {
       return Arrays.asList(
           new Function()
               .setName("BFCETBaseTwoKeyNavRTESTwoKeyNav")
               .setBound(true)
-              .setComposable(true)
               .setParameters(Arrays.asList(
-                  new Parameter()
-                      .setName("BindingParam")
-                      .setType(nameETBaseTwoKeyNav)
-                      .setNullable(false)))
-              .setReturnType(returnTypeCollectionETTwoKeyNav_NotNullable)
+                  new Parameter().setName("BindingParam").setType(nameETBaseTwoKeyNav)))
+              .setComposable(true)
+              .setReturnType(
+                  new ReturnType().setType(nameETTwoKeyNav).setCollection(true))
           );
+
     } else if (functionName.equals(nameBFCSINavRTESTwoKeyNav)) {
       return Arrays.asList(
           new Function()
               .setName("BFCSINavRTESTwoKeyNav")
               .setBound(true)
-              .setComposable(true)
               .setParameters(Arrays.asList(
-                  new Parameter()
-                      .setName("BindingParam")
-                      .setType(nameETTwoKeyNav)
-                      .setNullable(false)))
-              .setReturnType(returnTypeCollectionETTwoKeyNav_NotNullable)
+                  new Parameter().setName("BindingParam").setType(nameETTwoKeyNav)))
+              .setComposable(true)
+              .setReturnType(
+                  new ReturnType().setType(nameETTwoKeyNav).setCollection(true))
           );
+
     } else if (functionName.equals(nameBFCETBaseTwoKeyNavRTESBaseTwoKey)) {
       return Arrays.asList(
           new Function()
               .setName("BFCETBaseTwoKeyNavRTESBaseTwoKey")
               .setBound(true)
-              .setComposable(true)
               .setParameters(Arrays.asList(
-                  new Parameter()
-                      .setName("BindingParam")
-                      .setType(nameETBaseTwoKeyNav)
-                      .setNullable(false)))
+                  new Parameter().setName("BindingParam").setType(nameETBaseTwoKeyNav)))
+              .setComposable(true)
               .setReturnType(
-                  new ReturnType()
-                      .setType(nameETBaseTwoKeyNav)
-                      .setNullable(false)
-                      .setCollection(true))
+                  new ReturnType().setType(nameETBaseTwoKeyNav).setCollection(true))
           );
+
     } else if (functionName.equals(nameBFCCollStringRTESTwoKeyNav)) {
       return Arrays.asList(
           new Function()
               .setName("BFCCollStringRTESTwoKeyNav")
               .setBound(true)
-              .setComposable(true)
               .setParameters(Arrays.asList(
-                  new Parameter()
-                      .setName("BindingParam")
-                      .setType(nameString)
-                      .setNullable(false)
-                      .setCollection(true)))
-              .setReturnType(returnTypeETTwoKeyNav_NotNullable)
+                  new Parameter().setName("BindingParam").setType(nameString).setCollection(true)))
+              .setComposable(true)
+              .setReturnType(new ReturnType().setType(nameETTwoKeyNav).setCollection(true))
           );
+
     } else if (functionName.equals(nameBFCCTPrimCompRTESTwoKeyNav)) {
       return Arrays.asList(
           new Function()
               .setName("BFCCTPrimCompRTESTwoKeyNav")
               .setBound(true)
-              .setComposable(true)
               .setParameters(Arrays.asList(
-                  new Parameter()
-                      .setName("BindingParam")
-                      .setType(nameCTPrimComp)
-                      .setNullable(false)))
-              .setReturnType(returnTypeETTwoKeyNav_NotNullable)
+                  new Parameter().setName("BindingParam").setType(nameCTPrimComp)))
+              .setComposable(true)
+              .setReturnType(
+                  new ReturnType().setType(nameETTwoKeyNav).setCollection(true))
           );
+
     } else if (functionName.equals(nameBFCCTPrimCompRTESBaseTwoKeyNav)) {
       return Arrays.asList(
           new Function()
               .setName("BFCCTPrimCompRTESBaseTwoKeyNav")
               .setBound(true)
-              .setComposable(true)
               .setParameters(Arrays.asList(
-                  new Parameter().setName("BindingParam").setType(nameCTPrimComp).setNullable(false)))
+                  new Parameter().setName("BindingParam").setType(nameCTPrimComp)))
+              .setComposable(true)
               .setReturnType(
-                  new ReturnType()
-                      .setType(nameETBaseTwoKeyNav)
-                      .setNullable(false)
-                      .setCollection(true))
+                  new ReturnType().setType(nameETBaseTwoKeyNav).setColl

<TRUNCATED>