geode-commits mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From jbarr...@apache.org
Subject [geode-native] branch develop updated: GEODE-5190: Refactor Serializable into separate interfaces (#303)
Date Fri, 01 Jun 2018 05:55:33 GMT
This is an automated email from the ASF dual-hosted git repository.

jbarrett pushed a commit to branch develop
in repository https://gitbox.apache.org/repos/asf/geode-native.git


The following commit(s) were added to refs/heads/develop by this push:
     new 4ca100a  GEODE-5190: Refactor Serializable into separate interfaces (#303)
4ca100a is described below

commit 4ca100a3b783f25094ad6a8e43fe56af46c35a4a
Author: Jacob Barrett <jbarrett@pivotal.io>
AuthorDate: Thu May 31 22:55:13 2018 -0700

    GEODE-5190: Refactor Serializable into separate interfaces (#303)
    
    - Added DataSerializable
    - Added DataSerializableFixeId
    - Added DataSerializablePrimitive
    - Added DataSerializableInternal
    
    - Added IDataSerializable
    - Added IDataSerializableFixeId
    - Added IDataSerializablePrimitive
    - Added IDataSerializableInternal
    - Renamed IGeodeSerializable to ISerializable
    - Renamed IGeodeDelta to IDelta
    
    Co-authored-by: Ivan Godwin <igodwin@pivotal.io>
---
 .gitignore                                         |   1 +
 CMakeLists.txt                                     |   1 +
 clicache/integration-test/CMakeLists.txt           |   2 +-
 clicache/integration-test/CacheableWrapper.cs      |   8 +-
 clicache/integration-test/DefaultCacheableN.cs     |   9 +-
 clicache/integration-test/DupListenerN.cs          |   2 +-
 clicache/integration-test/ExpirationTestsN.cs      |   2 +-
 clicache/integration-test/NetTests.cs              |   6 +-
 clicache/integration-test/OverflowTestsN.cs        |   4 +-
 clicache/integration-test/PutGetPerfTests.cs       |   2 +-
 clicache/integration-test/RegionEntryTests.cs      |   2 +-
 clicache/integration-test/SerializationTestsN.cs   | 134 ++---
 clicache/integration-test/TallyListener.cs         |  16 +-
 clicache/integration-test/TallyListenerN.cs        |   4 +-
 clicache/integration-test/TallyWriter.cs           |  16 +-
 clicache/integration-test/TallyWriterN.cs          |   4 +-
 .../ThinClientAppDomainQueryTests.cs               |   4 +-
 .../integration-test/ThinClientCallbackArgN.cs     |   6 +-
 .../ThinClientCqAttributesMutatorTests.cs          |   6 +-
 clicache/integration-test/ThinClientCqIRTestsN.cs  |   4 +-
 clicache/integration-test/ThinClientCqPdxTest.cs   |   6 +-
 .../integration-test/ThinClientCqStatusTest.cs     |   6 +-
 .../ThinClientCqStatusTestTwoServers.cs            |   6 +-
 clicache/integration-test/ThinClientCqTest.cs      |   6 +-
 ...nClientDeltaTestN.cs => ThinClientDeltaTest.cs} | 283 +--------
 .../integration-test/ThinClientDeltaTestFailing.cs | 657 +++++++++++++++++++++
 .../integration-test/ThinClientHARegionTestsN.cs   |   4 +-
 .../integration-test/ThinClientPdxLocalTests.cs    |   2 +-
 clicache/integration-test/ThinClientPdxTests1.cs   |  10 +-
 clicache/integration-test/ThinClientQueryTestsN.cs |   8 +-
 .../integration-test/ThinClientRegionQueryTests.cs |   4 +-
 .../integration-test/ThinClientRegionTestsN.cs     |   8 +-
 .../ThinClientRemoteParamQueryResultSetTests.cs    |   4 +-
 .../ThinClientRemoteParamQueryStructSetTests.cs    |   4 +-
 .../ThinClientRemoteQueryExclusivenessTests.cs     |   4 +-
 .../ThinClientRemoteQueryFailoverTests.cs          |   4 +-
 .../ThinClientRemoteQueryResultSetTests.cs         |   4 +-
 .../ThinClientRemoteQueryStructSetTests.cs         |   4 +-
 ...ThinClientSecurityAuthSetAuthInitializeTests.cs |  18 +-
 .../ThinClientSecurityAuthzTestsMUN.cs             |   8 +-
 .../ThinClientStringArrayTestsN.cs                 |   4 +-
 clicache/integration-test/UnitTests.csproj.in      |   3 +-
 clicache/integration-test2/CMakeLists.txt          |   6 +-
 clicache/integration-test2/Config.cs.in            |   6 +
 clicache/integration-test2/GeodeServer.cs          |   2 +-
 clicache/integration-test2/RegionTest.cs           |  65 +-
 clicache/integration-test2/SerializationTests.cs   | 131 ++++
 clicache/src/CMakeLists.txt                        |  12 +-
 clicache/src/CacheFactory.cpp                      |  12 +-
 clicache/src/CacheableArrayList.hpp                |  14 +-
 clicache/src/CacheableBuiltins.hpp                 | 194 ++----
 clicache/src/CacheableDate.cpp                     |  21 +-
 clicache/src/CacheableDate.hpp                     |  14 +-
 clicache/src/CacheableFileName.cpp                 |  12 +-
 clicache/src/CacheableFileName.hpp                 |  43 +-
 clicache/src/CacheableHashMap.cpp                  |   2 +-
 clicache/src/CacheableHashMap.hpp                  |  22 +-
 clicache/src/CacheableHashSet.hpp                  |  74 ++-
 clicache/src/CacheableHashTable.hpp                |  16 +-
 clicache/src/CacheableIdentityHashMap.hpp          |  14 +-
 clicache/src/CacheableKey.cpp                      |  21 +-
 clicache/src/CacheableKey.hpp                      |   2 +-
 clicache/src/CacheableLinkedList.hpp               |  18 +-
 clicache/src/CacheableObject.hpp                   |  39 +-
 clicache/src/CacheableObjectArray.cpp              |   2 +-
 clicache/src/CacheableObjectArray.hpp              |  46 +-
 clicache/src/CacheableObjectXml.hpp                |  39 +-
 clicache/src/CacheableStack.cpp                    |  18 +-
 clicache/src/CacheableStack.hpp                    |  16 +-
 clicache/src/CacheableString.cpp                   |  32 +-
 clicache/src/CacheableString.hpp                   |  81 +--
 clicache/src/CacheableStringArray.cpp              |   1 -
 clicache/src/CacheableStringArray.hpp              |  62 +-
 clicache/src/CacheableUndefined.cpp                |   2 +-
 clicache/src/CacheableUndefined.hpp                |  20 +-
 clicache/src/CacheableVector.cpp                   |   4 +-
 clicache/src/CacheableVector.hpp                   |  21 +-
 clicache/src/CqEvent.hpp                           |   2 +-
 clicache/src/DataInput.cpp                         | 125 +---
 clicache/src/DataInput.hpp                         |   7 +-
 clicache/src/DataOutput.cpp                        | 164 ++---
 clicache/src/DataOutput.hpp                        |  32 +-
 clicache/src/DistributedSystem.cpp                 | 371 +++++-------
 clicache/src/DistributedSystem.hpp                 |  17 +-
 clicache/src/EntryEvent.hpp                        |   2 +-
 clicache/src/GeodeClassIds.hpp                     |  90 +--
 clicache/src/ICacheableKey.hpp                     |   4 +-
 clicache/src/ICqEvent.hpp                          |   2 +-
 ...GeodeSerializable.hpp => IDataSerializable.hpp} |  39 +-
 ...eUndefined.cpp => IDataSerializableFixedId.hpp} |  32 +-
 ...Undefined.cpp => IDataSerializableInternal.hpp} |  31 +-
 ...ndefined.cpp => IDataSerializablePrimitive.hpp} |  32 +-
 clicache/src/{IGeodeDelta.hpp => IDelta.hpp}       |  10 +-
 clicache/src/IFixedPartitionResolver.hpp           |   2 +-
 clicache/src/IPartitionResolver.hpp                |   2 +-
 clicache/src/IPdxSerializable.hpp                  |   1 +
 clicache/src/IRegion.hpp                           |  13 +-
 clicache/src/IResultCollector.hpp                  |   2 +-
 clicache/src/ISelectResults.hpp                    |   2 +-
 .../src/{ISelectResults.hpp => ISerializable.hpp}  |  38 +-
 clicache/src/LocalRegion.cpp                       | 163 ++---
 clicache/src/LocalRegion.hpp                       |   1 -
 clicache/src/ManagedPdxTypeHandler.hpp             | 103 ++++
 clicache/src/Properties.cpp                        |   4 +-
 clicache/src/Properties.hpp                        |  53 +-
 clicache/src/Query.hpp                             |   2 +-
 clicache/src/QueryService.cpp                      |   2 +-
 clicache/src/Region.cpp                            |  46 +-
 clicache/src/Region.hpp                            |   1 -
 clicache/src/RegionAttributes.hpp                  |  19 +-
 clicache/src/RegionEvent.cpp                       |   2 +-
 clicache/src/RegionEvent.hpp                       |   2 +-
 clicache/src/ResultSet.hpp                         |   2 +-
 clicache/src/SelectResultsIterator.hpp             |   2 +-
 clicache/src/Serializable.cpp                      | 305 ++--------
 clicache/src/Serializable.hpp                      | 190 +-----
 clicache/src/Struct.cpp                            |  10 +-
 clicache/src/Struct.hpp                            |   5 +-
 clicache/src/StructSet.hpp                         |   6 +-
 clicache/src/TypeRegistry.cpp                      | 637 ++++++++++----------
 clicache/src/TypeRegistry.hpp                      | 165 +++---
 clicache/src/UserFunctionExecutionException.cpp    |  26 +-
 clicache/src/UserFunctionExecutionException.hpp    |  58 +-
 clicache/src/geode_defs.hpp                        |   7 +-
 clicache/src/impl/DelegateWrapper.hpp              |  29 +-
 clicache/src/impl/EnumInfo.hpp                     |  22 +-
 clicache/src/impl/ManagedCacheableDelta.cpp        |  56 +-
 clicache/src/impl/ManagedCacheableDelta.hpp        | 103 +---
 clicache/src/impl/ManagedCacheableKey.cpp          | 180 ++++--
 clicache/src/impl/ManagedCacheableKey.hpp          | 189 +++---
 clicache/src/impl/ManagedResultCollector.cpp       |   8 +-
 clicache/src/impl/ManagedVisitor.cpp               |   4 +-
 clicache/src/impl/PdxFieldType.cpp                 |  37 +-
 clicache/src/impl/PdxFieldType.hpp                 |  12 +-
 clicache/src/impl/PdxHelper.cpp                    |  13 +-
 clicache/src/impl/PdxInstanceFactoryImpl.cpp       |  54 +-
 clicache/src/impl/PdxInstanceImpl.cpp              | 265 ++++-----
 clicache/src/impl/PdxLocalWriter.hpp               |   1 -
 clicache/src/impl/PdxManagedCacheableKey.cpp       |  97 +--
 clicache/src/impl/PdxManagedCacheableKey.hpp       | 106 +---
 clicache/src/impl/PdxReaderWithTypeCollector.cpp   | 166 +++---
 clicache/src/impl/PdxReaderWithTypeCollector.hpp   | 421 +++++++------
 clicache/src/impl/PdxType.cpp                      |   8 +-
 clicache/src/impl/PdxType.hpp                      |  20 +-
 clicache/src/impl/PdxTypeRegistry.cpp              |  16 +-
 clicache/src/impl/PdxTypeRegistry.hpp              |  74 +--
 clicache/src/impl/PdxWrapper.hpp                   |  80 +--
 clicache/src/impl/PdxWriterWithTypeCollector.cpp   |  81 ++-
 clicache/src/impl/PdxWriterWithTypeCollector.hpp   |  74 +--
 clicache/src/impl/SafeConvert.hpp                  | 164 ++---
 cppcache/include/geode/CacheableBuiltins.hpp       |  74 +--
 cppcache/include/geode/CacheableDate.hpp           |  23 +-
 cppcache/include/geode/CacheableEnum.hpp           |  26 +-
 cppcache/include/geode/CacheableFileName.hpp       |  22 +-
 cppcache/include/geode/CacheableKey.hpp            |   7 +-
 cppcache/include/geode/CacheableObjectArray.hpp    |  26 +-
 cppcache/include/geode/CacheableString.hpp         |  41 +-
 cppcache/include/geode/CacheableUndefined.hpp      |  41 +-
 cppcache/include/geode/DataOutput.hpp              |   2 +
 .../geode/DataSerializable.hpp}                    |  45 +-
 cppcache/include/geode/GeodeTypeIds.hpp            |   4 +-
 cppcache/include/geode/PdxInstance.hpp             |  15 -
 cppcache/include/geode/PdxSerializable.hpp         |  55 +-
 cppcache/include/geode/PdxWrapper.hpp              |  36 --
 cppcache/include/geode/PoolManager.hpp             |   5 +-
 cppcache/include/geode/Properties.hpp              |  24 +-
 cppcache/include/geode/RegionAttributes.hpp        |  19 +-
 cppcache/include/geode/Serializable.hpp            |  53 +-
 cppcache/include/geode/Serializer.hpp              |  16 +-
 cppcache/include/geode/Struct.hpp                  |  26 +-
 .../geode/UserFunctionExecutionException.hpp       |  10 -
 .../geode/internal/DataSerializableFixedId.hpp}    |  40 +-
 .../geode/internal/DataSerializableInternal.hpp}   |  28 +-
 .../geode/internal/DataSerializablePrimitive.hpp}  |  28 +-
 .../integration-test/BuiltinCacheableWrappers.hpp  |  86 +--
 cppcache/integration-test/DeltaEx.hpp              |   5 +-
 cppcache/integration-test/testSerialization.cpp    |   6 +-
 .../integration-test/testThinClientCqDelta.cpp     |   3 +-
 .../testThinClientRemoteQueryRS.cpp                |  45 +-
 .../testThinClientRemoteQuerySS.cpp                |  11 +-
 cppcache/src/BucketServerLocation.hpp              |  12 +-
 cppcache/src/CacheFactory.cpp                      |   6 +-
 cppcache/src/CacheImpl.hpp                         |   5 +
 cppcache/src/CacheTransactionManagerImpl.cpp       |   5 +-
 cppcache/src/CacheableDate.cpp                     |  12 +-
 cppcache/src/CacheableEnum.cpp                     |   5 +-
 cppcache/src/CacheableFileName.cpp                 |   4 +-
 cppcache/src/CacheableObjectArray.cpp              |   7 -
 cppcache/src/CacheableObjectPartList.cpp           |  11 +-
 cppcache/src/CacheableObjectPartList.hpp           |  40 +-
 cppcache/src/CacheableString.cpp                   |  24 +-
 cppcache/src/CacheableToken.cpp                    |   4 +-
 cppcache/src/CacheableToken.hpp                    |  22 +-
 cppcache/src/CacheableUndefined.cpp                |  17 +-
 cppcache/src/ClientConnectionRequest.cpp           |   8 +-
 cppcache/src/ClientConnectionRequest.hpp           |   4 +-
 cppcache/src/ClientConnectionResponse.cpp          |   4 +-
 cppcache/src/ClientConnectionResponse.hpp          |   2 +-
 cppcache/src/ClientHealthStats.cpp                 |   9 -
 cppcache/src/ClientHealthStats.hpp                 |  29 +-
 cppcache/src/ClientMetadataService.cpp             |   2 +-
 cppcache/src/ClientProxyMembershipID.cpp           |  42 +-
 cppcache/src/ClientProxyMembershipID.hpp           |   7 +-
 cppcache/src/ClientReplacementRequest.cpp          |   6 +-
 cppcache/src/ClientReplacementRequest.hpp          |   7 +-
 cppcache/src/DSMemberForVersionStamp.hpp           |  27 +-
 cppcache/src/DiskStoreId.hpp                       |   4 +-
 cppcache/src/DiskVersionTag.hpp                    |   4 +-
 cppcache/src/EnumInfo.cpp                          |  34 +-
 cppcache/src/EnumInfo.hpp                          |  18 +-
 cppcache/src/EventId.cpp                           |   4 -
 cppcache/src/EventId.hpp                           |  35 +-
 cppcache/src/FarSideEntryOp.cpp                    |   2 +-
 cppcache/src/FixedPartitionAttributesImpl.hpp      |  14 +-
 cppcache/src/GeodeTypeIdsImpl.hpp                  |  68 +--
 cppcache/src/GetAllServersRequest.cpp              |   3 +-
 cppcache/src/GetAllServersRequest.hpp              |  20 +-
 cppcache/src/GetAllServersResponse.hpp             |  17 +-
 .../src/InternalCacheTransactionManager2PCImpl.cpp |   2 +-
 cppcache/src/LocalRegion.cpp                       |  92 +--
 cppcache/src/LocatorListRequest.cpp                |   7 +-
 cppcache/src/LocatorListRequest.hpp                |   6 +-
 cppcache/src/LocatorListResponse.cpp               |   6 +-
 cppcache/src/LocatorListResponse.hpp               |  14 +-
 cppcache/src/PdxFieldType.hpp                      |  13 +-
 cppcache/src/PdxHelper.cpp                         |   4 +-
 cppcache/src/PdxInstanceImpl.cpp                   | 241 ++++----
 cppcache/src/PdxInstanceImpl.hpp                   |  12 -
 cppcache/src/PdxLocalWriter.cpp                    |  53 +-
 cppcache/src/PdxSerializable.cpp                   |  17 +-
 cppcache/src/PdxType.hpp                           |   4 +-
 cppcache/src/PdxTypeRegistry.cpp                   |  10 +-
 cppcache/src/PdxTypes.hpp                          |   8 +
 cppcache/src/PdxWrapper.cpp                        |  14 +-
 cppcache/src/PoolManager.cpp                       |   6 +-
 cppcache/src/PoolManagerImpl.cpp                   |   4 +-
 cppcache/src/PoolManagerImpl.hpp                   |   2 +-
 cppcache/src/Properties.cpp                        |   8 +-
 cppcache/src/PutAllPartialResult.hpp               |  23 -
 .../src/PutAllPartialResultServerException.cpp     |  25 -
 .../src/PutAllPartialResultServerException.hpp     |  45 --
 cppcache/src/QueueConnectionRequest.cpp            |  16 +-
 cppcache/src/QueueConnectionRequest.hpp            |   5 +-
 cppcache/src/QueueConnectionResponse.cpp           |  12 +-
 cppcache/src/QueueConnectionResponse.hpp           |  10 +-
 cppcache/src/RegionAttributes.cpp                  |   6 +-
 cppcache/src/RegionCommit.cpp                      |   6 +-
 cppcache/src/Serializable.cpp                      |  18 +-
 cppcache/src/SerializableHelper.hpp                | 104 ++++
 cppcache/src/SerializationRegistry.cpp             | 126 +++-
 cppcache/src/SerializationRegistry.hpp             | 225 +++++--
 cppcache/src/ServerLocation.hpp                    |  16 +-
 cppcache/src/ServerLocationRequest.cpp             |  29 -
 cppcache/src/ServerLocationRequest.hpp             |  15 +-
 cppcache/src/ServerLocationResponse.hpp            |  17 +-
 cppcache/src/Struct.cpp                            |   6 -
 cppcache/src/TXCommitMessage.cpp                   |   6 -
 cppcache/src/TXCommitMessage.hpp                   |   6 +-
 cppcache/src/TcrConnection.cpp                     |   2 +-
 cppcache/src/TcrEndpoint.cpp                       |   2 +-
 cppcache/src/TcrMessage.cpp                        |  98 ++-
 cppcache/src/ThinClientLocatorHelper.cpp           |   8 +-
 cppcache/src/ThinClientPoolDM.cpp                  |   8 +-
 cppcache/src/ThinClientRedundancyManager.cpp       |  21 +-
 cppcache/src/ThinClientRegion.cpp                  |  10 +-
 cppcache/src/TransactionalOperation.cpp            |  22 +-
 cppcache/src/UserFunctionExecutionException.cpp    |  24 -
 cppcache/src/Utils.hpp                             |   9 +-
 cppcache/src/VersionTag.cpp                        |   6 -
 cppcache/src/VersionTag.hpp                        |  10 +-
 cppcache/src/VersionedCacheableObjectPartList.cpp  |  13 +-
 cppcache/src/VersionedCacheableObjectPartList.hpp  |  38 +-
 cppcache/src/statistics/StatArchiveWriter.cpp      |  10 +-
 cppcache/test/ByteArrayFixture.cpp                 |   3 +-
 cppcache/test/DataInputTest.cpp                    |   2 +-
 cppcache/test/TcrMessage_unittest.cpp              |  24 +-
 tests/CMakeLists.txt                               |   1 -
 tests/cli/CMakeLists.txt                           |   1 +
 tests/cli/NewFwkLib/CacheHelper.cs                 |   2 +-
 tests/cli/NewFwkLib/CacheServer.cs                 |   2 +-
 tests/cli/NewFwkLib/DeltaTest/DeltaTest.cs         |   4 +-
 tests/cli/NewFwkLib/EventTest/ETCacheLoader.cs     |   2 +-
 tests/cli/NewFwkLib/EventTest/EventTests.cs        |  16 +-
 .../FunctionExecution/FunctionExecution.cs         |  10 +-
 tests/cli/NewFwkLib/QueryTest/QueryTests.cs        |  10 +-
 tests/cli/NewFwkLib/SecurityTest/Security.cs       |  12 +-
 tests/cli/NewTestObject/BatchObject.cs             |   2 +-
 tests/cli/NewTestObject/DeltaEx.cs                 |   6 +-
 tests/cli/NewTestObject/DeltaFastAssetAccount.cs   |   4 +-
 tests/cli/NewTestObject/DeltaPSTObject.cs          |   4 +-
 tests/cli/NewTestObject/DeltaTestImpl.cs           |   6 +-
 tests/cli/NewTestObject/EqStruct.cs                |   2 +-
 tests/cli/NewTestObject/FastAsset.cs               |   2 +-
 tests/cli/NewTestObject/FastAssetAccount.cs        |   2 +-
 tests/cli/NewTestObject/PSTObject.cs               |   2 +-
 tests/cli/NewTestObject/Portfolio.cs               |  12 +-
 tests/cli/NewTestObject/PortfolioPdx.cs            |   4 +-
 tests/cli/NewTestObject/Position.cs                |  10 +-
 tests/cli/NewTestObject/PositionPdx.cs             |   4 +-
 tests/cli/NewTestObject/TestObject1.cs             |   6 +-
 tests/cli/NewTestObject/TimeStampdObject.cs        |   2 +-
 tests/cli/PdxClassLibrary/CMakeLists.txt           |  50 ++
 .../cli/PdxClassLibrary/PdxClassLibrary.csproj.in  | 122 ----
 tests/cli/PdxClassLibrary/PdxType.cs               |  30 +-
 tests/cli/PdxClassLibrary/PortfolioPdx.cs          |   2 +-
 tests/cli/PdxClassLibrary/PositionPdx.cs           |   2 +-
 tests/cli/PdxClassLibrary/VariousPdxTypes.cs       |   8 +-
 tests/cli/QueryHelper/QueryHelperN.cs              |  10 +-
 tests/cpp/testobject/BatchObject.cpp               |   2 +-
 tests/cpp/testobject/BatchObject.hpp               |   2 +-
 tests/cpp/testobject/DeltaFastAssetAccount.cpp     |   4 +-
 tests/cpp/testobject/DeltaFastAssetAccount.hpp     |   9 +-
 tests/cpp/testobject/DeltaPSTObject.cpp            |   2 +-
 tests/cpp/testobject/DeltaPSTObject.hpp            |   7 +-
 tests/cpp/testobject/DeltaTestImpl.cpp             |  12 +-
 tests/cpp/testobject/DeltaTestImpl.hpp             |  13 +-
 tests/cpp/testobject/EqStruct.hpp                  |   2 +-
 tests/cpp/testobject/FastAsset.hpp                 |   2 +-
 tests/cpp/testobject/FastAssetAccount.cpp          |   4 +-
 tests/cpp/testobject/FastAssetAccount.hpp          |   2 +-
 tests/cpp/testobject/InvalidPdxUsage.cpp           |   2 +-
 tests/cpp/testobject/NestedPdxObject.cpp           |   4 +-
 tests/cpp/testobject/NestedPdxObject.hpp           |   4 +-
 tests/cpp/testobject/NonPdxType.hpp                |   2 +-
 tests/cpp/testobject/PSTObject.cpp                 |   2 +-
 tests/cpp/testobject/PSTObject.hpp                 |   2 +-
 tests/cpp/testobject/PdxType.cpp                   |  16 +-
 tests/cpp/testobject/PdxType.hpp                   |   2 +-
 tests/cpp/testobject/PdxVersioned1.cpp             |   4 +-
 tests/cpp/testobject/PdxVersioned1.hpp             |   2 +-
 tests/cpp/testobject/PdxVersioned2.cpp             |   4 +-
 tests/cpp/testobject/PdxVersioned2.hpp             |   2 +-
 tests/cpp/testobject/Portfolio.cpp                 |  14 +-
 tests/cpp/testobject/Portfolio.hpp                 |   4 +-
 tests/cpp/testobject/PortfolioPdx.cpp              |   8 +-
 tests/cpp/testobject/Position.cpp                  |  10 +-
 tests/cpp/testobject/Position.hpp                  |   5 +-
 tests/cpp/testobject/TestObject1.cpp               |   2 +-
 tests/cpp/testobject/TestObject1.hpp               |  12 +-
 tests/cpp/testobject/TimestampedObject.hpp         |   8 +-
 tests/cpp/testobject/VariousPdxTypes.cpp           |  12 +-
 tests/cpp/testobject/VariousPdxTypes.hpp           |   5 +-
 342 files changed, 4905 insertions(+), 6034 deletions(-)

diff --git a/.gitignore b/.gitignore
index e3b336d..3486d30 100644
--- a/.gitignore
+++ b/.gitignore
@@ -6,6 +6,7 @@
 /.project
 /.idea/
 .vs/
+.vscode/
 
 /examples/dotnet/*/bin/
 /examples/dotnet/*/obj/
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 95f79e3..e5ef8e4 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -334,6 +334,7 @@ add_subdirectory(sqliteimpl)
 add_subdirectory(templates/security)
 add_subdirectory(docs/api)
 add_subdirectory(examples)
+add_subdirectory(tests/javaobject)
 if (${BUILD_CLI})
   add_subdirectory(clicache)
   add_subdirectory(plugins/SQLiteCLI)
diff --git a/clicache/integration-test/CMakeLists.txt b/clicache/integration-test/CMakeLists.txt
index f482f62..2b89dd3 100644
--- a/clicache/integration-test/CMakeLists.txt
+++ b/clicache/integration-test/CMakeLists.txt
@@ -100,7 +100,7 @@ set_property(TEST ThinClientQueryTestsN PROPERTY LABELS FLAKY)
 
 # Label any tests that always fail here
 set_property(TEST OverflowTestsN PROPERTY LABELS OMITTED)
-set_property(TEST ThinClientDeltaTestN PROPERTY LABELS OMITTED)
+set_property(TEST ThinClientDeltaTestFailing PROPERTY LABELS OMITTED)
 set_property(TEST ThinClientDurableTestsN PROPERTY LABELS OMITTED)
 set_property(TEST ThinClientHARegionTestsN PROPERTY LABELS OMITTED)
 set_property(TEST ThinClientRegionTestsN PROPERTY LABELS OMITTED)
diff --git a/clicache/integration-test/CacheableWrapper.cs b/clicache/integration-test/CacheableWrapper.cs
index f8acd21..cac4e42 100644
--- a/clicache/integration-test/CacheableWrapper.cs
+++ b/clicache/integration-test/CacheableWrapper.cs
@@ -35,12 +35,12 @@ namespace Apache.Geode.Client.UnitTests
   {
     #region Protected members
 
-    protected IGeodeSerializable m_cacheableObject = null;
+    protected ISerializable m_cacheableObject = null;
     protected uint m_typeId;
 
     #endregion
 
-    public virtual IGeodeSerializable Cacheable
+    public virtual ISerializable Cacheable
     {
       get
       {
@@ -62,7 +62,7 @@ namespace Apache.Geode.Client.UnitTests
 
     public abstract void InitRandomValue(int maxSize);
 
-    public abstract uint GetChecksum(IGeodeSerializable cacheableObject);
+    public abstract uint GetChecksum(ISerializable cacheableObject);
 
     public virtual uint GetChecksum()
     {
@@ -79,7 +79,7 @@ namespace Apache.Geode.Client.UnitTests
   /// </remarks>
   public abstract class CacheableKeyWrapper : CacheableWrapper
   {
-    public override IGeodeSerializable Cacheable
+    public override ISerializable Cacheable
     {
       get
       {
diff --git a/clicache/integration-test/DefaultCacheableN.cs b/clicache/integration-test/DefaultCacheableN.cs
index 552686e..e9db647 100644
--- a/clicache/integration-test/DefaultCacheableN.cs
+++ b/clicache/integration-test/DefaultCacheableN.cs
@@ -36,8 +36,7 @@ namespace Apache.Geode.Client.UnitTests
     }
   }
 
-  // VJR: TODO: IGeodeSerializable should be replaced by IPdxSerializable when ready
-  class DefaultType : IGeodeSerializable
+  class DefaultType : IDataSerializable
   {
     bool m_cacheableBoolean;
     int m_cacheableInt32;
@@ -155,9 +154,9 @@ namespace Apache.Geode.Client.UnitTests
       get { return m_cacheableObject; }
     }
 
-    #region IGeodeSerializable Members
+    #region IDataSerializable Members
 
-    public uint ClassId
+    public Int32 ClassId
     {
       get { return 0x04; }
     }
@@ -251,7 +250,7 @@ namespace Apache.Geode.Client.UnitTests
 
     #endregion
 
-    public static IGeodeSerializable CreateDeserializable()
+    public static ISerializable CreateDeserializable()
     {
       return new DefaultType();
     }
diff --git a/clicache/integration-test/DupListenerN.cs b/clicache/integration-test/DupListenerN.cs
index 74eab9a..be3be58 100644
--- a/clicache/integration-test/DupListenerN.cs
+++ b/clicache/integration-test/DupListenerN.cs
@@ -32,7 +32,7 @@ namespace Apache.Geode.Client.UnitTests
 
     private int m_ops = 0;
     private Dictionary<object, object> m_map = new Dictionary<object, object>();
-    //ICacheableKey, IGeodeSerializable
+    //ICacheableKey, ISerializable
 
     #endregion
 
diff --git a/clicache/integration-test/ExpirationTestsN.cs b/clicache/integration-test/ExpirationTestsN.cs
index 92e25b0..8b3498a 100644
--- a/clicache/integration-test/ExpirationTestsN.cs
+++ b/clicache/integration-test/ExpirationTestsN.cs
@@ -185,7 +185,7 @@ namespace Apache.Geode.Client.UnitTests
       m_regionName = "RT1";
       SetupRegion(0, 0, 0, 0);
       PutKeyTouch(5);
-      IGeodeSerializable val = m_region.Get(m_key);
+      ISerializable val = m_region.Get(m_key);
       m_region.Destroy(m_key);
       val = m_region.Get(m_key);
       CheckRegion(false, 0);
diff --git a/clicache/integration-test/NetTests.cs b/clicache/integration-test/NetTests.cs
index c3abea6..d667dc4 100644
--- a/clicache/integration-test/NetTests.cs
+++ b/clicache/integration-test/NetTests.cs
@@ -73,7 +73,7 @@ namespace Apache.Geode.Client.UnitTests
       CacheHelper.CreateDistribRegion(TestRegion, false, true);
       m_region = CacheHelper.GetVerifyRegion(TestRegion);
       DoGets(m_region, num);
-      IGeodeSerializable[] arr = m_region.GetKeys();
+      ISerializable[] arr = m_region.GetKeys();
       Assert.AreEqual(num, arr.Length);
     }
 
@@ -83,7 +83,7 @@ namespace Apache.Geode.Client.UnitTests
       Util.Log("Calling doGets for verify");
       //Thread.Sleep(2000);
       //doGets(m_region, load);
-      IGeodeSerializable[] arr = m_region.GetKeys();
+      ISerializable[] arr = m_region.GetKeys();
       Assert.AreEqual(num, arr.Length);
     }
 
@@ -97,7 +97,7 @@ namespace Apache.Geode.Client.UnitTests
       Thread.Sleep(100);
       DoGets(m_region, num);
       Assert.AreEqual(num, m_ldr.Loads);
-      IGeodeSerializable[] arr = m_region.GetKeys();
+      ISerializable[] arr = m_region.GetKeys();
       Assert.AreEqual(num, arr.Length);
     }
 
diff --git a/clicache/integration-test/OverflowTestsN.cs b/clicache/integration-test/OverflowTestsN.cs
index 2ef32fe..f82dddb 100644
--- a/clicache/integration-test/OverflowTestsN.cs
+++ b/clicache/integration-test/OverflowTestsN.cs
@@ -165,7 +165,7 @@ namespace Apache.Geode.Client.UnitTests
       }
     }
 
-    private bool IsOverflowed(/*IGeodeSerializable*/ object cVal)
+    private bool IsOverflowed(/*ISerializable*/ object cVal)
     {
       //Util.Log("IsOverflowed:: value is: {0}; type is: {1}", cVal.ToString(), cVal.GetType());
       return cVal.ToString() == "CacheableToken::OVERFLOWED";
@@ -173,7 +173,7 @@ namespace Apache.Geode.Client.UnitTests
 
     private void CheckOverflowToken(IRegion<object, object> region, int num, int lruLimit)
     {
-      //IGeodeSerializable cVal;
+      //ISerializable cVal;
       //ICacheableKey[] cKeys = region.GetKeys();
 
       object cVal;
diff --git a/clicache/integration-test/PutGetPerfTests.cs b/clicache/integration-test/PutGetPerfTests.cs
index 8268742..606df48 100644
--- a/clicache/integration-test/PutGetPerfTests.cs
+++ b/clicache/integration-test/PutGetPerfTests.cs
@@ -174,7 +174,7 @@ namespace Apache.Geode.Client.UnitTests
     {
       int numKeys = 0;
       string message;
-      IGeodeSerializable[] keys = CacheHelper.CurrentRegion.GetKeys();
+      ISerializable[] keys = CacheHelper.CurrentRegion.GetKeys();
       if (keys != null)
       {
         numKeys = keys.Length;
diff --git a/clicache/integration-test/RegionEntryTests.cs b/clicache/integration-test/RegionEntryTests.cs
index ba76dae..9c74bd0 100644
--- a/clicache/integration-test/RegionEntryTests.cs
+++ b/clicache/integration-test/RegionEntryTests.cs
@@ -66,7 +66,7 @@ namespace Apache.Geode.Client.UnitTests
           regionName + ": value of " + i.ToString());
       }
       ICacheableKey[] cKeys = region.GetKeys();
-      IGeodeSerializable[] cValues = region.GetValues();
+      ISerializable[] cValues = region.GetValues();
       Assert.AreEqual(num, cKeys.Length, "Number of keys in region is incorrect.");
       Assert.AreEqual(num, cValues.Length, "Number of values in region is incorrect.");
 
diff --git a/clicache/integration-test/SerializationTestsN.cs b/clicache/integration-test/SerializationTestsN.cs
index d1e54d6..f2a876b 100644
--- a/clicache/integration-test/SerializationTestsN.cs
+++ b/clicache/integration-test/SerializationTestsN.cs
@@ -70,9 +70,9 @@ namespace Apache.Geode.Client.UnitTests
       base.EndTest();
     }
 
-    private IGeodeSerializable CreateOtherType(int i, int otherType)
+    private ISerializable CreateOtherType(int i, int otherType)
     {
-      IGeodeSerializable ot;
+      ISerializable ot;
       switch (otherType)
       {
         case OTHER_TYPE1: ot = new OtherType(i, i + 20000); break;
@@ -92,19 +92,19 @@ namespace Apache.Geode.Client.UnitTests
     {
       CacheHelper.CreateTCRegion2<object, object>(RegionNames[0], true, false,
         null, locators, false);
-      CacheHelper.DCache.TypeRegistry.RegisterTypeGeneric(OtherType.CreateDeserializable);
-      CacheHelper.DCache.TypeRegistry.RegisterTypeGeneric(OtherType22.CreateDeserializable);
-      CacheHelper.DCache.TypeRegistry.RegisterTypeGeneric(OtherType4.CreateDeserializable);
-      CacheHelper.DCache.TypeRegistry.RegisterTypeGeneric(OtherType2.CreateDeserializable);
-      CacheHelper.DCache.TypeRegistry.RegisterTypeGeneric(OtherType42.CreateDeserializable);
-      CacheHelper.DCache.TypeRegistry.RegisterTypeGeneric(OtherType43.CreateDeserializable);
+      CacheHelper.DCache.TypeRegistry.RegisterType(OtherType.CreateDeserializable);
+      CacheHelper.DCache.TypeRegistry.RegisterType(OtherType22.CreateDeserializable);
+      CacheHelper.DCache.TypeRegistry.RegisterType(OtherType4.CreateDeserializable);
+      CacheHelper.DCache.TypeRegistry.RegisterType(OtherType2.CreateDeserializable);
+      CacheHelper.DCache.TypeRegistry.RegisterType(OtherType42.CreateDeserializable);
+      CacheHelper.DCache.TypeRegistry.RegisterType(OtherType43.CreateDeserializable);
     }
 
     public void DoNPuts(int n)
     {
       try
       {
-        CacheHelper.DCache.TypeRegistry.RegisterTypeGeneric(OtherType.CreateDeserializable);
+        CacheHelper.DCache.TypeRegistry.RegisterType(OtherType.CreateDeserializable);
         Assert.Fail("Expected exception in registering the type again.");
       }
       catch (IllegalStateException ex)
@@ -126,7 +126,7 @@ namespace Apache.Geode.Client.UnitTests
     {
       try
       {
-        CacheHelper.DCache.TypeRegistry.RegisterTypeGeneric(OtherType.CreateDeserializable);
+        CacheHelper.DCache.TypeRegistry.RegisterType(OtherType.CreateDeserializable);
         Assert.Fail("Expected exception in registering the type again.");
       }
       catch (IllegalStateException ex)
@@ -147,7 +147,7 @@ namespace Apache.Geode.Client.UnitTests
       IRegion<object, object> region = CacheHelper.GetVerifyRegion<object, object>(RegionNames[0]);
       for (int i = 0; i < n; i++)
       {
-        IGeodeSerializable ot = CreateOtherType(i, otherType);
+        ISerializable ot = CreateOtherType(i, otherType);
         region[i + 10] = ot;
       }
     }
@@ -158,7 +158,7 @@ namespace Apache.Geode.Client.UnitTests
       for (int i = 0; i < n; i++)
       {
         object val = region[i + 10];
-        IGeodeSerializable ot = CreateOtherType(i, otherType);
+        ISerializable ot = CreateOtherType(i, otherType);
         Assert.IsTrue(ot.Equals(val), "Found unexpected value");
       }
     }
@@ -385,7 +385,7 @@ namespace Apache.Geode.Client.UnitTests
 
   };
 
-  public class OtherType : IGeodeSerializable
+  public class OtherType : IDataSerializable
   {
     private CData m_struct;
     private ExceptionType m_exType;
@@ -427,18 +427,7 @@ namespace Apache.Geode.Client.UnitTests
       }
     }
 
-    public static IGeodeSerializable Duplicate(IGeodeSerializable orig)
-    {
-      DataOutput dout = CacheHelper.DCache.CreateDataOutput();
-      orig.ToData(dout);
-
-      //DataInput din = new DataInput(dout.GetBuffer());
-      DataInput din = CacheHelper.DCache.CreateDataInput(dout.GetBuffer());
-      IGeodeSerializable dup = (IGeodeSerializable)din.ReadObject();
-      return dup;
-    }
-
-    #region IGeodeSerializable Members
+    #region IDataSerializable Members
 
     public void FromData(DataInput input)
     {
@@ -502,7 +491,7 @@ namespace Apache.Geode.Client.UnitTests
       }
     }
 
-    public UInt32 ClassId
+    public Int32 ClassId
     {
       get
       {
@@ -512,7 +501,7 @@ namespace Apache.Geode.Client.UnitTests
 
     #endregion
 
-    public static IGeodeSerializable CreateDeserializable()
+    public static ISerializable CreateDeserializable()
     {
       return new OtherType();
     }
@@ -533,7 +522,7 @@ namespace Apache.Geode.Client.UnitTests
     }
   }
 
-  public class OtherType2 : IGeodeSerializable
+  public class OtherType2 : IDataSerializable
   {
     private CData m_struct;
     private ExceptionType m_exType;
@@ -574,18 +563,7 @@ namespace Apache.Geode.Client.UnitTests
         return m_struct;
       }
     }
-
-    public static IGeodeSerializable Duplicate(IGeodeSerializable orig)
-    {
-      DataOutput dout = CacheHelper.DCache.CreateDataOutput();
-      orig.ToData(dout);
-
-      DataInput din = CacheHelper.DCache.CreateDataInput(dout.GetBuffer());
-      IGeodeSerializable dup = (IGeodeSerializable)din.ReadObject();
-      return dup;
-    }
-
-    #region IGeodeSerializable Members
+    #region IDataSerializable Members
 
     public void FromData(DataInput input)
     {
@@ -649,7 +627,7 @@ namespace Apache.Geode.Client.UnitTests
       }
     }
 
-    public UInt32 ClassId
+    public Int32 ClassId
     {
       get
       {
@@ -659,7 +637,7 @@ namespace Apache.Geode.Client.UnitTests
 
     #endregion
 
-    public static IGeodeSerializable CreateDeserializable()
+    public static ISerializable CreateDeserializable()
     {
       return new OtherType2();
     }
@@ -681,7 +659,7 @@ namespace Apache.Geode.Client.UnitTests
 
   }
 
-  public class OtherType22 : IGeodeSerializable
+  public class OtherType22 : IDataSerializable
   {
     private CData m_struct;
     private ExceptionType m_exType;
@@ -723,17 +701,7 @@ namespace Apache.Geode.Client.UnitTests
       }
     }
 
-    public static IGeodeSerializable Duplicate(IGeodeSerializable orig)
-    {
-      DataOutput dout = CacheHelper.DCache.CreateDataOutput();
-      orig.ToData(dout);
-
-      DataInput din = CacheHelper.DCache.CreateDataInput(dout.GetBuffer());
-      IGeodeSerializable dup = (IGeodeSerializable)din.ReadObject();
-      return dup;
-    }
-
-    #region IGeodeSerializable Members
+    #region IDataSerializable Members
 
     public void FromData(DataInput input)
     {
@@ -797,7 +765,7 @@ namespace Apache.Geode.Client.UnitTests
       }
     }
 
-    public UInt32 ClassId
+    public Int32 ClassId
     {
       get
       {
@@ -807,7 +775,7 @@ namespace Apache.Geode.Client.UnitTests
 
     #endregion
 
-    public static IGeodeSerializable CreateDeserializable()
+    public static ISerializable CreateDeserializable()
     {
       return new OtherType22();
     }
@@ -828,7 +796,7 @@ namespace Apache.Geode.Client.UnitTests
     }
   }
 
-  public class OtherType4 : IGeodeSerializable
+  public class OtherType4 : IDataSerializable
   {
     private CData m_struct;
     private ExceptionType m_exType;
@@ -870,17 +838,7 @@ namespace Apache.Geode.Client.UnitTests
       }
     }
 
-    public static IGeodeSerializable Duplicate(IGeodeSerializable orig)
-    {
-      DataOutput dout = CacheHelper.DCache.CreateDataOutput();
-      orig.ToData(dout);
-
-      DataInput din = CacheHelper.DCache.CreateDataInput(dout.GetBuffer());
-      IGeodeSerializable dup = (IGeodeSerializable)din.ReadObject();
-      return dup;
-    }
-
-    #region IGeodeSerializable Members
+    #region IDataSerializable Members
 
     public void FromData(DataInput input)
     {
@@ -944,7 +902,7 @@ namespace Apache.Geode.Client.UnitTests
       }
     }
 
-    public UInt32 ClassId
+    public Int32 ClassId
     {
       get
       {
@@ -954,7 +912,7 @@ namespace Apache.Geode.Client.UnitTests
 
     #endregion
 
-    public static IGeodeSerializable CreateDeserializable()
+    public static ISerializable CreateDeserializable()
     {
       return new OtherType4();
     }
@@ -976,7 +934,7 @@ namespace Apache.Geode.Client.UnitTests
 
   }
 
-  public class OtherType42 : IGeodeSerializable
+  public class OtherType42 : IDataSerializable
   {
     private CData m_struct;
     private ExceptionType m_exType;
@@ -1018,17 +976,7 @@ namespace Apache.Geode.Client.UnitTests
       }
     }
 
-    public static IGeodeSerializable Duplicate(IGeodeSerializable orig)
-    {
-      DataOutput dout = CacheHelper.DCache.CreateDataOutput();
-      orig.ToData(dout);
-
-      DataInput din = CacheHelper.DCache.CreateDataInput(dout.GetBuffer());
-      IGeodeSerializable dup = (IGeodeSerializable)din.ReadObject();
-      return dup;
-    }
-
-    #region IGeodeSerializable Members
+    #region IDataSerializable Members
 
     public void FromData(DataInput input)
     {
@@ -1092,7 +1040,7 @@ namespace Apache.Geode.Client.UnitTests
       }
     }
 
-    public UInt32 ClassId
+    public Int32 ClassId
     {
       get
       {
@@ -1102,7 +1050,7 @@ namespace Apache.Geode.Client.UnitTests
 
     #endregion
 
-    public static IGeodeSerializable CreateDeserializable()
+    public static ISerializable CreateDeserializable()
     {
       return new OtherType42();
     }
@@ -1124,7 +1072,7 @@ namespace Apache.Geode.Client.UnitTests
 
   }
 
-  public class OtherType43 : IGeodeSerializable
+  public class OtherType43 : IDataSerializable
   {
     private CData m_struct;
     private ExceptionType m_exType;
@@ -1166,17 +1114,7 @@ namespace Apache.Geode.Client.UnitTests
       }
     }
 
-    public static IGeodeSerializable Duplicate(IGeodeSerializable orig)
-    {
-      DataOutput dout = CacheHelper.DCache.CreateDataOutput();
-      orig.ToData(dout);
-
-      DataInput din = CacheHelper.DCache.CreateDataInput(dout.GetBuffer());
-      IGeodeSerializable dup = (IGeodeSerializable)din.ReadObject();
-      return dup;
-    }
-
-    #region IGeodeSerializable Members
+    #region IDataSerializable Members
 
     public void FromData(DataInput input)
     {
@@ -1240,7 +1178,7 @@ namespace Apache.Geode.Client.UnitTests
       }
     }
 
-    public UInt32 ClassId
+    public Int32 ClassId
     {
       get
       {
@@ -1250,7 +1188,7 @@ namespace Apache.Geode.Client.UnitTests
 
     #endregion
 
-    public static IGeodeSerializable CreateDeserializable()
+    public static ISerializable CreateDeserializable()
     {
       return new OtherType43();
     }
diff --git a/clicache/integration-test/TallyListener.cs b/clicache/integration-test/TallyListener.cs
index 62a6df0..c8907a8 100644
--- a/clicache/integration-test/TallyListener.cs
+++ b/clicache/integration-test/TallyListener.cs
@@ -32,8 +32,8 @@ namespace Apache.Geode.Client.UnitTests
     private int m_destroys = 0;
     private int m_clears = 0;
     private Apache.Geode.Client.ICacheableKey m_lastKey = null;
-    private Apache.Geode.Client.IGeodeSerializable m_lastValue = null;
-    private Apache.Geode.Client.IGeodeSerializable m_callbackArg = null;
+    private Apache.Geode.Client.ISerializable m_lastValue = null;
+    private Apache.Geode.Client.ISerializable m_callbackArg = null;
     private bool m_ignoreTimeout = false;
     private bool m_quiet = false;
     private bool isListenerInvoke = false;
@@ -83,7 +83,7 @@ namespace Apache.Geode.Client.UnitTests
       }
     }
 
-    public Apache.Geode.Client.IGeodeSerializable LastKey
+    public Apache.Geode.Client.ISerializable LastKey
     {
       get
       {
@@ -107,7 +107,7 @@ namespace Apache.Geode.Client.UnitTests
       }
     }
 
-    public Apache.Geode.Client.IGeodeSerializable LastValue
+    public Apache.Geode.Client.ISerializable LastValue
     {
       get
       {
@@ -131,7 +131,7 @@ namespace Apache.Geode.Client.UnitTests
       }
     }
 
-     public void SetCallBackArg(Apache.Geode.Client.IGeodeSerializable callbackArg)
+     public void SetCallBackArg(Apache.Geode.Client.ISerializable callbackArg)
     {
       m_callbackArg = callbackArg;
     }
@@ -145,7 +145,7 @@ namespace Apache.Geode.Client.UnitTests
         isListenerInvoke = true;
       if (m_callbackArg != null)
       {
-        Apache.Geode.Client.IGeodeSerializable callbkArg = (Apache.Geode.Client.IGeodeSerializable)ev.CallbackArgument;
+        Apache.Geode.Client.ISerializable callbkArg = (Apache.Geode.Client.ISerializable)ev.CallbackArgument;
         if (m_callbackArg.Equals(callbkArg))
           isCallbackCalled = true;
       }
@@ -238,7 +238,7 @@ namespace Apache.Geode.Client.UnitTests
     {
       m_creates++;
       m_lastKey = (Apache.Geode.Client.ICacheableKey)ev.Key;
-      m_lastValue = (Apache.Geode.Client.IGeodeSerializable)ev.NewValue;
+      m_lastValue = (Apache.Geode.Client.ISerializable)ev.NewValue;
       CheckcallbackArg(ev);
 
       string keyString = m_lastKey.ToString();
@@ -257,7 +257,7 @@ namespace Apache.Geode.Client.UnitTests
     {
       m_updates++;
       m_lastKey = (Apache.Geode.Client.ICacheableKey)ev.Key;
-      m_lastValue = (Apache.Geode.Client.IGeodeSerializable)ev.NewValue;
+      m_lastValue = (Apache.Geode.Client.ISerializable)ev.NewValue;
       CheckcallbackArg(ev);
      
       string keyString = m_lastKey.ToString();
diff --git a/clicache/integration-test/TallyListenerN.cs b/clicache/integration-test/TallyListenerN.cs
index 3bad24e..af7ff2f 100644
--- a/clicache/integration-test/TallyListenerN.cs
+++ b/clicache/integration-test/TallyListenerN.cs
@@ -152,8 +152,8 @@ namespace Apache.Geode.Client.UnitTests
       /*
       if (m_callbackArg != null)
       {
-        IGeodeSerializable callbkArg1 = ev.CallbackArgument as IGeodeSerializable;
-        IGeodeSerializable callbkArg2 = m_callbackArg as IGeodeSerializable;
+        ISerializable callbkArg1 = ev.CallbackArgument as ISerializable;
+        ISerializable callbkArg2 = m_callbackArg as ISerializable;
         if (callbkArg2 != null && callbkArg2.Equals(callbkArg1))
         {
           isCallbackCalled = true;
diff --git a/clicache/integration-test/TallyWriter.cs b/clicache/integration-test/TallyWriter.cs
index 8ef6db0..5da474c 100644
--- a/clicache/integration-test/TallyWriter.cs
+++ b/clicache/integration-test/TallyWriter.cs
@@ -30,10 +30,10 @@ namespace Apache.Geode.Client.UnitTests
     private int m_updates = 0;
     private int m_invalidates = 0;
     private int m_destroys = 0;
-    private Apache.Geode.Client.IGeodeSerializable m_callbackArg = null;
+    private Apache.Geode.Client.ISerializable m_callbackArg = null;
     private int m_clears = 0;
-    private Apache.Geode.Client.IGeodeSerializable m_lastKey = null;
-    private Apache.Geode.Client.IGeodeSerializable m_lastValue = null;
+    private Apache.Geode.Client.ISerializable m_lastKey = null;
+    private Apache.Geode.Client.ISerializable m_lastValue = null;
     private bool isWriterFailed = false;
     private bool isWriterInvoke = false;
     private bool isCallbackCalled = false;
@@ -82,7 +82,7 @@ namespace Apache.Geode.Client.UnitTests
     }
 
 
-    public Apache.Geode.Client.IGeodeSerializable LastKey
+    public Apache.Geode.Client.ISerializable LastKey
     {
       get
       {
@@ -90,7 +90,7 @@ namespace Apache.Geode.Client.UnitTests
       }
     }
 
-    public Apache.Geode.Client.IGeodeSerializable CallbackArgument
+    public Apache.Geode.Client.ISerializable CallbackArgument
     {
       get
       {
@@ -99,7 +99,7 @@ namespace Apache.Geode.Client.UnitTests
     }
 
 
-    public Apache.Geode.Client.IGeodeSerializable LastValue
+    public Apache.Geode.Client.ISerializable LastValue
     {
       get
       {
@@ -112,7 +112,7 @@ namespace Apache.Geode.Client.UnitTests
     isWriterFailed = true;
    }
 
-  public void SetCallBackArg( Apache.Geode.Client.IGeodeSerializable callbackArg )
+  public void SetCallBackArg( Apache.Geode.Client.ISerializable callbackArg )
   {
     m_callbackArg = callbackArg;
   }
@@ -174,7 +174,7 @@ namespace Apache.Geode.Client.UnitTests
           isWriterInvoke = true;
         if (m_callbackArg != null)
         {
-          Apache.Geode.Client.IGeodeSerializable callbkArg = (Apache.Geode.Client.IGeodeSerializable)ev.CallbackArgument;
+          Apache.Geode.Client.ISerializable callbkArg = (Apache.Geode.Client.ISerializable)ev.CallbackArgument;
           if (m_callbackArg.Equals(callbkArg))
             isCallbackCalled = true;
         }  
diff --git a/clicache/integration-test/TallyWriterN.cs b/clicache/integration-test/TallyWriterN.cs
index 1f3aaa2..5944db5 100644
--- a/clicache/integration-test/TallyWriterN.cs
+++ b/clicache/integration-test/TallyWriterN.cs
@@ -178,8 +178,8 @@ namespace Apache.Geode.Client.UnitTests
       /*
         if (m_callbackArg != null)
         {
-          IGeodeSerializable callbkArg1 = ev.CallbackArgument as IGeodeSerializable;
-          IGeodeSerializable callbkArg2 = m_callbackArg as IGeodeSerializable;
+          ISerializable callbkArg1 = ev.CallbackArgument as ISerializable;
+          ISerializable callbkArg2 = m_callbackArg as ISerializable;
           if (callbkArg1 != null && callbkArg1.Equals(callbkArg2))
           {
             isCallbackCalled = true;
diff --git a/clicache/integration-test/ThinClientAppDomainQueryTests.cs b/clicache/integration-test/ThinClientAppDomainQueryTests.cs
index 5eece34..46c453a 100644
--- a/clicache/integration-test/ThinClientAppDomainQueryTests.cs
+++ b/clicache/integration-test/ThinClientAppDomainQueryTests.cs
@@ -64,8 +64,8 @@ namespace Apache.Geode.Client.UnitTests
 
     public void InitClient()
     {
-      CacheHelper.DCache.TypeRegistry.RegisterTypeGeneric(Portfolio.CreateDeserializable);
-      CacheHelper.DCache.TypeRegistry.RegisterTypeGeneric(Position.CreateDeserializable);
+      CacheHelper.DCache.TypeRegistry.RegisterType(Portfolio.CreateDeserializable);
+      CacheHelper.DCache.TypeRegistry.RegisterType(Position.CreateDeserializable);
       CacheHelper.DCache.TypeRegistry.RegisterPdxType(PortfolioPdx.CreateDeserializable);
       CacheHelper.DCache.TypeRegistry.RegisterPdxType(PositionPdx.CreateDeserializable);
     }
diff --git a/clicache/integration-test/ThinClientCallbackArgN.cs b/clicache/integration-test/ThinClientCallbackArgN.cs
index 5f86715..ec3aef5 100644
--- a/clicache/integration-test/ThinClientCallbackArgN.cs
+++ b/clicache/integration-test/ThinClientCallbackArgN.cs
@@ -248,8 +248,8 @@ namespace Apache.Geode.Client.UnitTests
       GIRegion region = null;
       region = CacheHelper.CreateTCRegion_Pool<int, object>(RegionName, true, caching,
         callbackLis, locators, "__TESTPOOL1_", true);
-      CacheHelper.DCache.TypeRegistry.RegisterTypeGeneric(Portfolio.CreateDeserializable);
-      CacheHelper.DCache.TypeRegistry.RegisterTypeGeneric(Position.CreateDeserializable);
+      CacheHelper.DCache.TypeRegistry.RegisterType(Portfolio.CreateDeserializable);
+      CacheHelper.DCache.TypeRegistry.RegisterType(Position.CreateDeserializable);
     }
 
     public void ValidateLocalListenerWriterData()
@@ -454,7 +454,7 @@ namespace Apache.Geode.Client.UnitTests
     {
       if (!isRegistered)
       {
-        CacheHelper.DCache.TypeRegistry.RegisterTypeGeneric(DefaultType.CreateDeserializable);
+        CacheHelper.DCache.TypeRegistry.RegisterType(DefaultType.CreateDeserializable);
         isRegistered = true;
       }
     }
diff --git a/clicache/integration-test/ThinClientCqAttributesMutatorTests.cs b/clicache/integration-test/ThinClientCqAttributesMutatorTests.cs
index 2a82ce3..b2ad64c 100644
--- a/clicache/integration-test/ThinClientCqAttributesMutatorTests.cs
+++ b/clicache/integration-test/ThinClientCqAttributesMutatorTests.cs
@@ -76,7 +76,7 @@ namespace Apache.Geode.Client.UnitTests
         else
           m_eventCountBefore++;
 
-        //IGeodeSerializable val = ev.getNewValue();
+        //ISerializable val = ev.getNewValue();
         //ICacheableKey key = ev.getKey();
 
         TResult val = (TResult)ev.getNewValue();
@@ -258,8 +258,8 @@ namespace Apache.Geode.Client.UnitTests
       CacheHelper.Init();
       try
       {
-        CacheHelper.DCache.TypeRegistry.RegisterTypeGeneric(Portfolio.CreateDeserializable);
-        CacheHelper.DCache.TypeRegistry.RegisterTypeGeneric(Position.CreateDeserializable);
+        CacheHelper.DCache.TypeRegistry.RegisterType(Portfolio.CreateDeserializable);
+        CacheHelper.DCache.TypeRegistry.RegisterType(Position.CreateDeserializable);
       }
       catch (IllegalStateException)
       {
diff --git a/clicache/integration-test/ThinClientCqIRTestsN.cs b/clicache/integration-test/ThinClientCqIRTestsN.cs
index 10657cc..5e17906 100644
--- a/clicache/integration-test/ThinClientCqIRTestsN.cs
+++ b/clicache/integration-test/ThinClientCqIRTestsN.cs
@@ -73,8 +73,8 @@ namespace Apache.Geode.Client.UnitTests
       CacheHelper.Init();
       try
       {
-        CacheHelper.DCache.TypeRegistry.RegisterTypeGeneric(Portfolio.CreateDeserializable);
-        CacheHelper.DCache.TypeRegistry.RegisterTypeGeneric(Position.CreateDeserializable);
+        CacheHelper.DCache.TypeRegistry.RegisterType(Portfolio.CreateDeserializable);
+        CacheHelper.DCache.TypeRegistry.RegisterType(Position.CreateDeserializable);
       }
       catch (IllegalStateException)
       {
diff --git a/clicache/integration-test/ThinClientCqPdxTest.cs b/clicache/integration-test/ThinClientCqPdxTest.cs
index bd0ff30..985d1db 100644
--- a/clicache/integration-test/ThinClientCqPdxTest.cs
+++ b/clicache/integration-test/ThinClientCqPdxTest.cs
@@ -76,7 +76,7 @@ namespace Apache.Geode.Client.UnitTests
         else
           m_eventCountBefore++;
 
-        //IGeodeSerializable val = ev.getNewValue();
+        //ISerializable val = ev.getNewValue();
         //ICacheableKey key = ev.getKey();
 
         TResult val = (TResult)ev.getNewValue();
@@ -297,8 +297,8 @@ namespace Apache.Geode.Client.UnitTests
       CacheHelper.Init();
       try
       {
-        CacheHelper.DCache.TypeRegistry.RegisterTypeGeneric(Portfolio.CreateDeserializable);
-        CacheHelper.DCache.TypeRegistry.RegisterTypeGeneric(Position.CreateDeserializable);
+        CacheHelper.DCache.TypeRegistry.RegisterType(Portfolio.CreateDeserializable);
+        CacheHelper.DCache.TypeRegistry.RegisterType(Position.CreateDeserializable);
       }
       catch (IllegalStateException)
       {
diff --git a/clicache/integration-test/ThinClientCqStatusTest.cs b/clicache/integration-test/ThinClientCqStatusTest.cs
index 68f582a..a7c6c2d 100644
--- a/clicache/integration-test/ThinClientCqStatusTest.cs
+++ b/clicache/integration-test/ThinClientCqStatusTest.cs
@@ -76,7 +76,7 @@ namespace Apache.Geode.Client.UnitTests
         else
           m_eventCountBefore++;
 
-        //IGeodeSerializable val = ev.getNewValue();
+        //ISerializable val = ev.getNewValue();
         //ICacheableKey key = ev.getKey();
 
         TResult val = (TResult)ev.getNewValue();
@@ -297,8 +297,8 @@ namespace Apache.Geode.Client.UnitTests
       CacheHelper.Init();
       try
       {
-        CacheHelper.DCache.TypeRegistry.RegisterTypeGeneric(Portfolio.CreateDeserializable);
-        CacheHelper.DCache.TypeRegistry.RegisterTypeGeneric(Position.CreateDeserializable);
+        CacheHelper.DCache.TypeRegistry.RegisterType(Portfolio.CreateDeserializable);
+        CacheHelper.DCache.TypeRegistry.RegisterType(Position.CreateDeserializable);
       }
       catch (IllegalStateException)
       {
diff --git a/clicache/integration-test/ThinClientCqStatusTestTwoServers.cs b/clicache/integration-test/ThinClientCqStatusTestTwoServers.cs
index b5d2933..0831535 100644
--- a/clicache/integration-test/ThinClientCqStatusTestTwoServers.cs
+++ b/clicache/integration-test/ThinClientCqStatusTestTwoServers.cs
@@ -69,7 +69,7 @@ namespace Apache.Geode.Client.UnitTests
       else
         m_eventCountBefore++;
 
-      //IGeodeSerializable val = ev.getNewValue();
+      //ISerializable val = ev.getNewValue();
       //ICacheableKey key = ev.getKey();
 
       TResult val = (TResult)ev.getNewValue();
@@ -298,8 +298,8 @@ namespace Apache.Geode.Client.UnitTests
       CacheHelper.Init();
       try
       {
-        CacheHelper.DCache.TypeRegistry.RegisterTypeGeneric(Portfolio.CreateDeserializable);
-        CacheHelper.DCache.TypeRegistry.RegisterTypeGeneric(Position.CreateDeserializable);
+        CacheHelper.DCache.TypeRegistry.RegisterType(Portfolio.CreateDeserializable);
+        CacheHelper.DCache.TypeRegistry.RegisterType(Position.CreateDeserializable);
       }
       catch (IllegalStateException)
       {
diff --git a/clicache/integration-test/ThinClientCqTest.cs b/clicache/integration-test/ThinClientCqTest.cs
index b718be6..2c066c9 100644
--- a/clicache/integration-test/ThinClientCqTest.cs
+++ b/clicache/integration-test/ThinClientCqTest.cs
@@ -76,7 +76,7 @@ namespace Apache.Geode.Client.UnitTests
         else
           m_eventCountBefore++;
 
-        //IGeodeSerializable val = ev.getNewValue();
+        //ISerializable val = ev.getNewValue();
         //ICacheableKey key = ev.getKey();
 
         TResult val = (TResult)ev.getNewValue();
@@ -296,8 +296,8 @@ namespace Apache.Geode.Client.UnitTests
       CacheHelper.Init();
       try
       {
-        CacheHelper.DCache.TypeRegistry.RegisterTypeGeneric(Portfolio.CreateDeserializable);
-        CacheHelper.DCache.TypeRegistry.RegisterTypeGeneric(Position.CreateDeserializable);
+        CacheHelper.DCache.TypeRegistry.RegisterType(Portfolio.CreateDeserializable);
+        CacheHelper.DCache.TypeRegistry.RegisterType(Position.CreateDeserializable);
       }
       catch (IllegalStateException)
       {
diff --git a/clicache/integration-test/ThinClientDeltaTestN.cs b/clicache/integration-test/ThinClientDeltaTest.cs
similarity index 65%
rename from clicache/integration-test/ThinClientDeltaTestN.cs
rename to clicache/integration-test/ThinClientDeltaTest.cs
index 6cb387f..012c8e6 100644
--- a/clicache/integration-test/ThinClientDeltaTestN.cs
+++ b/clicache/integration-test/ThinClientDeltaTest.cs
@@ -79,7 +79,7 @@ namespace Apache.Geode.Client.UnitTests
     private int m_valueCount;
   }
 
-  public class DeltaTestAD : IGeodeDelta, IGeodeSerializable
+  public class DeltaTestAD : IDelta, IDataSerializable
   {
     private int _deltaUpdate;
     private string _staticData;
@@ -96,7 +96,7 @@ namespace Apache.Geode.Client.UnitTests
     }
 
 
-    #region IGeodeDelta Members
+    #region IDelta Members
 
     public void FromDelta(DataInput input)
     {
@@ -118,9 +118,9 @@ namespace Apache.Geode.Client.UnitTests
 
     #endregion
 
-    #region IGeodeSerializable Members
+    #region IDataSerializable Members
 
-    public uint ClassId
+    public int ClassId
     {
       get { return 151; }
     }
@@ -194,11 +194,6 @@ namespace Apache.Geode.Client.UnitTests
       base.EndTest();
     }
 
-    public void createLRURegionAndAttachPool(string regionName, string poolName)
-    {
-      CacheHelper.CreateLRUTCRegion_Pool<object, object>(regionName, true, true, null, null, poolName, false, 3);
-    }
-
     public void createRegionAndAttachPool(string regionName, string poolName)
     {
       createRegionAndAttachPool(regionName, poolName, false);
@@ -210,11 +205,6 @@ namespace Apache.Geode.Client.UnitTests
         false, cloningEnabled);
     }
 
-    //public void createPooledRegion(string regionName, string poolName, string endpoints, string locators)
-    //{
-    //  CacheHelper.CreateTCRegion_Pool(regionName, true, true, null, endpoints, locators, poolName, false);
-    //}
-
     public void createPool(string name, string locators, string serverGroup,
       int redundancy, bool subscription)
     {
@@ -227,34 +217,11 @@ namespace Apache.Geode.Client.UnitTests
           poolName, ExpirationAction.LocalInvalidate, TimeSpan.FromSeconds(5));
     }
 
-    public void createExpirationRegion(string name)
-    {
-      createExpirationRegion(name, null);
-    }
-
-    public void CreateRegion(string name)
-    {
-      CreateRegion(name, false);
-    }
-
-    public void CreateRegion(string name, bool enableNotification)
-    {
-      CreateRegion(name, enableNotification, false);
-    }
-    public void CreateRegion(string name, bool enableNotification, bool cloningEnabled)
-    {
-      var regionAttributesFactory = new RegionAttributesFactory<object, object>();
-      regionAttributesFactory.SetCacheListener(new SimpleCacheListener<object, object>());
-      regionAttributesFactory.SetCloningEnabled(cloningEnabled);
-      var regionAttributes = regionAttributesFactory.Create();
-      CacheHelper.CreateRegion<object, object>(name, regionAttributes);
-    }
-
     void DoPutWithDelta()
     {
       try
       {
-        CacheHelper.DCache.TypeRegistry.RegisterTypeGeneric(DeltaEx.create);
+        CacheHelper.DCache.TypeRegistry.RegisterType(DeltaEx.create);
       }
       catch (IllegalStateException)
       {
@@ -289,7 +256,7 @@ namespace Apache.Geode.Client.UnitTests
     {
       try
       {
-        CacheHelper.DCache.TypeRegistry.RegisterTypeGeneric(DeltaEx.create);
+        CacheHelper.DCache.TypeRegistry.RegisterType(DeltaEx.create);
       }
       catch (IllegalStateException)
       {
@@ -333,88 +300,11 @@ namespace Apache.Geode.Client.UnitTests
       Assert.IsFalse(updatedcontainsOpflag, "Result should be false as key & value are removed");
     }
 
-    void DoNotificationWithDelta()
-    {
-      try
-      {
-        CacheHelper.DCache.TypeRegistry.RegisterTypeGeneric(DeltaEx.create);
-      }
-      catch (IllegalStateException)
-      {
-        //do nothig.
-      }
-
-      string cKey = m_keys[0];
-      DeltaEx val = new DeltaEx();
-      IRegion<object, object> reg = CacheHelper.GetRegion<object, object>("DistRegionAck");
-      reg[cKey] = val;
-      val.SetDelta(true);
-      reg[cKey] = val;
-
-      string cKey1 = m_keys[1];
-      DeltaEx val1 = new DeltaEx();
-      reg[cKey1] = val1;
-      val1.SetDelta(true);
-      reg[cKey1] = val1;
-      DeltaEx.ToDeltaCount = 0;
-      DeltaEx.ToDataCount = 0;
-    }
-
-    void DoNotificationWithDefaultCloning()
-    {
-      string cKey = m_keys[0];
-      DeltaTestImpl val = new DeltaTestImpl();
-      IRegion<object, object> reg = CacheHelper.GetRegion<object, object>("DistRegionAck");
-      reg[cKey] = val;
-      val.SetIntVar(2);
-      val.SetDelta(true);
-      reg[cKey] = val;
-
-      javaobject.PdxDelta pd = new javaobject.PdxDelta(1001);
-      for (int i = 0; i < 10; i++)
-      {
-        reg["pdxdelta"] = pd;
-      }
-    }
-
-    void DoNotificationWithDeltaLRU()
-    {
-      try
-      {
-        CacheHelper.DCache.TypeRegistry.RegisterTypeGeneric(DeltaEx.create);
-      }
-      catch (IllegalStateException)
-      {
-        //do nothig.
-      }
-
-      string cKey1 = "key1";
-      string cKey2 = "key2";
-      string cKey3 = "key3";
-      string cKey4 = "key4";
-      string cKey5 = "key5";
-      string cKey6 = "key6";
-      DeltaEx val1 = new DeltaEx();
-      DeltaEx val2 = new DeltaEx();
-      IRegion<object, object> reg = CacheHelper.GetRegion<object, object>("DistRegionAck");
-      reg[cKey1] = val1;
-      reg[cKey2] = val1;
-      reg[cKey3] = val1;
-      reg[cKey4] = val1;
-      reg[cKey5] = val1;
-      reg[cKey6] = val1;
-      val2.SetDelta(true);
-      reg[cKey1] = val2;
-
-      DeltaEx.ToDeltaCount = 0;
-      DeltaEx.ToDataCount = 0;
-    }
-
     void DoExpirationWithDelta()
     {
       try
       {
-        CacheHelper.DCache.TypeRegistry.RegisterTypeGeneric(DeltaEx.create);
+        CacheHelper.DCache.TypeRegistry.RegisterType(DeltaEx.create);
       }
       catch (IllegalStateException)
       {
@@ -447,7 +337,7 @@ namespace Apache.Geode.Client.UnitTests
     {
       try
       {
-        CacheHelper.DCache.TypeRegistry.RegisterTypeGeneric(DeltaTestAD.Create);
+        CacheHelper.DCache.TypeRegistry.RegisterType(DeltaTestAD.Create);
       }
       catch (IllegalStateException)
       {
@@ -571,7 +461,7 @@ namespace Apache.Geode.Client.UnitTests
     {
       try
       {
-        CacheHelper.DCache.TypeRegistry.RegisterTypeGeneric(DeltaEx.create);
+        CacheHelper.DCache.TypeRegistry.RegisterType(DeltaEx.create);
       }
       catch (IllegalStateException)
       {
@@ -588,7 +478,7 @@ namespace Apache.Geode.Client.UnitTests
     {
       try
       {
-        CacheHelper.DCache.TypeRegistry.RegisterTypeGeneric(DeltaTestImpl.CreateDeserializable);
+        CacheHelper.DCache.TypeRegistry.RegisterType(DeltaTestImpl.CreateDeserializable);
       }
       catch (IllegalStateException)
       {
@@ -621,64 +511,6 @@ namespace Apache.Geode.Client.UnitTests
       theQuery.Execute();
     }
 
-    void VerifyDeltaCount()
-    {
-      Thread.Sleep(1000);
-      Util.Log("Total Data count" + DeltaEx.FromDataCount);
-      Util.Log("Total Data count" + DeltaEx.FromDeltaCount);
-      if (DeltaEx.FromDataCount != 3)
-        Assert.Fail("Count of fromData called should be 3 ");
-      if (DeltaEx.FromDeltaCount != 2)
-        Assert.Fail("Count of fromDelta called should be 2 ");
-      if (SimpleCacheListener<object, object>.isSuccess == false)
-        Assert.Fail("Listener failure");
-      SimpleCacheListener<object, object>.isSuccess = false;
-      if (DeltaEx.CloneCount != 2)
-        Assert.Fail("Clone count should be 2, is " + DeltaEx.CloneCount);
-
-      DeltaEx.FromDataCount = 0;
-      DeltaEx.FromDeltaCount = 0;
-      DeltaEx.CloneCount = 0;
-    }
-
-    void VerifyCloning()
-    {
-      Thread.Sleep(1000);
-      string cKey = m_keys[0];
-      IRegion<object, object> reg = CacheHelper.GetRegion<object, object>("DistRegionAck");
-      DeltaTestImpl val = reg[cKey] as DeltaTestImpl;
-
-      if (val.GetIntVar() != 2)
-        Assert.Fail("Int value after cloning should be 2, is " + val.GetIntVar());
-      if (DeltaTestImpl.GetFromDataCount() != 2)
-        Assert.Fail("After cloning, fromDataCount should have been 2, is " + DeltaTestImpl.GetFromDataCount());
-      if (DeltaTestImpl.GetToDataCount() != 1)
-        Assert.Fail("After cloning, toDataCount should have been 1, is " + DeltaTestImpl.GetToDataCount());
-
-      System.Threading.Thread.Sleep(5000);
-      //Assert.Greater(javaobject.PdxDelta.GotDelta, 7, "this should have recieve delta");
-      javaobject.PdxDelta pd = (javaobject.PdxDelta)(reg.GetLocalView()["pdxdelta"]);
-      Assert.Greater(pd.Delta, 7, "this should have recieve delta");
-    }
-
-    void VerifyDeltaCountLRU()
-    {
-      Thread.Sleep(1000);
-      if (DeltaEx.FromDataCount != 8)
-      {
-        Util.Log("DeltaEx.FromDataCount = " + DeltaEx.FromDataCount);
-        Util.Log("DeltaEx.FromDeltaCount = " + DeltaEx.FromDeltaCount);
-        Assert.Fail("Count should have been 8. 6 for common put and two when pulled from database and deserialized");
-      }
-      if (DeltaEx.FromDeltaCount != 1)
-      {
-        Util.Log("DeltaEx.FromDeltaCount = " + DeltaEx.FromDeltaCount);
-        Assert.Fail("Count should have been 1");
-      }
-      DeltaEx.FromDataCount = 0;
-      DeltaEx.FromDeltaCount = 0;
-    }
-
     void VerifyCqDeltaCount()
     {
       // Wait for Cq event processing in listener
@@ -692,6 +524,7 @@ namespace Apache.Geode.Client.UnitTests
         Assert.Fail("Value from CQ event is incorrect");
       }
     }
+
     void VerifyExpirationDeltaCount()
     {
       Thread.Sleep(1000);
@@ -703,81 +536,6 @@ namespace Apache.Geode.Client.UnitTests
       DeltaEx.FromDeltaCount = 0;
     }
 
-    void runNotificationWithDelta()
-    {
-      CacheHelper.SetupJavaServers(true, "cacheserver_with_delta.xml");
-      CacheHelper.StartJavaLocator(1, "GFELOC1");
-      CacheHelper.StartJavaServerWithLocators(1, "GFECS5", 1);
-
-      m_client1.Call(createPool, "__TEST_POOL1__", CacheHelper.Locators, (string)null, 0, true);
-      m_client1.Call(createRegionAndAttachPool, "DistRegionAck", "__TEST_POOL1__", true);
-
-      m_client2.Call(createPool, "__TEST_POOL1__", CacheHelper.Locators, (string)null, 0, true);
-      m_client2.Call(createRegionAndAttachPool, "DistRegionAck", "__TEST_POOL1__", true);
-
-      m_client2.Call(registerClassCl2);
-
-      m_client1.Call(DoNotificationWithDelta);
-      m_client2.Call(VerifyDeltaCount);
-      m_client1.Call(Close);
-      m_client2.Call(Close);
-
-      CacheHelper.StopJavaServer(1);
-      CacheHelper.StopJavaLocator(1);
-      CacheHelper.ClearEndpoints();
-      CacheHelper.ClearLocators();
-    }
-
-    void runNotificationWithDefaultCloning()
-    {
-      CacheHelper.SetupJavaServers(true, "cacheserver_with_delta_test_impl.xml");
-      CacheHelper.StartJavaLocator(1, "GFELOC1");
-      CacheHelper.StartJavaServerWithLocators(1, "GFECS5", 1);
-
-      m_client1.Call(createPool, "__TEST_POOL1__", CacheHelper.Locators, (string)null, 0, true);
-      m_client1.Call(createRegionAndAttachPool, "DistRegionAck", "__TEST_POOL1__", true);
-
-      m_client2.Call(createPool, "__TEST_POOL1__", CacheHelper.Locators, (string)null, 0, true);
-      m_client2.Call(createRegionAndAttachPool, "DistRegionAck", "__TEST_POOL1__", true);
-
-      m_client1.Call(registerClassDeltaTestImpl);
-      m_client2.Call(registerClassDeltaTestImpl);
-
-      m_client1.Call(DoNotificationWithDefaultCloning);
-      m_client2.Call(VerifyCloning);
-      m_client1.Call(Close);
-      m_client2.Call(Close);
-
-      CacheHelper.StopJavaServer(1);
-      CacheHelper.StopJavaLocator(1);
-      CacheHelper.ClearEndpoints();
-      CacheHelper.ClearLocators();
-    }
-
-    void runNotificationWithDeltaWithOverFlow()
-    {
-      CacheHelper.SetupJavaServers(true, "cacheserver_with_delta.xml");
-      CacheHelper.StartJavaLocator(1, "GFELOC1");
-      CacheHelper.StartJavaServerWithLocators(1, "GFECS1", 1);
-
-      m_client1.Call(createPool, "__TEST_POOL1__", CacheHelper.Locators, (string)null, 0, true);
-      m_client1.Call(createLRURegionAndAttachPool, "DistRegionAck", "__TEST_POOL1__");
-
-      m_client2.Call(createPool, "__TEST_POOL1__", CacheHelper.Locators, (string)null, 0, true);
-      m_client2.Call(createLRURegionAndAttachPool, "DistRegionAck", "__TEST_POOL1__");
-
-      m_client2.Call(registerClassCl2);
-
-      m_client1.Call(DoNotificationWithDeltaLRU);
-      m_client2.Call(VerifyDeltaCountLRU);
-      m_client1.Call(Close);
-      m_client2.Call(Close);
-      CacheHelper.StopJavaServer(1);
-      CacheHelper.StopJavaLocator(1);
-      CacheHelper.ClearEndpoints();
-      CacheHelper.ClearLocators();
-    }
-
     void runCqWithDelta()
     {
       CacheHelper.SetupJavaServers(true, "cacheserver_with_delta_test_impl.xml");
@@ -836,7 +594,6 @@ namespace Apache.Geode.Client.UnitTests
     public void PutWithDeltaAD()
     {
       runDeltaWithAppdomian(false);
-      runDeltaWithAppdomian(true);//cloning enable
     }
 
     [Test]
@@ -852,24 +609,6 @@ namespace Apache.Geode.Client.UnitTests
     }
 
     [Test]
-    public void NotificationWithDelta()
-    {
-      runNotificationWithDelta();
-    }
-
-    [Test]
-    public void NotificationWithDefaultCloning()
-    {
-      runNotificationWithDefaultCloning();
-    }
-
-    [Test]
-    public void NotificationWithDeltaWithOverFlow()
-    {
-      runNotificationWithDeltaWithOverFlow();
-    }
-
-    [Test]
     public void CqWithDelta()
     {
       runCqWithDelta();
diff --git a/clicache/integration-test/ThinClientDeltaTestFailing.cs b/clicache/integration-test/ThinClientDeltaTestFailing.cs
new file mode 100644
index 0000000..9721434
--- /dev/null
+++ b/clicache/integration-test/ThinClientDeltaTestFailing.cs
@@ -0,0 +1,657 @@
+/*
+ * 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.
+ */
+
+using System;
+using System.Collections.Generic;
+using System.IO;
+using System.Threading;
+
+#pragma warning disable 618
+
+namespace Apache.Geode.Client.UnitTests
+{
+  using NUnit.Framework;
+  using Apache.Geode.DUnitFramework;
+  using Apache.Geode.Client.Tests;
+  using Apache.Geode.Client;
+  using DeltaEx = Apache.Geode.Client.Tests.DeltaEx;
+
+  namespace failing
+  {
+    public class CqDeltaListener<TKey, TResult> : ICqListener<TKey, TResult>
+    {
+
+      public CqDeltaListener()
+      {
+        m_deltaCount = 0;
+        m_valueCount = 0;
+      }
+
+      public void OnEvent(CqEvent<TKey, TResult> aCqEvent)
+      {
+        byte[] deltaValue = aCqEvent.getDeltaValue();
+        DeltaTestImpl newValue = new DeltaTestImpl();
+        DataInput input = CacheHelper.DCache.CreateDataInput(deltaValue);
+        newValue.FromDelta(input);
+        if (newValue.GetIntVar() == 5)
+        {
+          m_deltaCount++;
+        }
+        DeltaTestImpl fullObject = (DeltaTestImpl)(object)aCqEvent.getNewValue();
+        if (fullObject.GetIntVar() == 5)
+        {
+          m_valueCount++;
+        }
+
+      }
+
+      public void OnError(CqEvent<TKey, TResult> aCqEvent)
+      {
+      }
+
+      public void Close()
+      {
+      }
+
+      public int GetDeltaCount()
+      {
+        return m_deltaCount;
+      }
+
+      public int GetValueCount()
+      {
+        return m_valueCount;
+      }
+
+      private int m_deltaCount;
+      private int m_valueCount;
+    }
+
+    public class DeltaTestAD : IDelta, IDataSerializable
+    {
+      private int _deltaUpdate;
+      private string _staticData;
+
+      public static DeltaTestAD Create()
+      {
+        return new DeltaTestAD();
+      }
+
+      public DeltaTestAD()
+      {
+        _deltaUpdate = 1;
+        _staticData = "Data which don't get updated";
+      }
+
+
+      #region IDelta Members
+
+      public void FromDelta(DataInput input)
+      {
+        _deltaUpdate = input.ReadInt32();
+      }
+
+      public bool HasDelta()
+      {
+        _deltaUpdate++;
+        bool isDelta = (_deltaUpdate % 2) == 1;
+        Util.Log("In DeltaTestAD.HasDelta _deltaUpdate:" + _deltaUpdate + " : isDelta:" + isDelta);
+        return isDelta;
+      }
+
+      public void ToDelta(DataOutput output)
+      {
+        output.WriteInt32(_deltaUpdate);
+      }
+
+      #endregion
+
+      #region IDataSerializable Members
+
+      public int ClassId
+      {
+        get { return 151; }
+      }
+
+      public void FromData(DataInput input)
+      {
+        _deltaUpdate = input.ReadInt32();
+        _staticData = input.ReadUTF();
+      }
+
+      public UInt64 ObjectSize
+      {
+        get { return (uint)(4 + _staticData.Length); }
+      }
+
+      public void ToData(DataOutput output)
+      {
+        output.WriteInt32(_deltaUpdate);
+        output.WriteUTF(_staticData);
+      }
+
+      public int DeltaUpdate
+      {
+        get { return _deltaUpdate; }
+        set { _deltaUpdate = value; }
+      }
+
+      #endregion
+    }
+
+    [TestFixture]
+    [Category("group1")]
+    [Category("unicast_only")]
+    [Category("generics")]
+    public class ThinClientDeltaTest : ThinClientRegionSteps
+    {
+      #region Private members
+
+      private UnitProcess m_client1, m_client2;
+      private CqDeltaListener<object, DeltaTestImpl> myCqListener;
+
+      #endregion
+
+      protected override ClientBase[] GetClients()
+      {
+        m_client1 = new UnitProcess();
+        m_client2 = new UnitProcess();
+        return new ClientBase[] { m_client1, m_client2 };
+      }
+
+      [TestFixtureTearDown]
+      public override void EndTests()
+      {
+        CacheHelper.StopJavaServers();
+        base.EndTests();
+      }
+
+      [TearDown]
+      public override void EndTest()
+      {
+        try
+        {
+          CacheHelper.ClearEndpoints();
+          CacheHelper.ClearLocators();
+        }
+        finally
+        {
+          CacheHelper.StopJavaServers();
+          CacheHelper.StopJavaLocators();
+        }
+        base.EndTest();
+      }
+
+      public void createLRURegionAndAttachPool(string regionName, string poolName)
+      {
+        CacheHelper.CreateLRUTCRegion_Pool<object, object>(regionName, true, true, null, null, poolName, false, 3);
+      }
+
+      public void createRegionAndAttachPool(string regionName, string poolName, bool cloningEnabled)
+      {
+        CacheHelper.CreateTCRegion_Pool<object, object>(regionName, true, true, null, null, poolName, false,
+          false, cloningEnabled);
+      }
+
+      public void createPool(string name, string locators, string serverGroup,
+        int redundancy, bool subscription)
+      {
+        CacheHelper.CreatePool<object, object>(name, locators, serverGroup, redundancy, subscription);
+      }
+
+      void DoNotificationWithDelta()
+      {
+        try
+        {
+          CacheHelper.DCache.TypeRegistry.RegisterType(DeltaEx.create);
+        }
+        catch (IllegalStateException)
+        {
+          //do nothig.
+        }
+
+        string cKey = m_keys[0];
+        DeltaEx val = new DeltaEx();
+        IRegion<object, object> reg = CacheHelper.GetRegion<object, object>("DistRegionAck");
+        reg[cKey] = val;
+        val.SetDelta(true);
+        reg[cKey] = val;
+
+        string cKey1 = m_keys[1];
+        DeltaEx val1 = new DeltaEx();
+        reg[cKey1] = val1;
+        val1.SetDelta(true);
+        reg[cKey1] = val1;
+        DeltaEx.ToDeltaCount = 0;
+        DeltaEx.ToDataCount = 0;
+      }
+
+      void DoNotificationWithDefaultCloning()
+      {
+        string cKey = m_keys[0];
+        DeltaTestImpl val = new DeltaTestImpl();
+        IRegion<object, object> reg = CacheHelper.GetRegion<object, object>("DistRegionAck");
+        reg[cKey] = val;
+        val.SetIntVar(2);
+        val.SetDelta(true);
+        reg[cKey] = val;
+
+        javaobject.PdxDelta pd = new javaobject.PdxDelta(1001);
+        for (int i = 0; i < 10; i++)
+        {
+          reg["pdxdelta"] = pd;
+        }
+      }
+
+      void DoNotificationWithDeltaLRU()
+      {
+        try
+        {
+          CacheHelper.DCache.TypeRegistry.RegisterType(DeltaEx.create);
+        }
+        catch (IllegalStateException)
+        {
+          //do nothig.
+        }
+
+        string cKey1 = "key1";
+        string cKey2 = "key2";
+        string cKey3 = "key3";
+        string cKey4 = "key4";
+        string cKey5 = "key5";
+        string cKey6 = "key6";
+        DeltaEx val1 = new DeltaEx();
+        DeltaEx val2 = new DeltaEx();
+        IRegion<object, object> reg = CacheHelper.GetRegion<object, object>("DistRegionAck");
+        reg[cKey1] = val1;
+        reg[cKey2] = val1;
+        reg[cKey3] = val1;
+        reg[cKey4] = val1;
+        reg[cKey5] = val1;
+        reg[cKey6] = val1;
+        val2.SetDelta(true);
+        reg[cKey1] = val2;
+
+        DeltaEx.ToDeltaCount = 0;
+        DeltaEx.ToDataCount = 0;
+      }
+
+      void DoExpirationWithDelta()
+      {
+        try
+        {
+          CacheHelper.DCache.TypeRegistry.RegisterType(DeltaEx.create);
+        }
+        catch (IllegalStateException)
+        {
+          //do nothig.
+        }
+
+        DeltaEx val1 = new DeltaEx();
+        IRegion<object, object> reg = CacheHelper.GetRegion<object, object>("DistRegionAck");
+        reg[1] = val1;
+        // Sleep 10 seconds to allow expiration of entry in client 2
+        Thread.Sleep(10000);
+        val1.SetDelta(true);
+        reg[1] = val1;
+        DeltaEx.ToDeltaCount = 0;
+        DeltaEx.ToDataCount = 0;
+      }
+
+      void DoCqWithDelta()
+      {
+        string cKey1 = "key1";
+        IRegion<object, object> reg = CacheHelper.GetRegion<object, object>("DistRegionAck");
+        DeltaTestImpl value = new DeltaTestImpl();
+        reg[cKey1] = value;
+        value.SetIntVar(5);
+        value.SetDelta(true);
+        reg[cKey1] = value;
+      }
+
+      void initializeDeltaClientAD()
+      {
+        try
+        {
+          CacheHelper.DCache.TypeRegistry.RegisterType(DeltaTestAD.Create);
+        }
+        catch (IllegalStateException)
+        {
+          //do nothng
+        }
+      }
+
+      void DoDeltaAD_C1_1()
+      {
+        DeltaTestAD val = new DeltaTestAD();
+        IRegion<object, object> reg = CacheHelper.GetRegion<object, object>("DistRegionAck");
+        reg.GetSubscriptionService().RegisterAllKeys();
+        Util.Log("clientAD1 put");
+        reg[1] = val;
+        Util.Log("clientAD1 put done");
+      }
+
+      void DoDeltaAD_C2_1()
+      {
+        IRegion<object, object> reg = CacheHelper.GetRegion<object, object>("DistRegionAck");
+
+        Util.Log("clientAD2 get");
+        DeltaTestAD val = (DeltaTestAD)reg[1];
+
+        Assert.AreEqual(2, val.DeltaUpdate);
+        Util.Log("clientAD2 get done");
+        reg[1] = val;
+        Util.Log("clientAD2 put done");
+
+        javaobject.PdxDelta pd = new javaobject.PdxDelta(1001);
+        for (int i = 0; i < 10; i++)
+        {
+          reg["pdxdelta"] = pd;
+        }
+      }
+
+      void DoDeltaAD_C1_afterC2Put()
+      {
+        Thread.Sleep(15000);
+        DeltaTestAD val = null;
+        IRegion<object, object> reg = CacheHelper.GetRegion<object, object>("DistRegionAck");
+        Util.Log("client fetching entry from local cache");
+        val = (DeltaTestAD)reg.GetEntry(1).Value;
+        Assert.IsNotNull(val);
+        Assert.AreEqual(3, val.DeltaUpdate);
+        Util.Log("done");
+
+        System.Threading.Thread.Sleep(5000);
+        //Assert.Greater(javaobject.PdxDelta.GotDelta, 7, "this should have recieve delta");
+        javaobject.PdxDelta pd = (javaobject.PdxDelta)(reg.GetLocalView()["pdxdelta"]);
+        Assert.Greater(pd.Delta, 7, "this should have recieve delta");
+      }
+
+      void runDeltaWithAppdomian(bool cloningenable)
+      {
+        CacheHelper.SetupJavaServers(true, "cacheserver_with_deltaAD.xml");
+        CacheHelper.StartJavaLocator(1, "GFELOC1");
+        CacheHelper.StartJavaServerWithLocators(1, "GFECS5", 1);
+        string regionName = "DistRegionAck";
+        // if (usePools)
+        {
+          //CacheHelper.CreateTCRegion_Pool_AD("DistRegionAck", false, false, null, null, CacheHelper.Locators, "__TEST_POOL1__", false, false, false);
+          m_client1.Call(CacheHelper.CreateTCRegion_Pool_AD1, regionName, false, true, CacheHelper.Locators, (string)"__TEST_POOL1__", true, cloningenable);
+          m_client2.Call(CacheHelper.CreateTCRegion_Pool_AD1, regionName, false, true, CacheHelper.Locators, (string)"__TEST_POOL1__", false, cloningenable);
+
+          // m_client1.Call(createPool, "__TEST_POOL1__", CacheHelper.Locators, (string)null, 0, false);
+          // m_client1.Call(createRegionAndAttachPool, "DistRegionAck", "__TEST_POOL1__");
+        }
+
+
+        m_client1.Call(initializeDeltaClientAD);
+        m_client2.Call(initializeDeltaClientAD);
+
+        m_client1.Call(DoDeltaAD_C1_1);
+        m_client2.Call(DoDeltaAD_C2_1);
+        m_client1.Call(DoDeltaAD_C1_afterC2Put);
+        m_client1.Call(Close);
+        m_client2.Call(Close);
+
+        CacheHelper.StopJavaServer(1);
+        CacheHelper.StopJavaLocator(1);
+        CacheHelper.ClearEndpoints();
+        CacheHelper.ClearLocators();
+      }
+
+      void registerClassCl2()
+      {
+        try
+        {
+          CacheHelper.DCache.TypeRegistry.RegisterType(DeltaEx.create);
+        }
+        catch (IllegalStateException)
+        {
+          //do nothing
+        }
+        IRegion<object, object> reg = CacheHelper.GetRegion<object, object>("DistRegionAck");
+
+        reg.GetSubscriptionService().RegisterRegex(".*");
+        AttributesMutator<object, object> attrMutator = reg.AttributesMutator;
+        attrMutator.SetCacheListener(new SimpleCacheListener<object, object>());
+      }
+
+      void registerClassDeltaTestImpl()
+      {
+        try
+        {
+          CacheHelper.DCache.TypeRegistry.RegisterType(DeltaTestImpl.CreateDeserializable);
+        }
+        catch (IllegalStateException)
+        {
+          // ARB: ignore exception caused by type reregistration.
+        }
+        DeltaTestImpl.ResetDataCount();
+
+        Thread.Sleep(2000);
+        IRegion<object, object> reg = CacheHelper.GetRegion<object, object>("DistRegionAck");
+        try
+        {
+          reg.GetSubscriptionService().RegisterRegex(".*");
+        }
+        catch (Exception)
+        {
+          // ARB: ignore regex exception for missing notification channel.
+        }
+      }
+
+      void registerCq()
+      {
+        Pool thePool = CacheHelper.DCache.GetPoolManager().Find("__TEST_POOL1__");
+        QueryService cqService = null;
+        cqService = thePool.GetQueryService();
+        CqAttributesFactory<object, DeltaTestImpl> attrFac = new CqAttributesFactory<object, DeltaTestImpl>();
+        myCqListener = new CqDeltaListener<object, DeltaTestImpl>();
+        attrFac.AddCqListener(myCqListener);
+        CqAttributes<object, DeltaTestImpl> cqAttr = attrFac.Create();
+        CqQuery<object, DeltaTestImpl> theQuery = cqService.NewCq("select * from /DistRegionAck d where d.intVar > 4", cqAttr, false);
+        theQuery.Execute();
+      }
+
+      void VerifyDeltaCount()
+      {
+        Thread.Sleep(1000);
+        Util.Log("Total Data count" + DeltaEx.FromDataCount);
+        Util.Log("Total Data count" + DeltaEx.FromDeltaCount);
+        if (DeltaEx.FromDataCount != 3)
+          Assert.Fail("Count of fromData called should be 3 ");
+        if (DeltaEx.FromDeltaCount != 2)
+          Assert.Fail("Count of fromDelta called should be 2 ");
+        if (SimpleCacheListener<object, object>.isSuccess == false)
+          Assert.Fail("Listener failure");
+        SimpleCacheListener<object, object>.isSuccess = false;
+        if (DeltaEx.CloneCount != 2)
+          Assert.Fail("Clone count should be 2, is " + DeltaEx.CloneCount);
+
+        DeltaEx.FromDataCount = 0;
+        DeltaEx.FromDeltaCount = 0;
+        DeltaEx.CloneCount = 0;
+      }
+
+      void VerifyCloning()
+      {
+        Thread.Sleep(1000);
+        string cKey = m_keys[0];
+        IRegion<object, object> reg = CacheHelper.GetRegion<object, object>("DistRegionAck");
+        DeltaTestImpl val = reg[cKey] as DeltaTestImpl;
+
+        if (val.GetIntVar() != 2)
+          Assert.Fail("Int value after cloning should be 2, is " + val.GetIntVar());
+        if (DeltaTestImpl.GetFromDataCount() != 2)
+          Assert.Fail("After cloning, fromDataCount should have been 2, is " + DeltaTestImpl.GetFromDataCount());
+        if (DeltaTestImpl.GetToDataCount() != 1)
+          Assert.Fail("After cloning, toDataCount should have been 1, is " + DeltaTestImpl.GetToDataCount());
+
+        System.Threading.Thread.Sleep(5000);
+        //Assert.Greater(javaobject.PdxDelta.GotDelta, 7, "this should have recieve delta");
+        javaobject.PdxDelta pd = (javaobject.PdxDelta)(reg.GetLocalView()["pdxdelta"]);
+        Assert.Greater(pd.Delta, 7, "this should have recieve delta");
+      }
+
+      void VerifyDeltaCountLRU()
+      {
+        Thread.Sleep(1000);
+        if (DeltaEx.FromDataCount != 8)
+        {
+          Util.Log("DeltaEx.FromDataCount = " + DeltaEx.FromDataCount);
+          Util.Log("DeltaEx.FromDeltaCount = " + DeltaEx.FromDeltaCount);
+          Assert.Fail("Count should have been 8. 6 for common put and two when pulled from database and deserialized");
+        }
+        if (DeltaEx.FromDeltaCount != 1)
+        {
+          Util.Log("DeltaEx.FromDeltaCount = " + DeltaEx.FromDeltaCount);
+          Assert.Fail("Count should have been 1");
+        }
+        DeltaEx.FromDataCount = 0;
+        DeltaEx.FromDeltaCount = 0;
+      }
+
+      void VerifyCqDeltaCount()
+      {
+        // Wait for Cq event processing in listener
+        Thread.Sleep(1000);
+        if (myCqListener.GetDeltaCount() != 1)
+        {
+          Assert.Fail("Delta from CQ event does not have expected value");
+        }
+        if (myCqListener.GetValueCount() != 1)
+        {
+          Assert.Fail("Value from CQ event is incorrect");
+        }
+      }
+      void VerifyExpirationDeltaCount()
+      {
+        Thread.Sleep(1000);
+        if (DeltaEx.FromDataCount != 2)
+          Assert.Fail("Count should have been 2.");
+        if (DeltaEx.FromDeltaCount != 0)
+          Assert.Fail("Count should have been 0.");
+        DeltaEx.FromDataCount = 0;
+        DeltaEx.FromDeltaCount = 0;
+      }
+
+      void runNotificationWithDelta()
+      {
+        CacheHelper.SetupJavaServers(true, "cacheserver_with_delta.xml");
+        CacheHelper.StartJavaLocator(1, "GFELOC1");
+        CacheHelper.StartJavaServerWithLocators(1, "GFECS5", 1);
+
+        m_client1.Call(createPool, "__TEST_POOL1__", CacheHelper.Locators, (string)null, 0, true);
+        m_client1.Call(createRegionAndAttachPool, "DistRegionAck", "__TEST_POOL1__", true);
+
+        m_client2.Call(createPool, "__TEST_POOL1__", CacheHelper.Locators, (string)null, 0, true);
+        m_client2.Call(createRegionAndAttachPool, "DistRegionAck", "__TEST_POOL1__", true);
+
+        m_client2.Call(registerClassCl2);
+
+        m_client1.Call(DoNotificationWithDelta);
+        m_client2.Call(VerifyDeltaCount);
+        m_client1.Call(Close);
+        m_client2.Call(Close);
+
+        CacheHelper.StopJavaServer(1);
+        CacheHelper.StopJavaLocator(1);
+        CacheHelper.ClearEndpoints();
+        CacheHelper.ClearLocators();
+      }
+
+      void runNotificationWithDefaultCloning()
+      {
+        CacheHelper.SetupJavaServers(true, "cacheserver_with_delta_test_impl.xml");
+        CacheHelper.StartJavaLocator(1, "GFELOC1");
+        CacheHelper.StartJavaServerWithLocators(1, "GFECS5", 1);
+
+        m_client1.Call(createPool, "__TEST_POOL1__", CacheHelper.Locators, (string)null, 0, true);
+        m_client1.Call(createRegionAndAttachPool, "DistRegionAck", "__TEST_POOL1__", true);
+
+        m_client2.Call(createPool, "__TEST_POOL1__", CacheHelper.Locators, (string)null, 0, true);
+        m_client2.Call(createRegionAndAttachPool, "DistRegionAck", "__TEST_POOL1__", true);
+
+        m_client1.Call(registerClassDeltaTestImpl);
+        m_client2.Call(registerClassDeltaTestImpl);
+
+        m_client1.Call(DoNotificationWithDefaultCloning);
+        m_client2.Call(VerifyCloning);
+        m_client1.Call(Close);
+        m_client2.Call(Close);
+
+        CacheHelper.StopJavaServer(1);
+        CacheHelper.StopJavaLocator(1);
+        CacheHelper.ClearEndpoints();
+        CacheHelper.ClearLocators();
+      }
+
+      void runNotificationWithDeltaWithOverFlow()
+      {
+        CacheHelper.SetupJavaServers(true, "cacheserver_with_delta.xml");
+        CacheHelper.StartJavaLocator(1, "GFELOC1");
+        CacheHelper.StartJavaServerWithLocators(1, "GFECS1", 1);
+
+        m_client1.Call(createPool, "__TEST_POOL1__", CacheHelper.Locators, (string)null, 0, true);
+        m_client1.Call(createLRURegionAndAttachPool, "DistRegionAck", "__TEST_POOL1__");
+
+        m_client2.Call(createPool, "__TEST_POOL1__", CacheHelper.Locators, (string)null, 0, true);
+        m_client2.Call(createLRURegionAndAttachPool, "DistRegionAck", "__TEST_POOL1__");
+
+        m_client2.Call(registerClassCl2);
+
+        m_client1.Call(DoNotificationWithDeltaLRU);
+        m_client2.Call(VerifyDeltaCountLRU);
+        m_client1.Call(Close);
+        m_client2.Call(Close);
+        CacheHelper.StopJavaServer(1);
+        CacheHelper.StopJavaLocator(1);
+        CacheHelper.ClearEndpoints();
+        CacheHelper.ClearLocators();
+      }
+
+      //#region Tests
+      
+      [Test]
+      public void PutWithDeltaADWithCloning()
+      {
+        runDeltaWithAppdomian(true);
+      }
+
+      [Test]
+      public void NotificationWithDelta()
+      {
+        runNotificationWithDelta();
+      }
+
+      [Test]
+      public void NotificationWithDefaultCloning()
+      {
+        runNotificationWithDefaultCloning();
+      }
+
+      [Test]
+      public void NotificationWithDeltaWithOverFlow()
+      {
+        runNotificationWithDeltaWithOverFlow();
+      }
+
+      //#endregion
+    }
+  }
+}
+
diff --git a/clicache/integration-test/ThinClientHARegionTestsN.cs b/clicache/integration-test/ThinClientHARegionTestsN.cs
index 2751e8c..5192349 100644
--- a/clicache/integration-test/ThinClientHARegionTestsN.cs
+++ b/clicache/integration-test/ThinClientHARegionTestsN.cs
@@ -641,8 +641,8 @@ namespace Apache.Geode.Client.UnitTests
 
       try
       {
-        CacheHelper.DCache.TypeRegistry.RegisterTypeGeneric(Portfolio.CreateDeserializable);
-        CacheHelper.DCache.TypeRegistry.RegisterTypeGeneric(Position.CreateDeserializable);
+        CacheHelper.DCache.TypeRegistry.RegisterType(Portfolio.CreateDeserializable);
+        CacheHelper.DCache.TypeRegistry.RegisterType(Position.CreateDeserializable);
       }
       catch (IllegalStateException)
       {
diff --git a/clicache/integration-test/ThinClientPdxLocalTests.cs b/clicache/integration-test/ThinClientPdxLocalTests.cs
index bd1879f..f675155 100644
--- a/clicache/integration-test/ThinClientPdxLocalTests.cs
+++ b/clicache/integration-test/ThinClientPdxLocalTests.cs
@@ -98,7 +98,7 @@ namespace Apache.Geode.Client.UnitTests
     {
       try
       {
-        CacheHelper.DCache.TypeRegistry.RegisterTypeGeneric(PdxInsideIGeodeSerializable.CreateDeserializable);
+        CacheHelper.DCache.TypeRegistry.RegisterType(PdxInsideIGeodeSerializable.CreateDeserializable);
         CacheHelper.DCache.TypeRegistry.RegisterPdxType(NestedPdx.CreateDeserializable);
         CacheHelper.DCache.TypeRegistry.RegisterPdxType(PdxTypes1.CreateDeserializable);
         CacheHelper.DCache.TypeRegistry.RegisterPdxType(PdxTypes2.CreateDeserializable);
diff --git a/clicache/integration-test/ThinClientPdxTests1.cs b/clicache/integration-test/ThinClientPdxTests1.cs
index cbbbabb..9f95028 100755
--- a/clicache/integration-test/ThinClientPdxTests1.cs
+++ b/clicache/integration-test/ThinClientPdxTests1.cs
@@ -530,7 +530,7 @@ namespace Apache.Geode.Client.UnitTests
     {
       try
       {
-        CacheHelper.DCache.TypeRegistry.RegisterTypeGeneric(PdxInsideIGeodeSerializable.CreateDeserializable);
+        CacheHelper.DCache.TypeRegistry.RegisterType(PdxInsideIGeodeSerializable.CreateDeserializable);
         CacheHelper.DCache.TypeRegistry.RegisterPdxType(NestedPdx.CreateDeserializable);
         CacheHelper.DCache.TypeRegistry.RegisterPdxType(PdxTypes1.CreateDeserializable);
         CacheHelper.DCache.TypeRegistry.RegisterPdxType(PdxTypes2.CreateDeserializable);
@@ -558,7 +558,7 @@ namespace Apache.Geode.Client.UnitTests
     {
       try
       {
-        CacheHelper.DCache.TypeRegistry.RegisterTypeGeneric(PdxInsideIGeodeSerializable.CreateDeserializable);
+        CacheHelper.DCache.TypeRegistry.RegisterType(PdxInsideIGeodeSerializable.CreateDeserializable);
         CacheHelper.DCache.TypeRegistry.RegisterPdxType(NestedPdx.CreateDeserializable);
         CacheHelper.DCache.TypeRegistry.RegisterPdxType(PdxTypes1.CreateDeserializable);
         CacheHelper.DCache.TypeRegistry.RegisterPdxType(PdxTypes2.CreateDeserializable);
@@ -769,7 +769,7 @@ namespace Apache.Geode.Client.UnitTests
     {
       try
       {
-        CacheHelper.DCache.TypeRegistry.RegisterTypeGeneric(PdxInsideIGeodeSerializable.CreateDeserializable);
+        CacheHelper.DCache.TypeRegistry.RegisterType(PdxInsideIGeodeSerializable.CreateDeserializable);
         CacheHelper.DCache.TypeRegistry.RegisterPdxType(NestedPdx.CreateDeserializable);
         CacheHelper.DCache.TypeRegistry.RegisterPdxType(PdxTypes1.CreateDeserializable);
         CacheHelper.DCache.TypeRegistry.RegisterPdxType(PdxTypes2.CreateDeserializable);
@@ -2240,7 +2240,7 @@ namespace javaobject
 
   #region Pdx Delta class
 
-  public class PdxDelta : IPdxSerializable, IGeodeDelta, ICloneable
+  public class PdxDelta : IPdxSerializable, IDelta, ICloneable
   {
     public static int GotDelta = 0;
     private int _delta = 0;
@@ -2276,7 +2276,7 @@ namespace javaobject
       get { return _delta; }
     }
 
-    #region IGeodeDelta Members
+    #region IDelta Members
 
     public void FromDelta(DataInput input)
     {
diff --git a/clicache/integration-test/ThinClientQueryTestsN.cs b/clicache/integration-test/ThinClientQueryTestsN.cs
index dff5311..d5fa0a8 100644
--- a/clicache/integration-test/ThinClientQueryTestsN.cs
+++ b/clicache/integration-test/ThinClientQueryTestsN.cs
@@ -80,8 +80,8 @@ namespace Apache.Geode.Client.UnitTests
     public void InitClient()
     {
       CacheHelper.Init();
-      CacheHelper.DCache.TypeRegistry.RegisterTypeGeneric(Portfolio.CreateDeserializable);
-      CacheHelper.DCache.TypeRegistry.RegisterTypeGeneric(Position.CreateDeserializable);
+      CacheHelper.DCache.TypeRegistry.RegisterType(Portfolio.CreateDeserializable);
+      CacheHelper.DCache.TypeRegistry.RegisterType(Position.CreateDeserializable);
       CacheHelper.DCache.TypeRegistry.RegisterPdxType(PortfolioPdx.CreateDeserializable);
       CacheHelper.DCache.TypeRegistry.RegisterPdxType(PositionPdx.CreateDeserializable);
     }
@@ -1444,9 +1444,9 @@ namespace Apache.Geode.Client.UnitTests
     //  if (map1.Count != map2.Count)
     //    Assert.Fail("Number of Keys dont match");
     //  if (map1.Count == 0) return;
-    //  foreach (KeyValuePair<ICacheableKey, IGeodeSerializable> entry in map1)
+    //  foreach (KeyValuePair<ICacheableKey, ISerializable> entry in map1)
     //  {
-    //    IGeodeSerializable value;
+    //    ISerializable value;
     //    if (!(map2.TryGetValue(entry.Key,out value)))
     //    {
     //      Assert.Fail("Key was not found");
diff --git a/clicache/integration-test/ThinClientRegionQueryTests.cs b/clicache/integration-test/ThinClientRegionQueryTests.cs
index e64d26e..6b47752 100644
--- a/clicache/integration-test/ThinClientRegionQueryTests.cs
+++ b/clicache/integration-test/ThinClientRegionQueryTests.cs
@@ -79,8 +79,8 @@ namespace Apache.Geode.Client.UnitTests
     public void InitClient()
     {
       CacheHelper.Init();
-      CacheHelper.DCache.TypeRegistry.RegisterTypeGeneric(Portfolio.CreateDeserializable);
-      CacheHelper.DCache.TypeRegistry.RegisterTypeGeneric(Position.CreateDeserializable);
+      CacheHelper.DCache.TypeRegistry.RegisterType(Portfolio.CreateDeserializable);
+      CacheHelper.DCache.TypeRegistry.RegisterType(Position.CreateDeserializable);
       CacheHelper.DCache.TypeRegistry.RegisterPdxType(PortfolioPdx.CreateDeserializable);
       CacheHelper.DCache.TypeRegistry.RegisterPdxType(PositionPdx.CreateDeserializable);
     }
diff --git a/clicache/integration-test/ThinClientRegionTestsN.cs b/clicache/integration-test/ThinClientRegionTestsN.cs
index 98fad50..3eae18f 100644
--- a/clicache/integration-test/ThinClientRegionTestsN.cs
+++ b/clicache/integration-test/ThinClientRegionTestsN.cs
@@ -253,7 +253,7 @@ namespace Apache.Geode.Client.UnitTests
       output.WriteInt32(m_accountid);
     }
 
-    public UInt32 ClassId
+    public Int32 ClassId
     {
       get
       {
@@ -272,7 +272,7 @@ namespace Apache.Geode.Client.UnitTests
       }
     }
 
-    public static IGeodeSerializable CreateDeserializable()
+    public static ISerializable CreateDeserializable()
     {
       return new TradeKey();
     }
@@ -375,7 +375,7 @@ namespace Apache.Geode.Client.UnitTests
     {
       try
       {
-        CacheHelper.DCache.TypeRegistry.RegisterTypeGeneric(OtherType.CreateDeserializable);
+        CacheHelper.DCache.TypeRegistry.RegisterType(OtherType.CreateDeserializable);
       }
       catch (IllegalStateException)
       {
@@ -867,7 +867,7 @@ namespace Apache.Geode.Client.UnitTests
     //  else {
     //    region0 = CacheHelper.CreateTCRegion(RegionNames[0], true, true, null, endpoints, true); //caching enable true
     //  }
-    //  Dictionary<ICacheableKey, IGeodeSerializable> values = new Dictionary<ICacheableKey, IGeodeSerializable>();
+    //  Dictionary<ICacheableKey, ISerializable> values = new Dictionary<ICacheableKey, ISerializable>();
     //  Dictionary<ICacheableKey, Exception> exceptions = new Dictionary<ICacheableKey, Exception>();
     //  resultKeys.Clear();
     //  try {
diff --git a/clicache/integration-test/ThinClientRemoteParamQueryResultSetTests.cs b/clicache/integration-test/ThinClientRemoteParamQueryResultSetTests.cs
index 0e1e2e9..4b1c860 100644
--- a/clicache/integration-test/ThinClientRemoteParamQueryResultSetTests.cs
+++ b/clicache/integration-test/ThinClientRemoteParamQueryResultSetTests.cs
@@ -79,8 +79,8 @@ namespace Apache.Geode.Client.UnitTests
     public void InitClient()
     {
       CacheHelper.Init();
-      CacheHelper.DCache.TypeRegistry.RegisterTypeGeneric(Portfolio.CreateDeserializable);
-      CacheHelper.DCache.TypeRegistry.RegisterTypeGeneric(Position.CreateDeserializable);
+      CacheHelper.DCache.TypeRegistry.RegisterType(Portfolio.CreateDeserializable);
+      CacheHelper.DCache.TypeRegistry.RegisterType(Position.CreateDeserializable);
       CacheHelper.DCache.TypeRegistry.RegisterPdxType(PortfolioPdx.CreateDeserializable);
       CacheHelper.DCache.TypeRegistry.RegisterPdxType(PositionPdx.CreateDeserializable);
     }
diff --git a/clicache/integration-test/ThinClientRemoteParamQueryStructSetTests.cs b/clicache/integration-test/ThinClientRemoteParamQueryStructSetTests.cs
index 4618d91..8435777 100644
--- a/clicache/integration-test/ThinClientRemoteParamQueryStructSetTests.cs
+++ b/clicache/integration-test/ThinClientRemoteParamQueryStructSetTests.cs
@@ -79,8 +79,8 @@ namespace Apache.Geode.Client.UnitTests
     public void InitClient()
     {
       CacheHelper.Init();
-      CacheHelper.DCache.TypeRegistry.RegisterTypeGeneric(Portfolio.CreateDeserializable);
-      CacheHelper.DCache.TypeRegistry.RegisterTypeGeneric(Position.CreateDeserializable);
+      CacheHelper.DCache.TypeRegistry.RegisterType(Portfolio.CreateDeserializable);
+      CacheHelper.DCache.TypeRegistry.RegisterType(Position.CreateDeserializable);
       CacheHelper.DCache.TypeRegistry.RegisterPdxType(PortfolioPdx.CreateDeserializable);
       CacheHelper.DCache.TypeRegistry.RegisterPdxType(PositionPdx.CreateDeserializable);
     }
diff --git a/clicache/integration-test/ThinClientRemoteQueryExclusivenessTests.cs b/clicache/integration-test/ThinClientRemoteQueryExclusivenessTests.cs
index 6476da2..2add876 100644
--- a/clicache/integration-test/ThinClientRemoteQueryExclusivenessTests.cs
+++ b/clicache/integration-test/ThinClientRemoteQueryExclusivenessTests.cs
@@ -78,8 +78,8 @@ namespace Apache.Geode.Client.UnitTests
     public void InitClient()
     {
       CacheHelper.Init();
-      CacheHelper.DCache.TypeRegistry.RegisterTypeGeneric(Portfolio.CreateDeserializable);
-      CacheHelper.DCache.TypeRegistry.RegisterTypeGeneric(Position.CreateDeserializable);
+      CacheHelper.DCache.TypeRegistry.RegisterType(Portfolio.CreateDeserializable);
+      CacheHelper.DCache.TypeRegistry.RegisterType(Position.CreateDeserializable);
       CacheHelper.DCache.TypeRegistry.RegisterPdxType(PortfolioPdx.CreateDeserializable);
       CacheHelper.DCache.TypeRegistry.RegisterPdxType(PositionPdx.CreateDeserializable);
     }
diff --git a/clicache/integration-test/ThinClientRemoteQueryFailoverTests.cs b/clicache/integration-test/ThinClientRemoteQueryFailoverTests.cs
index a40b069..2ae797e2 100644
--- a/clicache/integration-test/ThinClientRemoteQueryFailoverTests.cs
+++ b/clicache/integration-test/ThinClientRemoteQueryFailoverTests.cs
@@ -79,8 +79,8 @@ namespace Apache.Geode.Client.UnitTests
     public void InitClient()
     {
       CacheHelper.Init();
-      CacheHelper.DCache.TypeRegistry.RegisterTypeGeneric(Portfolio.CreateDeserializable);
-      CacheHelper.DCache.TypeRegistry.RegisterTypeGeneric(Position.CreateDeserializable);
+      CacheHelper.DCache.TypeRegistry.RegisterType(Portfolio.CreateDeserializable);
+      CacheHelper.DCache.TypeRegistry.RegisterType(Position.CreateDeserializable);
       CacheHelper.DCache.TypeRegistry.RegisterPdxType(PortfolioPdx.CreateDeserializable);
       CacheHelper.DCache.TypeRegistry.RegisterPdxType(PositionPdx.CreateDeserializable);
     }
diff --git a/clicache/integration-test/ThinClientRemoteQueryResultSetTests.cs b/clicache/integration-test/ThinClientRemoteQueryResultSetTests.cs
index dd65966..d87cabb 100644
--- a/clicache/integration-test/ThinClientRemoteQueryResultSetTests.cs
+++ b/clicache/integration-test/ThinClientRemoteQueryResultSetTests.cs
@@ -80,8 +80,8 @@ namespace Apache.Geode.Client.UnitTests
     public void InitClient()
     {
       CacheHelper.Init();
-      CacheHelper.DCache.TypeRegistry.RegisterTypeGeneric(Portfolio.CreateDeserializable);
-      CacheHelper.DCache.TypeRegistry.RegisterTypeGeneric(Position.CreateDeserializable);
+      CacheHelper.DCache.TypeRegistry.RegisterType(Portfolio.CreateDeserializable);
+      CacheHelper.DCache.TypeRegistry.RegisterType(Position.CreateDeserializable);
       CacheHelper.DCache.TypeRegistry.RegisterPdxType(PortfolioPdx.CreateDeserializable);
       CacheHelper.DCache.TypeRegistry.RegisterPdxType(PositionPdx.CreateDeserializable);
     }
diff --git a/clicache/integration-test/ThinClientRemoteQueryStructSetTests.cs b/clicache/integration-test/ThinClientRemoteQueryStructSetTests.cs
index cc4237a..61a5d8d 100644
--- a/clicache/integration-test/ThinClientRemoteQueryStructSetTests.cs
+++ b/clicache/integration-test/ThinClientRemoteQueryStructSetTests.cs
@@ -80,8 +80,8 @@ namespace Apache.Geode.Client.UnitTests
     public void InitClient()
     {
       CacheHelper.Init();
-      CacheHelper.DCache.TypeRegistry.RegisterTypeGeneric(Portfolio.CreateDeserializable);
-      CacheHelper.DCache.TypeRegistry.RegisterTypeGeneric(Position.CreateDeserializable);
+      CacheHelper.DCache.TypeRegistry.RegisterType(Portfolio.CreateDeserializable);
+      CacheHelper.DCache.TypeRegistry.RegisterType(Position.CreateDeserializable);
       CacheHelper.DCache.TypeRegistry.RegisterPdxType(Apache.Geode.Client.Tests.PortfolioPdx.CreateDeserializable);
       CacheHelper.DCache.TypeRegistry.RegisterPdxType(Apache.Geode.Client.Tests.PositionPdx.CreateDeserializable);
     }
diff --git a/clicache/integration-test/ThinClientSecurityAuthSetAuthInitializeTests.cs b/clicache/integration-test/ThinClientSecurityAuthSetAuthInitializeTests.cs
index 8bfc668..ebabd89 100644
--- a/clicache/integration-test/ThinClientSecurityAuthSetAuthInitializeTests.cs
+++ b/clicache/integration-test/ThinClientSecurityAuthSetAuthInitializeTests.cs
@@ -34,7 +34,6 @@ namespace Apache.Geode.Client.UnitTests
 	{
 		#region Private members
 
-		private UnitProcess m_client1;
 		private const string CacheXml1 = "cacheserver_notify_subscription.xml";
 
 		private UsernamePasswordAuthInitialize authInitialize = new UsernamePasswordAuthInitialize();
@@ -43,15 +42,14 @@ namespace Apache.Geode.Client.UnitTests
 
 		protected override ClientBase[] GetClients()
 		{
-			m_client1 = new UnitProcess();
-			return new ClientBase[] { m_client1 };
+			return new ClientBase[] {  };
 		}
 
 		[TearDown]
 		public override void EndTest()
 		{
 			try {
-				m_client1.Call(CacheHelper.Close);
+				CacheHelper.Close();
 				CacheHelper.ClearEndpoints();
 				CacheHelper.ClearLocators();
 			} finally {
@@ -100,17 +98,17 @@ namespace Apache.Geode.Client.UnitTests
 			Util.Log("Cacheserver 1 started.");
 
 
-      m_client1.Call(AssertAuthInitializeCalled, false);
-      m_client1.Call(CreateClient, RegionName, CacheHelper.Locators);
+      AssertAuthInitializeCalled(false);
+      CreateClient(RegionName, CacheHelper.Locators);
 
 			// Perform some put operations from client1
-			m_client1.Call(DoPuts, 4);
-			m_client1.Call(AssertAuthInitializeCalled, true);
+			DoPuts(4);
+			AssertAuthInitializeCalled(true);
 
 			// Verify that the puts succeeded
-			m_client1.Call(DoGets, 4);
+			DoGets(4);
 
-			m_client1.Call(Close);
+			Close();
 
 			CacheHelper.StopJavaServer(1);
 
diff --git a/clicache/integration-test/ThinClientSecurityAuthzTestsMUN.cs b/clicache/integration-test/ThinClientSecurityAuthzTestsMUN.cs
index de6a1e4..0dc2863 100644
--- a/clicache/integration-test/ThinClientSecurityAuthzTestsMUN.cs
+++ b/clicache/integration-test/ThinClientSecurityAuthzTestsMUN.cs
@@ -238,8 +238,8 @@ namespace Apache.Geode.Client.UnitTests
 
       try
       {
-        CacheHelper.DCache.TypeRegistry.RegisterTypeGeneric(Portfolio.CreateDeserializable);
-        CacheHelper.DCache.TypeRegistry.RegisterTypeGeneric(Position.CreateDeserializable);
+        CacheHelper.DCache.TypeRegistry.RegisterType(Portfolio.CreateDeserializable);
+        CacheHelper.DCache.TypeRegistry.RegisterType(Position.CreateDeserializable);
         Util.Log("registerCQ portfolio registered");
       }
       catch (IllegalStateException)
@@ -267,8 +267,8 @@ namespace Apache.Geode.Client.UnitTests
 
       try
       {
-        CacheHelper.DCache.TypeRegistry.RegisterTypeGeneric(Portfolio.CreateDeserializable);
-        CacheHelper.DCache.TypeRegistry.RegisterTypeGeneric(Position.CreateDeserializable);
+        CacheHelper.DCache.TypeRegistry.RegisterType(Portfolio.CreateDeserializable);
+        CacheHelper.DCache.TypeRegistry.RegisterType(Position.CreateDeserializable);
         Util.Log("doCQPut portfolio registered");
       }
       catch (IllegalStateException)
diff --git a/clicache/integration-test/ThinClientStringArrayTestsN.cs b/clicache/integration-test/ThinClientStringArrayTestsN.cs
index da45644..f4251ea 100644
--- a/clicache/integration-test/ThinClientStringArrayTestsN.cs
+++ b/clicache/integration-test/ThinClientStringArrayTestsN.cs
@@ -72,8 +72,8 @@ namespace Apache.Geode.Client.UnitTests
       CacheHelper.Init();
       try
       {
-        CacheHelper.DCache.TypeRegistry.RegisterTypeGeneric(Portfolio.CreateDeserializable);
-        CacheHelper.DCache.TypeRegistry.RegisterTypeGeneric(Position.CreateDeserializable);
+        CacheHelper.DCache.TypeRegistry.RegisterType(Portfolio.CreateDeserializable);
+        CacheHelper.DCache.TypeRegistry.RegisterType(Position.CreateDeserializable);
       }
       catch (IllegalStateException)
       {
diff --git a/clicache/integration-test/UnitTests.csproj.in b/clicache/integration-test/UnitTests.csproj.in
index 1c85a39..13355ec 100644
--- a/clicache/integration-test/UnitTests.csproj.in
+++ b/clicache/integration-test/UnitTests.csproj.in
@@ -239,7 +239,8 @@
     <Compile Include="$(CMAKE_CURRENT_SOURCE_DIR)\ThinClientCqStatusTestTwoServers.cs" />
     <Compile Include="$(CMAKE_CURRENT_SOURCE_DIR)\ThinClientStringArrayTestsN.cs" />
     <Compile Include="$(CMAKE_CURRENT_SOURCE_DIR)\ThinClientCSTXN.cs" />
-    <Compile Include="$(CMAKE_CURRENT_SOURCE_DIR)\ThinClientDeltaTestN.cs" />
+    <Compile Include="$(CMAKE_CURRENT_SOURCE_DIR)\ThinClientDeltaTest.cs" />
+    <Compile Include="$(CMAKE_CURRENT_SOURCE_DIR)\ThinClientDeltaTestFailing.cs" />
     <Compile Include="$(CMAKE_SOURCE_DIR)\tests\cli\NewTestObject\DeltaTestImpl.cs">
       <Link>DeltaTestImpl.cs</Link>
     </Compile>
diff --git a/clicache/integration-test2/CMakeLists.txt b/clicache/integration-test2/CMakeLists.txt
index 1244f13..bc9058f 100644
--- a/clicache/integration-test2/CMakeLists.txt
+++ b/clicache/integration-test2/CMakeLists.txt
@@ -18,6 +18,8 @@ project( Apache.Geode.IntegrationTests2 CSharp )
 
 set(CMAKE_CSharp_FLAGS "/langversion:5")
 
+get_target_property(JAVAOBJECT_JAR_PATH javaobject JAR_FILE)
+
 configure_file(${CMAKE_CURRENT_SOURCE_DIR}/packages.config ${CMAKE_CURRENT_BINARY_DIR}/packages.config COPYONLY)
 configure_file(${CMAKE_CURRENT_SOURCE_DIR}/Config.cs.in ${CMAKE_CURRENT_BINARY_DIR}/Config.cs)
 
@@ -28,11 +30,12 @@ add_library( ${PROJECT_NAME} SHARED
     GeodeServerTests.cs
     CacheXml.cs
     CacheXmlTests.cs
-    RegionTest.cs
     cache.xml
     geode.properties
     xunit.runner.json
     packages.config
+    RegionTest.cs
+    SerializationTests.cs
 )
 
 set_source_files_properties(cache.xml xunit.runner.json geode.properties PROPERTIES
@@ -43,6 +46,7 @@ set_source_files_properties(cache.xml xunit.runner.json geode.properties PROPERT
 target_link_libraries(${PROJECT_NAME}
   PUBLIC
     Apache.Geode
+    PdxClassLibrary
 )
 
 set_target_properties( ${PROJECT_NAME} PROPERTIES
diff --git a/clicache/integration-test2/Config.cs.in b/clicache/integration-test2/Config.cs.in
index 092287e..e9dac8f 100644
--- a/clicache/integration-test2/Config.cs.in
+++ b/clicache/integration-test2/Config.cs.in
@@ -23,4 +23,10 @@ public class Config
   {
     get { return @"@Geode_gfsh_EXECUTABLE@"; }
   }
+
+  static public string JavaobjectJarPath
+  {
+    get { return @"@JAVAOBJECT_JAR_PATH@"; }
+  }
+
 }
diff --git a/clicache/integration-test2/GeodeServer.cs b/clicache/integration-test2/GeodeServer.cs
index dfcacdf..d32e32b 100644
--- a/clicache/integration-test2/GeodeServer.cs
+++ b/clicache/integration-test2/GeodeServer.cs
@@ -44,7 +44,7 @@ public class GeodeServer : IDisposable
                             " --J=-Dgemfire.jmx-manager-port=" + locatorJmxPort + " --http-service-port=0\"" +
                             " -e \"connect --locator=localhost[" + LocatorPort + "]\"" +
                             " -e \"configure pdx " + readSerializedStr + "\"" +
-                            " -e \"start server --bind-address=localhost --server-port=0 --log-level=all\"" +
+                            " -e \"start server --bind-address=localhost --server-port=0 --log-level=all --classpath=" + Config.JavaobjectJarPath + "\"" +
                             " -e \"create region --name=" + regionName + " --type=PARTITION\"" +
                             " -e \"create region --name=testRegion1 --type=PARTITION\"",
                 WindowStyle = ProcessWindowStyle.Hidden,
diff --git a/clicache/integration-test2/RegionTest.cs b/clicache/integration-test2/RegionTest.cs
index 27c13d6..120603c 100644
--- a/clicache/integration-test2/RegionTest.cs
+++ b/clicache/integration-test2/RegionTest.cs
@@ -22,47 +22,50 @@ using Xunit;
 namespace Apache.Geode.Client.IntegrationTests
 {
   [Trait("Category", "Integration")]
-  public class RegionTest : IDisposable
+  public class RegionTest
   {
-    private readonly Cache _cacheOne;
-    private readonly Cache _cacheTwo;
-    private readonly GeodeServer _geodeServer;
-
-    public RegionTest()
-    {
-      _geodeServer = new GeodeServer();
-
-      var cacheFactory = new CacheFactory();
-      _cacheOne = cacheFactory.Create();
-      _cacheTwo = cacheFactory.Create();
-    }
-
-    public void Dispose()
-    {
-      _cacheOne.Close();
-      _cacheTwo.Close();
-      _geodeServer.Dispose();
-    }
 
     [Fact]
     public void PutOnOneCacheGetOnAnotherCache()
     {
-      using (var cacheXml = new CacheXml(new FileInfo("cache.xml"), _geodeServer))
+      using (var geodeServer = new GeodeServer())
       {
-        _cacheOne.InitializeDeclarativeCache(cacheXml.File.FullName);
-        _cacheTwo.InitializeDeclarativeCache(cacheXml.File.FullName);
+        using (var cacheXml = new CacheXml(new FileInfo("cache.xml"), geodeServer))
+        {
+          var cacheFactory = new CacheFactory();
 
-        var regionForCache1 = _cacheOne.GetRegion<string, string>("testRegion1");
-        var regionForCache2 = _cacheTwo.GetRegion<string, string>("testRegion1");
+          var cacheOne = cacheFactory.Create();
+          try
+          {
+            cacheOne.InitializeDeclarativeCache(cacheXml.File.FullName);
 
-        const string key = "hello";
-        const string expectedResult = "dave";
+            var cacheTwo = cacheFactory.Create();
+            try
+            {
+              cacheTwo.InitializeDeclarativeCache(cacheXml.File.FullName);
 
-        regionForCache1.Put(key, expectedResult, null);
-        var actualResult = regionForCache2.Get(key, null);
+              var regionForCache1 = cacheOne.GetRegion<string, string>("testRegion1");
+              var regionForCache2 = cacheTwo.GetRegion<string, string>("testRegion1");
 
-        Assert.Equal(expectedResult, actualResult);
+              const string key = "hello";
+              const string expectedResult = "dave";
+              regionForCache1.Put(key, expectedResult, null);
+              var actualResult = regionForCache2.Get(key, null);
+
+              Assert.Equal(expectedResult, actualResult);
+            }
+            finally
+            {
+              cacheTwo.Close();
+            }
+          }
+          finally
+          {
+            cacheOne.Close();
+          }
+        }
       }
     }
   }
-}
\ No newline at end of file
+
+}
diff --git a/clicache/integration-test2/SerializationTests.cs b/clicache/integration-test2/SerializationTests.cs
new file mode 100644
index 0000000..59281ee
--- /dev/null
+++ b/clicache/integration-test2/SerializationTests.cs
@@ -0,0 +1,131 @@
+/*
+ * 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.
+ */
+
+using System;
+using System.IO;
+using Xunit;
+using PdxTests;
+using System.Collections;
+using System.Collections.Generic;
+
+namespace Apache.Geode.Client.IntegrationTests
+{
+
+    [Trait("Category", "Integration")]
+    public class SerializationTests : IDisposable
+    {
+        private GeodeServer GeodeServer;
+        private CacheXml CacheXml;
+        private Cache Cache;
+
+        public SerializationTests()
+        {
+            GeodeServer = new GeodeServer();
+            CacheXml = new CacheXml(new FileInfo("cache.xml"), GeodeServer);
+
+            var cacheFactory = new CacheFactory();
+            Cache = cacheFactory.Create();
+            Cache.InitializeDeclarativeCache(CacheXml.File.FullName);
+        }
+
+        public void Dispose()
+        {
+            try
+            {
+                if (null != Cache)
+                {
+                    Cache.Close();
+                }
+            }
+            finally
+            {
+                try
+                {
+                    if (null != CacheXml)
+                    {
+                        CacheXml.Dispose();
+                    }
+                }
+                finally
+                {
+                    GeodeServer.Dispose();
+                }
+            }
+        }
+
+
+        private void putAndCheck(IRegion<object, object> region, object key, object value)
+        {
+            region[key] = value;
+            Assert.Equal(value, region[key]);
+        }
+
+        [Fact]
+        public void BuiltInSerializableTypes()
+        {
+            var region = Cache.GetRegion<object, object>("testRegion");
+            Assert.NotNull(region);
+
+            putAndCheck(region, "CacheableString", "foo");
+            putAndCheck(region, "CacheableByte", (Byte)8);
+            putAndCheck(region, "CacheableInt16", (Int16)16);
+            putAndCheck(region, "CacheableInt32", (Int32)32);
+            putAndCheck(region, "CacheableInt64", (Int64)64);
+            putAndCheck(region, "CacheableBoolean", (Boolean)true);
+            putAndCheck(region, "CacheableCharacter", 'c');
+            putAndCheck(region, "CacheableDouble", (Double)1.5);
+            putAndCheck(region, "CacheableFloat", (float)2.5);
+
+            putAndCheck(region, "CacheableStringArray", new String[] { "foo", "bar" });
+            putAndCheck(region, "CacheableBytes", new Byte[] { 8, 8 });
+            putAndCheck(region, "CacheableInt16Array", new Int16[] { 16, 16 });
+            putAndCheck(region, "CacheableInt32Array", new Int32[] { 32, 32 });
+            putAndCheck(region, "CacheableInt64Array", new Int64[] { 64, 64 });
+            putAndCheck(region, "CacheableBooleanArray", new Boolean[] { true, false });
+            putAndCheck(region, "CacheableCharacterArray", new Char[] { 'c', 'a' });
+            putAndCheck(region, "CacheableDoubleArray", new Double[] { 1.5, 1.7 });
+            putAndCheck(region, "CacheableFloatArray", new float[] { 2.5F, 2.7F });
+
+            putAndCheck(region, "CacheableDate", new DateTime());
+
+            putAndCheck(region, "CacheableHashMap", new Dictionary<int, string>() { { 1, "one" }, { 2, "two" } });
+            putAndCheck(region, "CacheableHashTable", new Hashtable() { { 1, "one" }, { 2, "two" } });
+            putAndCheck(region, "CacheableVector", new ArrayList() { "one", "two" });
+            putAndCheck(region, "CacheableArrayList", new List<string>() { "one", "two" });
+            putAndCheck(region, "CacheableLinkedList", new LinkedList<object>(new string[] { "one", "two" }));
+            putAndCheck(region, "CacheableStack", new Stack<object>(new string[] { "one", "two" }));
+
+            {
+                var cacheableHashSet = new CacheableHashSet();
+                cacheableHashSet.Add("one");
+                cacheableHashSet.Add("two");
+                putAndCheck(region, "CacheableHashSet", cacheableHashSet);
+            }
+
+            {
+                var cacheableLinkedHashSet = new CacheableLinkedHashSet();
+                cacheableLinkedHashSet.Add("one");
+                cacheableLinkedHashSet.Add("two");
+                putAndCheck(region, "CacheableLinkedHashSet", cacheableLinkedHashSet);
+            }
+
+            Cache.TypeRegistry.RegisterPdxType(PdxType.CreateDeserializable);
+            putAndCheck(region, "PdxType", new PdxType());
+        }
+    }
+
+}
\ No newline at end of file
diff --git a/clicache/src/CMakeLists.txt b/clicache/src/CMakeLists.txt
index b7d1897..b510478 100644
--- a/clicache/src/CMakeLists.txt
+++ b/clicache/src/CMakeLists.txt
@@ -116,10 +116,14 @@ add_library(${PROJECT_NAME} SHARED
   ICqListener.hpp
   ICqResults.hpp
   ICqStatusListener.hpp
+  IDataSerializable.hpp
+  IDataSerializableFixedId.hpp
+  IDataSerializableInternal.hpp
+  IDataSerializablePrimitive.hpp
   IFixedPartitionResolver.hpp
   IGeodeCache.hpp
-  IGeodeDelta.hpp
-  IGeodeSerializable.hpp
+  IDelta.hpp
+  ISerializable.hpp
   IPartitionResolver.hpp
   IPdxInstance.hpp
   IPdxInstanceFactory.hpp
@@ -142,6 +146,7 @@ add_library(${PROJECT_NAME} SHARED
   LocalRegion.hpp
   Log.cpp
   Log.hpp
+  ManagedPdxTypeHandler.hpp
   native_conditional_shared_ptr.hpp
   native_conditional_unique_ptr.hpp
   native_shared_ptr.hpp
@@ -303,12 +308,13 @@ set_target_properties(${PROJECT_NAME} PROPERTIES
   VS_GLOBAL_PROJECT_TYPES "{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}"
   VS_GLOBAL_ROOTNAMESPACE ${PROJECT_NAME}
   VS_DOTNET_TARGET_FRAMEWORK_VERSION "v4.5.2"
-  VS_DOTNET_REFERENCES "System;System.Xml"
+  VS_DOTNET_REFERENCES "System;System.Xml;System.Core"
 )
 
 target_compile_options(${PROJECT_NAME}
   PRIVATE
 	/bigobj # C1128 - large number of templates causes too many section.
+	/Zm32   # C3859 - internal heap limit reached
 	#/doc # Documents to xml
 	# warnings as error
 	/we4488 # interfaces fully implemented.
diff --git a/clicache/src/CacheFactory.cpp b/clicache/src/CacheFactory.cpp
index 3353655..6e00569 100644
--- a/clicache/src/CacheFactory.cpp
+++ b/clicache/src/CacheFactory.cpp
@@ -15,6 +15,9 @@
  * limitations under the License.
  */
 
+#include "begin_native.hpp"
+#include "CacheRegionHelper.hpp"
+#include "end_native.hpp"
 
 #include "ExceptionTypes.hpp"
 #include "CacheFactory.hpp"
@@ -26,6 +29,7 @@
 #include "impl/AppDomainContext.hpp"
 #include "impl/CacheResolver.hpp"
 #include "impl/ManagedAuthInitialize.hpp"
+#include "ManagedPdxTypeHandler.hpp"
 
 using namespace System;
 
@@ -66,14 +70,12 @@ namespace Apache
 
           Log::SetLogLevel(static_cast<LogLevel>(native::Log::logLevel( )));
           native::createAppDomainContext = &Apache::Geode::Client::createAppDomainContext;
-          cache->TypeRegistry->RegisterTypeGeneric(
-            native::GeodeTypeIds::PdxType,
-            gcnew TypeFactoryMethodGeneric(Apache::Geode::Client::Internal::PdxType::CreateDeserializable),
-            nullptr);
+
 
           DistributedSystem::ManagedPostConnect(cache);
           DistributedSystem::registerCliCallback();
-          Serializable::RegisterPDXManagedCacheableKey(cache);
+          auto&& cacheImpl = CacheRegionHelper::getCacheImpl(nativeCache.get());
+          cacheImpl->getSerializationRegistry()->setPdxTypeHandler(new ManagedPdxTypeHandler());
 
           return cache;
         _GF_MG_EXCEPTION_CATCH_ALL2
diff --git a/clicache/src/CacheableArrayList.hpp b/clicache/src/CacheableArrayList.hpp
index 4d0cf84..cac5971 100644
--- a/clicache/src/CacheableArrayList.hpp
+++ b/clicache/src/CacheableArrayList.hpp
@@ -33,7 +33,7 @@ namespace Apache
     {
 
       /// <summary>
-      /// A mutable <c>IGeodeSerializable</c> vector wrapper that can serve as
+      /// A mutable <c>ISerializable</c> vector wrapper that can serve as
       /// a distributable object for caching. This class extends .NET generic
       /// <c>List</c> class.
       /// </summary>
@@ -66,7 +66,7 @@ namespace Apache
         }
 
 
-        // Region: IGeodeSerializable Members
+        // Region: ISerializable Members
 
         /// <summary>
         /// Returns the classId of the instance being serialized.
@@ -74,20 +74,20 @@ namespace Apache
         /// type to create and deserialize into.
         /// </summary>
         /// <returns>the classId</returns>
-        virtual property System::UInt32 ClassId
+        property int8_t DsCode
         {
-          virtual System::UInt32 get() override
+          int8_t get() override
           {
-            return GeodeClassIds::CacheableArrayList;
+            return native::GeodeTypeIds::CacheableArrayList;
           }
         }
 
-        // End Region: IGeodeSerializable Members
+        // End Region: ISerializable Members
 
         /// <summary>
         /// Factory function to register this class.
         /// </summary>
-        static IGeodeSerializable^ CreateDeserializable()
+        static ISerializable^ CreateDeserializable()
         {
           return gcnew CacheableArrayList(gcnew System::Collections::Generic::List<Object^>());
         }
diff --git a/clicache/src/CacheableBuiltins.hpp b/clicache/src/CacheableBuiltins.hpp
index afbc176..bdc9706 100644
--- a/clicache/src/CacheableBuiltins.hpp
+++ b/clicache/src/CacheableBuiltins.hpp
@@ -28,7 +28,6 @@
 #include "CacheableKey.hpp"
 #include "Serializable.hpp"
 #include "ExceptionTypes.hpp"
-#include "GeodeClassIds.hpp"
 #include "DataOutput.hpp"
 #include "DataInput.hpp"
 
@@ -48,9 +47,9 @@ namespace Apache
       /// An immutable template wrapper for C++ <c>CacheableKey</c>s that can
       /// serve as a distributable key object for caching.
       /// </summary>
-      template <typename TNative, typename TManaged, System::UInt32 TYPEID>
+      template <typename TNative, typename TManaged, int8_t TYPEID>
       ref class CacheableBuiltinKey
-        : public CacheableKey
+        : public IDataSerializablePrimitive, public CacheableKey
       {
       public:
         /// <summary>
@@ -72,15 +71,9 @@ namespace Apache
           m_nativeptr = gcnew native_shared_ptr<native::Serializable>(nativeptr);
         }
 
-        /// <summary>
-        /// Returns the classId of the instance being serialized.
-        /// This is used by deserialization to determine what instance
-        /// type to create and deserialize into.
-        /// </summary>
-        /// <returns>the classId</returns>
-        virtual property System::UInt32 ClassId
+        property int8_t DsCode
         {
-          virtual System::UInt32 get() override
+          virtual int8_t get()
           {
             return TYPEID;
           }
@@ -90,11 +83,11 @@ namespace Apache
         /// Return a string representation of the object.
         /// This returns the string for the <c>Value</c> property.
         /// </summary>
-        virtual String^ ToString() override
+        String^ ToString() override
         {
           try
           {
-            return static_cast<TNative*>(m_nativeptr->get())->value().ToString();
+            return GetNative()->value().ToString();
           }
           finally
           {
@@ -113,8 +106,8 @@ namespace Apache
           if (auto o = dynamic_cast<CacheableBuiltinKey^>(other)) {
             try
             {
-              return static_cast<TNative*>(m_nativeptr->get())->operator==(
-                *static_cast<TNative*>(o->m_nativeptr->get()));
+              return GetNative()->operator==(
+                *dynamic_cast<TNative*>(o->m_nativeptr->get()));
             }
             finally
             {
@@ -143,7 +136,7 @@ namespace Apache
         {
           try
           {
-            return (static_cast<TNative*>(m_nativeptr->get())->value() == other);
+            return (GetNative()->value() == other);
           }
           finally
           {
@@ -161,7 +154,7 @@ namespace Apache
           {
             try
             {
-              return static_cast<TNative*>(m_nativeptr->get())->value();
+              return GetNative()->value();
             }
             finally
             {
@@ -171,6 +164,30 @@ namespace Apache
           }
         }
 
+        virtual void ToData(DataOutput^ dataOutput)
+        {
+          try
+          {
+            return GetNative()->toData(*dataOutput->GetNative());
+          }
+          finally
+          {
+            GC::KeepAlive(m_nativeptr);
+          }
+        }
+
+        virtual void FromData(DataInput^ dataInput)
+        {
+          try
+          {
+            return GetNative()->fromData(*dataInput->GetNative());
+          }
+          finally
+          {
+            GC::KeepAlive(m_nativeptr);
+          }
+        }
+
       protected:
 
         /// <summary>
@@ -179,6 +196,12 @@ namespace Apache
         /// <param name="nativeptr">The native object pointer</param>
         inline CacheableBuiltinKey(std::shared_ptr<native::Serializable> nativeptr)
           : CacheableKey(nativeptr) { }
+
+      private:
+        inline TNative* GetNative()
+        {
+          return dynamic_cast<TNative*>(m_nativeptr->get());
+        }
       };
 
 
@@ -187,9 +210,9 @@ namespace Apache
       /// distributable object for caching.
       /// </summary>
       template <typename TNative, typename TNativePtr, typename TManaged,
-        System::UInt32 TYPEID>
+        int8_t TYPEID>
       ref class CacheableBuiltinArray
-        : public Serializable
+        : public IDataSerializablePrimitive
       {
       public:
 
@@ -199,27 +222,27 @@ namespace Apache
         /// type to create and deserialize into.
         /// </summary>
         /// <returns>the classId</returns>
-        virtual property System::UInt32 ClassId
+        property int8_t DsCode
         {
-          virtual System::UInt32 get() override
+          virtual int8_t get()
           {
             return TYPEID;
           }
         }
 
-        virtual void ToData(DataOutput^ output) override
+        virtual void ToData(DataOutput^ output)
         {
           output->WriteObject(m_value);
         }
 
-        virtual void FromData(DataInput^ input) override
+        virtual void FromData(DataInput^ input)
         {
           input->ReadObject(m_value);
         }
 
-        virtual property System::UInt64 ObjectSize
+        property System::UInt64 ObjectSize
         {
-          virtual System::UInt64 get() override
+          virtual System::UInt64 get()
           {
             return m_value->Length * sizeof(TManaged);
           }
@@ -281,9 +304,8 @@ namespace Apache
         /// </summary>
         /// <param name="nativeptr">The native object pointer</param>
         inline CacheableBuiltinArray(std::shared_ptr<native::Serializable> nptr)
-          : Serializable(nptr)
         {
-          auto nativeptr = std::static_pointer_cast<TNative>(nptr);
+          auto nativeptr = std::dynamic_pointer_cast<TNative>(nptr);
           System::Int32 len = nativeptr->length();
           if (len > 0)
           {
@@ -342,7 +364,7 @@ namespace Apache
       //mt = managed type(bool, int)
 #define _GFCLI_CACHEABLE_KEY_DEF_NEW(n, m, mt)                                   \
       ref class m : public CacheableBuiltinKey<n, mt,        \
-        GeodeClassIds::m>                                                   \
+        GeodeTypeIds::m>                                                   \
       {                                                                       \
       public:                                                                 \
          /** <summary>
@@ -381,13 +403,13 @@ namespace Apache
             * Factory function to register this class.
             * </summary>
             */                                                                   \
-            static IGeodeSerializable^ CreateDeserializable()                        \
+            static ISerializable^ CreateDeserializable()                        \
            {                                                                     \
            return gcnew m();                                       \
            }                                                                     \
            \
            internal:                                                               \
-           static IGeodeSerializable^ Create(std::shared_ptr<native::Serializable> obj)            \
+           static ISerializable^ Create(std::shared_ptr<native::Serializable> obj)            \
            {                                                                     \
            return (obj != nullptr ? gcnew m(obj) : nullptr);                   \
            }                                                                     \
@@ -398,94 +420,6 @@ namespace Apache
       };
 
 
-#define _GFCLI_CACHEABLE_ARRAY_DEF_NEW(m, mt)                                    \
-      ref class m : public CacheableBuiltinArray<            \
-        native::m, native::m, mt, GeodeClassIds::m>                  \
-            {                                                                       \
-      public:                                                                 \
-        /** <summary>
-      *  Static function to create a new instance copying
-      *  from the given array.
-      *  </summary>
-      *  <remarks>
-      *  Providing a null or zero size array will return a null object.
-      *  </remarks>
-      *  <param name="value">the array to create the new instance</param>
-      */                                                                   \
-      inline static m^ Create(array<mt>^ value)                             \
-      {                                                                     \
-      return (value != nullptr /*&& value->Length > 0*/ ? \
-      gcnew m(value) : nullptr);                                        \
-      }                                                                     \
-      /** <summary>
-       *  Static function to create a new instance copying
-       *  from the given array.
-       *  </summary>
-       *  <remarks>
-       *  Providing a null or zero size array will return a null object.
-       *  </remarks>
-       *  <param name="value">the array to create the new instance</param>
-       */                                                                   \
-       inline static m^ Create(array<mt>^ value, System::Int32 length)               \
-      {                                                                     \
-      return (value != nullptr && value->Length > 0 ? \
-      gcnew m(value, length) : nullptr);                                \
-      }                                                                     \
-      /** <summary>
-       * Explicit conversion operator to contained array type.
-       * </summary>
-       */                                                                   \
-       inline static explicit operator array<mt> ^ (m^ value)                 \
-      {                                                                     \
-      return (value != nullptr ? value->Value : nullptr);                 \
-      }                                                                     \
-      \
-      /** <summary>
-       * Factory function to register this class.
-       * </summary>
-       */                                                                   \
-       static IGeodeSerializable^ CreateDeserializable()                        \
-      {                                                                     \
-      return gcnew m();                                                   \
-      }                                                                     \
-      \
-            internal:                                                               \
-              static IGeodeSerializable^ Create(std::shared_ptr<native::Serializable> obj)            \
-      {                                                                     \
-      return (obj != nullptr ? gcnew m(obj) : nullptr);                   \
-      }                                                                     \
-      \
-            private:                                                                \
-            /** <summary>
-             * Allocates a new instance
-             *  </summary>
-             */                                                                   \
-             inline m()                                                            \
-             : CacheableBuiltinArray() { }                                       \
-             /** <summary>
-              * Allocates a new instance copying from the given array.
-              *  </summary>
-              *  <remarks>
-              *  Providing a null or zero size array will return a null object.
-              *  </remarks>
-              *  <param name="value">the array to create the new instance</param>
-              */                                                                   \
-              inline m(array<mt>^ value)                                            \
-              : CacheableBuiltinArray(value) { }                                  \
-              /** <summary>
-               * Allocates a new instance copying given length from the
-               * start of given array.
-               *  </summary>
-               *  <remarks>
-               *  Providing a null or zero size array will return a null object.
-               *  </remarks>
-               *  <param name="value">the array to create the new instance</param>
-               */                                                                   \
-               inline m(array<mt>^ value, System::Int32 length)                              \
-               : CacheableBuiltinArray(value, length) { }                          \
-               inline m(std::shared_ptr<native::Serializable> nativeptr)                            \
-               : CacheableBuiltinArray(nativeptr) { }                              \
-      };
 
 
       // Built-in CacheableKeys
@@ -549,9 +483,9 @@ namespace Apache
 
       // Built-in Cacheable array types
 
-      template <typename NativeArray, typename ManagedType, System::UInt32 GeodeClassId>
+      template <typename NativeArray, typename ManagedType, int8_t DsCode>
       ref class CacheableArray : public CacheableBuiltinArray<
-          NativeArray, NativeArray, ManagedType, GeodeClassId> {
+          NativeArray, NativeArray, ManagedType, DsCode> {
       public:
           /** <summary>
           *  Static function to create a new instance copying
@@ -593,12 +527,12 @@ namespace Apache
           * Factory function to register this class.
           * </summary>
           */
-          static IGeodeSerializable^ CreateDeserializable()
+          static ISerializable^ CreateDeserializable()
           {
               return gcnew CacheableArray();
           }
         internal:
-          static IGeodeSerializable^ Create(std::shared_ptr<native::Serializable> obj)
+          static ISerializable^ Create(std::shared_ptr<native::Serializable> obj)
           {
               return (obj != nullptr ? gcnew CacheableArray(obj) : nullptr);
           }
@@ -636,49 +570,49 @@ namespace Apache
       /// An immutable wrapper for byte arrays that can serve
       /// as a distributable object for caching.
       /// </summary>
-      using CacheableBytes = CacheableArray<native::CacheableArray<int8_t, native::GeodeTypeIds::CacheableBytes>, Byte, GeodeClassIds::CacheableBytes>;
+      using CacheableBytes = CacheableArray<native::CacheableArray<int8_t, native::GeodeTypeIds::CacheableBytes>, Byte, GeodeTypeIds::CacheableBytes>;
 
       /// <summary>
       /// An immutable wrapper for array of doubles that can serve
       /// as a distributable object for caching.
       /// </summary>
-      using CacheableDoubleArray = CacheableArray<native::CacheableArray<double, native::GeodeTypeIds::CacheableDoubleArray>, Double, GeodeClassIds::CacheableDoubleArray>;
+      using CacheableDoubleArray = CacheableArray<native::CacheableArray<double, native::GeodeTypeIds::CacheableDoubleArray>, Double, GeodeTypeIds::CacheableDoubleArray>;
 
       /// <summary>
       /// An immutable wrapper for array of floats that can serve
       /// as a distributable object for caching.
       /// </summary>
-      using CacheableFloatArray = CacheableArray<native::CacheableArray<float, native::GeodeTypeIds::CacheableFloatArray>, Single, GeodeClassIds::CacheableFloatArray>;
+      using CacheableFloatArray = CacheableArray<native::CacheableArray<float, native::GeodeTypeIds::CacheableFloatArray>, Single, GeodeTypeIds::CacheableFloatArray>;
 
       /// <summary>
       /// An immutable wrapper for array of 16-bit integers that can serve
       /// as a distributable object for caching.
       /// </summary>
-      using CacheableInt16Array = CacheableArray<native::CacheableArray<int16_t, native::GeodeTypeIds::CacheableInt16Array>, System::Int16, GeodeClassIds::CacheableInt16Array>;
+      using CacheableInt16Array = CacheableArray<native::CacheableArray<int16_t, native::GeodeTypeIds::CacheableInt16Array>, System::Int16, GeodeTypeIds::CacheableInt16Array>;
 
       /// <summary>
       /// An immutable wrapper for array of 32-bit integers that can serve
       /// as a distributable object for caching.
       /// </summary>
-      using CacheableInt32Array = CacheableArray<native::CacheableArray<int32_t, native::GeodeTypeIds::CacheableInt32Array>, System::Int32, GeodeClassIds::CacheableInt32Array>;
+      using CacheableInt32Array = CacheableArray<native::CacheableArray<int32_t, native::GeodeTypeIds::CacheableInt32Array>, System::Int32, GeodeTypeIds::CacheableInt32Array>;
 
       /// <summary>
       /// An immutable wrapper for array of 64-bit integers that can serve
       /// as a distributable object for caching.
       /// </summary>
-      using CacheableInt64Array = CacheableArray<native::CacheableArray<int64_t, native::GeodeTypeIds::CacheableInt64Array>, System::Int64, GeodeClassIds::CacheableInt64Array>;
+      using CacheableInt64Array = CacheableArray<native::CacheableArray<int64_t, native::GeodeTypeIds::CacheableInt64Array>, System::Int64, GeodeTypeIds::CacheableInt64Array>;
 
       /// <summary>
       /// An immutable wrapper for array of booleans that can serve
       /// as a distributable object for caching.
       /// </summary>
-      using BooleanArray = CacheableArray<native::CacheableArray<bool, native::GeodeTypeIds::BooleanArray>, bool, GeodeClassIds::BooleanArray>;
+      using BooleanArray = CacheableArray<native::CacheableArray<bool, native::GeodeTypeIds::BooleanArray>, bool, GeodeTypeIds::BooleanArray>;
 
       /// <summary>
       /// An immutable wrapper for array of 16-bit characters that can serve
       /// as a distributable object for caching.
       /// </summary>
-      using CharArray = CacheableArray<native::CacheableArray<char16_t, native::GeodeTypeIds::CharArray>, Char, GeodeClassIds::CharArray>;
+      using CharArray = CacheableArray<native::CacheableArray<char16_t, native::GeodeTypeIds::CharArray>, Char, GeodeTypeIds::CharArray>;
     }  // namespace Client
   }  // namespace Geode
 }  // namespace Apache
diff --git a/clicache/src/CacheableDate.cpp b/clicache/src/CacheableDate.cpp
index 986fe87..6d13159 100644
--- a/clicache/src/CacheableDate.cpp
+++ b/clicache/src/CacheableDate.cpp
@@ -20,7 +20,6 @@
 #include "DataInput.hpp"
 #include "DataOutput.hpp"
 #include "Log.hpp"
-#include "GeodeClassIds.hpp"
 
 using namespace System;
 
@@ -69,9 +68,9 @@ namespace Apache
         return sizeof(DateTime);
       }
 
-      System::UInt32 CacheableDate::ClassId::get()
+      int8_t CacheableDate::DsCode::get()
       {
-        return GeodeClassIds::CacheableDate;
+        return native::GeodeTypeIds::CacheableDate;
       }
 
       String^ CacheableDate::ToString()
@@ -93,12 +92,7 @@ namespace Apache
 
       bool CacheableDate::Equals(ICacheableKey^ other)
       {
-        if (other == nullptr ||
-            other->ClassId != GeodeClassIds::CacheableDate) {
-          return false;
-        }
-        return m_dateTime.Equals(static_cast<CacheableDate^>(
-          other)->m_dateTime);
+        return Equals((Object^) other);
       }
 
       bool CacheableDate::Equals(Object^ obj)
@@ -110,9 +104,8 @@ namespace Apache
           return (m_dateTime == otherDate->m_dateTime);
         }
         return false;
-      }  // namespace Client
-    }  // namespace Geode
-  }  // namespace Apache
-
-} //namespace 
+      }
+    }  // namespace Client
+  }  // namespace Geode
+}  // namespace Apache
 
diff --git a/clicache/src/CacheableDate.hpp b/clicache/src/CacheableDate.hpp
index b094153..4527a98 100644
--- a/clicache/src/CacheableDate.hpp
+++ b/clicache/src/CacheableDate.hpp
@@ -20,6 +20,7 @@
 
 #include "geode_defs.hpp"
 #include "ICacheableKey.hpp"
+#include "IDataSerializablePrimitive.hpp"
 
 using namespace System;
 
@@ -35,7 +36,8 @@ namespace Apache
       /// key object for caching as well as being a string value.
       /// </summary>
       public ref class CacheableDate
-        : public ICacheableKey
+        : public ICacheableKey,
+          public IDataSerializablePrimitive
       {
       public:
         /// <summary>
@@ -70,7 +72,7 @@ namespace Apache
           return gcnew CacheableDate(dateTime);
         }
 
-        // Region: IGeodeSerializable Members
+        // Region: ISerializable Members
 
         /// <summary>
         /// Serializes this object.
@@ -107,9 +109,9 @@ namespace Apache
         /// type to create and deserialize into.
         /// </summary>
         /// <returns>the classId</returns>
-        virtual property System::UInt32 ClassId
+        property int8_t DsCode
         {
-          virtual System::UInt32 get();
+          virtual int8_t get();
         }
 
         /// <summary>
@@ -117,7 +119,7 @@ namespace Apache
         /// </summary>
         virtual String^ ToString() override;
 
-        // End Region: IGeodeSerializable Members
+        // End Region: ISerializable Members
 
 
         // Region: ICacheableKey Members
@@ -159,7 +161,7 @@ namespace Apache
         /// <summary>
         /// Factory function to register this class.
         /// </summary>
-        static IGeodeSerializable^ CreateDeserializable()
+        static ISerializable^ CreateDeserializable()
         {
           return gcnew CacheableDate();
         }
diff --git a/clicache/src/CacheableFileName.cpp b/clicache/src/CacheableFileName.cpp
index 639c1d0..4b05130 100644
--- a/clicache/src/CacheableFileName.cpp
+++ b/clicache/src/CacheableFileName.cpp
@@ -19,7 +19,7 @@
 #include "CacheableFileName.hpp"
 #include "DataOutput.hpp"
 #include "DataInput.hpp"
-#include "GeodeClassIds.hpp"
+
 using namespace System;
 
 namespace Apache
@@ -52,9 +52,9 @@ namespace Apache
         }
       }
 
-      System::UInt32 CacheableFileName::ClassId::get()
+      int8_t CacheableFileName::DsCode::get()
       {
-        return GeodeClassIds::CacheableFileName;
+        return native::GeodeTypeIds::CacheableFileName;
       }
 
       System::UInt64 CacheableFileName::ObjectSize::get()
@@ -82,11 +82,7 @@ namespace Apache
 
       bool CacheableFileName::Equals(ICacheableKey^ other)
       {
-        if (other == nullptr ||
-            other->ClassId != GeodeClassIds::CacheableFileName) {
-          return false;
-        }
-        return (m_str == static_cast<CacheableFileName^>(other)->m_str);
+        return Equals((Object^) other);
       }
 
       bool CacheableFileName::Equals(Object^ obj)
diff --git a/clicache/src/CacheableFileName.hpp b/clicache/src/CacheableFileName.hpp
index d31df9f..2a6f4eb 100644
--- a/clicache/src/CacheableFileName.hpp
+++ b/clicache/src/CacheableFileName.hpp
@@ -22,6 +22,7 @@
 
 #include "geode_defs.hpp"
 #include "ICacheableKey.hpp"
+#include "IDataSerializablePrimitive.hpp"
 
 
 using namespace System;
@@ -38,7 +39,8 @@ namespace Apache
       /// key object for caching as well as being a string value.
       /// </summary>
       public ref class CacheableFileName
-        : public ICacheableKey
+        : public ICacheableKey,
+          public IDataSerializablePrimitive
       {
       public:
         /// <summary>
@@ -60,55 +62,28 @@ namespace Apache
             gcnew CacheableFileName(value) : nullptr);
         }
 
-        // Region: IGeodeSerializable Members
+        // Region: ISerializable Members
 
-        /// <summary>
-        /// Serializes this object.
-        /// </summary>
-        /// <param name="output">
-        /// the DataOutput object to use for serializing the object
-        /// </param>
-        virtual void ToData(DataOutput^ output);
+         virtual void ToData(DataOutput^ output);
 
-        /// <summary>
-        /// Deserialize this object, typical implementation should return
-        /// the 'this' pointer.
-        /// </summary>
-        /// <param name="input">
-        /// the DataInput stream to use for reading the object data
-        /// </param>
-        /// <returns>the deserialized object</returns>
         virtual void FromData(DataInput^ input);
 
-        /// <summary>
-        /// return the size of this object in bytes
-        /// </summary>
         virtual property System::UInt64 ObjectSize
         {
           virtual System::UInt64 get();
         }
 
-        /// <summary>
-        /// Returns the classId of the instance being serialized.
-        /// This is used by deserialization to determine what instance
-        /// type to create and deserialize into.
-        /// </summary>
-        /// <returns>the classId</returns>
-        virtual property System::UInt32 ClassId
+        virtual property int8_t DsCode
         {
-          virtual System::UInt32 get();
+          virtual int8_t get();
         }
 
-        /// <summary>
-        /// Return a string representation of the object.
-        /// This returns the same string as <c>Value</c> property.
-        /// </summary>
         virtual String^ ToString() override
         {
           return m_str;
         }
 
-        // End Region: IGeodeSerializable Members
+        // End Region: ISerializable Members
 
         // Region: ICacheableKey Members
 
@@ -144,7 +119,7 @@ namespace Apache
         /// <summary>
         /// Factory function to register this class.
         /// </summary>
-        static IGeodeSerializable^ CreateDeserializable()
+        static ISerializable^ CreateDeserializable()
         {
           return gcnew CacheableFileName((String^)nullptr);
         }
diff --git a/clicache/src/CacheableHashMap.cpp b/clicache/src/CacheableHashMap.cpp
index 7c3a3ac..e27fc6a 100644
--- a/clicache/src/CacheableHashMap.cpp
+++ b/clicache/src/CacheableHashMap.cpp
@@ -32,7 +32,7 @@ namespace Apache
     namespace Client
     {
 
-      // Region: IGeodeSerializable Members
+      // Region: ISerializable Members
 
       void Client::CacheableHashMap::ToData(DataOutput^ output)
       {
diff --git a/clicache/src/CacheableHashMap.hpp b/clicache/src/CacheableHashMap.hpp
index 7501667..45bd339 100644
--- a/clicache/src/CacheableHashMap.hpp
+++ b/clicache/src/CacheableHashMap.hpp
@@ -19,9 +19,8 @@
 
 
 #include "geode_defs.hpp"
-#include "IGeodeSerializable.hpp"
-#include "ICacheableKey.hpp"
-#include "GeodeClassIds.hpp"
+#include "ISerializable.hpp"
+#include "IDataSerializablePrimitive.hpp"
 
 using namespace System;
 using namespace System::Collections::Generic;
@@ -34,14 +33,15 @@ namespace Apache
   {
     namespace Client
     {
+			namespace native = apache::geode::client;
 
       /// <summary>
-      /// A mutable <c>ICacheableKey</c> to <c>IGeodeSerializable</c> hash map
+      /// A mutable <c>ICacheableKey</c> to <c>ISerializable</c> hash map
       /// that can serve as a distributable object for caching. This class
       /// extends .NET generic <c>Dictionary</c> class.
       /// </summary>
       ref class CacheableHashMap
-        : public IGeodeSerializable
+        : public IDataSerializablePrimitive
       {
       protected:
         Object^ m_dictionary;
@@ -82,7 +82,7 @@ namespace Apache
         }
 
 
-        // Region: IGeodeSerializable Members
+        // Region: ISerializable Members
 
         /// <summary>
         /// Serializes this object.
@@ -116,11 +116,11 @@ namespace Apache
         /// type to create and deserialize into.
         /// </summary>
         /// <returns>the classId</returns>
-        virtual property System::UInt32 ClassId
+        property int8_t DsCode
         {
-          inline virtual System::UInt32 get()
+          virtual int8_t get()
           {
-            return GeodeClassIds::CacheableHashMap;
+            return native::GeodeTypeIds::CacheableHashMap;
           }
         }
 
@@ -132,12 +132,12 @@ namespace Apache
           }
         }
 
-        // End Region: IGeodeSerializable Members
+        // End Region: ISerializable Members
 
         /// <summary>
         /// Factory function to register this class.
         /// </summary>
-        static IGeodeSerializable^ CreateDeserializable()
+        static ISerializable^ CreateDeserializable()
         {
           return gcnew CacheableHashMap();
         }
diff --git a/clicache/src/CacheableHashSet.hpp b/clicache/src/CacheableHashSet.hpp
index d47c84c..f2b207d 100644
--- a/clicache/src/CacheableHashSet.hpp
+++ b/clicache/src/CacheableHashSet.hpp
@@ -46,17 +46,19 @@ namespace Apache
         /// A mutable <c>ICacheableKey</c> hash set wrapper that can serve as
         /// a distributable object for caching.
         /// </summary>
-        template <System::UInt32 TYPEID, typename HSTYPE>
+        template <int8_t TYPEID, typename HSTYPE>
         public ref class CacheableHashSetType
-          : public Serializable, public ICollection<Object^>
+          : public IDataSerializablePrimitive,
+            public Serializable,
+            public ICollection<Object^>
         {
         public:
 
-          virtual void ToData(DataOutput^ output) override
+          virtual void ToData(DataOutput^ output)
           {
             output->WriteArrayLen(this->Count);
 
-            auto set = static_cast<HSTYPE*>(m_nativeptr->get());
+            auto set = dynamic_cast<HSTYPE*>(m_nativeptr->get());
             for (const auto& iter : *set) {
               auto key = TypeRegistry::GetManagedValueGeneric<Object^>(iter);
               output->WriteObject(key);
@@ -65,7 +67,7 @@ namespace Apache
             GC::KeepAlive(this);
           }
 
-          virtual void FromData(DataInput^ input) override
+          virtual void FromData(DataInput^ input)
           {
             int len = input->ReadArrayLen();
             if (len > 0)
@@ -78,9 +80,9 @@ namespace Apache
             }
           }
 
-          virtual property System::UInt64 ObjectSize
+          property System::UInt64 ObjectSize
           {
-            virtual System::UInt64 get() override
+            System::UInt64 get() override
             {
               System::UInt64 size = 0;
               for each (Object^ key in this) {
@@ -93,7 +95,7 @@ namespace Apache
             }
           }
 
-          virtual int GetHashCode() override
+          int GetHashCode() override
           {
             IEnumerator<Object^>^ ie = GetEnumerator();
 
@@ -105,7 +107,7 @@ namespace Apache
             return h;
           }
 
-          virtual bool Equals(Object^ other)override
+          bool Equals(Object^ other) override
           {
             if (other == nullptr)
               return false;
@@ -178,14 +180,14 @@ namespace Apache
             virtual bool MoveNext()
             {
               auto nptr = m_nativeptr->get();
-              bool isEnd = static_cast<HSTYPE*>(m_set->m_nativeptr->get())->end() == *nptr;
+              bool isEnd = dynamic_cast<HSTYPE*>(m_set->m_nativeptr->get())->end() == *nptr;
               if (!m_started) {
                 m_started = true;
               }
               else {
                 if (!isEnd) {
                   (*nptr)++;
-                  isEnd = static_cast<HSTYPE*>(m_set->m_nativeptr->get())->end() == *nptr;
+                  isEnd = dynamic_cast<HSTYPE*>(m_set->m_nativeptr->get())->end() == *nptr;
                 }
               }
               GC::KeepAlive(this);
@@ -202,7 +204,7 @@ namespace Apache
               {
                 m_nativeptr = gcnew native_unique_ptr<typename HSTYPE::iterator>(
                     std::make_unique<typename HSTYPE::iterator>(
-                    static_cast<HSTYPE*>(m_set->m_nativeptr->get())->begin()));
+                    dynamic_cast<HSTYPE*>(m_set->m_nativeptr->get())->begin()));
               }
               finally
               {
@@ -257,15 +259,9 @@ namespace Apache
             native_unique_ptr<typename HSTYPE::iterator>^ m_nativeptr;
           };
 
-          /// <summary>
-          /// Returns the classId of the instance being serialized.
-          /// This is used by deserialization to determine what instance
-          /// type to create and deserialize into.
-          /// </summary>
-          /// <returns>the classId</returns>
-          virtual property System::UInt32 ClassId
+          property int8_t DsCode
           {
-            virtual System::UInt32 get() override
+            virtual int8_t get()
             {
               return TYPEID;
             }
@@ -280,7 +276,7 @@ namespace Apache
             {
               try
               {
-                return static_cast<int>(static_cast<HSTYPE*>(m_nativeptr->get())->max_size());
+                return static_cast<int>(dynamic_cast<HSTYPE*>(m_nativeptr->get())->max_size());
               }
               finally
               {
@@ -298,7 +294,7 @@ namespace Apache
             {
               try
               {
-                return static_cast<HSTYPE*>(m_nativeptr->get())->empty();
+                return dynamic_cast<HSTYPE*>(m_nativeptr->get())->empty();
               }
               finally
               {
@@ -316,7 +312,7 @@ namespace Apache
             {
               try
               {
-                return static_cast<int>(static_cast<HSTYPE*>(m_nativeptr->get())->bucket_count());
+                return static_cast<int>(dynamic_cast<HSTYPE*>(m_nativeptr->get())->bucket_count());
               }
               finally
               {
@@ -333,7 +329,7 @@ namespace Apache
           {
             try
             {
-              static_cast<HSTYPE*>(m_nativeptr->get())->reserve(size);
+              dynamic_cast<HSTYPE*>(m_nativeptr->get())->reserve(size);
             }
             finally
             {
@@ -353,8 +349,8 @@ namespace Apache
             try
             {
               if (other != nullptr) {
-                static_cast<HSTYPE*>(m_nativeptr->get())->swap(
-                  *static_cast<HSTYPE*>(other->m_nativeptr->get()));
+                dynamic_cast<HSTYPE*>(m_nativeptr->get())->swap(
+                  *dynamic_cast<HSTYPE*>(other->m_nativeptr->get()));
               }
             }
             finally
@@ -378,7 +374,7 @@ namespace Apache
 
             try
             {
-              static_cast<HSTYPE*>(m_nativeptr->get())->insert(Serializable::GetUnmanagedValueGeneric(item));
+              dynamic_cast<HSTYPE*>(m_nativeptr->get())->insert(Serializable::GetUnmanagedValueGeneric(item));
             }
             finally
             {
@@ -395,7 +391,7 @@ namespace Apache
           {
             try
             {
-              static_cast<HSTYPE*>(m_nativeptr->get())->clear();
+              dynamic_cast<HSTYPE*>(m_nativeptr->get())->clear();
             }
             finally
             {
@@ -418,7 +414,7 @@ namespace Apache
           {
             try
             {
-              return static_cast<HSTYPE*>(m_nativeptr->get())->find(Serializable::GetUnmanagedValueGeneric(item)) != static_cast<HSTYPE*>(m_nativeptr->get())->end();
+              return dynamic_cast<HSTYPE*>(m_nativeptr->get())->find(Serializable::GetUnmanagedValueGeneric(item)) != dynamic_cast<HSTYPE*>(m_nativeptr->get())->end();
             }
             finally
             {
@@ -455,7 +451,7 @@ namespace Apache
                                                    " array is null or array index is less than zero");
             }
 
-            auto set = static_cast<HSTYPE*>(m_nativeptr->get());
+            auto set = dynamic_cast<HSTYPE*>(m_nativeptr->get());
             System::Int32 index = arrayIndex;
 
             if (arrayIndex >= array->Length ||
@@ -482,7 +478,7 @@ namespace Apache
             {
               try
               {
-                return static_cast<int>(static_cast<HSTYPE*>(m_nativeptr->get())->size());
+                return static_cast<int>(dynamic_cast<HSTYPE*>(m_nativeptr->get())->size());
               }
               finally
               {
@@ -508,7 +504,7 @@ namespace Apache
           {
             try
             {
-              return (static_cast<HSTYPE*>(m_nativeptr->get())->erase(Serializable::GetUnmanagedValueGeneric(item)) > 0);
+              return (dynamic_cast<HSTYPE*>(m_nativeptr->get())->erase(Serializable::GetUnmanagedValueGeneric(item)) > 0);
             }
             finally
             {
@@ -553,7 +549,7 @@ namespace Apache
           /// <summary>
           /// Factory function to register wrapper
           /// </summary>
-          static IGeodeSerializable^ Create(apache::geode::client::Serializable* obj)
+          static ISerializable^ Create(apache::geode::client::Serializable* obj)
           {
             return (obj != NULL ?
                     gcnew CacheableHashSetType<TYPEID, HSTYPE>(obj) : nullptr);
@@ -603,7 +599,7 @@ namespace Apache
       }
 
 #define _GFCLI_CACHEABLEHASHSET_DEF_GENERIC(m, HSTYPE)                               \
-	public ref class m : public Internal::CacheableHashSetType<Apache::Geode::Client::GeodeClassIds::m, HSTYPE>      \
+	public ref class m : public Internal::CacheableHashSetType<native::GeodeTypeIds::m, HSTYPE>      \
             {                                                                       \
       public:                                                                 \
         /** <summary>
@@ -611,7 +607,7 @@ namespace Apache
       *  </summary>
       */                                                                   \
       inline m()                                                            \
-      : Internal::CacheableHashSetType<Apache::Geode::Client::GeodeClassIds::m, HSTYPE>() {}                      \
+      : Internal::CacheableHashSetType<native::GeodeTypeIds::m, HSTYPE>() {}                      \
       \
       /** <summary>
        *  Allocates a new instance with the given size.
@@ -619,7 +615,7 @@ namespace Apache
        *  <param name="size">the intial size of the new instance</param>
        */                                                                   \
        inline m(System::Int32 size)                                                 \
-       : Internal::CacheableHashSetType<Apache::Geode::Client::GeodeClassIds::m, HSTYPE>(size) {}                  \
+       : Internal::CacheableHashSetType<native::GeodeTypeIds::m, HSTYPE>(size) {}                  \
        \
        /** <summary>
         *  Static function to create a new empty instance.
@@ -643,20 +639,20 @@ namespace Apache
        * Factory function to register this class.
        * </summary>
        */                                                                   \
-       static IGeodeSerializable^ CreateDeserializable()                        \
+       static ISerializable^ CreateDeserializable()                        \
       {                                                                     \
       return gcnew m();                                                   \
       }                                                                     \
       \
             internal:                                                               \
-              static IGeodeSerializable^ Create(std::shared_ptr<apache::geode::client::Serializable> obj)            \
+              static ISerializable^ Create(std::shared_ptr<apache::geode::client::Serializable> obj)            \
       {                                                                     \
       return gcnew m(obj);                                                \
       }                                                                     \
       \
             private:                                                                \
               inline m(std::shared_ptr<apache::geode::client::Serializable> nativeptr)                            \
-              : Internal::CacheableHashSetType<Apache::Geode::Client::GeodeClassIds::m, HSTYPE>(nativeptr) { }             \
+              : Internal::CacheableHashSetType<native::GeodeTypeIds::m, HSTYPE>(nativeptr) { }             \
       };
 
       /// <summary>
diff --git a/clicache/src/CacheableHashTable.hpp b/clicache/src/CacheableHashTable.hpp
index 5bc962b..7902266 100644
--- a/clicache/src/CacheableHashTable.hpp
+++ b/clicache/src/CacheableHashTable.hpp
@@ -34,7 +34,7 @@ namespace Apache
     {
 
       /// <summary>
-      /// A mutable <c>ICacheableKey</c> to <c>IGeodeSerializable</c> hash table
+      /// A mutable <c>ICacheableKey</c> to <c>ISerializable</c> hash table
       /// that can serve as a distributable object for caching. This class
       /// extends .NET generic <c>Dictionary</c> class.
       /// </summary>
@@ -71,7 +71,7 @@ namespace Apache
         { }
 
 
-        // Region: IGeodeSerializable Members
+        // Region: ISerializable Members
 
         /// <summary>
         /// Returns the classId of the instance being serialized.
@@ -79,20 +79,20 @@ namespace Apache
         /// type to create and deserialize into.
         /// </summary>
         /// <returns>the classId</returns>
-        virtual property System::UInt32 ClassId
+        property int8_t DsCode
         {
-          virtual System::UInt32 get() override
+          int8_t get() override
           {
-            return GeodeClassIds::CacheableHashTable;
+            return native::GeodeTypeIds::CacheableHashTable;
           }
         }
 
-        // End Region: IGeodeSerializable Members
+        // End Region: ISerializable Members
 
         /// <summary>
         /// Factory function to register this class.
         /// </summary>
-        static IGeodeSerializable^ CreateDeserializable()
+        static ISerializable^ CreateDeserializable()
         {
           return gcnew CacheableHashTable();
         }
@@ -106,7 +106,7 @@ namespace Apache
         /// <summary>
         /// Factory function to register this class.
         /// </summary>
-        static IGeodeSerializable^ Create(Object^ hashtable)
+        static ISerializable^ Create(Object^ hashtable)
         {
           return gcnew CacheableHashTable(hashtable);
         }
diff --git a/clicache/src/CacheableIdentityHashMap.hpp b/clicache/src/CacheableIdentityHashMap.hpp
index e127c84..6960bca 100644
--- a/clicache/src/CacheableIdentityHashMap.hpp
+++ b/clicache/src/CacheableIdentityHashMap.hpp
@@ -33,7 +33,7 @@ namespace Apache
     {
 
       /// <summary>
-      /// A mutable <c>ICacheableKey</c> to <c>IGeodeSerializable</c> hash map
+      /// A mutable <c>ICacheableKey</c> to <c>ISerializable</c> hash map
       /// that can serve as a distributable object for caching. This class
       /// extends .NET generic <c>Dictionary</c> class. This class is meant
       /// as a means to interoperate with java server side
@@ -97,7 +97,7 @@ namespace Apache
           return gcnew CacheableIdentityHashMap(capacity);
         }
 
-        // Region: IGeodeSerializable Members
+        // Region: ISerializable Members
 
         /// <summary>
         /// Returns the classId of the instance being serialized.
@@ -105,20 +105,20 @@ namespace Apache
         /// type to create and deserialize into.
         /// </summary>
         /// <returns>the classId</returns>
-        virtual property System::UInt32 ClassId
+        property int8_t DsCode
         {
-          virtual System::UInt32 get() override
+          int8_t get() override
           {
-            return GeodeClassIds::CacheableIdentityHashMap;
+            return native::GeodeTypeIds::CacheableIdentityHashMap;
           }
         }
 
-        // End Region: IGeodeSerializable Members
+        // End Region: ISerializable Members
 
         /// <summary>
         /// Factory function to register this class.
         /// </summary>
-        static IGeodeSerializable^ CreateDeserializable()
+        static ISerializable^ CreateDeserializable()
         {
           return gcnew CacheableIdentityHashMap();
         }
diff --git a/clicache/src/CacheableKey.cpp b/clicache/src/CacheableKey.cpp
index 68347f3..0e52df9 100644
--- a/clicache/src/CacheableKey.cpp
+++ b/clicache/src/CacheableKey.cpp
@@ -31,12 +31,11 @@ namespace Apache
 
       namespace native = apache::geode::client;
 
-     // generic<class TKey>
       System::Int32 CacheableKey::GetHashCode()
       {
         try
         {
-          return static_cast<native::CacheableKey*>(m_nativeptr->get())->hashcode();
+          return dynamic_cast<native::CacheableKey*>(m_nativeptr->get())->hashcode();
         }
         finally
         {
@@ -44,16 +43,12 @@ namespace Apache
         }
       }
 
-     // generic<class TKey>
       bool CacheableKey::Equals(Client::ICacheableKey^ other)
       {
-        if (other == nullptr || other->ClassId != ClassId) {
-          return false;
-        }
         try
         {
-          return static_cast<native::CacheableKey*>(m_nativeptr->get())->operator==(
-            *static_cast<native::CacheableKey*>(
+          return dynamic_cast<native::CacheableKey*>(m_nativeptr->get())->operator==(
+            *dynamic_cast<native::CacheableKey*>(
             ((Client::CacheableKey^)other)->m_nativeptr->get()));
         }
         finally
@@ -63,61 +58,51 @@ namespace Apache
         }
       }
 
-      //generic<class TKey>
       bool CacheableKey::Equals(Object^ obj)
       {
         return Equals(dynamic_cast<CacheableKey^>(obj));
       }
 
-      //generic<class TKey>
       CacheableKey::operator CacheableKey^ (Byte value)
       {
         return (CacheableKey^) CacheableByte::Create(value);
       }
 
-      //generic<class TKey>
       CacheableKey::operator CacheableKey^ (bool value)
       {
         return (CacheableKey^) CacheableBoolean::Create(value);
       }
 
-      //generic<class TKey>
       CacheableKey::operator CacheableKey^ (Char value)
       {
         return (CacheableKey^) CacheableCharacter::Create(value);
       }
 
-      //generic<class TKey>
       CacheableKey::operator CacheableKey^ (Double value)
       {
         return (CacheableKey^) CacheableDouble::Create(value);
       }
 
-      //generic<class TKey>
       CacheableKey::operator CacheableKey^ (Single value)
       {
         return (CacheableKey^) CacheableFloat::Create(value);
       }
 
-      //generic<class TKey>
       CacheableKey::operator CacheableKey^ (System::Int16 value)
       {
         return (CacheableKey^) CacheableInt16::Create(value);
       }
 
-      //generic<class TKey>
       CacheableKey::operator CacheableKey^ (System::Int32 value)
       {
         return (CacheableKey^) CacheableInt32::Create(value);
       }
 
-     // generic<class TKey>
       CacheableKey::operator CacheableKey^ (System::Int64 value)
       {
         return (CacheableKey^) CacheableInt64::Create(value);
       }
 
-      //generic<class TKey>
       CacheableKey::operator CacheableKey ^ (String^ value)
       {
         return dynamic_cast<CacheableKey^>(CacheableString::Create(value));
diff --git a/clicache/src/CacheableKey.hpp b/clicache/src/CacheableKey.hpp
index cc85520..517c416 100644
--- a/clicache/src/CacheableKey.hpp
+++ b/clicache/src/CacheableKey.hpp
@@ -38,7 +38,7 @@ namespace Apache
 
       /// <summary>
       /// This class wraps the native C++ <c>apache::geode::client::Serializable</c> objects
-      /// as managed <see cref="../../IGeodeSerializable" /> objects.
+      /// as managed <see cref="../../ISerializable" /> objects.
       /// </summary>
       public ref class CacheableKey
         : public Serializable, public ICacheableKey
diff --git a/clicache/src/CacheableLinkedList.hpp b/clicache/src/CacheableLinkedList.hpp
index 7228705..0777f49 100644
--- a/clicache/src/CacheableLinkedList.hpp
+++ b/clicache/src/CacheableLinkedList.hpp
@@ -33,12 +33,12 @@ namespace Apache
     {
 
       /// <summary>
-      /// A mutable <c>IGeodeSerializable</c> vector wrapper that can serve as
+      /// A mutable <c>ISerializable</c> vector wrapper that can serve as
       /// a distributable object for caching. This class extends .NET generic
       /// <c>List</c> class.
       /// </summary>
       ref class CacheableLinkedList
-        : public IGeodeSerializable
+        : public IDataSerializablePrimitive
       {
         System::Collections::Generic::LinkedList<Object^>^ m_linkedList;
       public:
@@ -68,7 +68,7 @@ namespace Apache
         }
 
 
-        // Region: IGeodeSerializable Members
+        // Region: ISerializable Members
 
         /// <summary>
         /// Returns the classId of the instance being serialized.
@@ -76,15 +76,15 @@ namespace Apache
         /// type to create and deserialize into.
         /// </summary>
         /// <returns>the classId</returns>
-        virtual property System::UInt32 ClassId
+        property int8_t DsCode
         {
-          virtual System::UInt32 get()
+          virtual int8_t get()
           {
-            return GeodeClassIds::CacheableLinkedList;
+            return native::GeodeTypeIds::CacheableLinkedList;
           }
         }
 
-        // Region: IGeodeSerializable Members
+        // Region: ISerializable Members
 
         virtual void ToData(DataOutput^ output)
         {
@@ -124,12 +124,12 @@ namespace Apache
             return m_linkedList;
           }
         }
-        // End Region: IGeodeSerializable Members
+        // End Region: ISerializable Members
 
         /// <summary>
         /// Factory function to register this class.
         /// </summary>
-        static IGeodeSerializable^ CreateDeserializable()
+        static ISerializable^ CreateDeserializable()
         {
           return gcnew CacheableLinkedList(gcnew System::Collections::Generic::LinkedList<Object^>());
         }
diff --git a/clicache/src/CacheableObject.hpp b/clicache/src/CacheableObject.hpp
index db85b2e..4cccd79 100644
--- a/clicache/src/CacheableObject.hpp
+++ b/clicache/src/CacheableObject.hpp
@@ -19,8 +19,7 @@
 
 
 #include "geode_defs.hpp"
-#include "IGeodeSerializable.hpp"
-#include "GeodeClassIds.hpp"
+#include "IDataSerializablePrimitive.hpp"
 
 using namespace System;
 
@@ -41,7 +40,7 @@ namespace Apache
       /// [Serializable] attribute set or implements
       /// <see cref="System.Runtime.Serialization.ISerializable" /> interface.
       /// However, for better efficiency the latter should be avoided and the
-      /// user should implement <see cref="../../IGeodeSerializable" /> instead.
+      /// user should implement <see cref="../../ISerializable" /> instead.
       /// </para><para>
       /// The user must keep in mind that the rules that apply to runtime
       /// serialization would be the rules that apply to this class. For
@@ -52,7 +51,7 @@ namespace Apache
       /// </para>
       /// </remarks>
       public ref class CacheableObject
-        : public IGeodeSerializable
+        : public IDataSerializablePrimitive
       {
       public:
         /// <summary>
@@ -67,44 +66,20 @@ namespace Apache
                   nullptr);
         }
 
-        /// <summary>
-        /// Serializes this <see cref="System.Object" /> using
-        /// <see cref="System.Runtime.Serialization.Formatters.Binary.BinaryFormatter" /> class.
-        /// </summary>
-        /// <param name="output">
-        /// the DataOutput object to use for serializing the object
-        /// </param>
         virtual void ToData(DataOutput^ output);
 
-        /// <summary>
-        /// Deserializes the <see cref="System.Object" /> using
-        /// <see cref="System.Runtime.Serialization.Formatters.Binary.BinaryFormatter" /> class.
-        /// </summary>
-        /// <param name="input">
-        /// the DataInput stream to use for reading the object data
-        /// </param>
-        /// <returns>the deserialized object</returns>
         virtual void FromData(DataInput^ input);
 
-        /// <summary>
-        /// return the size of this object in bytes
-        /// </summary>
         virtual property System::UInt64 ObjectSize
         {
           virtual System::UInt64 get();
         }
 
-        /// <summary>
-        /// Returns the classId of the instance being serialized.
-        /// This is used by deserialization to determine what instance
-        /// type to create and deserialize into.
-        /// </summary>
-        /// <returns>the classId</returns>
-        virtual property System::UInt32 ClassId
+        property int8_t DsCode
         {
-          inline virtual System::UInt32 get()
+          virtual int8_t get()
           {
-            return GeodeClassIds::CacheableManagedObject;
+            return apache::geode::client::GeodeTypeIds::CacheableManagedObject;
           }
         }
 
@@ -133,7 +108,7 @@ namespace Apache
         /// <summary>
         /// Factory function to register this class.
         /// </summary>
-        static IGeodeSerializable^ CreateDeserializable()
+        static ISerializable^ CreateDeserializable()
         {
           return gcnew CacheableObject(nullptr);
         }
diff --git a/clicache/src/CacheableObjectArray.cpp b/clicache/src/CacheableObjectArray.cpp
index 7c328df..3208cfa 100644
--- a/clicache/src/CacheableObjectArray.cpp
+++ b/clicache/src/CacheableObjectArray.cpp
@@ -37,7 +37,7 @@ namespace Apache
     namespace Client
     {
 
-      // Region: IGeodeSerializable Members
+      // Region: ISerializable Members
 
       void CacheableObjectArray::ToData(DataOutput^ output)
       {
diff --git a/clicache/src/CacheableObjectArray.hpp b/clicache/src/CacheableObjectArray.hpp
index d34cfee..6ad7c55 100644
--- a/clicache/src/CacheableObjectArray.hpp
+++ b/clicache/src/CacheableObjectArray.hpp
@@ -17,11 +17,8 @@
 
 #pragma once
 
-
 #include "geode_defs.hpp"
-#include "IGeodeSerializable.hpp"
-#include "GeodeClassIds.hpp"
-
+#include "IDataSerializablePrimitive.hpp"
 
 using namespace System;
 using namespace System::Collections::Generic;
@@ -34,13 +31,13 @@ namespace Apache
     {
 
       /// <summary>
-      /// A mutable <c>IGeodeSerializable</c> object array wrapper that can serve
+      /// A mutable <c>ISerializable</c> object array wrapper that can serve
       /// as a distributable object for caching. Though this class provides
       /// compatibility with java Object[] serialization, it provides the
       /// semantics of .NET generic <c>List</c> class.
       /// </summary>
       public ref class CacheableObjectArray
-        : public List<Object^>, public IGeodeSerializable
+        : public List<Object^>, public IDataSerializablePrimitive
       {
       public:
         /// <summary>
@@ -96,54 +93,31 @@ namespace Apache
           return gcnew CacheableObjectArray(capacity);
         }
 
-        // Region: IGeodeSerializable Members
+        // Region: ISerializable Members
 
-        /// <summary>
-        /// Serializes this object.
-        /// </summary>
-        /// <param name="output">
-        /// the DataOutput object to use for serializing the object
-        /// </param>
         virtual void ToData(DataOutput^ output);
 
-        /// <summary>
-        /// Deserialize this object, typical implementation should return
-        /// the 'this' pointer.
-        /// </summary>
-        /// <param name="input">
-        /// the DataInput stream to use for reading the object data
-        /// </param>
-        /// <returns>the deserialized object</returns>
         virtual void FromData(DataInput^ input);
 
-        /// <summary>
-        /// return the size of this object in bytes
-        /// </summary>
-        virtual property System::UInt64 ObjectSize
+        property System::UInt64 ObjectSize
         {
           virtual System::UInt64 get();
         }
 
-        /// <summary>
-        /// Returns the classId of the instance being serialized.
-        /// This is used by deserialization to determine what instance
-        /// type to create and deserialize into.
-        /// </summary>
-        /// <returns>the classId</returns>
-        virtual property System::UInt32 ClassId
+        property int8_t DsCode
         {
-          virtual System::UInt32 get()
+          virtual int8_t get()
           {
-            return GeodeClassIds::CacheableObjectArray;
+            return GeodeTypeIds::CacheableObjectArray;
           }
         }
 
-        // End Region: IGeodeSerializable Members
+        // End Region: ISerializable Members
 
         /// <summary>
         /// Factory function to register this class.
         /// </summary>
-        static IGeodeSerializable^ CreateDeserializable()
+        static ISerializable^ CreateDeserializable()
         {
           return gcnew CacheableObjectArray();
         }
diff --git a/clicache/src/CacheableObjectXml.hpp b/clicache/src/CacheableObjectXml.hpp
index 2ebb652..20a32bd 100644
--- a/clicache/src/CacheableObjectXml.hpp
+++ b/clicache/src/CacheableObjectXml.hpp
@@ -19,8 +19,7 @@
 
 
 #include "geode_defs.hpp"
-#include "IGeodeSerializable.hpp"
-#include "GeodeClassIds.hpp"
+#include "IDataSerializablePrimitive.hpp"
 
 using namespace System;
 
@@ -44,7 +43,7 @@ namespace Apache
       /// of the object (or implement the <see cref="System.Xml.Serialization.IXmlSerializable" />)
       /// to change the serialization/deserialization. However, the latter should
       /// be avoided for efficiency reasons and the user should implement
-      /// <see cref="../../IGeodeSerializable" /> instead.
+      /// <see cref="../../ISerializable" /> instead.
       /// </para><para>
       /// The user must keep in mind that the rules that apply to <c>XmlSerializer</c>
       /// would be the rules that apply to this class. For instance the user
@@ -55,7 +54,7 @@ namespace Apache
       /// </para>
       /// </remarks>
       public ref class CacheableObjectXml
-        : public IGeodeSerializable
+        : public ISerializable
       {
       public:
         /// <summary>
@@ -70,44 +69,20 @@ namespace Apache
                   nullptr);
         }
 
-        /// <summary>
-        /// Serializes this <see cref="System.Object" /> using
-        /// <see cref="System.Xml.Serialization.XmlSerializer" /> class.
-        /// </summary>
-        /// <param name="output">
-        /// the DataOutput object to use for serializing the object
-        /// </param>
         virtual void ToData(DataOutput^ output);
 
-        /// <summary>
-        /// Deserializes the <see cref="System.Object" /> using
-        /// <see cref="System.Xml.Serialization.XmlSerializer" /> class.
-        /// </summary>
-        /// <param name="input">
-        /// the DataInput stream to use for reading the object data
-        /// </param>
-        /// <returns>the deserialized object</returns>
         virtual void FromData(DataInput^ input);
 
-        /// <summary>
-        /// return the size of this object in bytes
-        /// </summary>
         virtual property System::UInt64 ObjectSize
         {
           virtual System::UInt64 get();
         }
 
-        /// <summary>
-        /// Returns the classId of the instance being serialized.
-        /// This is used by deserialization to determine what instance
-        /// type to create and deserialize into.
-        /// </summary>
-        /// <returns>the classId</returns>
-        virtual property System::UInt32 ClassId
+        property int8_t DsCode
         {
-          inline virtual System::UInt32 get()
+          virtual int8_t get()
           {
-            return GeodeClassIds::CacheableManagedObjectXml;
+            return apache::geode::client::GeodeTypeIds::CacheableManagedObjectXml;
           }
         }
 
@@ -136,7 +111,7 @@ namespace Apache
         /// <summary>
         /// Factory function to register this class.
         /// </summary>
-        static IGeodeSerializable^ CreateDeserializable()
+        static ISerializable^ CreateDeserializable()
         {
           return gcnew CacheableObjectXml(nullptr);
         }
diff --git a/clicache/src/CacheableStack.cpp b/clicache/src/CacheableStack.cpp
index 3c23438..ab819a7 100644
--- a/clicache/src/CacheableStack.cpp
+++ b/clicache/src/CacheableStack.cpp
@@ -25,7 +25,6 @@
 #include <GeodeTypeIdsImpl.hpp>
 #include "end_native.hpp"
 #include "impl/SafeConvert.hpp"
-#include "GeodeClassIds.hpp"
 
 using namespace System;
 using namespace System::Collections::Generic;
@@ -37,14 +36,15 @@ namespace Apache
     namespace Client
     {
 
-      // Region: IGeodeSerializable Members
+      // Region: ISerializable Members
 
       void CacheableStack::ToData(DataOutput^ output)
       {
         if (m_stack != nullptr)
         {
           output->WriteArrayLen((System::Int32)m_stack->Count);
-          for each (Object^ obj in m_stack) {
+          auto stack = safe_cast<System::Collections::Generic::Stack<Object^>^>(m_stack);
+          for each (auto obj in Linq::Enumerable::Reverse(stack)) {
             output->WriteObject(obj);
           }
         }
@@ -56,27 +56,27 @@ namespace Apache
 
       void CacheableStack::FromData(DataInput^ input)
       {
-        int len = input->ReadArrayLen();
+        auto len = input->ReadArrayLen();
         if (len > 0)
         {
-          System::Collections::Generic::Stack<Object^>^ stack = safe_cast<System::Collections::Generic::Stack<Object^>^>(m_stack);
+          auto stack = safe_cast<System::Collections::Generic::Stack<Object^>^>(m_stack);
           for (int i = 0; i < len; i++)
           {
-            (stack)->Push(input->ReadObject());
+            stack->Push(input->ReadObject());
           }
         }
       }
 
-      System::UInt32 CacheableStack::ClassId::get()
+      int8_t CacheableStack::DsCode::get()
       {
-        return GeodeClassIds::CacheableStack;
+        return native::GeodeTypeIds::CacheableStack;
       }
 
       System::UInt64 CacheableStack::ObjectSize::get()
       {
         //TODO:
         /*System::UInt32 size = static_cast<System::UInt32> (sizeof(CacheableStack^));
-        for each (IGeodeSerializable^ val in this) {
+        for each (ISerializable^ val in this) {
         if (val != nullptr) {
         size += val->ObjectSize;
         }
diff --git a/clicache/src/CacheableStack.hpp b/clicache/src/CacheableStack.hpp
index d71cb05..705cf86 100644
--- a/clicache/src/CacheableStack.hpp
+++ b/clicache/src/CacheableStack.hpp
@@ -19,7 +19,7 @@
 
 
 #include "geode_defs.hpp"
-#include "IGeodeSerializable.hpp"
+#include "IDataSerializablePrimitive.hpp"
 
 
 using namespace System;
@@ -33,11 +33,11 @@ namespace Apache
     {
 
       /// <summary>
-      /// A mutable <c>IGeodeSerializable</c> vector wrapper that can serve as
+      /// A mutable <c>ISerializable</c> vector wrapper that can serve as
       /// a distributable object for caching.
       /// </summary>
       ref class CacheableStack
-        : public IGeodeSerializable
+        : public IDataSerializablePrimitive
       {
       public:
         /// <summary>
@@ -66,7 +66,7 @@ namespace Apache
 
         
         
-        // Region: IGeodeSerializable Members
+        // Region: ISerializable Members
 
         /// <summary>
         /// Serializes this object.
@@ -100,9 +100,9 @@ namespace Apache
         /// type to create and deserialize into.
         /// </summary>
         /// <returns>the classId</returns>
-        virtual property System::UInt32 ClassId
+        property int8_t DsCode
         {
-          virtual System::UInt32 get();
+          virtual int8_t get();
         }
 
         virtual property System::Collections::ICollection^ Value
@@ -112,12 +112,12 @@ namespace Apache
             return m_stack;
           }
         }
-        // End Region: IGeodeSerializable Members
+        // End Region: ISerializable Members
 
         /// <summary>
         /// Factory function to register this class.
         /// </summary>
-        static IGeodeSerializable^ CreateDeserializable()
+        static ISerializable^ CreateDeserializable()
         {
           return gcnew CacheableStack(gcnew System::Collections::Generic::Stack<Object^>());
         }
diff --git a/clicache/src/CacheableString.cpp b/clicache/src/CacheableString.cpp
index 14db878..934f537 100644
--- a/clicache/src/CacheableString.cpp
+++ b/clicache/src/CacheableString.cpp
@@ -36,12 +36,12 @@ namespace Apache
 
       void CacheableString::ToData(DataOutput^ output)
       {
-        if (m_type == GeodeClassIds::CacheableASCIIString ||
-            m_type == GeodeClassIds::CacheableString)
+        if (m_type == GeodeTypeIds::CacheableASCIIString ||
+            m_type == GeodeTypeIds::CacheableString)
         {
           output->WriteUTF(m_value);
         }
-        else if (m_type == GeodeClassIds::CacheableASCIIStringHuge)
+        else if (m_type == GeodeTypeIds::CacheableASCIIStringHuge)
         {
           output->WriteASCIIHuge(m_value);
         }
@@ -53,12 +53,12 @@ namespace Apache
 
       void CacheableString::FromData(DataInput^ input)
       {
-        if (m_type == GeodeClassIds::CacheableASCIIString ||
-            m_type == GeodeClassIds::CacheableString)
+        if (m_type == GeodeTypeIds::CacheableASCIIString ||
+            m_type == GeodeTypeIds::CacheableString)
         {
           m_value = input->ReadUTF();
         }
-        else if (m_type == GeodeClassIds::CacheableASCIIStringHuge)
+        else if (m_type == GeodeTypeIds::CacheableASCIIStringHuge)
         {
           m_value = input->ReadASCIIHuge();
         }
@@ -113,17 +113,7 @@ namespace Apache
 
       bool CacheableString::Equals(Apache::Geode::Client::ICacheableKey^ other)
       {
-        if (other == nullptr || other->ClassId != ClassId) {
-          return false;
-        }
-
-        CacheableString^ otherStr =
-          dynamic_cast<CacheableString^>(other);
-
-        if (otherStr == nullptr)
-          return false;
-
-        return m_value->Equals(otherStr->Value);//TODO::
+        return Equals((Object^) other);
       }
 
       bool CacheableString::Equals(Object^ obj)
@@ -162,16 +152,16 @@ namespace Apache
         if (len == m_value->Length)//ASCII string
         {
           if (len > 0xFFFF)
-            m_type = GeodeClassIds::CacheableASCIIStringHuge;
+            m_type = GeodeTypeIds::CacheableASCIIStringHuge;
           else
-            m_type = GeodeClassIds::CacheableASCIIString;
+            m_type = GeodeTypeIds::CacheableASCIIString;
         }
         else
         {
           if (len > 0xFFFF)
-            m_type = GeodeClassIds::CacheableStringHuge;
+            m_type = GeodeTypeIds::CacheableStringHuge;
           else
-            m_type = GeodeClassIds::CacheableString;
+            m_type = GeodeTypeIds::CacheableString;
         }  // namespace Client
       }  // namespace Geode
     }  // namespace Apache
diff --git a/clicache/src/CacheableString.hpp b/clicache/src/CacheableString.hpp
index ce7bf97..4465c59 100644
--- a/clicache/src/CacheableString.hpp
+++ b/clicache/src/CacheableString.hpp
@@ -17,8 +17,7 @@
 
 #pragma once
 
-
-
+#include <msclr/marshal.h>
 
 #include "geode_defs.hpp"
 #include "begin_native.hpp"
@@ -26,7 +25,7 @@
 #include "end_native.hpp"
 
 #include "CacheableKey.hpp"
-#include "GeodeClassIds.hpp"
+#include "IDataSerializablePrimitive.hpp"
 
 using namespace System;
 
@@ -42,7 +41,7 @@ namespace Apache
       /// key object for caching as well as being a string value.
       /// </summary>
       ref class CacheableString
-        : public CacheableKey
+        :  public IDataSerializablePrimitive, public CacheableKey
       {
       public:
         /// <summary>
@@ -80,45 +79,21 @@ namespace Apache
                   gcnew CacheableString(value, true) : nullptr);
         }
 
-        /// <summary>
-        /// Serializes this managed object.
-        /// </summary>
-        /// <param name="output">
-        /// the DataOutput object to use for serializing the object
-        /// </param>
-        virtual void ToData(DataOutput^ output) override;
+        virtual void ToData(DataOutput^ output);
 
-        /// <summary>
-        /// Deserializes the managed object -- returns an instance of the
-        /// <c>IGeodeSerializable</c> class.
-        /// </summary>
-        /// <param name="input">
-        /// the DataInput stream to use for reading the object data
-        /// </param>
-        /// <returns>the deserialized object</returns>
-        virtual void FromData(DataInput^ input) override;
+        virtual void FromData(DataInput^ input);
 
-        // <summary>
-        /// Returns the classId of the instance being serialized.
-        /// This is used by deserialization to determine what instance
-        /// type to create and deserialize into.
-        /// </summary>
-        /// <returns>the classId</returns>
-        virtual property System::UInt32 ClassId
+        property int8_t DsCode
         {
-          virtual System::UInt32 get() override
+          virtual int8_t get()
           {
             return m_type;
           }
         }
 
-
-        /// <summary>
-        /// return the size of this object in bytes
-        /// </summary>
-        virtual property System::UInt64 ObjectSize
+        property System::UInt64 ObjectSize
         {
-          virtual System::UInt64 get() override;
+          System::UInt64 get() override;
         }
 
         /// <summary>
@@ -220,32 +195,35 @@ namespace Apache
         }
 
       internal:
-        static IGeodeSerializable^ CreateDeserializable()
+        static ISerializable^ CreateDeserializable()
         {
-          return gcnew CacheableString(GeodeClassIds::CacheableASCIIString);
+          return gcnew CacheableString(GeodeTypeIds::CacheableASCIIString);
         }
 
-        static IGeodeSerializable^ createDeserializableHuge()
+        static ISerializable^ createDeserializableHuge()
         {
-          return gcnew CacheableString(GeodeClassIds::CacheableASCIIStringHuge);
+          return gcnew CacheableString(GeodeTypeIds::CacheableASCIIStringHuge);
         }
 
-        static IGeodeSerializable^ createUTFDeserializable()
+        static ISerializable^ createUTFDeserializable()
         {
-          return gcnew CacheableString(GeodeClassIds::CacheableString);
+          return gcnew CacheableString(GeodeTypeIds::CacheableString);
         }
 
-        static IGeodeSerializable^ createUTFDeserializableHuge()
+        static ISerializable^ createUTFDeserializableHuge()
         {
-          return gcnew CacheableString(GeodeClassIds::CacheableStringHuge);
+          return gcnew CacheableString(GeodeTypeIds::CacheableStringHuge);
         }
         /// <summary>
         /// Factory function to register wrapper
         /// </summary>
-        static IGeodeSerializable^ Create(std::shared_ptr<apache::geode::client::Serializable> obj)
+        static ISerializable^ Create(std::shared_ptr<apache::geode::client::Serializable> obj)
         {
-          return (obj != nullptr ?
-                  gcnew CacheableString(obj) : nullptr);
+          if (auto str = std::dynamic_pointer_cast<apache::geode::client::CacheableString>(obj)) {
+            return gcnew CacheableString(str);
+          }
+
+          return nullptr;
         }
 
         CacheableString(System::UInt32 type) : CacheableKey()
@@ -255,12 +233,12 @@ namespace Apache
 
       private:
         String^ m_value;
-        System::UInt32 m_type;
+        int8_t m_type;
         int m_hashcode;
 
         CacheableString() : CacheableKey()
         {
-          m_type = GeodeClassIds::CacheableASCIIString;
+          m_type = GeodeTypeIds::CacheableASCIIString;
         }
 
         void SetStringType();
@@ -280,8 +258,13 @@ namespace Apache
         /// Private constructor to wrap a native object pointer
         /// </summary>
         /// <param name="nativeptr">The native object pointer</param>
-        inline CacheableString(std::shared_ptr<apache::geode::client::Serializable> nativeptr)
-          : CacheableKey(nativeptr) { }
+        inline CacheableString(std::shared_ptr<apache::geode::client::CacheableString> nativeptr)
+          : CacheableKey(nativeptr) {
+        
+          m_value = msclr::interop::marshal_as<String^>(nativeptr->value());
+          m_type = nativeptr->getDsCode();
+          m_hashcode = nativeptr->hashcode();
+        }
       };
     }  // namespace Client
   }  // namespace Geode
diff --git a/clicache/src/CacheableStringArray.cpp b/clicache/src/CacheableStringArray.cpp
index ed5e5af..c82b344 100644
--- a/clicache/src/CacheableStringArray.cpp
+++ b/clicache/src/CacheableStringArray.cpp
@@ -33,7 +33,6 @@ namespace Apache
     {
 
       CacheableStringArray::CacheableStringArray(array<String^>^ strings)
-        : Serializable()
       {
         m_value = strings;
       }
diff --git a/clicache/src/CacheableStringArray.hpp b/clicache/src/CacheableStringArray.hpp
index 883eb8e..5b7c8d1 100644
--- a/clicache/src/CacheableStringArray.hpp
+++ b/clicache/src/CacheableStringArray.hpp
@@ -26,7 +26,6 @@
 #include "end_native.hpp"
 
 #include "Serializable.hpp"
-#include "GeodeClassIds.hpp"
 #include "CacheableString.hpp"
 
 using namespace System;
@@ -45,7 +44,7 @@ namespace Apache
       /// a distributable object for caching.
       /// </summary>
       ref class CacheableStringArray
-        : public Serializable
+        :  public IDataSerializablePrimitive
       {
       public:
         /// <summary>
@@ -65,45 +64,21 @@ namespace Apache
                   gcnew CacheableStringArray(strings) : nullptr);
         }
 
-        /// <summary>
-        /// Serializes this managed object.
-        /// </summary>
-        /// <param name="output">
-        /// the DataOutput object to use for serializing the object
-        /// </param>
-        virtual void ToData(DataOutput^ output) override;
-
-        /// <summary>
-        /// Deserializes the managed object -- returns an instance of the
-        /// <c>IGeodeSerializable</c> class.
-        /// </summary>
-        /// <param name="input">
-        /// the DataInput stream to use for reading the object data
-        /// </param>
-        /// <returns>the deserialized object</returns>
-        virtual void FromData(DataInput^ input) override;
+        virtual void ToData(DataOutput^ output);
 
+        virtual void FromData(DataInput^ input);
 
-        /// <summary>
-        /// Returns the classId of the instance being serialized.
-        /// This is used by deserialization to determine what instance
-        /// type to create and deserialize into.
-        /// </summary>
-        /// <returns>the classId</returns>
-        virtual property System::UInt32 ClassId
+        property int8_t DsCode
         {
-          virtual System::UInt32 get() override
+          virtual int8_t get()
           {
-            return GeodeClassIds::CacheableStringArray;
+            return GeodeTypeIds::CacheableStringArray;
           }
         }
 
-        /// <summary>
-        /// return the size of this object in bytes
-        /// </summary>
-        virtual property System::UInt64 ObjectSize
+        property System::UInt64 ObjectSize
         {
-          virtual System::UInt64 get() override
+          virtual System::UInt64 get()
           {
             auto size = sizeof(this);
             for (int i = 0; i < m_value->Length; i++)
@@ -147,20 +122,11 @@ namespace Apache
         /// <summary>
         /// Factory function to register this class.
         /// </summary>
-        static IGeodeSerializable^ CreateDeserializable()
+        static ISerializable^ CreateDeserializable()
         {
           return gcnew CacheableStringArray();
         }
 
-      internal:
-        /// <summary>
-        /// Factory function to register wrapper
-        /// </summary>
-        static IGeodeSerializable^ Create(std::shared_ptr<apache::geode::client::Serializable> obj)
-        {
-          return (obj != nullptr ?
-                  gcnew CacheableStringArray(obj) : nullptr);
-        }
 
       private:
         array<String^>^ m_value;
@@ -174,18 +140,8 @@ namespace Apache
 
 
         inline CacheableStringArray()
-          : Serializable()
         {
-          //apache::geode::client::Serializable* sp = apache::geode::client::CacheableStringArray::createDeserializable();
-          //SetSP(sp);
         }
-
-        /// <summary>
-        /// Private constructor to wrap a native object pointer
-        /// </summary>
-        /// <param name="nativeptr">The native object pointer</param>
-        inline CacheableStringArray(std::shared_ptr<apache::geode::client::Serializable> nativeptr)
-          : Serializable(nativeptr) { }
       };
     }  // namespace Client
   }  // namespace Geode
diff --git a/clicache/src/CacheableUndefined.cpp b/clicache/src/CacheableUndefined.cpp
index 975cb62..2c0b7c6 100644
--- a/clicache/src/CacheableUndefined.cpp
+++ b/clicache/src/CacheableUndefined.cpp
@@ -33,7 +33,7 @@ namespace Apache
     namespace Client
     {
 
-      // Region: IGeodeSerializable Members
+      // Region: ISerializable Members
 
       void CacheableUndefined::ToData(DataOutput^ output)
       {
diff --git a/clicache/src/CacheableUndefined.hpp b/clicache/src/CacheableUndefined.hpp
index d1f606a..ff9935d 100644
--- a/clicache/src/CacheableUndefined.hpp
+++ b/clicache/src/CacheableUndefined.hpp
@@ -19,8 +19,8 @@
 
 
 #include "geode_defs.hpp"
-#include "IGeodeSerializable.hpp"
-#include "GeodeClassIds.hpp"
+#include "IDataSerializableFixedId.hpp"
+#include "ISerializable.hpp"
 #include "Log.hpp"
 
 using namespace System;
@@ -31,12 +31,14 @@ namespace Apache
   {
     namespace Client
     {
+		  
+			namespace native = apache::geode::client;
 
       /// <summary>
       /// Encapsulate an undefined result.
       /// </summary>
       public ref class CacheableUndefined
-        : public IGeodeSerializable
+        : public IDataSerializableFixedId
       {
       public:
         /// <summary>
@@ -52,7 +54,7 @@ namespace Apache
           return gcnew CacheableUndefined();
         }
 
-        // Region: IGeodeSerializable Members
+        // Region: ISerializable Members
 
         /// <summary>
         /// Serializes this object.
@@ -86,20 +88,20 @@ namespace Apache
         /// type to create and deserialize into.
         /// </summary>
         /// <returns>the classId</returns>
-        virtual property System::UInt32 ClassId
+        property Int32 DSFID
         {
-          inline virtual System::UInt32 get()
+          virtual Int32 get()
           {
-            return GeodeClassIds::CacheableUndefined;
+            return native::GeodeTypeIds::CacheableUndefined;
           }
         }
 
-        // End Region: IGeodeSerializable Members
+        // End Region: ISerializable Members
 
         /// <summary>
         /// Factory function to register this class.
         /// </summary>
-        static IGeodeSerializable^ CreateDeserializable()
+        static ISerializable^ CreateDeserializable()
         {
           return gcnew CacheableUndefined();
         }
diff --git a/clicache/src/CacheableVector.cpp b/clicache/src/CacheableVector.cpp
index dc5ccc0..8fdafbd 100644
--- a/clicache/src/CacheableVector.cpp
+++ b/clicache/src/CacheableVector.cpp
@@ -35,7 +35,7 @@ namespace Apache
     namespace Client
     {
 
-      // Region: IGeodeSerializable Members
+      // Region: ISerializable Members
 
       void CacheableVector::ToData(DataOutput^ output)
       {
@@ -64,7 +64,7 @@ namespace Apache
       { 
         //TODO::
         /*System::UInt32 size = static_cast<System::UInt32> (sizeof(CacheableVector^));
-        for each (IGeodeSerializable^ val in this) {
+        for each (ISerializable^ val in this) {
           if (val != nullptr) {
             size += val->ObjectSize;
           }
diff --git a/clicache/src/CacheableVector.hpp b/clicache/src/CacheableVector.hpp
index 748ad57..64d492a 100644
--- a/clicache/src/CacheableVector.hpp
+++ b/clicache/src/CacheableVector.hpp
@@ -19,8 +19,8 @@
 
 
 #include "geode_defs.hpp"
-#include "IGeodeSerializable.hpp"
-#include "GeodeClassIds.hpp"
+#include "IDataSerializablePrimitive.hpp"
+#include "ISerializable.hpp"
 
 
 using namespace System;
@@ -32,14 +32,15 @@ namespace Apache
   {
     namespace Client
     {
+			namespace native = apache::geode::client;
 
       /// <summary>
-      /// A mutable <c>IGeodeSerializable</c> vector wrapper that can serve as
+      /// A mutable <c>ISerializable</c> vector wrapper that can serve as
       /// a distributable object for caching. This class extends .NET generic
       /// <c>List</c> class.
       /// </summary>
       ref class CacheableVector
-        : public IGeodeSerializable
+        : public IDataSerializablePrimitive
       {
       public:
         /// <summary>
@@ -68,7 +69,7 @@ namespace Apache
         }
 
 
-        // Region: IGeodeSerializable Members
+        // Region: ISerializable Members
 
         /// <summary>
         /// Serializes this object.
@@ -102,11 +103,11 @@ namespace Apache
         /// type to create and deserialize into.
         /// </summary>
         /// <returns>the classId</returns>
-        virtual property System::UInt32 ClassId
+        property int8_t DsCode
         {
-          virtual System::UInt32 get()
+          virtual int8_t get()
           {
-            return GeodeClassIds::CacheableVector;
+            return native::GeodeTypeIds::CacheableVector;
           }
         }
 
@@ -118,12 +119,12 @@ namespace Apache
           }
         }
 
-        // End Region: IGeodeSerializable Members
+        // End Region: ISerializable Members
 
         /// <summary>
         /// Factory function to register this class.
         /// </summary>
-        static IGeodeSerializable^ CreateDeserializable()
+        static ISerializable^ CreateDeserializable()
         {
           return gcnew CacheableVector(gcnew System::Collections::ArrayList());
         }
diff --git a/clicache/src/CqEvent.hpp b/clicache/src/CqEvent.hpp
index cc16e20..846ef61 100644
--- a/clicache/src/CqEvent.hpp
+++ b/clicache/src/CqEvent.hpp
@@ -40,7 +40,7 @@ namespace Apache
     {
       namespace native = apache::geode::client;
 
-			interface class IGeodeSerializable;
+			interface class ISerializable;
       
       /// <summary>
       /// This class encapsulates events that occur for cq.
diff --git a/clicache/src/DataInput.cpp b/clicache/src/DataInput.cpp
index 86737b6..4203874 100644
--- a/clicache/src/DataInput.cpp
+++ b/clicache/src/DataInput.cpp
@@ -36,6 +36,7 @@
 #include "CacheableIDentityHashMap.hpp"
 #include "CacheableDate.hpp"
 #include "CacheableObjectArray.hpp"
+#include "IDataSerializable.hpp"
 #include "Serializable.hpp"
 #include "impl/PdxHelper.hpp"
 #include "impl/PdxWrapper.hpp"
@@ -452,7 +453,7 @@ namespace Apache
         {
         case apache::geode::client::GeodeTypeIds::CacheableByte:
         {
-          return ReadSByte();
+          return ReadByte();
         }
         case apache::geode::client::GeodeTypeIds::CacheableBoolean:
         {
@@ -658,12 +659,12 @@ namespace Apache
         bool findinternal = false;
         int8_t typeId = ReadByte();
         System::Int64 compId = typeId;
-        TypeFactoryMethodGeneric^ createType = nullptr;
+        TypeFactoryMethod^ createType = nullptr;
 
         if (compId == GeodeTypeIds::NullObj) {
           return nullptr;
         }
-        else if (compId == GeodeClassIds::PDX)
+        else if (compId == GeodeTypeIdsImpl::PDX)
         {
           //cache current state and reset after reading pdx object
           auto cacheCursor = m_cursor;
@@ -678,16 +679,14 @@ namespace Apache
 
           if (ret != nullptr)
           {
-            Apache::Geode::Client::PdxWrapper^ pdxWrapper = dynamic_cast<Apache::Geode::Client::PdxWrapper^>(ret);
-
-            if (pdxWrapper != nullptr)
+            if (auto pdxWrapper = dynamic_cast<Apache::Geode::Client::PdxWrapper^>(ret))
             {
               return pdxWrapper->GetObject();
             }
           }
           return ret;
         }
-        else if (compId == GeodeClassIds::PDX_ENUM)
+        else if (compId == GeodeTypeIdsImpl::PDX_ENUM)
         {
           int8_t dsId = ReadByte();
           int tmp = ReadArrayLen();
@@ -732,8 +731,7 @@ namespace Apache
           findinternal = true;
         }
         if (findinternal) {
-          compId += 0x80000000;
-          createType = m_cache->TypeRegistry->GetManagedDelegateGeneric((System::Int64)compId);
+          createType = m_cache->TypeRegistry->GetDataSerializableFixedTypeFactoryMethodForFixedId((Int32)compId);
         }
         else {
           createType = m_cache->TypeRegistry->GetManagedDelegateGeneric(compId);
@@ -748,15 +746,8 @@ namespace Apache
             {//object array and pdxSerialization
               return readDotNetObjectArray();
             }
-            compId += 0x80000000;
-            createType = m_cache->TypeRegistry->GetManagedDelegateGeneric(compId);
-
-            /*if (createType == nullptr)
-            {
-            //TODO:: final check for user type if its not in cache
-            compId -= 0x80000000;
-            createType = Serializable::GetManagedDelegate(compId);
-            }*/
+            
+            createType = m_cache->TypeRegistry->GetDataSerializablePrimitiveTypeFactoryMethodForDsCode(typeId);
           }
         }
 
@@ -766,8 +757,25 @@ namespace Apache
 
         bool isPdxDeserialization = m_ispdxDesrialization;
         m_ispdxDesrialization = false;//for nested objects
-        IGeodeSerializable^ newObj = createType();
-        newObj->FromData(this);
+        ISerializable^ newObj = createType();
+
+        if (auto dataSerializable = dynamic_cast<IDataSerializablePrimitive^>(newObj))
+        {
+          dataSerializable->FromData(this);
+        }
+        else if (auto dataSerializable = dynamic_cast<IDataSerializable^>(newObj))
+        {
+          dataSerializable->FromData(this);
+        }
+        else if (auto dataSerializableFixedId = dynamic_cast<IDataSerializableFixedId^>(newObj))
+        {
+          dataSerializableFixedId->FromData(this);
+        }
+        else
+        {
+          throw gcnew IllegalStateException("Unknown serialization type.");
+        }
+
         m_ispdxDesrialization = isPdxDeserialization;
         return newObj;
         }
@@ -808,83 +816,6 @@ namespace Apache
         return nullptr;
       }
 
-      Object^ DataInput::ReadInternalGenericObject()
-      {
-        bool findinternal = false;
-        int8_t typeId = ReadByte();
-        System::Int64 compId = typeId;
-        TypeFactoryMethodGeneric^ createType = nullptr;
-
-        if (compId == GeodeTypeIds::NullObj) {
-          return nullptr;
-        }
-        else if (compId == GeodeClassIds::PDX)
-        {
-          return Internal::PdxHelper::DeserializePdx(this, false, CacheRegionHelper::getCacheImpl(m_cache->GetNative().get())->getSerializationRegistry().get());
-        }
-        else if (compId == GeodeTypeIds::CacheableNullString) {
-          //return SerializablePtr(CacheableString::createDeserializable());
-          //TODO::
-          return nullptr;
-        }
-        else if (compId == GeodeTypeIdsImpl::CacheableUserData) {
-          int8_t classId = ReadByte();
-          //compId |= ( ( (System::Int64)classId ) << 32 );
-          compId = (System::Int64)classId;
-        }
-        else if (compId == GeodeTypeIdsImpl::CacheableUserData2) {
-          System::Int16 classId = ReadInt16();
-          //compId |= ( ( (System::Int64)classId ) << 32 );
-          compId = (System::Int64)classId;
-        }
-        else if (compId == GeodeTypeIdsImpl::CacheableUserData4) {
-          System::Int32 classId = ReadInt32();
-          //compId |= ( ( (System::Int64)classId ) << 32 );
-          compId = (System::Int64)classId;
-        }
-        else if (compId == GeodeTypeIdsImpl::FixedIDByte) {//TODO: need to verify again
-          int8_t fixedId = ReadByte();
-          compId = fixedId;
-          findinternal = true;
-        }
-        else if (compId == GeodeTypeIdsImpl::FixedIDShort) {
-          System::Int16 fixedId = ReadInt16();
-          compId = fixedId;
-          findinternal = true;
-        }
-        else if (compId == GeodeTypeIdsImpl::FixedIDInt) {
-          System::Int32 fixedId = ReadInt32();
-          compId = fixedId;
-          findinternal = true;
-        }
-        if (findinternal) {
-          compId += 0x80000000;
-          createType = m_cache->TypeRegistry->GetManagedDelegateGeneric((System::Int64)compId);
-        }
-        else {
-          createType = m_cache->TypeRegistry->GetManagedDelegateGeneric(compId);
-          if (createType == nullptr)
-          {
-            Object^ retVal = ReadDotNetTypes(typeId);
-
-            if (retVal != nullptr)
-              return retVal;
-
-            compId += 0x80000000;
-            createType = m_cache->TypeRegistry->GetManagedDelegateGeneric(compId);
-          }
-        }
-
-        if (createType != nullptr)
-        {
-          IGeodeSerializable^ newObj = createType();
-          newObj->FromData(this);
-          return newObj;
-        }
-
-        throw gcnew IllegalStateException("Unregistered typeId in deserialization, aborting.");
-      }
-
       size_t DataInput::BytesRead::get()
       {
         AdvanceUMCursor();
diff --git a/clicache/src/DataInput.hpp b/clicache/src/DataInput.hpp
index 1b3d8df..3906e40 100644
--- a/clicache/src/DataInput.hpp
+++ b/clicache/src/DataInput.hpp
@@ -38,13 +38,13 @@ namespace Apache
 
       namespace native = apache::geode::client;
 
-      interface class IGeodeSerializable;
+      interface class ISerializable;
 
       ref class Cache;
 
       /// <summary>
       /// Provides operations for reading primitive data values, byte arrays,
-      /// strings, <c>IGeodeSerializable</c> objects from a byte stream.
+      /// strings, <c>ISerializable</c> objects from a byte stream.
       /// </summary>
       public ref class DataInput sealed
       {
@@ -643,9 +643,6 @@ namespace Apache
 
         void CheckBufferSize(int size);
        
-
-        Object^ ReadInternalGenericObject();
-
         Object^ ReadInternalObject();
 
         DataInput^ GetClone();
diff --git a/clicache/src/DataOutput.cpp b/clicache/src/DataOutput.cpp
index dded088..24e1638 100644
--- a/clicache/src/DataOutput.cpp
+++ b/clicache/src/DataOutput.cpp
@@ -25,7 +25,8 @@
 
 
 #include "DataOutput.hpp"
-#include "IGeodeSerializable.hpp"
+#include "IDataSerializable.hpp"
+#include "ISerializable.hpp"
 #include "CacheableObjectArray.hpp"
 #include "impl/PdxHelper.hpp"
 #include "impl/PdxWrapper.hpp"
@@ -322,7 +323,7 @@ namespace Apache
         this->WriteArrayLen(list->Count);
         WriteByte((int8_t)apache::geode::client::GeodeTypeIdsImpl::Class);
         String^ pdxDomainClassname = m_cache->TypeRegistry->GetPdxTypeName(objectArray->GetType()->GetElementType()->FullName);
-        WriteByte((int8_t)apache::geode::client::GeodeTypeIds::CacheableASCIIString);
+        WriteByte((int8_t)GeodeTypeIds::CacheableASCIIString);
         WriteUTF(pdxDomainClassname);
         for each(Object^ o in list)
           WriteObject(o);
@@ -428,12 +429,12 @@ namespace Apache
 
       /*void DataOutput::WriteObject( Object^ obj )
       {
-      WriteObjectInternal((IGeodeSerializable^)obj);
+      WriteObjectInternal((ISerializable^)obj);
       }*/
 
       /*void DataOutput::WriteObject( Object^ obj )
       {
-      WriteObject( (IGeodeSerializable^)obj );
+      WriteObject( (ISerializable^)obj );
       }*/
 
       int8_t DataOutput::GetTypeId(System::UInt32 classId)
@@ -479,41 +480,41 @@ namespace Apache
         {
           //need to set             
           int enumVal = Internal::PdxHelper::GetEnumValue(obj->GetType()->FullName, Enum::GetName(obj->GetType(), obj), obj->GetHashCode(), m_cache);
-          WriteByte(GeodeClassIds::PDX_ENUM);
+          WriteByte(GeodeTypeIdsImpl::PDX_ENUM);
           WriteByte(enumVal >> 24);
           WriteArrayLen(enumVal & 0xFFFFFF);
           return;
         }
 
-        Byte typeId = m_cache->TypeRegistry->GetManagedTypeMappingGeneric(obj->GetType());
+        Byte typeId = m_cache->TypeRegistry->GetDsCodeForManagedType(obj->GetType());
 
         switch (typeId)
         {
-        case apache::geode::client::GeodeTypeIds::CacheableByte:
+        case GeodeTypeIds::CacheableByte:
         {
           WriteByte(typeId);
-          WriteSByte((SByte)obj);
+          WriteByte((Byte)obj);
           return;
         }
-        case apache::geode::client::GeodeTypeIds::CacheableBoolean:
+        case GeodeTypeIds::CacheableBoolean:
         {
           WriteByte(typeId);
           WriteBoolean((bool)obj);
           return;
         }
-        case apache::geode::client::GeodeTypeIds::CacheableCharacter:
+        case GeodeTypeIds::CacheableCharacter:
         {
           WriteByte(typeId);
           WriteObject((Char)obj);
           return;
         }
-        case apache::geode::client::GeodeTypeIds::CacheableDouble:
+        case GeodeTypeIds::CacheableDouble:
         {
           WriteByte(typeId);
           WriteDouble((Double)obj);
           return;
         }
-        case apache::geode::client::GeodeTypeIds::CacheableASCIIString:
+        case GeodeTypeIds::CacheableASCIIString:
         {
           //CacheableString^ cStr = CacheableString::Create((String^)obj);
           ////  TODO: igfser mapping between generic and non generic
@@ -521,31 +522,31 @@ namespace Apache
           WriteStringWithType((String^)obj);
           return;
         }
-        case apache::geode::client::GeodeTypeIds::CacheableFloat:
+        case GeodeTypeIds::CacheableFloat:
         {
           WriteByte(typeId);
           WriteFloat((float)obj);
           return;
         }
-        case apache::geode::client::GeodeTypeIds::CacheableInt16:
+        case GeodeTypeIds::CacheableInt16:
         {
           WriteByte(typeId);
           WriteInt16((Int16)obj);
           return;
         }
-        case apache::geode::client::GeodeTypeIds::CacheableInt32:
+        case GeodeTypeIds::CacheableInt32:
         {
           WriteByte(typeId);
           WriteInt32((Int32)obj);
           return;
         }
-        case apache::geode::client::GeodeTypeIds::CacheableInt64:
+        case GeodeTypeIds::CacheableInt64:
         {
           WriteByte(typeId);
           WriteInt64((Int64)obj);
           return;
         }
-        case apache::geode::client::GeodeTypeIds::CacheableDate:
+        case GeodeTypeIds::CacheableDate:
         {
           //CacheableDate^ cd = gcnew CacheableDate((DateTime)obj);
           //  TODO: igfser mapping between generic and non generic
@@ -554,99 +555,99 @@ namespace Apache
           WriteDate((DateTime)obj);
           return;
         }
-        case apache::geode::client::GeodeTypeIds::CacheableBytes:
+        case GeodeTypeIds::CacheableBytes:
         {
           WriteByte(typeId);
           WriteBytes((array<Byte>^)obj);
           return;
         }
-        case apache::geode::client::GeodeTypeIds::CacheableDoubleArray:
+        case GeodeTypeIds::CacheableDoubleArray:
         {
           WriteByte(typeId);
           WriteObject((array<Double>^)obj);
           return;
         }
-        case apache::geode::client::GeodeTypeIds::CacheableFloatArray:
+        case GeodeTypeIds::CacheableFloatArray:
         {
           WriteByte(typeId);
           WriteObject((array<float>^)obj);
           return;
         }
-        case apache::geode::client::GeodeTypeIds::CacheableInt16Array:
+        case GeodeTypeIds::CacheableInt16Array:
         {
           WriteByte(typeId);
           WriteObject((array<Int16>^)obj);
           return;
         }
-        case apache::geode::client::GeodeTypeIds::CacheableInt32Array:
+        case GeodeTypeIds::CacheableInt32Array:
         {
           WriteByte(typeId);
           WriteObject((array<Int32>^)obj);
           return;
         }
-        case apache::geode::client::GeodeTypeIds::CacheableInt64Array:
+        case GeodeTypeIds::CacheableInt64Array:
         {
           WriteByte(typeId);
           WriteObject((array<Int64>^)obj);
           return;
         }
-        case apache::geode::client::GeodeTypeIds::BooleanArray:
+        case GeodeTypeIds::BooleanArray:
         {
           WriteByte(typeId);
           WriteObject((array<bool>^)obj);
           return;
         }
-        case apache::geode::client::GeodeTypeIds::CharArray:
+        case GeodeTypeIds::CharArray:
         {
           WriteByte(typeId);
           WriteObject((array<char>^)obj);
           return;
         }
-        case apache::geode::client::GeodeTypeIds::CacheableStringArray:
+        case GeodeTypeIds::CacheableStringArray:
         {
           WriteByte(typeId);
           WriteObject((array<String^>^)obj);
           return;
         }
-        case apache::geode::client::GeodeTypeIds::CacheableHashTable:
-        case apache::geode::client::GeodeTypeIds::CacheableHashMap:
-        case apache::geode::client::GeodeTypeIds::CacheableIdentityHashMap:
+        case GeodeTypeIds::CacheableHashTable:
+        case GeodeTypeIds::CacheableHashMap:
+        case GeodeTypeIds::CacheableIdentityHashMap:
         {
           WriteByte(typeId);
           WriteDictionary((System::Collections::IDictionary^)obj);
           return;
         }
-        case apache::geode::client::GeodeTypeIds::CacheableVector:
+        case GeodeTypeIds::CacheableVector:
         {
           //CacheableVector^ cv = gcnew CacheableVector((System::Collections::IList^)obj);
           ////  TODO: igfser mapping between generic and non generic
           //WriteObjectInternal(cv);
-          WriteByte(apache::geode::client::GeodeTypeIds::CacheableVector);
+          WriteByte(GeodeTypeIds::CacheableVector);
           WriteList((System::Collections::IList^)obj);
           return;
         }
-        case apache::geode::client::GeodeTypeIds::CacheableLinkedList:
+        case GeodeTypeIds::CacheableLinkedList:
         {
           //CacheableArrayList^ cal = gcnew CacheableArrayList((System::Collections::IList^)obj);
           ////  TODO: igfser mapping between generic and non generic
           //WriteObjectInternal(cal);
-          WriteByte(apache::geode::client::GeodeTypeIds::CacheableLinkedList);
+          WriteByte(GeodeTypeIds::CacheableLinkedList);
           System::Collections::ICollection^ linkedList = (System::Collections::ICollection^)obj;
           this->WriteArrayLen(linkedList->Count);
           for each (Object^ o in linkedList)
             this->WriteObject(o);
           return;
         }
-        case apache::geode::client::GeodeTypeIds::CacheableArrayList:
+        case GeodeTypeIds::CacheableArrayList:
         {
           //CacheableArrayList^ cal = gcnew CacheableArrayList((System::Collections::IList^)obj);
           ////  TODO: igfser mapping between generic and non generic
           //WriteObjectInternal(cal);
-          WriteByte(apache::geode::client::GeodeTypeIds::CacheableArrayList);
+          WriteByte(GeodeTypeIds::CacheableArrayList);
           WriteList((System::Collections::IList^)obj);
           return;
         }
-        case apache::geode::client::GeodeTypeIds::CacheableStack:
+        case GeodeTypeIds::CacheableStack:
         {
           CacheableStack^ cs = gcnew CacheableStack((System::Collections::ICollection^)obj);
           //  TODO: igfser mapping between generic and non generic
@@ -655,10 +656,9 @@ namespace Apache
         }
         default:
         {
-          IPdxSerializable^ pdxObj = dynamic_cast<IPdxSerializable^>(obj);
-          if (pdxObj != nullptr)
+          if (auto pdxObj = dynamic_cast<IPdxSerializable^>(obj))
           {
-            WriteByte(GeodeClassIds::PDX);
+            WriteByte(GeodeTypeIdsImpl::PDX);
             Internal::PdxHelper::SerializePdx(this, pdxObj);
             return;
           }
@@ -667,21 +667,20 @@ namespace Apache
             //pdx serialization and is array of object
             if (m_ispdxSerialization && obj->GetType()->IsArray)
             {
-              WriteByte(apache::geode::client::GeodeTypeIds::CacheableObjectArray);
+              WriteByte(GeodeTypeIds::CacheableObjectArray);
               WriteDotNetObjectArray(obj);
               return;
             }
 
-            IGeodeSerializable^ ct = dynamic_cast<IGeodeSerializable^>(obj);
-            if (ct != nullptr) {
+            if (auto ct = dynamic_cast<ISerializable^>(obj)) {
               WriteObjectInternal(ct);
               return;
             }
 
             if (m_cache->TypeRegistry->PdxSerializer)
             {
-              pdxObj = gcnew PdxWrapper(obj);
-              WriteByte(GeodeClassIds::PDX);
+              auto pdxObj = gcnew PdxWrapper(obj);
+              WriteByte(GeodeTypeIdsImpl::PDX);
               Internal::PdxHelper::SerializePdx(this, pdxObj);
               return;
             }
@@ -707,42 +706,61 @@ namespace Apache
           WriteByte(-1);
       }
 
-      void DataOutput::WriteObjectInternal(IGeodeSerializable^ obj)
+      void DataOutput::WriteObjectInternal(ISerializable^ obj)
       {
         //CacheableKey^ key = gcnew CacheableKey();
         if (obj == nullptr) {
           WriteByte((int8_t)GeodeTypeIds::NullObj);
         }
-        else {
-          int8_t typeId = DataOutput::GetTypeId(obj->ClassId);
-          switch (DataOutput::DSFID(obj->ClassId)) {
-          case GeodeTypeIdsImpl::FixedIDByte:
-            WriteByte((int8_t)GeodeTypeIdsImpl::FixedIDByte);
-            WriteByte(typeId); // write the type ID.
-            break;
-          case GeodeTypeIdsImpl::FixedIDShort:
-            WriteByte((int8_t)GeodeTypeIdsImpl::FixedIDShort);
-            WriteInt16((System::Int16)typeId); // write the type ID.
-            break;
-          case GeodeTypeIdsImpl::FixedIDInt:
-            WriteByte((int8_t)GeodeTypeIdsImpl::FixedIDInt);
-            WriteInt32((System::Int32)typeId); // write the type ID.
-            break;
-          default:
-            WriteByte(typeId); // write the type ID.
-            break;
-          }
-
-          if ((System::Int32)typeId == GeodeTypeIdsImpl::CacheableUserData) {
-            WriteByte((int8_t)obj->ClassId);
-          }
-          else if ((System::Int32)typeId == GeodeTypeIdsImpl::CacheableUserData2) {
-            WriteInt16((System::Int16)obj->ClassId);
+        else if (auto dataSerializablePrimitive = dynamic_cast<IDataSerializablePrimitive^>(obj))
+        {
+          auto dsCode = dataSerializablePrimitive->DsCode;
+          WriteByte(dsCode);
+          dataSerializablePrimitive->ToData(this);
+        }
+        else if (auto dataSerializable = dynamic_cast<IDataSerializable^>(obj))
+        {
+          auto id = dataSerializable->ClassId;
+          auto dsCode = getDataSerializableDsCode(id);
+          WriteByte(dsCode);
+          switch (dsCode) {
+            case GeodeTypeIdsImpl::CacheableUserData:
+              WriteByte(static_cast<int8_t>(id));
+              break;
+            case GeodeTypeIdsImpl::CacheableUserData2:
+              WriteInt16(static_cast<int16_t>(id));
+              break;
+            case GeodeTypeIdsImpl::CacheableUserData4:
+              WriteInt32(static_cast<int32_t>(id));
+              break;
+            default:
+              IllegalStateException("Invalid DS Code.");
           }
-          else if ((System::Int32)typeId == GeodeTypeIdsImpl::CacheableUserData4) {
-            WriteInt32((System::Int32)obj->ClassId);
+          dataSerializable->ToData(this);
+        }
+        else if (auto dataSerializableFixedId = dynamic_cast<IDataSerializableFixedId^>(obj))
+        {
+          auto id = dataSerializableFixedId->DSFID;
+          auto dsCode = getDataSerializableFixedIdDsCode(id);
+          WriteByte(dsCode);
+          switch (dsCode) {
+            case GeodeTypeIdsImpl::FixedIDByte:
+              WriteByte(static_cast<int8_t>(id));
+              break;
+            case GeodeTypeIdsImpl::FixedIDShort:
+              WriteInt16(static_cast<int16_t>(id));
+              break;
+            case GeodeTypeIdsImpl::FixedIDInt:
+              WriteInt32(static_cast<int32_t>(id));
+              break;
+            default:
+              IllegalStateException("Invalid DS Code.");
           }
-          obj->ToData(this); // let the obj serialize itself.
+          dataSerializable->ToData(this);
+        }
+        else
+        {
+          throw gcnew IllegalStateException("Unknown serializable type.");
         }
       }
 
diff --git a/clicache/src/DataOutput.hpp b/clicache/src/DataOutput.hpp
index 4c13ea7..8700e40 100644
--- a/clicache/src/DataOutput.hpp
+++ b/clicache/src/DataOutput.hpp
@@ -46,11 +46,11 @@ namespace Apache
       namespace native = apache::geode::client;
 
       ref class Cache;
-      interface class IGeodeSerializable;
+      interface class ISerializable;
 
       /// <summary>
       /// Provides operations for writing primitive data values, and
-      /// user-defined objects implementing IGeodeSerializable, to a byte stream.
+      /// user-defined objects implementing ISerializable, to a byte stream.
       /// This class is intentionally not thread safe.
       /// </summary>
       public ref class DataOutput sealed
@@ -220,7 +220,7 @@ namespace Apache
         /// Write a <c>Serializable</c> object to the <c>DataOutput</c>.
         /// This is provided to conveniently pass primitive types (like string)
         /// that shall be implicitly converted to corresponding
-        /// <c>IGeodeSerializable</c> wrapper types.
+        /// <c>ISerializable</c> wrapper types.
         /// </summary>
         /// <param name="obj">The object to write.</param>
         void WriteObject( Object^ obj );
@@ -482,7 +482,31 @@ namespace Apache
         
         static int8_t DSFID(System::UInt32 classId);        
   
-        void WriteObjectInternal( IGeodeSerializable^ obj );     
+        static inline int8_t getDataSerializableDsCode(int32_t classId) {
+          if (classId <= std::numeric_limits<int8_t>::max() &&
+              classId >= std::numeric_limits<int8_t>::min()) {
+            return static_cast<int8_t>(GeodeTypeIdsImpl::CacheableUserData);
+          } else if (classId <= std::numeric_limits<int16_t>::max() &&
+                     classId >= std::numeric_limits<int16_t>::min()) {
+            return static_cast<int8_t>(GeodeTypeIdsImpl::CacheableUserData2);
+          } else {
+            return static_cast<int8_t>(GeodeTypeIdsImpl::CacheableUserData4);
+          }
+        }
+
+				static inline int8_t getDataSerializableFixedIdDsCode(int32_t fixedId) {
+          if (fixedId <= std::numeric_limits<int8_t>::max() &&
+              fixedId >= std::numeric_limits<int8_t>::min()) {
+            return static_cast<int8_t>(GeodeTypeIdsImpl::FixedIDByte);
+          } else if (fixedId <= std::numeric_limits<int16_t>::max() &&
+                     fixedId >= std::numeric_limits<int16_t>::min()) {
+            return static_cast<int8_t>(GeodeTypeIdsImpl::FixedIDShort);
+          } else {
+            return static_cast<int8_t>(GeodeTypeIdsImpl::FixedIDInt);
+          }
+        }
+
+        void WriteObjectInternal( ISerializable^ obj );     
 
         void WriteBytesToUMDataOutput();
         
diff --git a/clicache/src/DistributedSystem.cpp b/clicache/src/DistributedSystem.cpp
index e1b7d29..a2ecbb9 100644
--- a/clicache/src/DistributedSystem.cpp
+++ b/clicache/src/DistributedSystem.cpp
@@ -46,6 +46,7 @@
 #include "CacheableUndefined.hpp"
 #include "CacheableVector.hpp"
 #include "CacheableArrayList.hpp"
+#include "CacheableLinkedList.hpp"
 #include "CacheableStack.hpp"
 #include "CacheableObject.hpp"
 #include "CacheableObjectXml.hpp"
@@ -150,141 +151,171 @@ namespace Apache
       void DistributedSystem::Disconnect(Cache^ cache)
       {
         _GF_MG_EXCEPTION_TRY2
+          DistributedSystem::UnregisterBuiltinManagedTypes(cache);
+          m_nativeDistributedSystem->get()->disconnect();
+          GC::KeepAlive(m_nativeDistributedSystem);
+        _GF_MG_EXCEPTION_CATCH_ALL2
+      }
 
+      void DistributedSystem::RegisterDataSerializablePrimitives(Cache^ cache)
+      {
+        RegisterDataSerializablePrimitivesOverrideNativeDeserialization(cache);
+      }
 
-        TypeRegistry::UnregisterNativesGeneric(cache);
-        DistributedSystem::UnregisterBuiltinManagedTypes(cache);
-        m_nativeDistributedSystem->get()->disconnect();
-        GC::KeepAlive(m_nativeDistributedSystem);
+      void DistributedSystem::RegisterDataSerializablePrimitivesOverrideNativeDeserialization(Cache^ cache)
+      {
+        // Registers overrides in the C++ layer to incercept deserialization into managed layer.
+
+        auto&& typeRegistry = cache->TypeRegistry;
+
+        typeRegistry->RegisterDataSerializablePrimitiveOverrideNativeDeserialization(
+            native::GeodeTypeIds::CacheableBytes,
+            gcnew TypeFactoryMethod(CacheableBytes::CreateDeserializable),
+            Type::GetType("System.Byte[]"));
+
+        typeRegistry->RegisterDataSerializablePrimitiveOverrideNativeDeserialization(
+            native::GeodeTypeIds::CacheableDoubleArray,
+            gcnew TypeFactoryMethod(CacheableDoubleArray::CreateDeserializable),
+            Type::GetType("System.Double[]"));
+
+        typeRegistry->RegisterDataSerializablePrimitiveOverrideNativeDeserialization(
+            native::GeodeTypeIds::CacheableFloatArray,
+            gcnew TypeFactoryMethod(CacheableFloatArray::CreateDeserializable),
+            Type::GetType("System.Single[]"));
+
+        typeRegistry->RegisterDataSerializablePrimitiveOverrideNativeDeserialization(
+            native::GeodeTypeIds::CacheableHashSet,
+            gcnew TypeFactoryMethod(CacheableHashSet::CreateDeserializable),
+            nullptr);
+
+        typeRegistry->RegisterDataSerializablePrimitiveOverrideNativeDeserialization(
+            native::GeodeTypeIds::CacheableLinkedHashSet,
+            gcnew TypeFactoryMethod(CacheableLinkedHashSet::CreateDeserializable),
+            nullptr);
+
+        typeRegistry->RegisterDataSerializablePrimitiveOverrideNativeDeserialization(
+            native::GeodeTypeIds::CacheableInt16Array,
+            gcnew TypeFactoryMethod(CacheableInt16Array::CreateDeserializable),
+            Type::GetType("System.Int16[]"));
+
+        typeRegistry->RegisterDataSerializablePrimitiveOverrideNativeDeserialization(
+            native::GeodeTypeIds::CacheableInt32Array,
+            gcnew TypeFactoryMethod(CacheableInt32Array::CreateDeserializable),
+            Type::GetType("System.Int32[]"));
+
+        typeRegistry->RegisterDataSerializablePrimitiveOverrideNativeDeserialization(
+            native::GeodeTypeIds::CacheableInt64Array,
+            gcnew TypeFactoryMethod(CacheableInt64Array::CreateDeserializable),
+            Type::GetType("System.Int64[]"));
+
+        typeRegistry->RegisterDataSerializablePrimitiveOverrideNativeDeserialization(
+            native::GeodeTypeIds::BooleanArray,
+            gcnew TypeFactoryMethod(BooleanArray::CreateDeserializable),
+            Type::GetType("System.Boolean[]"));
+
+        typeRegistry->RegisterDataSerializablePrimitiveOverrideNativeDeserialization(
+            native::GeodeTypeIds::CharArray,
+            gcnew TypeFactoryMethod(CharArray::CreateDeserializable),
+            Type::GetType("System.Char[]"));
+
+        typeRegistry->RegisterDataSerializablePrimitiveOverrideNativeDeserialization(
+            native::GeodeTypeIds::CacheableStringArray,
+            gcnew TypeFactoryMethod(CacheableStringArray::CreateDeserializable),
+            Type::GetType("System.String[]"));
+
+        typeRegistry->RegisterDataSerializablePrimitiveOverrideNativeDeserialization(
+            native::GeodeTypeIds::Struct,
+            gcnew TypeFactoryMethod(Struct::CreateDeserializable),
+            nullptr);
+        
+        typeRegistry->RegisterDataSerializablePrimitiveOverrideNativeDeserialization(
+            native::GeodeTypeIds::CacheableDate,
+            gcnew TypeFactoryMethod(CacheableDate::CreateDeserializable),
+            Type::GetType("System.DateTime"));
+
+        typeRegistry->RegisterDataSerializablePrimitiveOverrideNativeDeserialization(
+            native::GeodeTypeIds::CacheableFileName,
+            gcnew TypeFactoryMethod(CacheableFileName::CreateDeserializable),
+            nullptr);
+
+        typeRegistry->RegisterDataSerializablePrimitiveOverrideNativeDeserialization(
+            native::GeodeTypeIds::CacheableHashMap,
+            gcnew TypeFactoryMethod(CacheableHashMap::CreateDeserializable),
+            nullptr);
+
+        typeRegistry->RegisterDataSerializablePrimitiveOverrideNativeDeserialization(
+            native::GeodeTypeIds::CacheableHashTable,
+            gcnew TypeFactoryMethod(CacheableHashTable::CreateDeserializable),
+            Type::GetType("System.Collections.Hashtable"));
+
+        typeRegistry->RegisterDataSerializablePrimitiveOverrideNativeDeserialization(
+            native::GeodeTypeIds::CacheableIdentityHashMap,
+            gcnew TypeFactoryMethod(CacheableIdentityHashMap::CreateDeserializable),
+            nullptr);
+
+        typeRegistry->RegisterDataSerializablePrimitiveOverrideNativeDeserialization(
+            native::GeodeTypeIds::CacheableUndefined,
+            gcnew TypeFactoryMethod(CacheableUndefined::CreateDeserializable),
+            nullptr);
+
+        typeRegistry->RegisterDataSerializablePrimitiveOverrideNativeDeserialization(
+            native::GeodeTypeIds::CacheableVector,
+            gcnew TypeFactoryMethod(CacheableVector::CreateDeserializable),
+            nullptr);
+
+        typeRegistry->RegisterDataSerializablePrimitiveOverrideNativeDeserialization(
+            native::GeodeTypeIds::CacheableObjectArray,
+            gcnew TypeFactoryMethod(CacheableObjectArray::CreateDeserializable),
+            nullptr);
+
+        typeRegistry->RegisterDataSerializablePrimitiveOverrideNativeDeserialization(
+            native::GeodeTypeIds::CacheableArrayList,
+            gcnew TypeFactoryMethod(CacheableArrayList::CreateDeserializable),
+            nullptr);
+
+        typeRegistry->RegisterDataSerializablePrimitiveOverrideNativeDeserialization(
+            native::GeodeTypeIds::CacheableLinkedList,
+            gcnew TypeFactoryMethod(CacheableLinkedList::CreateDeserializable),
+            nullptr);
+
+        typeRegistry->RegisterDataSerializablePrimitiveOverrideNativeDeserialization(
+            native::GeodeTypeIds::CacheableStack,
+            gcnew TypeFactoryMethod(CacheableStack::CreateDeserializable),
+            nullptr);
+
+        typeRegistry->RegisterDataSerializablePrimitiveOverrideNativeDeserialization(
+            native::GeodeTypeIds::CacheableManagedObject,
+            gcnew TypeFactoryMethod(CacheableObject::CreateDeserializable),
+            nullptr);
+
+        typeRegistry->RegisterDataSerializablePrimitiveOverrideNativeDeserialization(
+            native::GeodeTypeIds::CacheableManagedObjectXml,
+            gcnew TypeFactoryMethod(CacheableObjectXml::CreateDeserializable),
+            nullptr);
+      }
 
-        _GF_MG_EXCEPTION_CATCH_ALL2
+      void DistributedSystem::RegisterDataSerializableFixedIdsOverrideNativeDeserialization(Cache^ cache)
+      {
+        auto&& typeRegistry = cache->TypeRegistry;
+ 
+        typeRegistry->RegisterDataSerializableFixedIdTypeOverrideNativeDeserialization(
+            native::GeodeTypeIds::EnumInfo,
+            gcnew TypeFactoryMethod(Internal::EnumInfo::CreateDeserializable));
       }
 
       void DistributedSystem::AppDomainInstanceInitialization(Cache^ cache)
+      {
+        RegisterDataSerializablePrimitives(cache);
+        RegisterDataSerializableFixedIdsOverrideNativeDeserialization(cache);
 
-        // TODO AppDomain move this.
+        // Actually an internal type being registered as a primitive
+        cache->TypeRegistry->RegisterDataSerializablePrimitiveOverrideNativeDeserialization(
+            native::GeodeTypeIds::PdxType,
+            gcnew TypeFactoryMethod(Apache::Geode::Client::Internal::PdxType::CreateDeserializable),
+            nullptr);
 
-      {
         _GF_MG_EXCEPTION_TRY2
 
-          // Register wrapper types for built-in types, this are still cpp wrapper
-
-        //byte
-        TypeRegistry::RegisterWrapperGeneric(
-        gcnew WrapperDelegateGeneric(CacheableByte::Create),
-        native::GeodeTypeIds::CacheableByte, SByte::typeid);
-
-        //boolean
-        TypeRegistry::RegisterWrapperGeneric(
-          gcnew WrapperDelegateGeneric(CacheableBoolean::Create),
-          native::GeodeTypeIds::CacheableBoolean, Boolean::typeid);
-        //wide char
-        TypeRegistry::RegisterWrapperGeneric(
-          gcnew WrapperDelegateGeneric(CacheableCharacter::Create),
-          native::GeodeTypeIds::CacheableCharacter, Char::typeid);
-        //double
-        TypeRegistry::RegisterWrapperGeneric(
-          gcnew WrapperDelegateGeneric(CacheableDouble::Create),
-          native::GeodeTypeIds::CacheableDouble, Double::typeid);
-        //ascii string
-        TypeRegistry::RegisterWrapperGeneric(
-          gcnew WrapperDelegateGeneric(CacheableString::Create),
-          native::GeodeTypeIds::CacheableASCIIString, String::typeid);
-
-        TypeRegistry::RegisterWrapperGeneric(
-          gcnew WrapperDelegateGeneric(CacheableFloat::Create),
-          native::GeodeTypeIds::CacheableFloat, float::typeid);
-        //int 16
-        TypeRegistry::RegisterWrapperGeneric(
-          gcnew WrapperDelegateGeneric(CacheableInt16::Create),
-          native::GeodeTypeIds::CacheableInt16, Int16::typeid);
-        //int32
-        TypeRegistry::RegisterWrapperGeneric(
-          gcnew WrapperDelegateGeneric(CacheableInt32::Create),
-          native::GeodeTypeIds::CacheableInt32, Int32::typeid);
-        //int64
-        TypeRegistry::RegisterWrapperGeneric(
-          gcnew WrapperDelegateGeneric(CacheableInt64::Create),
-          native::GeodeTypeIds::CacheableInt64, Int64::typeid);
-
-        //Now onwards all will be wrap in managed cacheable key..
-
-        cache->TypeRegistry->RegisterTypeGeneric(
-          native::GeodeTypeIds::CacheableBytes,
-          gcnew TypeFactoryMethodGeneric(CacheableBytes::CreateDeserializable),
-          Type::GetType("System.Byte[]"));
-
-        cache->TypeRegistry->RegisterTypeGeneric(
-          native::GeodeTypeIds::CacheableDoubleArray,
-          gcnew TypeFactoryMethodGeneric(CacheableDoubleArray::CreateDeserializable),
-          Type::GetType("System.Double[]"));
-
-        cache->TypeRegistry->RegisterTypeGeneric(
-          native::GeodeTypeIds::CacheableFloatArray,
-          gcnew TypeFactoryMethodGeneric(CacheableFloatArray::CreateDeserializable),
-          Type::GetType("System.Single[]"));
-
-        //TODO:
-        //as it is
-        cache->TypeRegistry->RegisterTypeGeneric(
-          native::GeodeTypeIds::CacheableHashSet,
-          gcnew TypeFactoryMethodGeneric(CacheableHashSet::CreateDeserializable),
-          nullptr);
-
-        //as it is
-        cache->TypeRegistry->RegisterTypeGeneric(
-          native::GeodeTypeIds::CacheableLinkedHashSet,
-          gcnew TypeFactoryMethodGeneric(CacheableLinkedHashSet::CreateDeserializable),
-          nullptr);
-
-
-        cache->TypeRegistry->RegisterTypeGeneric(
-          native::GeodeTypeIds::CacheableInt16Array,
-          gcnew TypeFactoryMethodGeneric(CacheableInt16Array::CreateDeserializable),
-          Type::GetType("System.Int16[]"));
-
-        cache->TypeRegistry->RegisterTypeGeneric(
-          native::GeodeTypeIds::CacheableInt32Array,
-          gcnew TypeFactoryMethodGeneric(CacheableInt32Array::CreateDeserializable),
-          Type::GetType("System.Int32[]"));
-
-
-        cache->TypeRegistry->RegisterTypeGeneric(
-          native::GeodeTypeIds::CacheableInt64Array,
-          gcnew TypeFactoryMethodGeneric(CacheableInt64Array::CreateDeserializable),
-          Type::GetType("System.Int64[]"));
-
-        cache->TypeRegistry->RegisterTypeGeneric(
-          native::GeodeTypeIds::BooleanArray,
-          gcnew TypeFactoryMethodGeneric(BooleanArray::CreateDeserializable),
-          Type::GetType("System.Boolean[]"));
-
-        cache->TypeRegistry->RegisterTypeGeneric(
-          native::GeodeTypeIds::CharArray,
-          gcnew TypeFactoryMethodGeneric(CharArray::CreateDeserializable),
-          Type::GetType("System.Char[]"));
-
-        cache->TypeRegistry->RegisterTypeGeneric(
-          native::GeodeTypeIds::CacheableStringArray,
-          gcnew TypeFactoryMethodGeneric(CacheableStringArray::CreateDeserializable),
-          Type::GetType("System.String[]"));
-
-        //as it is
-        cache->TypeRegistry->RegisterTypeGeneric(
-          native::GeodeTypeIds::Struct,
-          gcnew TypeFactoryMethodGeneric(Struct::CreateDeserializable),
-          nullptr);
-
-        cache->TypeRegistry->RegisterTypeGeneric(
-          native::GeodeTypeIds::EnumInfo,
-          gcnew TypeFactoryMethodGeneric(Apache::Geode::Client::Internal::EnumInfo::CreateDeserializable),
-          nullptr);
-
-        // End register generic wrapper types for built-in types
-
-        //if (!native::DistributedSystem::isConnected())
-        //{
-
           // Set the Generic ManagedCacheLoader/Listener/Writer factory functions.
           native::CacheXmlParser::managedCacheLoaderFn =
             native::ManagedCacheLoaderGeneric::create;
@@ -300,98 +331,12 @@ namespace Apache
           // Set the Generic ManagedPersistanceManager factory function
           native::CacheXmlParser::managedPersistenceManagerFn =
             native::ManagedPersistenceManagerGeneric::create;
-        //}
 
         _GF_MG_EXCEPTION_CATCH_ALL2
       }
 
       void DistributedSystem::ManagedPostConnect(Cache^ cache)
       {
-        //  The registration into the native map should be after
-        // native connect since it can be invoked only once
-
-        // Register other built-in types
-
-        // End register other built-in types
-
-        // Register other built-in types for generics
-        //c# datatime
-
-        cache->TypeRegistry->RegisterTypeGeneric(
-          native::GeodeTypeIds::CacheableDate,
-          gcnew TypeFactoryMethodGeneric(CacheableDate::CreateDeserializable),
-          Type::GetType("System.DateTime"));
-
-        //as it is
-        cache->TypeRegistry->RegisterTypeGeneric(
-          native::GeodeTypeIds::CacheableFileName,
-          gcnew TypeFactoryMethodGeneric(CacheableFileName::CreateDeserializable),
-          nullptr);
-
-        //for generic dictionary define its type in static constructor of Serializable.hpp
-        cache->TypeRegistry->RegisterTypeGeneric(
-          native::GeodeTypeIds::CacheableHashMap,
-          gcnew TypeFactoryMethodGeneric(CacheableHashMap::CreateDeserializable),
-          nullptr);
-
-        //c# hashtable
-        cache->TypeRegistry->RegisterTypeGeneric(
-          native::GeodeTypeIds::CacheableHashTable,
-          gcnew TypeFactoryMethodGeneric(CacheableHashTable::CreateDeserializable),
-          Type::GetType("System.Collections.Hashtable"));
-
-        //Need to keep public as no counterpart in c#
-        cache->TypeRegistry->RegisterTypeGeneric(
-          native::GeodeTypeIds::CacheableIdentityHashMap,
-          gcnew TypeFactoryMethodGeneric(
-          CacheableIdentityHashMap::CreateDeserializable),
-          nullptr);
-
-        //keep as it is
-        cache->TypeRegistry->RegisterTypeGeneric(
-          native::GeodeTypeIds::CacheableUndefined,
-          gcnew TypeFactoryMethodGeneric(CacheableUndefined::CreateDeserializable),
-          nullptr);
-
-        //c# arraylist
-        cache->TypeRegistry->RegisterTypeGeneric(
-          native::GeodeTypeIds::CacheableVector,
-          gcnew TypeFactoryMethodGeneric(CacheableVector::CreateDeserializable),
-          nullptr);
-
-        //as it is
-        cache->TypeRegistry->RegisterTypeGeneric(
-          native::GeodeTypeIds::CacheableObjectArray,
-          gcnew TypeFactoryMethodGeneric(
-          CacheableObjectArray::CreateDeserializable),
-          nullptr);
-
-        //Generic::List
-        cache->TypeRegistry->RegisterTypeGeneric(
-          native::GeodeTypeIds::CacheableArrayList,
-          gcnew TypeFactoryMethodGeneric(CacheableArrayList::CreateDeserializable),
-          nullptr);
-
-        //c# generic stack
-        cache->TypeRegistry->RegisterTypeGeneric(
-          native::GeodeTypeIds::CacheableStack,
-          gcnew TypeFactoryMethodGeneric(CacheableStack::CreateDeserializable),
-          nullptr);
-
-        //as it is
-        cache->TypeRegistry->RegisterTypeGeneric(
-          GeodeClassIds::CacheableManagedObject - 0x80000000,
-          gcnew TypeFactoryMethodGeneric(CacheableObject::CreateDeserializable),
-          nullptr);
-
-        //as it is
-        cache->TypeRegistry->RegisterTypeGeneric(
-          GeodeClassIds::CacheableManagedObjectXml - 0x80000000,
-          gcnew TypeFactoryMethodGeneric(CacheableObjectXml::CreateDeserializable),
-          nullptr);
-
-        // End register other built-in types
-
         // Log the version of the C# layer being used
         Log::Config(".NET layer assembly version: {0}({1})", System::Reflection::
                     Assembly::GetExecutingAssembly()->GetName()->Version->ToString(),
@@ -428,9 +373,9 @@ namespace Apache
           cache->TypeRegistry->UnregisterTypeGeneric(
             native::GeodeTypeIds::CacheableStack);
           cache->TypeRegistry->UnregisterTypeGeneric(
-            GeodeClassIds::CacheableManagedObject - 0x80000000);
+            native::GeodeTypeIds::CacheableManagedObject);
           cache->TypeRegistry->UnregisterTypeGeneric(
-            GeodeClassIds::CacheableManagedObjectXml - 0x80000000);
+            native::GeodeTypeIds::CacheableManagedObjectXml);
 
         _GF_MG_EXCEPTION_CATCH_ALL2
       }
diff --git a/clicache/src/DistributedSystem.hpp b/clicache/src/DistributedSystem.hpp
index 2ad4110..8bd0d37 100644
--- a/clicache/src/DistributedSystem.hpp
+++ b/clicache/src/DistributedSystem.hpp
@@ -129,6 +129,13 @@ namespace Apache
         static void registerCliCallback();
 
         static void unregisterCliCallback();
+
+        static void RegisterDataSerializablePrimitives(Cache^ cache);
+
+        static void RegisterDataSerializablePrimitivesOverrideNativeDeserialization(Cache^ cache);
+
+        static void RegisterDataSerializableFixedIdsOverrideNativeDeserialization(Cache^ cache);
+
         /// <summary>
         /// Stuff that needs to be done for Connect in each AppDomain.
         /// </summary>
@@ -182,16 +189,6 @@ namespace Apache
         /// </summary>
         System::Threading::Timer^ m_memoryPressureHandler;
 
-        /// <summary>
-        /// Singleton instance of this class.
-        /// </summary>
-        static volatile DistributedSystem^ m_instance;
-
-        /// <summary>
-        /// Static lock object to protect the singleton instance of this class.
-        /// </summary>
-        static System::Object^ m_singletonSync = gcnew System::Object();
-
         static CliCallbackDelegate^ m_cliCallBackObj;
       };
     }  // namespace Client
diff --git a/clicache/src/EntryEvent.hpp b/clicache/src/EntryEvent.hpp
index ec1f5f1..87c8a76 100644
--- a/clicache/src/EntryEvent.hpp
+++ b/clicache/src/EntryEvent.hpp
@@ -35,7 +35,7 @@ namespace Apache
     {
       namespace native = apache::geode::client;
 
-      interface class IGeodeSerializable;
+      interface class ISerializable;
 
      // ref class Region;
       //interface class ICacheableKey;
diff --git a/clicache/src/GeodeClassIds.hpp b/clicache/src/GeodeClassIds.hpp
index 3dcc037..dd2440d 100644
--- a/clicache/src/GeodeClassIds.hpp
+++ b/clicache/src/GeodeClassIds.hpp
@@ -17,16 +17,11 @@
 
 #pragma once
 
-
-
-
 #include "geode_defs.hpp"
 #include "begin_native.hpp"
 #include <geode/GeodeTypeIds.hpp>
 #include "end_native.hpp"
 
-
-
 namespace Apache
 {
   namespace Geode
@@ -34,39 +29,11 @@ namespace Apache
     namespace Client
     {
 
-      struct PdxTypes
-      {
-        enum PdxTypesInternal
-        {
-          BOOLEAN,
-          BYTE,
-          CHAR,
-          SHORT,
-          INT,
-          LONG,
-          FLOAT,
-          DOUBLE,
-          DATE,
-          STRING,
-          OBJECT,
-          BOOLEAN_ARRAY,
-          CHAR_ARRAY,
-          BYTE_ARRAY,
-          SHORT_ARRAY,
-          INT_ARRAY,
-          LONG_ARRAY,
-          FLOAT_ARRAY,
-          DOUBLE_ARRAY,
-          STRING_ARRAY,
-          OBJECT_ARRAY,
-          ARRAY_OF_BYTE_ARRAYS
-        };
-      };
-
       /// <summary>
       /// Static class containing the classIds of the built-in cacheable types.
       /// </summary>
-      public ref class GeodeClassIds
+      [Obsolete("Used only to expose types to old integration tests.")]
+      private ref class GeodeClassIds
       {
       public:
 
@@ -102,8 +69,8 @@ namespace Apache
         literal System::UInt32 CacheableUndefined =
           apache::geode::client::GeodeTypeIds::CacheableUndefined + 0xa0000000;
 
-        literal System::UInt32 EnumInfo =
-          apache::geode::client::GeodeTypeIds::EnumInfo + 0xa0000000;
+        literal System::Int32 EnumInfo =
+          apache::geode::client::GeodeTypeIds::EnumInfo;
 
         /// <summary>
         /// ClassId of <c>Struct</c> class
@@ -315,56 +282,15 @@ namespace Apache
         /// <summary>
         /// ClassId of <c>CacheableObject</c> class
         /// </summary>
-        literal System::UInt32 CacheableManagedObject = 7 + 0x80000000;
+        literal System::UInt32 CacheableManagedObject = 
+          apache::geode::client::GeodeTypeIds::CacheableManagedObject + 0x80000000;
 
         /// <summary>
         /// ClassId of <c>CacheableObjectXml</c> class
         /// </summary>
-        literal System::UInt32 CacheableManagedObjectXml = 8 + 0x80000000;
-      internal:
-
-        literal System::UInt32 PdxType = apache::geode::client::GeodeTypeIds::PdxType + 0x80000000;
-
-        literal System::UInt32 DATA_SERIALIZABLE = 45;
-        literal System::UInt32 JAVA_CLASS = 43;
-
-        //internal geode typeids..
-        /*  literal Byte USERCLASS = 40;
-          literal Byte USERMAP = 94;
-          literal Byte USERCOLLECTION = 95;
-          literal Byte ARRAYOFBYTEARRAYS = 91;
-          literal Byte GEODEREGION =  98;
-
-          literal Byte BOOLEAN_TYPE = 17;
-          literal Byte CHARACTER_TYPE = 18;
-          literal Byte BYTE_TYPE = 19;
-          literal Byte SHORT_TYPE = 20;
-          literal Byte INTEGER_TYPE = 21;
-          literal Byte LONG_TYPE = 22;
-          literal Byte FLOAT_TYPE = 23;
-          literal Byte DOUBLE_TYPE = 24;
-          literal Byte VOID_TYPE = 25;   */
-
-        literal Byte PDX = 93;
-        literal Byte PDX_ENUM = 94;
-
-        literal Byte BYTE_SIZE = 1;
-
-        literal Byte BOOLEAN_SIZE = 1;
-
-        literal Byte CHAR_SIZE = 2;
-
-        literal Byte SHORT_SIZE = 2;
-
-        literal Byte INTEGER_SIZE = 4;
-
-        literal Byte FLOAT_SIZE = 4;
-
-        literal Byte LONG_SIZE = 8;
-
-        literal Byte DOUBLE_SIZE = 8;
+        literal System::UInt32 CacheableManagedObjectXml = 
+          apache::geode::client::GeodeTypeIds::CacheableManagedObjectXml + 0x80000000;
 
-        literal Byte DATE_SIZE = 8;
       };
     }  // namespace Client
   }  // namespace Geode
diff --git a/clicache/src/ICacheableKey.hpp b/clicache/src/ICacheableKey.hpp
index a27bef5..116622c 100644
--- a/clicache/src/ICacheableKey.hpp
+++ b/clicache/src/ICacheableKey.hpp
@@ -19,7 +19,7 @@
 
 
 #include "geode_defs.hpp"
-#include "IGeodeSerializable.hpp"
+#include "ISerializable.hpp"
 
 using namespace System;
 
@@ -44,7 +44,7 @@ namespace Apache
       /// and will not work correctly.
       /// </remarks>
       public interface class ICacheableKey
-        : public IGeodeSerializable
+        : public ISerializable
       {
       public:
 
diff --git a/clicache/src/ICqEvent.hpp b/clicache/src/ICqEvent.hpp
index f60a7fd..cb84b7c 100644
--- a/clicache/src/ICqEvent.hpp
+++ b/clicache/src/ICqEvent.hpp
@@ -29,7 +29,7 @@ namespace Apache
     namespace Client
     {
 
-      interface class IGeodeSerializable;
+      interface class ISerializable;
 
 
       generic<class TKey, class TResult>
diff --git a/clicache/src/IGeodeSerializable.hpp b/clicache/src/IDataSerializable.hpp
similarity index 70%
rename from clicache/src/IGeodeSerializable.hpp
rename to clicache/src/IDataSerializable.hpp
index d9612a5..2abc59a 100644
--- a/clicache/src/IGeodeSerializable.hpp
+++ b/clicache/src/IDataSerializable.hpp
@@ -17,12 +17,14 @@
 
 #pragma once
 
-
 #include "geode_defs.hpp"
+
 #include "begin_native.hpp"
 #include <geode/internal/geode_globals.hpp>
 #include "end_native.hpp"
 
+#include "ISerializable.hpp"
+
 using namespace System;
 
 namespace Apache
@@ -34,16 +36,10 @@ namespace Apache
 
       ref class DataOutput;
       ref class DataInput;
-      ref class Serializable;
 
-      /// <summary>
-      /// This interface class is the superclass of all user objects 
-      /// in the cache that can be serialized.
-      /// </summary>
-      public interface class IGeodeSerializable
+      public interface class IDataSerializable : public ISerializable
       {
       public:
-
         /// <summary>
         /// Serializes this object.
         /// </summary>
@@ -52,8 +48,6 @@ namespace Apache
         /// </param>
         void ToData( DataOutput^ output );
 
-        //bool HasDelta();
-
         /// <summary>
         /// Deserialize this object, typical implementation should return
         /// the 'this' pointer.
@@ -65,19 +59,6 @@ namespace Apache
         void FromData( DataInput^ input );
 
         /// <summary>
-        /// Get the size of this object in bytes.
-        /// This is only needed if you use the HeapLRU feature.
-        /// </summary>
-        /// <remarks>
-        /// Note that you can simply return zero if you are not using the HeapLRU feature.
-        /// </remarks>
-        /// <returns>the size of this object in bytes.</returns>
-        property System::UInt64 ObjectSize
-        {
-          System::UInt64 get( );
-        }
-
-        /// <summary>
         /// Returns the classId of the instance being serialized.
         /// This is used by deserialization to determine what instance
         /// type to create and deserialize into.
@@ -85,21 +66,17 @@ namespace Apache
         /// <remarks>
         /// The classId must be unique within an application suite
         /// and in the range 0 to ((2^31)-1) both inclusive. An application can
-        /// thus define upto 2^31 custom <c>IGeodeSerializable</c> classes.
+        /// thus define upto 2^31 custom <c>ISerializable</c> classes.
         /// Returning a value greater than ((2^31)-1) may result in undefined
         /// behaviour.
         /// </remarks>
         /// <returns>the classId</returns>
-        property System::UInt32 ClassId
+        property Int32 ClassId
         {
-          System::UInt32 get( );
+          Int32 get( );
         }
-
-        /// <summary>
-        /// Return a string representation of the object.
-        /// </summary>
-        String^ ToString( );
       };
+
     }  // namespace Client
   }  // namespace Geode
 }  // namespace Apache
diff --git a/clicache/src/CacheableUndefined.cpp b/clicache/src/IDataSerializableFixedId.hpp
similarity index 67%
copy from clicache/src/CacheableUndefined.cpp
copy to clicache/src/IDataSerializableFixedId.hpp
index 975cb62..42185a3 100644
--- a/clicache/src/CacheableUndefined.cpp
+++ b/clicache/src/IDataSerializableFixedId.hpp
@@ -15,14 +15,15 @@
  * limitations under the License.
  */
 
+#pragma once
 
+#include "geode_defs.hpp"
 
+#include "begin_native.hpp"
+#include <geode/internal/geode_globals.hpp>
+#include "end_native.hpp"
 
-
-#include "CacheableUndefined.hpp"
-#include "DataOutput.hpp"
-#include "DataInput.hpp"
-
+#include "ISerializable.hpp"
 
 using namespace System;
 
@@ -33,21 +34,22 @@ namespace Apache
     namespace Client
     {
 
-      // Region: IGeodeSerializable Members
+      ref class DataOutput;
+      ref class DataInput;
 
-      void CacheableUndefined::ToData(DataOutput^ output)
+      private interface class IDataSerializableFixedId : public ISerializable
       {
-      }
+        void ToData( DataOutput^ output );
 
-      void CacheableUndefined::FromData(DataInput^ input)
-      {
-      }
+        void FromData( DataInput^ input );
 
-      System::UInt64 CacheableUndefined::ObjectSize::get()
-      {
-        return sizeof(CacheableUndefined^);
-      }
+        property Int32 DSFID
+        {
+          Int32 get( );
+        }
+      };
 
     }  // namespace Client
   }  // namespace Geode
 }  // namespace Apache
+
diff --git a/clicache/src/CacheableUndefined.cpp b/clicache/src/IDataSerializableInternal.hpp
similarity index 71%
copy from clicache/src/CacheableUndefined.cpp
copy to clicache/src/IDataSerializableInternal.hpp
index 975cb62..3e708a9 100644
--- a/clicache/src/CacheableUndefined.cpp
+++ b/clicache/src/IDataSerializableInternal.hpp
@@ -15,14 +15,15 @@
  * limitations under the License.
  */
 
+#pragma once
 
+#include "geode_defs.hpp"
 
+#include "begin_native.hpp"
+#include <geode/internal/geode_globals.hpp>
+#include "end_native.hpp"
 
-
-#include "CacheableUndefined.hpp"
-#include "DataOutput.hpp"
-#include "DataInput.hpp"
-
+#include "ISerializable.hpp"
 
 using namespace System;
 
@@ -33,21 +34,17 @@ namespace Apache
     namespace Client
     {
 
-      // Region: IGeodeSerializable Members
-
-      void CacheableUndefined::ToData(DataOutput^ output)
+      ref class DataOutput;
+      ref class DataInput;
+     
+      private interface class IDataSerializableInternal : public ISerializable
       {
-      }
+        void ToData( DataOutput^ output );
 
-      void CacheableUndefined::FromData(DataInput^ input)
-      {
-      }
-
-      System::UInt64 CacheableUndefined::ObjectSize::get()
-      {
-        return sizeof(CacheableUndefined^);
-      }
+        void FromData( DataInput^ input );
+      };
 
     }  // namespace Client
   }  // namespace Geode
 }  // namespace Apache
+
diff --git a/clicache/src/CacheableUndefined.cpp b/clicache/src/IDataSerializablePrimitive.hpp
similarity index 67%
copy from clicache/src/CacheableUndefined.cpp
copy to clicache/src/IDataSerializablePrimitive.hpp
index 975cb62..f690720 100644
--- a/clicache/src/CacheableUndefined.cpp
+++ b/clicache/src/IDataSerializablePrimitive.hpp
@@ -15,14 +15,15 @@
  * limitations under the License.
  */
 
+#pragma once
 
+#include "geode_defs.hpp"
 
+#include "begin_native.hpp"
+#include <geode/internal/geode_globals.hpp>
+#include "end_native.hpp"
 
-
-#include "CacheableUndefined.hpp"
-#include "DataOutput.hpp"
-#include "DataInput.hpp"
-
+#include "ISerializable.hpp"
 
 using namespace System;
 
@@ -33,21 +34,22 @@ namespace Apache
     namespace Client
     {
 
-      // Region: IGeodeSerializable Members
+      ref class DataOutput;
+      ref class DataInput;
 
-      void CacheableUndefined::ToData(DataOutput^ output)
+      private interface class IDataSerializablePrimitive : public ISerializable
       {
-      }
+        void ToData( DataOutput^ output );
 
-      void CacheableUndefined::FromData(DataInput^ input)
-      {
-      }
+        void FromData( DataInput^ input );
 
-      System::UInt64 CacheableUndefined::ObjectSize::get()
-      {
-        return sizeof(CacheableUndefined^);
-      }
+        property int8_t DsCode
+        {
+          int8_t get( );
+        }
+      };
 
     }  // namespace Client
   }  // namespace Geode
 }  // namespace Apache
+
diff --git a/clicache/src/IGeodeDelta.hpp b/clicache/src/IDelta.hpp
similarity index 87%
rename from clicache/src/IGeodeDelta.hpp
rename to clicache/src/IDelta.hpp
index 6e73db9..134dedf 100644
--- a/clicache/src/IGeodeDelta.hpp
+++ b/clicache/src/IDelta.hpp
@@ -33,14 +33,14 @@ namespace Apache
 
       /// <summary>
       /// This interface is used for delta propagation.
-      /// To use delta propagation, an application class must implement interfaces <c>IGeodeDelta</c> as well as <c>IGeodeSerializable</c>.
-      /// The <c>IGeodeDelta</c> interface methods <c>HasDelta( ), ToDelta( )</c> and <c>FromDelta( )</c> must be implemented by the class, as these methods are used by Geode
+      /// To use delta propagation, an application class must implement interfaces <c>IDelta</c> as well as <c>IDataSerializable</c>.
+      /// The <c>IDelta</c> interface methods <c>HasDelta( ), ToDelta( )</c> and <c>FromDelta( )</c> must be implemented by the class, as these methods are used by Geode
       /// to detect the presence of delta in an object, to serialize the delta, and to apply a serialized delta to an existing object
       /// of the class.
       /// If a customized cloning method is required, the class must also implement the interface <c>System.ICloneable</c>.
       /// To use cloning in delta propagation for a region, the region attribute for cloning must be enabled.
       /// </summary>
-      public interface class IGeodeDelta
+      public interface class IDelta
       {
       public:
 
@@ -67,9 +67,9 @@ namespace Apache
         void FromDelta(DataInput^ in);
 
         /// <summary>
-        /// <c>HasDelta( )</c> is invoked by Geode during <c>Region.Put( ICacheableKey, IGeodeSerializable )</c> to determine if the object contains a delta.
+        /// <c>HasDelta( )</c> is invoked by Geode during <c>Region.Put( ICacheableKey, ISerializable )</c> to determine if the object contains a delta.
         /// If <c>HasDelta( )</c> returns true, the delta in the object is serialized by invoking <c>ToDelta( DataOutput )</c>.
-        /// If <c>HasDelta( )</c> returns false, the object is serialized by invoking <c>IGeodeSerializable.ToData( DataOutput )</c>.
+        /// If <c>HasDelta( )</c> returns false, the object is serialized by invoking <c>ISerializable.ToData( DataOutput )</c>.
         /// </summary>
         bool HasDelta();
       };
diff --git a/clicache/src/IFixedPartitionResolver.hpp b/clicache/src/IFixedPartitionResolver.hpp
index 1a98dac..a0e4cbd 100644
--- a/clicache/src/IFixedPartitionResolver.hpp
+++ b/clicache/src/IFixedPartitionResolver.hpp
@@ -30,7 +30,7 @@ namespace Apache
     namespace Client
     {
 
-      interface class IGeodeSerializable;
+      interface class ISerializable;
       /// <summary>
       /// Implementers of interface <code>FixedPartitionResolver</code> helps to
       /// achieve explicit mapping of a "user defined" partition to a data member node.
diff --git a/clicache/src/IPartitionResolver.hpp b/clicache/src/IPartitionResolver.hpp
index d859a3e..7cb7f53 100644
--- a/clicache/src/IPartitionResolver.hpp
+++ b/clicache/src/IPartitionResolver.hpp
@@ -30,7 +30,7 @@ namespace Apache
     namespace Client
     {
 
-      interface class IGeodeSerializable;
+      interface class ISerializable;
 
 
       /// <summary>
diff --git a/clicache/src/IPdxSerializable.hpp b/clicache/src/IPdxSerializable.hpp
index b9e2d41..a8eadc2 100644
--- a/clicache/src/IPdxSerializable.hpp
+++ b/clicache/src/IPdxSerializable.hpp
@@ -21,6 +21,7 @@
 #include "geode_defs.hpp"
 #include "IPdxWriter.hpp"
 #include "IPdxReader.hpp"
+#include "ISerializable.hpp"
 
 namespace Apache
 {
diff --git a/clicache/src/IRegion.hpp b/clicache/src/IRegion.hpp
index a22637a..411fff7 100644
--- a/clicache/src/IRegion.hpp
+++ b/clicache/src/IRegion.hpp
@@ -17,23 +17,17 @@
 
 #pragma once
 
-
 #include "geode_defs.hpp"
-#include "ISubscriptionService.hpp"
+
 #include "begin_native.hpp"
 #include <geode/DataOutput.hpp>
 #include "end_native.hpp"
 
-//#include "ExceptionTypes.hpp"
+#include "ISubscriptionService.hpp"
 
 using namespace System;
 using namespace System::Collections::Generic;
 
-/*
-using namespace Apache::Geode::Client;
-using namespace Apache::Geode::Client;
-*/
-
 namespace Apache
 {
   namespace Geode
@@ -43,7 +37,6 @@ namespace Apache
 
       ref class Cache;
       ref class CacheStatistics;
-      //interface class IGeodeSerializable;
       interface class IRegionService;
 
       generic<class TResult>
@@ -924,7 +917,7 @@ namespace Apache
           /// </param>
           /// <param name="callbackArg">
           /// An argument passed into the CacheLoader if loader is used.
-          /// Has to be Serializable (i.e. implement <c>IGeodeSerializable</c>);
+          /// Has to be Serializable (i.e. implement <c>ISerializable</c>);
           /// can be null.
           /// </param>
           /// <returns>
diff --git a/clicache/src/IResultCollector.hpp b/clicache/src/IResultCollector.hpp
index fd81e89..67fb8a0 100644
--- a/clicache/src/IResultCollector.hpp
+++ b/clicache/src/IResultCollector.hpp
@@ -29,7 +29,7 @@ namespace Apache
     namespace Client
     {
 
-      interface class IGeodeSerializable;
+      interface class ISerializable;
       /*
       generic<class TKey>
       ref class ResultCollector;
diff --git a/clicache/src/ISelectResults.hpp b/clicache/src/ISelectResults.hpp
index 7ba2010..ca4b9aa 100644
--- a/clicache/src/ISelectResults.hpp
+++ b/clicache/src/ISelectResults.hpp
@@ -24,7 +24,7 @@
 #include "end_native.hpp"
 
 
-#include "IGeodeSerializable.hpp"
+#include "ISerializable.hpp"
 
 using namespace System;
 
diff --git a/clicache/src/ISelectResults.hpp b/clicache/src/ISerializable.hpp
similarity index 62%
copy from clicache/src/ISelectResults.hpp
copy to clicache/src/ISerializable.hpp
index 7ba2010..56c529f 100644
--- a/clicache/src/ISelectResults.hpp
+++ b/clicache/src/ISerializable.hpp
@@ -20,12 +20,9 @@
 
 #include "geode_defs.hpp"
 #include "begin_native.hpp"
-#include <geode/SelectResults.hpp>
+#include <geode/internal/geode_globals.hpp>
 #include "end_native.hpp"
 
-
-#include "IGeodeSerializable.hpp"
-
 using namespace System;
 
 namespace Apache
@@ -35,35 +32,36 @@ namespace Apache
     namespace Client
     {
 
-      generic<class TResult>
-      ref class SelectResultsIterator;
+      ref class DataOutput;
+      ref class DataInput;
+      ref class Serializable;
 
       /// <summary>
-      /// Interface to encapsulate a select query result set.
+      /// This interface class is the superclass of all user objects 
+      /// in the cache that can be serialized.
       /// </summary>
-      generic<class TResult>
-      public interface class ISelectResults
-        : public System::Collections::Generic::IEnumerable<TResult>
+      public interface class ISerializable
       {
       public:
-
         /// <summary>
-        /// The size of the <c>ISelectResults</c>.
+        /// Get the size of this object in bytes.
+        /// This is only needed if you use the HeapLRU feature.
         /// </summary>
-        property size_t Size
+        /// <remarks>
+        /// Note that you can simply return zero if you are not using the HeapLRU feature.
+        /// </remarks>
+        /// <returns>the size of this object in bytes.</returns>
+        property System::UInt64 ObjectSize
         {
-          size_t get( );
+          System::UInt64 get( );
         }
 
         /// <summary>
-        /// Get an object at the given index.
+        /// Return a string representation of the object.
         /// </summary>
-        property TResult GFINDEXER( size_t )
-        {
-          TResult get( size_t index );
-        }
-
+        String^ ToString( );
       };
+
     }  // namespace Client
   }  // namespace Geode
 }  // namespace Apache
diff --git a/clicache/src/LocalRegion.cpp b/clicache/src/LocalRegion.cpp
index 915eff8..0169a66 100644
--- a/clicache/src/LocalRegion.cpp
+++ b/clicache/src/LocalRegion.cpp
@@ -51,8 +51,8 @@ namespace Apache
           throw gcnew KeyNotFoundException("The given key was not present in the region");
         }
         TValue returnVal = TypeRegistry::GetManagedValueGeneric<TValue>( nativeptr );
-        return returnVal;        
-      }     
+        return returnVal;
+      }
 
       generic<class TKey, class TValue>
       std::shared_ptr<apache::geode::client::Serializable> LocalRegion<TKey, TValue>::getRegionEntryValue(std::shared_ptr<apache::geode::client::CacheableKey>& keyptr)
@@ -96,7 +96,7 @@ namespace Apache
 
       generic<class TKey, class TValue>
       TValue LocalRegion<TKey, TValue>::default::get(TKey key)
-      { 
+      {
         std::shared_ptr<native::CacheableKey> keyptr = Serializable::GetUnmanagedValueGeneric<TKey>( key );
         auto nativeptr = this->getRegionEntryValue(keyptr);
         if (nativeptr == nullptr)
@@ -107,7 +107,7 @@ namespace Apache
         return returnVal;
       }
 
-      generic<class TKey, class TValue>      
+      generic<class TKey, class TValue>
       void LocalRegion<TKey, TValue>::default::set(TKey key, TValue value)
       {
         _GF_MG_EXCEPTION_TRY2/* due to auto replace */
@@ -127,7 +127,7 @@ namespace Apache
       }
 
       generic<class TKey, class TValue>
-      System::Collections::Generic::IEnumerator<KeyValuePair<TKey,TValue>>^ 
+      System::Collections::Generic::IEnumerator<KeyValuePair<TKey,TValue>>^
         LocalRegion<TKey, TValue>::GetEnumerator()
       {
         std::vector<std::shared_ptr<apache::geode::client::RegionEntry>> vc;
@@ -143,21 +143,21 @@ namespace Apache
             GC::KeepAlive(m_nativeptr);
           }
 
-        _GF_MG_EXCEPTION_CATCH_ALL2/* due to auto replace */ 
+        _GF_MG_EXCEPTION_CATCH_ALL2/* due to auto replace */
 
         auto toArray = gcnew array<KeyValuePair<TKey,TValue>>(static_cast<int>(vc.size()));
         for( System::Int32 index = 0; index < vc.size( ); index++ )
         {
-          auto nativeptr = vc[ index ];  
+          auto nativeptr = vc[ index ];
           TKey key = TypeRegistry::GetManagedValueGeneric<TKey> (nativeptr->getKey());
           TValue val = TypeRegistry::GetManagedValueGeneric<TValue> (nativeptr->getValue());
-          toArray[ index ] = KeyValuePair<TKey,TValue>(key, val);           
-        }                      
+          toArray[ index ] = KeyValuePair<TKey,TValue>(key, val);
+        }
         return ((System::Collections::Generic::IEnumerable<KeyValuePair<TKey,TValue>>^)toArray)->GetEnumerator();
       }
 
       generic<class TKey, class TValue>
-      System::Collections::IEnumerator^ 
+      System::Collections::IEnumerator^
         LocalRegion<TKey, TValue>::GetEnumeratorOld()
       {
         std::vector<std::shared_ptr<apache::geode::client::RegionEntry>> vc;
@@ -178,61 +178,26 @@ namespace Apache
         auto toArray = gcnew array<Object^>(static_cast<int>(vc.size()));
         for( System::Int32 index = 0; index < vc.size( ); index++ )
         {
-          auto nativeptr = vc[ index ];                       
+          auto nativeptr = vc[ index ];
           TKey key = TypeRegistry::GetManagedValueGeneric<TKey> (nativeptr->getKey());
-          TValue val = TypeRegistry::GetManagedValueGeneric<TValue> (nativeptr->getValue());            
-          toArray[ index ] = KeyValuePair<TKey,TValue>(key, val);           
+          TValue val = TypeRegistry::GetManagedValueGeneric<TValue> (nativeptr->getValue());
+          toArray[ index ] = KeyValuePair<TKey,TValue>(key, val);
         }
-        return ((System::Collections::Generic::IEnumerable<Object^>^)toArray)->GetEnumerator();        
+        return ((System::Collections::Generic::IEnumerable<Object^>^)toArray)->GetEnumerator();
       }
 
-
       generic<class TKey, class TValue>
-      bool LocalRegion<TKey, TValue>::AreValuesEqual(std::shared_ptr<apache::geode::client::Cacheable>& val1, std::shared_ptr<apache::geode::client::Cacheable>& val2)
+      bool LocalRegion<TKey, TValue>::Contains(KeyValuePair<TKey,TValue> keyValuePair)
       {
-        if ( val1 == nullptr && val2 == nullptr )
-        {
-          return true;
-        }
-        else if ((val1 == nullptr && val2 != nullptr) || (val1 != nullptr && val2 == nullptr))
-        {
-          return false;
-        }
-        else if( val1 != nullptr && val2 != nullptr )
-        {
-          if (val1->classId() != val2->classId() || val1->typeId() != val2->typeId())
-          {
-            return false;
-          }
-          auto out1 = m_nativeptr->get_shared_ptr()->getCache().createDataOutput();
-          auto out2 = m_nativeptr->get_shared_ptr()->getCache().createDataOutput();
-          val1->toData(out1);
-          val2->toData(out2);
-          if ( out1.getBufferLength() != out2.getBufferLength() )
-          {
-            return false;
-          }
-          else if (memcmp(out1.getBuffer(), out2.getBuffer(), out1.getBufferLength()) != 0)
-          {
-            return false;
-          }
-          return true;
-        }
-        return false;
-      }
-
-      generic<class TKey, class TValue> 
-      bool LocalRegion<TKey, TValue>::Contains(KeyValuePair<TKey,TValue> keyValuePair) 
-      { 
-        auto keyptr = Serializable::GetUnmanagedValueGeneric<TKey>( keyValuePair.Key ); 
+        auto keyptr = Serializable::GetUnmanagedValueGeneric<TKey>( keyValuePair.Key );
         auto nativeptr = this->getRegionEntryValue(keyptr);
         //This means that key is not present.
         if (nativeptr == nullptr) {
           return false;
-        }        
+        }
         TValue value = TypeRegistry::GetManagedValueGeneric<TValue>(nativeptr);
         return ((Object^)value)->Equals(keyValuePair.Value);
-      } 
+      }
 
       generic<class TKey, class TValue>
       bool LocalRegion<TKey, TValue>::ContainsKey(TKey key)
@@ -241,7 +206,7 @@ namespace Apache
 
         try
         {
-          auto keyptr = Serializable::GetUnmanagedValueGeneric<TKey>( key );          
+          auto keyptr = Serializable::GetUnmanagedValueGeneric<TKey>( key );
           return m_nativeptr->get()->containsKey(keyptr);
         }
         finally
@@ -254,18 +219,18 @@ namespace Apache
 
       generic<class TKey, class TValue>
       bool LocalRegion<TKey, TValue>::TryGetValue(TKey key, TValue %val)
-      {        
+      {
         auto keyptr = Serializable::GetUnmanagedValueGeneric<TKey>( key );
         auto nativeptr = this->getRegionEntryValue(keyptr);
-        if (nativeptr == nullptr) {            
+        if (nativeptr == nullptr) {
           val = TValue();
           return false;
         }
         else {
           val = TypeRegistry::GetManagedValueGeneric<TValue>( nativeptr );
           return true;
-        }          
-      }      
+        }
+      }
 
       generic<class TKey, class TValue>
       System::Collections::Generic::ICollection<TKey>^ LocalRegion<TKey, TValue>::Keys::get()
@@ -284,7 +249,7 @@ namespace Apache
 
         auto keyarr =  gcnew array<TKey>( static_cast<int>(vc.size( )) );
         for( System::Int32 index = 0; index < vc.size( ); index++ )
-        {            
+        {
           auto& nativeptr = vc[ index ];
           keyarr[ index ] = TypeRegistry::GetManagedValueGeneric<TKey>(nativeptr);
         }
@@ -313,7 +278,7 @@ namespace Apache
           auto valarr = gcnew array<TValue>( static_cast<int>(vc.size( )) );
           for( System::Int32 index = 0; index < vc.size( ); index++ )
           {
-            auto& nativeptr = vc[ index ];            
+            auto& nativeptr = vc[ index ];
             valarr[ index ] = TypeRegistry::GetManagedValueGeneric<TValue>(nativeptr);
           }
           auto collectionlist = (System::Collections::Generic::ICollection<TValue>^)valarr;
@@ -384,7 +349,7 @@ namespace Apache
       bool LocalRegion<TKey, TValue>::Remove(TKey key)
       {
         _GF_MG_EXCEPTION_TRY2/* due to auto replace */
-    
+
           try
           {
             std::shared_ptr<native::CacheableKey> keyptr = Serializable::GetUnmanagedValueGeneric<TKey>(key);
@@ -401,7 +366,7 @@ namespace Apache
           }
 
         _GF_MG_EXCEPTION_CATCH_ALL2/* due to auto replace */
-        
+
       }
 
       generic<class TKey, class TValue>
@@ -479,7 +444,7 @@ namespace Apache
       void LocalRegion<TKey, TValue>::InvalidateRegion(Object^ callbackArg)
       {
         _GF_MG_EXCEPTION_TRY2/* due to auto replace */
-                    
+
           try
           {
             std::shared_ptr<native::Serializable> callbackptr = Serializable::GetUnmanagedValueGeneric<Object^>( callbackArg );
@@ -489,7 +454,7 @@ namespace Apache
           {
             GC::KeepAlive(m_nativeptr);
           }
-      
+
         _GF_MG_EXCEPTION_CATCH_ALL2/* due to auto replace */
       }
 
@@ -506,7 +471,7 @@ namespace Apache
       generic<class TKey, class TValue>
       void LocalRegion<TKey, TValue>::DestroyRegion(Object^ callbackArg)
       {
-        _GF_MG_EXCEPTION_TRY2/* due to auto replace */          
+        _GF_MG_EXCEPTION_TRY2/* due to auto replace */
           try
           {
             std::shared_ptr<native::Serializable> callbackptr = Serializable::GetUnmanagedValueGeneric<Object^>( callbackArg );
@@ -568,37 +533,37 @@ namespace Apache
       }
 
       generic<class TKey, class TValue>
-      void LocalRegion<TKey, TValue>::GetAll(System::Collections::Generic::ICollection<TKey>^ keys, 
-        System::Collections::Generic::IDictionary<TKey, TValue>^ values, 
+      void LocalRegion<TKey, TValue>::GetAll(System::Collections::Generic::ICollection<TKey>^ keys,
+        System::Collections::Generic::IDictionary<TKey, TValue>^ values,
         System::Collections::Generic::IDictionary<TKey, System::Exception^>^ exceptions)
       {
-        throw gcnew System::NotSupportedException;      
+        throw gcnew System::NotSupportedException;
       }
 
       generic<class TKey, class TValue>
-      void LocalRegion<TKey, TValue>::GetAll(System::Collections::Generic::ICollection<TKey>^ keys, 
-        System::Collections::Generic::IDictionary<TKey, TValue>^ values, 
-        System::Collections::Generic::IDictionary<TKey, System::Exception^>^ exceptions, 
+      void LocalRegion<TKey, TValue>::GetAll(System::Collections::Generic::ICollection<TKey>^ keys,
+        System::Collections::Generic::IDictionary<TKey, TValue>^ values,
+        System::Collections::Generic::IDictionary<TKey, System::Exception^>^ exceptions,
         bool addToLocalCache)
-      {    
+      {
         throw gcnew System::NotSupportedException;
       }
 
       generic<class TKey, class TValue>
-      void LocalRegion<TKey, TValue>::GetAll(System::Collections::Generic::ICollection<TKey>^ keys, 
-        System::Collections::Generic::IDictionary<TKey, TValue>^ values, 
-        System::Collections::Generic::IDictionary<TKey, System::Exception^>^ exceptions, 
+      void LocalRegion<TKey, TValue>::GetAll(System::Collections::Generic::ICollection<TKey>^ keys,
+        System::Collections::Generic::IDictionary<TKey, TValue>^ values,
+        System::Collections::Generic::IDictionary<TKey, System::Exception^>^ exceptions,
         bool addToLocalCache, Object^ callbackArg)
-      {    
+      {
         throw gcnew System::NotSupportedException;
       }
-      
+
       generic<class TKey, class TValue>
       void LocalRegion<TKey, TValue>::RemoveAll(System::Collections::Generic::ICollection<TKey>^ keys)
       {
         throw gcnew System::NotSupportedException;
       }
-      
+
       generic<class TKey, class TValue>
       void LocalRegion<TKey, TValue>::RemoveAll(System::Collections::Generic::ICollection<TKey>^ keys,
             Object^ callbackArg)
@@ -608,7 +573,7 @@ namespace Apache
 
       generic<class TKey, class TValue>
       String^ LocalRegion<TKey, TValue>::Name::get()
-      { 
+      {
         try
         {
           return marshal_as<String^>( m_nativeptr->get()->getName( ) );
@@ -616,12 +581,12 @@ namespace Apache
         finally
         {
           GC::KeepAlive(m_nativeptr);
-        } 
-      } 
+        }
+      }
 
       generic<class TKey, class TValue>
       String^ LocalRegion<TKey, TValue>::FullPath::get()
-      { 
+      {
         try
         {
           return marshal_as<String^>( m_nativeptr->get()->getFullPath( ) );
@@ -629,8 +594,8 @@ namespace Apache
         finally
         {
           GC::KeepAlive(m_nativeptr);
-        } 
-      } 
+        }
+      }
 
       generic<class TKey, class TValue>
       IRegion<TKey, TValue>^ LocalRegion<TKey, TValue>::ParentRegion::get()
@@ -655,7 +620,7 @@ namespace Apache
 
       generic<class TKey, class TValue>
       Apache::Geode::Client::RegionAttributes<TKey, TValue>^ LocalRegion<TKey, TValue>::Attributes::get()
-      { 
+      {
         _GF_MG_EXCEPTION_TRY2/* due to auto replace */
 
         try
@@ -668,9 +633,9 @@ namespace Apache
         }
 
         _GF_MG_EXCEPTION_CATCH_ALL2/* due to auto replace */
-      } 
+      }
 
-      generic<class TKey, class TValue>      
+      generic<class TKey, class TValue>
       AttributesMutator<TKey, TValue>^ LocalRegion<TKey, TValue>::AttributesMutator::get()
       {
         _GF_MG_EXCEPTION_TRY2/* due to auto replace */
@@ -727,7 +692,7 @@ namespace Apache
       }
 
       generic<class TKey, class TValue>
-      IRegion<TKey, TValue>^ LocalRegion<TKey, TValue>::CreateSubRegion( String^ subRegionName, 
+      IRegion<TKey, TValue>^ LocalRegion<TKey, TValue>::CreateSubRegion( String^ subRegionName,
         Apache::Geode::Client::RegionAttributes<TKey, TValue>^ attributes)
       {
         _GF_MG_EXCEPTION_TRY2/* due to auto replace */
@@ -790,7 +755,7 @@ namespace Apache
           {
             GC::KeepAlive(m_nativeptr);
           }
- 
+
         _GF_MG_EXCEPTION_CATCH_ALL2/* due to auto replace */
       }
 
@@ -807,7 +772,7 @@ namespace Apache
           finally
           {
             GC::KeepAlive(m_nativeptr);
-          }          
+          }
           auto entryarr = gcnew array<RegionEntry<TKey, TValue>^>( static_cast<int>(vc.size( )) );
 
           for( System::Int32 index = 0; index < vc.size( ); index++ )
@@ -819,12 +784,12 @@ namespace Apache
           return collection;
 
          _GF_MG_EXCEPTION_CATCH_ALL2/* due to auto replace */
-        
+
       }
 
       generic<class TKey, class TValue>
       IRegionService^ LocalRegion<TKey, TValue>::RegionService::get()
-      {        
+      {
         return CacheResolver::Lookup(&m_nativeptr->get()->getCache());
       }
 
@@ -867,7 +832,7 @@ namespace Apache
       generic<class TKey, class TValue>
       void LocalRegion<TKey, TValue>::Clear(Object^ callbackArg)
       {
-        _GF_MG_EXCEPTION_TRY2/* due to auto replace */        
+        _GF_MG_EXCEPTION_TRY2/* due to auto replace */
           try
           {
             m_nativeptr->get()->localClear(Serializable::GetUnmanagedValueGeneric<Object^>( callbackArg ) );
@@ -886,7 +851,7 @@ namespace Apache
       {
         if (toArray == nullptr)
         {
-          throw gcnew System::ArgumentNullException;            
+          throw gcnew System::ArgumentNullException;
         }
         if (startIdx < 0)
         {
@@ -903,21 +868,21 @@ namespace Apache
         finally
         {
           GC::KeepAlive(m_nativeptr);
-        }        
+        }
 
         if (toArray->Rank > 1 || (vc.size() > (toArray->Length - startIdx)))
         {
           throw gcnew System::ArgumentException;
-        }          
+        }
 
         for( System::Int32 index = 0; index < vc.size( ); index++ )
         {
           std::shared_ptr<apache::geode::client::RegionEntry> nativeptr =  vc[ index ];
           TKey key = TypeRegistry::GetManagedValueGeneric<TKey> (nativeptr->getKey());
-          TValue val = TypeRegistry::GetManagedValueGeneric<TValue> (nativeptr->getValue());            
+          TValue val = TypeRegistry::GetManagedValueGeneric<TValue> (nativeptr->getValue());
           toArray[ startIdx ] = KeyValuePair<TKey,TValue>(key, val);
           ++startIdx;
-        }               
+        }
 
         _GF_MG_EXCEPTION_CATCH_ALL2/* due to auto replace */
       }
@@ -934,7 +899,7 @@ namespace Apache
           GC::KeepAlive(m_nativeptr);
         }
       }
-      
+
       generic<class TKey, class TValue>
       generic<class TResult>
       ISelectResults<TResult>^ LocalRegion<TKey, TValue>::Query( String^ predicate )
diff --git a/clicache/src/LocalRegion.hpp b/clicache/src/LocalRegion.hpp
index 44fbb4f..d45137b 100644
--- a/clicache/src/LocalRegion.hpp
+++ b/clicache/src/LocalRegion.hpp
@@ -254,7 +254,6 @@ namespace Apache
 
         private:        
         inline std::shared_ptr<apache::geode::client::Serializable> getRegionEntryValue(std::shared_ptr<apache::geode::client::CacheableKey>& key);
-        bool AreValuesEqual(std::shared_ptr<apache::geode::client::Cacheable>& val1, std::shared_ptr<apache::geode::client::Cacheable>& val2);
 
         native_shared_ptr<native::Region>^ m_nativeptr;   
       };
diff --git a/clicache/src/ManagedPdxTypeHandler.hpp b/clicache/src/ManagedPdxTypeHandler.hpp
new file mode 100644
index 0000000..89fd7ac
--- /dev/null
+++ b/clicache/src/ManagedPdxTypeHandler.hpp
@@ -0,0 +1,103 @@
+/*
+* 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.
+*/
+
+#pragma once
+
+#include "begin_native.hpp"
+#include <SerializationRegistry.hpp>
+#include "end_native.hpp"
+
+#include "impl/CacheResolver.hpp"
+#include "impl/PdxHelper.hpp"
+#include "impl/PdxManagedCacheableKey.hpp"
+
+namespace apache {
+  namespace geode {
+    namespace client {
+      namespace Managed = Apache::Geode::Client;
+
+      /**
+       * Intercept (de)serialization of PDX types into the .NET managed layer.
+       */
+      class ManagedPdxTypeHandler : public PdxTypeHandler
+      {
+      public:
+        ~ManagedPdxTypeHandler() noexcept override = default;
+
+        void serialize(const PdxSerializable& pdxSerializable,
+          DataOutput& dataOutput) const override
+        {
+          if (auto wrappedPdxSerializable = dynamic_cast<const PdxManagedCacheableKey*>(&pdxSerializable))
+          {
+            try
+            {
+              auto&& cache = CacheResolver::Lookup(dataOutput.getCache());
+              Managed::DataOutput managedDataOutput(&dataOutput, true, cache);
+              
+              auto&& managedPdx = wrappedPdxSerializable->ptr();
+              Managed::Internal::PdxHelper::SerializePdx(%managedDataOutput, managedPdx);
+              
+              managedDataOutput.WriteBytesToUMDataOutput();
+            }
+            catch (Apache::Geode::Client::GeodeException^ ex)
+            {
+              ex->ThrowNative();
+            }
+            catch (System::Exception^ ex)
+            {
+              Apache::Geode::Client::GeodeException::ThrowNative(ex);
+            }
+          }
+          else
+          {
+            throw IllegalStateException("Not managed PDX object.");
+          }
+        }
+
+        std::shared_ptr<PdxSerializable> deserialize(DataInput& dataInput) const override
+        {
+          try
+          {
+            auto&& cache = CacheResolver::Lookup(dataInput.getCache());
+
+            Managed::DataInput managedDataInput(&dataInput, true, cache);
+
+            auto&& serializationRegistry = CacheRegionHelper::getCacheImpl(dataInput.getCache())->getSerializationRegistry().get();
+            auto managedPdx = Apache::Geode::Client::Internal::PdxHelper::DeserializePdx(%managedDataInput, false, serializationRegistry);
+            
+            dataInput.advanceCursor(managedDataInput.BytesReadInternally);
+            
+            return std::shared_ptr<PdxManagedCacheableKey>(new PdxManagedCacheableKey(managedPdx));
+          }
+          catch (Apache::Geode::Client::GeodeException^ ex)
+          {
+            ex->ThrowNative();
+          }
+          catch (System::Exception^ ex)
+          {
+            Apache::Geode::Client::GeodeException::ThrowNative(ex);
+          }
+
+          return nullptr;
+        }
+
+      };
+
+    } //  namespace client
+  } //  namespace geode
+} //  namespace apache
+
diff --git a/clicache/src/Properties.cpp b/clicache/src/Properties.cpp
index e2b33ff..89b87e5 100644
--- a/clicache/src/Properties.cpp
+++ b/clicache/src/Properties.cpp
@@ -50,7 +50,7 @@ namespace Apache
         inline PropertyToString( ) : m_str( "{" )
         { }
 
-        void Visit( Apache::Geode::Client::ICacheableKey^ key, IGeodeSerializable^ value )
+        void Visit( Apache::Geode::Client::ICacheableKey^ key, ISerializable^ value )
         {
           if ( m_str->Length > 1 ) {
             m_str += ",";
@@ -203,7 +203,7 @@ namespace Apache
 				return "";
       }
 
-      // IGeodeSerializable methods
+      // ISerializable methods
 
       generic<class TPropKey, class TPropValue>
       void Properties<TPropKey, TPropValue>::ToData( DataOutput^ output )
diff --git a/clicache/src/Properties.hpp b/clicache/src/Properties.hpp
index 4e762ad..f0bff7a 100644
--- a/clicache/src/Properties.hpp
+++ b/clicache/src/Properties.hpp
@@ -25,7 +25,7 @@
 #include "SerializationRegistry.hpp"
 #include "end_native.hpp"
 
-#include "IGeodeSerializable.hpp"
+#include "ISerializable.hpp"
 #include "ICacheableKey.hpp"
 #include "DataInput.hpp"
 #include "DataOutput.hpp"
@@ -46,7 +46,7 @@ namespace Apache
     {
       namespace native = apache::geode::client;
 
-      delegate void PropertyVisitor(Apache::Geode::Client::ICacheableKey^ key, Apache::Geode::Client::IGeodeSerializable^ value);
+      delegate void PropertyVisitor(Apache::Geode::Client::ICacheableKey^ key, Apache::Geode::Client::ISerializable^ value);
 
       generic <class TPropKey, class TPropValue>
       ref class PropertyVisitorProxy;
@@ -72,7 +72,7 @@ namespace Apache
       /// or an integer.
       /// </summary>
       public ref class Properties sealed
-        : public IGeodeSerializable //,public ISerializable
+        : public IDataSerializablePrimitive
       {
       public:
 
@@ -162,7 +162,7 @@ namespace Apache
         /// </returns>
         virtual String^ ToString( ) override;
 
-        // IGeodeSerializable members
+        // ISerializable members
 
         /// <summary>
         /// Serializes this Properties object.
@@ -189,34 +189,14 @@ namespace Apache
           virtual System::UInt64 get( ); 
         }
 
-        /// <summary>
-        /// Returns the classId of this class for serialization.
-        /// </summary>
-        /// <returns>classId of the Properties class</returns>
-        /// <seealso cref="IGeodeSerializable.ClassId" />
-        virtual property System::UInt32 ClassId
+        property int8_t DsCode
         {
-          inline virtual System::UInt32 get( )
+          inline virtual int8_t get( )
           {
-            return GeodeClassIds::Properties;
+            return native::GeodeTypeIds::Properties;
           }
         }
 
-        // End: IGeodeSerializable members
-
-        // ISerializable members
-
-        //virtual void GetObjectData( SerializationInfo^ info,
-        //  StreamingContext context);
-
-        // End: ISerializable members
-
-      protected:
-
-        // For deserialization using the .NET serialization (ISerializable)
-        //Properties(SerializationInfo^ info, StreamingContext context, std::shared_ptr<native::SerializationRegistry> serializationRegistry);
-
-
       internal:
 
         /// <summary>
@@ -238,7 +218,7 @@ namespace Apache
           return m_nativeptr->get_shared_ptr();
         }
 
-        inline static IGeodeSerializable^ CreateDeserializable()
+        inline static ISerializable^ CreateDeserializable()
         {
           return Create();
         }
@@ -263,25 +243,22 @@ namespace Apache
       ref class PropertyVisitorProxy
       {
       public:
-        void Visit(Apache::Geode::Client::ICacheableKey^ key,
-          Apache::Geode::Client::IGeodeSerializable^ value)
+        void Visit(ICacheableKey^ key, ISerializable^ value)
         {
-          TPropKey tpkey = Apache::Geode::Client::TypeRegistry::
-            GetManagedValueGeneric<TPropKey>(std::shared_ptr<apache::geode::client::Serializable>(SafeMSerializableConvertGeneric(key)));
-          TPropValue tpvalue = Apache::Geode::Client::TypeRegistry::
-            GetManagedValueGeneric<TPropValue>(std::shared_ptr<apache::geode::client::Serializable>(SafeMSerializableConvertGeneric(value)));
+          auto tpkey = TypeRegistry::GetManagedValueGeneric<TPropKey>(std::shared_ptr<apache::geode::client::Serializable>(GetNativeWrapperForManagedObject(key)));
+          auto tpvalue = TypeRegistry::GetManagedValueGeneric<TPropValue>(std::shared_ptr<apache::geode::client::Serializable>(GetNativeWrapperForManagedObject(value)));
           m_visitor->Invoke(tpkey, tpvalue);
+
+          //m_visitor->Invoke(safe_cast<TPropKey>(key), safe_cast<TPropValue>(value));
         }
 
-        void SetPropertyVisitorGeneric(
-          Apache::Geode::Client::PropertyVisitorGeneric<TPropKey, TPropValue>^ visitor)
+        void SetPropertyVisitorGeneric(PropertyVisitorGeneric<TPropKey, TPropValue>^ visitor)
         {
           m_visitor = visitor;
         }
 
       private:
-
-        Apache::Geode::Client::PropertyVisitorGeneric<TPropKey, TPropValue>^ m_visitor;
+        PropertyVisitorGeneric<TPropKey, TPropValue>^ m_visitor;
       };
 
     }  // namespace Client
diff --git a/clicache/src/Query.hpp b/clicache/src/Query.hpp
index f734701..105999c 100644
--- a/clicache/src/Query.hpp
+++ b/clicache/src/Query.hpp
@@ -25,7 +25,7 @@
 
 #include "native_shared_ptr.hpp"
 
-#include "IGeodeSerializable.hpp"
+#include "ISerializable.hpp"
 
 
 namespace Apache
diff --git a/clicache/src/QueryService.cpp b/clicache/src/QueryService.cpp
index af28116..49fd97c 100644
--- a/clicache/src/QueryService.cpp
+++ b/clicache/src/QueryService.cpp
@@ -206,7 +206,7 @@ namespace Apache
           auto durableCqsList = gcnew System::Collections::Generic::List<String^>();
           for (const auto& d : *durableCqsArrayListPtr)
           {
-            durableCqsList->Add(marshal_as<String^>(std::static_pointer_cast<apache::geode::client::CacheableString>(d)->toString()));
+            durableCqsList->Add(marshal_as<String^>(std::dynamic_pointer_cast<apache::geode::client::CacheableString>(d)->value()));
           }
           return durableCqsList;
         }
diff --git a/clicache/src/Region.cpp b/clicache/src/Region.cpp
index cb02bfe..9c2ab8d 100644
--- a/clicache/src/Region.cpp
+++ b/clicache/src/Region.cpp
@@ -29,7 +29,7 @@
 #include "AttributesMutator.hpp"
 #include "RegionEntry.hpp"
 #include "ISelectResults.hpp"
-#include "IGeodeSerializable.hpp"
+#include "ISerializable.hpp"
 #include "ResultSet.hpp"
 #include "StructSet.hpp"
 #include "impl/AuthenticatedView.hpp"
@@ -132,7 +132,7 @@ namespace Apache
           {
             GC::KeepAlive(m_nativeptr);
           }
-        
+
         _GF_MG_EXCEPTION_CATCH_ALL2/* due to auto replace */
       }
 
@@ -232,42 +232,6 @@ namespace Apache
       }
 
       generic<class TKey, class TValue>
-      bool Region<TKey, TValue>::AreValuesEqual(std::shared_ptr<native::Cacheable>& val1, std::shared_ptr<native::Cacheable>& val2)
-      {
-        if (val1 == nullptr && val2 == nullptr)
-        {
-          return true;
-        }
-        else if ((val1 == nullptr && val2 != nullptr) || (val1 != nullptr && val2 == nullptr))
-        {
-          return false;
-        }
-        else if (val1 != nullptr && val2 != nullptr)
-        {
-          if (val1->classId() != val2->classId() || val1->typeId() != val2->typeId())
-          {
-            return false;
-          }
-          auto out1 = m_nativeptr->get_conditional_shared_ptr()->getCache().createDataOutput();
-          auto out2 = m_nativeptr->get_conditional_shared_ptr()->getCache().createDataOutput();
-          val1->toData(out1);
-          val2->toData(out2);
-
-          GC::KeepAlive(m_nativeptr);
-          if (out1.getBufferLength() != out2.getBufferLength())
-          {
-            return false;
-          }
-          else if (memcmp(out1.getBuffer(), out2.getBuffer(), out1.getBufferLength()) != 0)
-          {
-            return false;
-          }
-          return true;
-        }
-        return false;
-      }
-
-      generic<class TKey, class TValue>
       bool Region<TKey, TValue>::Contains(KeyValuePair<TKey, TValue> keyValuePair)
       {
         std::shared_ptr<native::CacheableKey> keyptr = Serializable::GetUnmanagedValueGeneric<TKey>(keyValuePair.Key);
@@ -685,7 +649,7 @@ namespace Apache
           }
 
          native::HashMapOfCacheable native_value;
-        
+
           try
           {
             native_value = m_nativeptr->get()->getAll(vecKeys);
@@ -747,7 +711,7 @@ namespace Apache
               values->Add(key, val);
             }
           }
- 
+
           _GF_MG_EXCEPTION_CATCH_ALL2/* due to auto replace */
         }
         else {
@@ -1212,7 +1176,7 @@ namespace Apache
                                                   bool receiveValues)
       {
         _GF_MG_EXCEPTION_TRY2/* due to auto replace */
-          
+
         try
         {
             m_nativeptr->get()->registerAllKeys(isDurable, getInitialValues, receiveValues);
diff --git a/clicache/src/Region.hpp b/clicache/src/Region.hpp
index ec63a0d..9220874 100644
--- a/clicache/src/Region.hpp
+++ b/clicache/src/Region.hpp
@@ -301,7 +301,6 @@ namespace Apache
 
         inline std::shared_ptr<apache::geode::client::Serializable> get(std::shared_ptr<apache::geode::client::CacheableKey>& key, std::shared_ptr<apache::geode::client::Serializable>& callbackArg);
         inline std::shared_ptr<apache::geode::client::Serializable> get(std::shared_ptr<apache::geode::client::CacheableKey>& key);
-        bool AreValuesEqual(std::shared_ptr<apache::geode::client::Cacheable>& val1, std::shared_ptr<apache::geode::client::Cacheable>& val2);
         bool isPoolInMultiuserMode();
         
         native_conditional_shared_ptr<native::Region>^ m_nativeptr;
diff --git a/clicache/src/RegionAttributes.hpp b/clicache/src/RegionAttributes.hpp
index b4774df..5798993 100644
--- a/clicache/src/RegionAttributes.hpp
+++ b/clicache/src/RegionAttributes.hpp
@@ -24,10 +24,9 @@
 #include "end_native.hpp"
 
 #include "native_shared_ptr.hpp"
-#include "IGeodeSerializable.hpp"
+#include "ISerializable.hpp"
 #include "ExpirationAction.hpp"
 #include "DiskPolicyType.hpp"
-#include "GeodeClassIds.hpp"
 
 #include "ICacheLoader.hpp"
 #include "ICacheWriter.hpp"
@@ -68,7 +67,7 @@ namespace Apache
       /// <seealso cref="Region.Attributes" />
       generic <class TKey, class TValue>
       public ref class RegionAttributes sealed
-        : public IGeodeSerializable
+        : public IDataSerializableInternal
       {
       public:
 
@@ -457,20 +456,6 @@ namespace Apache
           }
         }
 
-        /// <summary>
-        /// Returns the classId of this class for serialization.
-        /// </summary>
-        /// <returns>classId of the Properties class</returns>
-        /// <seealso cref="../../IGeodeSerializable.ClassId" />
-        virtual property System::UInt32 ClassId
-        {
-          inline virtual System::UInt32 get()
-          {
-            return GeodeClassIds::RegionAttributes;
-          }
-        }
-
-
       internal:
 
         /// <summary>
diff --git a/clicache/src/RegionEvent.cpp b/clicache/src/RegionEvent.cpp
index 1d988e8..c0f363a 100644
--- a/clicache/src/RegionEvent.cpp
+++ b/clicache/src/RegionEvent.cpp
@@ -18,7 +18,7 @@
 
 #include "RegionEvent.hpp"
 #include "Region.hpp"
-#include "IGeodeSerializable.hpp"
+#include "ISerializable.hpp"
 #include "impl/SafeConvert.hpp"
 using namespace System;
 
diff --git a/clicache/src/RegionEvent.hpp b/clicache/src/RegionEvent.hpp
index 4bb28b9..92cb8fb 100644
--- a/clicache/src/RegionEvent.hpp
+++ b/clicache/src/RegionEvent.hpp
@@ -23,7 +23,7 @@
 #include <geode/RegionEvent.hpp>
 #include "end_native.hpp"
 
-#include "IGeodeSerializable.hpp"
+#include "ISerializable.hpp"
 #include "IRegion.hpp"
 #include "Region.hpp"
 
diff --git a/clicache/src/ResultSet.hpp b/clicache/src/ResultSet.hpp
index 29989d3..0ea1c5a 100644
--- a/clicache/src/ResultSet.hpp
+++ b/clicache/src/ResultSet.hpp
@@ -37,7 +37,7 @@ namespace Apache
     {
       namespace native = apache::geode::client;
 
-      interface class IGeodeSerializable;
+      interface class ISerializable;
 
       generic<class TResult>
       ref class SelectResultsIterator;
diff --git a/clicache/src/SelectResultsIterator.hpp b/clicache/src/SelectResultsIterator.hpp
index b4fd644..ae06e3a 100644
--- a/clicache/src/SelectResultsIterator.hpp
+++ b/clicache/src/SelectResultsIterator.hpp
@@ -27,7 +27,7 @@ namespace Apache
   {
     namespace Client
     {
-      interface class IGeodeSerializable;
+      interface class ISerializable;
 
       /// <summary>
       /// Iterator for a query result.
diff --git a/clicache/src/Serializable.cpp b/clicache/src/Serializable.cpp
index 3305b1c..b871729 100644
--- a/clicache/src/Serializable.cpp
+++ b/clicache/src/Serializable.cpp
@@ -67,47 +67,6 @@ namespace Apache
       using namespace msclr::interop;
       namespace native = apache::geode::client;
 
-      void Apache::Geode::Client::Serializable::ToData(
-        Apache::Geode::Client::DataOutput^ output)
-      {
-        if (output->IsManagedObject()) {
-          output->WriteBytesToUMDataOutput();
-        }
-        try
-        {
-          auto nativeOutput = output->GetNative();
-          m_nativeptr->get()->toData(*nativeOutput);
-        }
-        finally
-        {
-          GC::KeepAlive(output);
-          GC::KeepAlive(m_nativeptr);
-        }
-        if (output->IsManagedObject()) {
-          output->SetBuffer();
-        }
-      }
-
-      void Serializable::FromData(DataInput^ input)
-      {
-        if (input->IsManagedObject()) {
-          input->AdvanceUMCursor();
-        }
-        auto* nativeInput = input->GetNative();
-
-        try
-        {
-          m_nativeptr->get()->fromData(*nativeInput);
-          if (input->IsManagedObject()) {
-            input->SetBuffer();
-          }
-        }
-        finally
-        {
-          GC::KeepAlive(m_nativeptr);
-        }
-      }
-
       System::UInt64 Apache::Geode::Client::Serializable::ObjectSize::get()
       {
         try
@@ -120,27 +79,6 @@ namespace Apache
         }
       }
 
-      System::UInt32 Apache::Geode::Client::Serializable::ClassId::get()
-      {
-        try
-        {
-          auto n = m_nativeptr->get();
-          int8_t typeId = n->typeId();
-          if (typeId == native::GeodeTypeIdsImpl::CacheableUserData ||
-            typeId == native::GeodeTypeIdsImpl::CacheableUserData2 ||
-            typeId == native::GeodeTypeIdsImpl::CacheableUserData4) {
-            return n->classId();
-          }
-          else {
-            return typeId + 0x80000000 + (0x20000000 * n->DSFID());
-          }
-        }
-        finally
-        {
-          GC::KeepAlive(m_nativeptr);
-        }
-      }
-
       String^ Apache::Geode::Client::Serializable::ToString()
       {
         try
@@ -153,110 +91,15 @@ namespace Apache
         }
       }
 
-      Apache::Geode::Client::Serializable::operator Apache::Geode::Client::Serializable ^ (Byte value)
-      {
-        return (Apache::Geode::Client::Serializable^) CacheableByte::Create(value);
-      }
-
-      Apache::Geode::Client::Serializable::operator Apache::Geode::Client::Serializable ^ (bool value)
-      {
-        return (Apache::Geode::Client::Serializable^)CacheableBoolean::Create(value);
-      }
-
-      Apache::Geode::Client::Serializable::operator Apache::Geode::Client::Serializable ^ (array<bool>^ value)
-      {
-        // return (Apache::Geode::Client::Serializable^)Apache::Geode::Client::CacheableBooleanArray::Create(value);
-        //TODO:split
-        return nullptr;
-      }
-
-      Apache::Geode::Client::Serializable::operator Apache::Geode::Client::Serializable ^ (array<Byte>^ value)
-      {
-        return (Apache::Geode::Client::Serializable^)CacheableBytes::Create(value);
-      }
-
-      Apache::Geode::Client::Serializable::operator Apache::Geode::Client::Serializable ^ (Char value)
-      {
-        return (Apache::Geode::Client::Serializable^)CacheableCharacter::Create(value);
-      }
-
-      Apache::Geode::Client::Serializable::operator Apache::Geode::Client::Serializable ^ (array<Char>^ value)
-      {
-        //return (Apache::Geode::Client::Serializable^)Apache::Geode::Client::CacheableCharArray::Create(value);
-        //TODO:split
-        return nullptr;
-
-      }
-
-      Apache::Geode::Client::Serializable::operator Apache::Geode::Client::Serializable ^ (Double value)
-      {
-        return (Apache::Geode::Client::Serializable^)CacheableDouble::Create(value);
-      }
-
-      Apache::Geode::Client::Serializable::operator Apache::Geode::Client::Serializable ^ (array<Double>^ value)
-      {
-        return (Apache::Geode::Client::Serializable^)CacheableDoubleArray::Create(value);
-      }
-
-      Apache::Geode::Client::Serializable::operator Apache::Geode::Client::Serializable ^ (Single value)
-      {
-        return (Apache::Geode::Client::Serializable^)CacheableFloat::Create(value);
-      }
-
-      Apache::Geode::Client::Serializable::operator Apache::Geode::Client::Serializable ^ (array<Single>^ value)
-      {
-        return (Apache::Geode::Client::Serializable^)CacheableFloatArray::Create(value);
-      }
-
-      Apache::Geode::Client::Serializable::operator Apache::Geode::Client::Serializable ^ (System::Int16 value)
-      {
-        return (Apache::Geode::Client::Serializable^)CacheableInt16::Create(value);
-      }
-
-      Apache::Geode::Client::Serializable::operator Apache::Geode::Client::Serializable ^ (array<System::Int16>^ value)
-      {
-        return (Apache::Geode::Client::Serializable^)CacheableInt16Array::Create(value);
-      }
-
-      Apache::Geode::Client::Serializable::operator Apache::Geode::Client::Serializable ^ (System::Int32 value)
-      {
-        return (Apache::Geode::Client::Serializable^)CacheableInt32::Create(value);
-      }
-
-      Apache::Geode::Client::Serializable::operator Apache::Geode::Client::Serializable ^ (array<System::Int32>^ value)
-      {
-        return (Apache::Geode::Client::Serializable^)CacheableInt32Array::Create(value);
-      }
-
-      Apache::Geode::Client::Serializable::operator Apache::Geode::Client::Serializable ^ (System::Int64 value)
-      {
-        return (Apache::Geode::Client::Serializable^)CacheableInt64::Create(value);
-      }
-
-      /*Apache::Geode::Client::*/Serializable::operator /*Apache::Geode::Client::*/Serializable ^ (array<System::Int64>^ value)
-      {
-        return (Apache::Geode::Client::Serializable^)Apache::Geode::Client::CacheableInt64Array::Create(value);
-      }
-
-      Apache::Geode::Client::Serializable::operator Apache::Geode::Client::Serializable ^ (String^ value)
-      {
-        return (Apache::Geode::Client::Serializable^)CacheableString::Create(value);
-      }
-
-      Apache::Geode::Client::Serializable::operator Apache::Geode::Client::Serializable ^ (array<String^>^ value)
-      {
-        return (Apache::Geode::Client::Serializable^)CacheableStringArray::Create(value);
-      }
-
-      System::Int32 Serializable::GetPDXIdForType(native::Pool* pool, IGeodeSerializable^ pdxType, Cache^ cache)
+      System::Int32 Serializable::GetPDXIdForType(native::Pool* pool, ISerializable^ pdxType, Cache^ cache)
       {
-        std::shared_ptr<native::Cacheable> kPtr(SafeMSerializableConvertGeneric(pdxType));
+        std::shared_ptr<native::Cacheable> kPtr(GetNativeWrapperForManagedObject(pdxType));
         return CacheRegionHelper::getCacheImpl(cache->GetNative().get())
             ->getSerializationRegistry()
             ->GetPDXIdForType(pool, kPtr);
       }
 
-      IGeodeSerializable^ Serializable::GetPDXTypeById(native::Pool* pool, System::Int32 typeId, Cache^ cache)
+      ISerializable^ Serializable::GetPDXTypeById(native::Pool* pool, System::Int32 typeId, Cache^ cache)
       {        
         auto sPtr =  CacheRegionHelper::getCacheImpl(cache->GetNative().get())
             ->getSerializationRegistry()
@@ -266,23 +109,16 @@ namespace Apache
 
       int Serializable::GetEnumValue(Internal::EnumInfo^ ei, Cache^ cache)
       {
-        std::shared_ptr<native::Cacheable> kPtr(SafeMSerializableConvertGeneric(ei));
-        return  CacheRegionHelper::getCacheImpl(cache->GetNative().get())->getSerializationRegistry()->GetEnumValue(cache->GetNative()->getPoolManager().getAll().begin()->second, kPtr);
+        std::shared_ptr<native::Cacheable> kPtr(GetNativeWrapperForManagedObject(ei));
+        auto&& cacheImpl = CacheRegionHelper::getCacheImpl(cache->GetNative().get());
+        return cacheImpl->getSerializationRegistry()->GetEnumValue(cacheImpl->getDefaultPool(), kPtr);
       }
 
       Internal::EnumInfo^ Serializable::GetEnum(int val, Cache^ cache)
       {
-        std::shared_ptr<apache::geode::client::Serializable> sPtr = CacheRegionHelper::getCacheImpl(cache->GetNative().get())->getSerializationRegistry()->GetEnum(cache->GetNative()->getPoolManager().getAll().begin()->second, val);
-        return (Internal::EnumInfo^)SafeUMSerializableConvertGeneric(sPtr);
-      }
-      void Serializable::RegisterPDXManagedCacheableKey(Cache^ cache)
-      {
         auto cacheImpl = CacheRegionHelper::getCacheImpl(cache->GetNative().get());
-        cacheImpl->getSerializationRegistry()->setPdxTypeHandler([](native::DataInput& dataInput){
-          auto obj = std::make_shared<native::PdxManagedCacheableKey>();
-          obj->fromData(dataInput);
-          return obj;
-        });
+        auto sPtr = cacheImpl->getSerializationRegistry()->GetEnum(cacheImpl->getDefaultPool(), val);
+        return (Internal::EnumInfo^)SafeUMSerializableConvertGeneric(sPtr);
       }
 
       generic<class TKey>
@@ -314,12 +150,12 @@ namespace Apache
       std::shared_ptr<native::CacheableKey> Serializable::GetUnmanagedValueGeneric(
         Type^ managedType, TKey key, bool isAsciiChar)
       {
-        Byte typeId = Apache::Geode::Client::TypeRegistry::GetManagedTypeMappingGeneric(managedType);
+        Byte typeId = Apache::Geode::Client::TypeRegistry::GetDsCodeForManagedType(managedType);
 
         switch (typeId)
         {
         case native::GeodeTypeIds::CacheableByte: {
-          return Serializable::getCacheableByte((SByte)key);
+          return Serializable::getCacheableByte((Byte)key);
         }
         case native::GeodeTypeIds::CacheableBoolean:
           return Serializable::getCacheableBoolean((bool)key);
@@ -342,110 +178,110 @@ namespace Apache
         }
         case native::GeodeTypeIds::CacheableBytes:
         {
-          return wrapIGeodeSerializable(Apache::Geode::Client::CacheableBytes::Create((array<Byte>^)key));
+          return GetNativeCacheableKeyWrapperForManagedISerializable(Apache::Geode::Client::CacheableBytes::Create((array<Byte>^)key));
         }
         case native::GeodeTypeIds::CacheableDoubleArray:
         {
-          return wrapIGeodeSerializable(Apache::Geode::Client::CacheableDoubleArray::Create((array<Double>^)key));
+          return GetNativeCacheableKeyWrapperForManagedISerializable(Apache::Geode::Client::CacheableDoubleArray::Create((array<Double>^)key));
         }
         case native::GeodeTypeIds::CacheableFloatArray:
         {
-          return wrapIGeodeSerializable(Apache::Geode::Client::CacheableFloatArray::Create((array<float>^)key));
+          return GetNativeCacheableKeyWrapperForManagedISerializable(Apache::Geode::Client::CacheableFloatArray::Create((array<float>^)key));
         }
         case native::GeodeTypeIds::CacheableInt16Array:
         {
-          return wrapIGeodeSerializable(Apache::Geode::Client::CacheableInt16Array::Create((array<Int16>^)key));
+          return GetNativeCacheableKeyWrapperForManagedISerializable(Apache::Geode::Client::CacheableInt16Array::Create((array<Int16>^)key));
         }
         case native::GeodeTypeIds::CacheableInt32Array:
         {
-          return wrapIGeodeSerializable(Apache::Geode::Client::CacheableInt32Array::Create((array<Int32>^)key));
+          return GetNativeCacheableKeyWrapperForManagedISerializable(Apache::Geode::Client::CacheableInt32Array::Create((array<Int32>^)key));
         }
         case native::GeodeTypeIds::CacheableInt64Array:
         {
-          return wrapIGeodeSerializable(Apache::Geode::Client::CacheableInt64Array::Create((array<Int64>^)key));
+          return GetNativeCacheableKeyWrapperForManagedISerializable(Apache::Geode::Client::CacheableInt64Array::Create((array<Int64>^)key));
         }
         case native::GeodeTypeIds::CacheableStringArray:
         {
-          return wrapIGeodeSerializable(Apache::Geode::Client::CacheableStringArray::Create((array<String^>^)key));
+          return GetNativeCacheableKeyWrapperForManagedISerializable(Apache::Geode::Client::CacheableStringArray::Create((array<String^>^)key));
         }
         case native::GeodeTypeIds::CacheableFileName:
         {
-          return wrapIGeodeSerializable((Apache::Geode::Client::CacheableFileName^)key);
+          return GetNativeCacheableKeyWrapperForManagedISerializable((Apache::Geode::Client::CacheableFileName^)key);
         }
         case native::GeodeTypeIds::CacheableHashTable://collection::hashtable
         {
-          return wrapIGeodeSerializable(Apache::Geode::Client::CacheableHashTable::Create((System::Collections::Hashtable^)key));
+          return GetNativeCacheableKeyWrapperForManagedISerializable(Apache::Geode::Client::CacheableHashTable::Create((System::Collections::Hashtable^)key));
         }
         case native::GeodeTypeIds::CacheableHashMap://generic dictionary
         {
-          return wrapIGeodeSerializable(Apache::Geode::Client::CacheableHashMap::Create((System::Collections::IDictionary^)key));
+          return GetNativeCacheableKeyWrapperForManagedISerializable(Apache::Geode::Client::CacheableHashMap::Create((System::Collections::IDictionary^)key));
         }
         case native::GeodeTypeIds::CacheableVector://collection::arraylist
         {
-          return wrapIGeodeSerializable(CacheableVector::Create((System::Collections::IList^)key));
+          return GetNativeCacheableKeyWrapperForManagedISerializable(CacheableVector::Create((System::Collections::IList^)key));
         }
         case native::GeodeTypeIds::CacheableArrayList://generic ilist
         {
-          return wrapIGeodeSerializable(Apache::Geode::Client::CacheableArrayList::Create((System::Collections::IList^)key));
+          return GetNativeCacheableKeyWrapperForManagedISerializable(Apache::Geode::Client::CacheableArrayList::Create((System::Collections::IList^)key));
         }
         case native::GeodeTypeIds::CacheableLinkedList://generic linked list
         {
-          return wrapIGeodeSerializable(Apache::Geode::Client::CacheableLinkedList::Create((System::Collections::Generic::LinkedList<Object^>^)key));
+          return GetNativeCacheableKeyWrapperForManagedISerializable(Apache::Geode::Client::CacheableLinkedList::Create((System::Collections::Generic::LinkedList<Object^>^)key));
         }
         case native::GeodeTypeIds::CacheableStack:
         {
-          return wrapIGeodeSerializable(Apache::Geode::Client::CacheableStack::Create((System::Collections::ICollection^)key));
+          return GetNativeCacheableKeyWrapperForManagedISerializable(Apache::Geode::Client::CacheableStack::Create((System::Collections::ICollection^)key));
         }
-        case 7: //GeodeClassIds::CacheableManagedObject
+        case native::GeodeTypeIds::CacheableManagedObject:
         {
-          return wrapIGeodeSerializable((Apache::Geode::Client::CacheableObject^)key);
+          return GetNativeCacheableKeyWrapperForManagedISerializable((Apache::Geode::Client::CacheableObject^)key);
         }
-        case 8://GeodeClassIds::CacheableManagedObjectXml
+        case native::GeodeTypeIds::CacheableManagedObjectXml:
         {
-          return wrapIGeodeSerializable((Apache::Geode::Client::CacheableObjectXml^)key);
+          return GetNativeCacheableKeyWrapperForManagedISerializable((Apache::Geode::Client::CacheableObjectXml^)key);
         }
         case native::GeodeTypeIds::CacheableObjectArray:
         {
-          return wrapIGeodeSerializable((Apache::Geode::Client::CacheableObjectArray^)key);
+          return GetNativeCacheableKeyWrapperForManagedISerializable((Apache::Geode::Client::CacheableObjectArray^)key);
         }
         case native::GeodeTypeIds::CacheableIdentityHashMap:
         {
-          return wrapIGeodeSerializable(Apache::Geode::Client::CacheableIdentityHashMap::Create((System::Collections::IDictionary^)key));
+          return GetNativeCacheableKeyWrapperForManagedISerializable(Apache::Geode::Client::CacheableIdentityHashMap::Create((System::Collections::IDictionary^)key));
         }
         case native::GeodeTypeIds::CacheableHashSet://no need of it, default case should work
         {
-          return wrapIGeodeSerializable((Apache::Geode::Client::CacheableHashSet^)key);
+          return GetNativeCacheableKeyWrapperForManagedISerializable((Apache::Geode::Client::CacheableHashSet^)key);
         }
         case native::GeodeTypeIds::CacheableLinkedHashSet://no need of it, default case should work
         {
-          return wrapIGeodeSerializable((Apache::Geode::Client::CacheableLinkedHashSet^)key);
+          return GetNativeCacheableKeyWrapperForManagedISerializable((Apache::Geode::Client::CacheableLinkedHashSet^)key);
         }
         case native::GeodeTypeIds::CacheableDate:
         {
-          return wrapIGeodeSerializable(Apache::Geode::Client::CacheableDate::Create((System::DateTime)key));
+          return GetNativeCacheableKeyWrapperForManagedISerializable(Apache::Geode::Client::CacheableDate::Create((System::DateTime)key));
         }
         case native::GeodeTypeIds::BooleanArray:
         {
-          return wrapIGeodeSerializable(Apache::Geode::Client::BooleanArray::Create((array<bool>^)key));
+          return GetNativeCacheableKeyWrapperForManagedISerializable(Apache::Geode::Client::BooleanArray::Create((array<bool>^)key));
         }
         case native::GeodeTypeIds::CharArray:
         {
-          return wrapIGeodeSerializable(Apache::Geode::Client::CharArray::Create((array<Char>^)key));
+          return GetNativeCacheableKeyWrapperForManagedISerializable(Apache::Geode::Client::CharArray::Create((array<Char>^)key));
         }
         default:
         {
-          std::shared_ptr<native::Cacheable> kPtr(SafeGenericMSerializableConvert(key));
+          std::shared_ptr<native::Cacheable> kPtr(GetNativeWrapperForManagedObject(key));
           return std::dynamic_pointer_cast<native::CacheableKey>(kPtr);
         }
         }
       } //
       
-      std::shared_ptr<native::CacheableKey> Serializable::wrapIGeodeSerializable(IGeodeSerializable^ managedObject) {
+      std::shared_ptr<native::CacheableKey> Serializable::GetNativeCacheableKeyWrapperForManagedISerializable(ISerializable^ managedObject) {
         if (nullptr == managedObject) {
           return __nullptr;
         }
-        auto wrappedObject = new native::ManagedCacheableKeyGeneric(managedObject);
-        return std::shared_ptr<native::CacheableKey>(wrappedObject);
+        auto wrappedObject = std::shared_ptr<native::Serializable>(GetNativeWrapperForManagedObject(managedObject));
+        return std::dynamic_pointer_cast<native::CacheableKey>(wrappedObject);
       }
 
       // These are the new static methods to get/put data from c++
@@ -453,11 +289,11 @@ namespace Apache
       //byte
       Byte Serializable::getByte(std::shared_ptr<native::Serializable> nativeptr)
       {
-        native::CacheableByte* ci = static_cast<native::CacheableByte*>(nativeptr.get());
+        auto ci = dynamic_cast<native::CacheableByte*>(nativeptr.get());
         return ci->value();
       }
 
-      std::shared_ptr<native::CacheableKey> Serializable::getCacheableByte(SByte val)
+      std::shared_ptr<native::CacheableKey> Serializable::getCacheableByte(Byte val)
       {
         return native::CacheableByte::create(val);
       }
@@ -465,7 +301,7 @@ namespace Apache
       //boolean
       bool Serializable::getBoolean(std::shared_ptr<native::Serializable> nativeptr)
       {
-        native::CacheableBoolean* ci = static_cast<native::CacheableBoolean*>(nativeptr.get());
+        auto ci = dynamic_cast<native::CacheableBoolean*>(nativeptr.get());
         return ci->value();
       }
 
@@ -477,7 +313,7 @@ namespace Apache
       //widechar
       Char Serializable::getChar(std::shared_ptr<native::Serializable> nativeptr)
       {
-        native::CacheableCharacter* ci = static_cast<native::CacheableCharacter*>(nativeptr.get());
+        auto ci = dynamic_cast<native::CacheableCharacter*>(nativeptr.get());
         return ci->value();
       }
 
@@ -489,7 +325,7 @@ namespace Apache
       //double
       double Serializable::getDouble(std::shared_ptr<native::Serializable> nativeptr)
       {
-        native::CacheableDouble* ci = static_cast<native::CacheableDouble*>(nativeptr.get());
+        auto ci = dynamic_cast<native::CacheableDouble*>(nativeptr.get());
         return ci->value();
       }
 
@@ -501,7 +337,7 @@ namespace Apache
       //float
       float Serializable::getFloat(std::shared_ptr<native::Serializable> nativeptr)
       {
-        native::CacheableFloat* ci = static_cast<native::CacheableFloat*>(nativeptr.get());
+        auto ci = dynamic_cast<native::CacheableFloat*>(nativeptr.get());
         return ci->value();
       }
 
@@ -513,7 +349,7 @@ namespace Apache
       //int16
       System::Int16 Serializable::getInt16(std::shared_ptr<native::Serializable> nativeptr)
       {
-        native::CacheableInt16* ci = static_cast<native::CacheableInt16*>(nativeptr.get());
+        auto ci = dynamic_cast<native::CacheableInt16*>(nativeptr.get());
         return ci->value();
       }
 
@@ -525,7 +361,7 @@ namespace Apache
       //int32
       System::Int32 Serializable::getInt32(std::shared_ptr<native::Serializable> nativeptr)
       {
-        native::CacheableInt32* ci = static_cast<native::CacheableInt32*>(nativeptr.get());
+        auto ci = dynamic_cast<native::CacheableInt32*>(nativeptr.get());
         return ci->value();
       }
 
@@ -537,7 +373,7 @@ namespace Apache
       //int64
       System::Int64 Serializable::getInt64(std::shared_ptr<native::Serializable> nativeptr)
       {
-        native::CacheableInt64* ci = static_cast<native::CacheableInt64*>(nativeptr.get());
+        auto ci = dynamic_cast<native::CacheableInt64*>(nativeptr.get());
         return ci->value();
       }
 
@@ -547,49 +383,16 @@ namespace Apache
       }
 
       //cacheable ascii string
-      String^ Serializable::getASCIIString(std::shared_ptr<native::Serializable> nativeptr)
-      {
-        return marshal_as<String^>(nativeptr->toString());
-      }
-
-      std::shared_ptr<native::CacheableKey> Serializable::getCacheableASCIIString(String^ val)
-      {
-        return GetCacheableString(val);
-      }
-
-      //cacheable ascii string huge
-      String^ Serializable::getASCIIStringHuge(std::shared_ptr<native::Serializable> nativeptr)
-      {
-        return marshal_as<String^>(nativeptr->toString());
-      }
-
-      std::shared_ptr<native::CacheableKey> Serializable::getCacheableASCIIStringHuge(String^ val)
-      {
-        return GetCacheableString(val);
-      }
-
-      //cacheable string
-      String^ Serializable::getUTFString(std::shared_ptr<native::Serializable> nativeptr)
-      {
-        return marshal_as<String^>(nativeptr->toString());
-      }
-
-      std::shared_ptr<native::CacheableKey> Serializable::getCacheableUTFString(String^ val)
+      String^ Serializable::getString(std::shared_ptr<native::Serializable> nativeptr)
       {
-        return GetCacheableString(val);
-      }
+        if (auto cacheableString = std::dynamic_pointer_cast<native::CacheableString>(nativeptr))
+        {
+          return marshal_as<String^>(cacheableString->value());
+        }
 
-      //cacheable string huge
-      String^ Serializable::getUTFStringHuge(std::shared_ptr<native::Serializable> nativeptr)
-      {
         return marshal_as<String^>(nativeptr->toString());
       }
 
-      std::shared_ptr<native::CacheableKey> Serializable::getCacheableUTFStringHuge(String^ val)
-      {
-        return GetCacheableString(val);
-      }
-
       std::shared_ptr<native::CacheableString> Serializable::GetCacheableString(String^ value)
       {
         std::shared_ptr<native::CacheableString> cStr;
@@ -597,7 +400,7 @@ namespace Apache
           cStr = native::CacheableString::create(marshal_as<std::string>(value));
         }
         else {
-          cStr = std::static_pointer_cast<native::CacheableString>(native::CacheableString::createDeserializable());
+          cStr = std::dynamic_pointer_cast<native::CacheableString>(native::CacheableString::createDeserializable());
         }
 
         return cStr;
diff --git a/clicache/src/Serializable.hpp b/clicache/src/Serializable.hpp
index 5d31596..983a175 100644
--- a/clicache/src/Serializable.hpp
+++ b/clicache/src/Serializable.hpp
@@ -24,8 +24,8 @@
 #include <geode/CacheableBuiltins.hpp>
 #include "end_native.hpp"
 
-#include "IGeodeSerializable.hpp"
-#include "IGeodeDelta.hpp"
+#include "ISerializable.hpp"
+#include "IDelta.hpp"
 #include "native_shared_ptr.hpp"
 #include "impl/EnumInfo.hpp"
 #include "Log.hpp"
@@ -65,17 +65,17 @@ namespace Apache
       /// The delegate shall be stored in the internal <c>DelegateWrapper</c>
       /// class and an instance will be initialized in the
       /// <c>DelegateWrapper.NativeDelegate</c> method by a call to
-      /// <see cref="IGeodeSerializable.FromData" />.
+      /// <see cref="ISerializable.FromData" />.
       /// </summary>
-      public delegate Apache::Geode::Client::IGeodeSerializable^ TypeFactoryMethodGeneric();
+      public delegate Apache::Geode::Client::ISerializable^ TypeFactoryMethod();
       /// <summary>
       /// Delegate to wrap a native <c>native::Serializable</c> type.
       /// </summary>
       /// <remarks>
-      /// This delegate should return an object of type <c>IGeodeSerializable</c>
+      /// This delegate should return an object of type <c>ISerializable</c>
       /// given a native object.
       /// </remarks>
-      delegate Apache::Geode::Client::IGeodeSerializable^ WrapperDelegateGeneric(std::shared_ptr<native::Serializable> obj);
+      delegate Apache::Geode::Client::ISerializable^ DataSerializablePrimitiveWrapperDelegate(std::shared_ptr<native::Serializable> obj);
 
 			/// <summary>
       /// Signature of function delegates passed to
@@ -88,28 +88,12 @@ namespace Apache
       
       /// <summary>
       /// This class wraps the native C++ <c>native::Serializable</c> objects
-      /// as managed <see cref="IGeodeSerializable" /> objects.
+      /// as managed <see cref="ISerializable" /> objects.
       /// </summary>
       public ref class Serializable
-        : public Apache::Geode::Client::IGeodeSerializable
+        : public Apache::Geode::Client::ISerializable
       {
-      public:
-        /// <summary>
-        /// Serializes this native (C++) object.
-        /// </summary>
-        /// <param name="output">
-        /// the DataOutput object to use for serializing the object
-        /// </param>
-        virtual void ToData(Apache::Geode::Client::DataOutput^ output);
-
-        /// <summary>
-        /// Deserializes the native (C++) object with the native object wrapped inside.
-        /// </summary>
-        /// <param name="input">
-        /// the DataInput stream to use for reading the object data
-        /// </param>
-        virtual void FromData(Apache::Geode::Client::DataInput^ input);
-        
+      public:        
         /// <summary>
         /// return the size of this object in bytes
         /// </summary>
@@ -119,139 +103,17 @@ namespace Apache
         }
 
         /// <summary>
-        /// Returns the classId of the instance being serialized.
-        /// This is used by deserialization to determine what instance
-        /// type to create and deserialize into.
-        /// </summary>
-        /// <returns>the classId</returns>
-        virtual property System::UInt32 ClassId
-        {
-          virtual System::UInt32 get();
-        }
-
-        /// <summary>
         /// Return a string representation of the object.
         /// It simply returns the string representation of the underlying
         /// native object by calling its <c>toString()</c> function.
         /// </summary>
         virtual String^ ToString() override;
 
-        // Static conversion function from primitive types string, integer
-        // and byte array.
-
-        /// <summary>
-        /// Implicit conversion operator from a boolean
-        /// to a <c>Serializable</c>.
-        /// </summary>
-        static operator Apache::Geode::Client::Serializable^ (bool value);
-
-        /// <summary>
-        /// Implicit conversion operator from a byte
-        /// to a <c>Serializable</c>.
-        /// </summary>
-        static operator Apache::Geode::Client::Serializable^ (Byte value);
-
-        /// <summary>
-        /// Implicit conversion operator from an array of bytes
-        /// to a <c>Serializable</c>.
-        /// </summary>
-        static operator Apache::Geode::Client::Serializable^ (array<Byte>^ value);
-
-        /// <summary>
-        /// Implicit conversion operator from an boolean array
-        /// to a <c>Serializable</c>.
-        /// </summary>
-        static operator Apache::Geode::Client::Serializable^ (array<bool>^ value);
-
-        /// <summary>
-        /// Implicit conversion operator from a double
-        /// to a <c>Serializable</c>.
-        /// </summary>
-        static operator Apache::Geode::Client::Serializable^ (Double value);
-
-        /// <summary>
-        /// Implicit conversion operator from a double array
-        /// to a <c>Serializable</c>.
-        /// </summary>
-        static operator Apache::Geode::Client::Serializable^ (array<Double>^ value);
-
-        /// <summary>
-        /// Implicit conversion operator from a float
-        /// to a <c>Serializable</c>.
-        /// </summary>
-        static operator Apache::Geode::Client::Serializable^ (Single value);
-
-        /// <summary>
-        /// Implicit conversion operator from a float array
-        /// to a <c>Serializable</c>.
-        /// </summary>
-        static operator Apache::Geode::Client::Serializable^ (array<Single>^ value);
-
-        /// <summary>
-        /// Implicit conversion operator from a 16-bit integer
-        /// to a <c>Serializable</c>.
-        /// </summary>
-        static operator Apache::Geode::Client::Serializable^ (System::Int16 value);
-
-        /// <summary>
-        /// Implicit conversion operator from a character
-        /// to a <c>Serializable</c>.
-        /// </summary>
-        static operator Apache::Geode::Client::Serializable^ (Char value);
-
-        /// <summary>
-        /// Implicit conversion operator from a character array
-        /// to a <c>Serializable</c>.
-        /// </summary>
-        static operator Apache::Geode::Client::Serializable^ (array<Char>^ value);
-
-        /// <summary>
-        /// Implicit conversion operator from a 16-bit integer array
-        /// to a <c>Serializable</c>.
-        /// </summary>
-        static operator Apache::Geode::Client::Serializable^ (array<System::Int16>^ value);
-
-        /// <summary>
-        /// Implicit conversion operator from a 32-bit integer
-        /// to a <c>Serializable</c>.
-        /// </summary>
-        static operator Apache::Geode::Client::Serializable^ (System::Int32 value);
-
-        /// <summary>
-        /// Implicit conversion operator from a 32-bit integer array
-        /// to a <c>Serializable</c>.
-        /// </summary>
-        static operator Apache::Geode::Client::Serializable^ (array<System::Int32>^ value);
-
-        /// <summary>
-        /// Implicit conversion operator from a 64-bit integer
-        /// to a <c>Serializable</c>.
-        /// </summary>
-        static operator /*Apache::Geode::Client::*/Serializable^ (System::Int64 value);
-
-        /// <summary>
-        /// Implicit conversion operator from a 64-bit integer array
-        /// to a <c>Serializable</c>.
-        /// </summary>
-        static operator Apache::Geode::Client::Serializable^ (array<System::Int64>^ value);
-
-        /// <summary>
-        /// Implicit conversion operator from a string
-        /// to a <c>Serializable</c>.
-        /// </summary>
-        static operator Apache::Geode::Client::Serializable^ (String^ value);
-
-        /// <summary>
-        /// Implicit conversion operator from a string array
-        /// to a <c>Serializable</c>.
-        /// </summary>
-        static operator Apache::Geode::Client::Serializable^ (array<String^>^ value);
 
       internal:
-        static std::shared_ptr<CacheableKey> wrapIGeodeSerializable(IGeodeSerializable^ managedObject);
-				static System::Int32 GetPDXIdForType(native::Pool* pool, IGeodeSerializable^ pdxType, Cache^ cache);
-				static IGeodeSerializable^ GetPDXTypeById(native::Pool* pool, System::Int32 typeId, Cache^ cache);
-				static void RegisterPDXManagedCacheableKey(Cache^ cache);
+        static std::shared_ptr<CacheableKey> GetNativeCacheableKeyWrapperForManagedISerializable(ISerializable^ managedObject);
+				static System::Int32 GetPDXIdForType(native::Pool* pool, ISerializable^ pdxType, Cache^ cache);
+				static ISerializable^ GetPDXTypeById(native::Pool* pool, System::Int32 typeId, Cache^ cache);
         
         static int GetEnumValue(Internal::EnumInfo^ ei, Cache^ cache);
         static Internal::EnumInfo^ GetEnum(int val, Cache^ cache);
@@ -261,7 +123,7 @@ namespace Apache
         //byte
         static Byte getByte(std::shared_ptr<native::Serializable> nativeptr);
         
-        static std::shared_ptr<native::CacheableKey> getCacheableByte(SByte val);
+        static std::shared_ptr<native::CacheableKey> getCacheableByte(Byte val);
         
         //boolean
         static bool getBoolean(std::shared_ptr<native::Serializable> nativeptr);
@@ -298,32 +160,10 @@ namespace Apache
         
         static std::shared_ptr<native::CacheableKey> getCacheableInt64(System::Int64 val);
         
-        //cacheable ascii string
-        static String^ getASCIIString(std::shared_ptr<native::Serializable> nativeptr);
-
-        static std::shared_ptr<native::CacheableKey> getCacheableASCIIString(String^ val);
-        
-        //cacheable ascii string huge
-        static String^ getASCIIStringHuge(std::shared_ptr<native::Serializable> nativeptr);
-        
-        static std::shared_ptr<native::CacheableKey> getCacheableASCIIStringHuge(String^ val);
-
-        //cacheable string
-        static String^ getUTFString(std::shared_ptr<native::Serializable> nativeptr);
-
-        static std::shared_ptr<native::CacheableKey> getCacheableUTFString(String^ val);
-        
-
-        //cacheable string huge
-        static String^ getUTFStringHuge(std::shared_ptr<native::Serializable> nativeptr);
-        
-
-        static std::shared_ptr<native::CacheableKey> getCacheableUTFStringHuge(String^ val);
-        
-
+        static String^ getString(std::shared_ptr<native::Serializable> nativeptr);
+                
         static std::shared_ptr<native::CacheableString> GetCacheableString(String^ value);
 
-
         static array<Byte>^ getSByteArray(array<SByte>^ sArray);
         
         static array<System::Int16>^ getInt16Array(array<System::UInt16>^ sArray);
diff --git a/clicache/src/Struct.cpp b/clicache/src/Struct.cpp
index 018191a..c44019e 100644
--- a/clicache/src/Struct.cpp
+++ b/clicache/src/Struct.cpp
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
- 
+
 
 #include "begin_native.hpp"
 #include <geode/Struct.hpp>
@@ -41,7 +41,7 @@ namespace Apache
         try
         {
           return (TypeRegistry::GetManagedValueGeneric<Object^>(
-            static_cast<native::Struct*>(m_nativeptr->get())->operator[](index)));
+            dynamic_cast<native::Struct*>(m_nativeptr->get())->operator[](index)));
         }
         finally
         {
@@ -54,7 +54,7 @@ namespace Apache
         try
         {
           return (TypeRegistry::GetManagedValueGeneric<Object^>(
-            static_cast<native::Struct*>(m_nativeptr->get())->operator[](marshal_as<std::string>(fieldName))));
+            dynamic_cast<native::Struct*>(m_nativeptr->get())->operator[](marshal_as<std::string>(fieldName))));
         }
         finally
         {
@@ -67,7 +67,7 @@ namespace Apache
         try
         {
           return StructSet<Object^>::Create(
-            static_cast<native::Struct*>(m_nativeptr->get())->getStructSet());
+            dynamic_cast<native::Struct*>(m_nativeptr->get())->getStructSet());
         }
         finally
         {
@@ -80,7 +80,7 @@ namespace Apache
       {
         try
         {
-          return static_cast<native::Struct*>(m_nativeptr->get())->size();
+          return dynamic_cast<native::Struct*>(m_nativeptr->get())->size();
         }
         finally
         {
diff --git a/clicache/src/Struct.hpp b/clicache/src/Struct.hpp
index a6932e9..bd34712 100644
--- a/clicache/src/Struct.hpp
+++ b/clicache/src/Struct.hpp
@@ -111,13 +111,13 @@ namespace Apache
         /// <summary>
         /// Factory function to register wrapper
         /// </summary>
-        inline static Apache::Geode::Client::IGeodeSerializable^ Create( ::std::shared_ptr<apache::geode::client::Serializable> obj )
+        inline static Apache::Geode::Client::ISerializable^ Create( ::std::shared_ptr<apache::geode::client::Serializable> obj )
         {
           return ( obj != nullptr ?
             gcnew Apache::Geode::Client::Struct( obj ) : nullptr );
         }
 
-        inline static Apache::Geode::Client::IGeodeSerializable^ CreateDeserializable( )
+        inline static Apache::Geode::Client::ISerializable^ CreateDeserializable( )
         {
           return gcnew Apache::Geode::Client::Struct(  ) ;
         }
@@ -126,4 +126,3 @@ namespace Apache
     }  // namespace Client
   }  // namespace Geode
 }  // namespace Apache
-
diff --git a/clicache/src/StructSet.hpp b/clicache/src/StructSet.hpp
index 4fa1126..040b424 100644
--- a/clicache/src/StructSet.hpp
+++ b/clicache/src/StructSet.hpp
@@ -37,7 +37,7 @@ namespace Apache
     {
 
       namespace native = apache::geode::client;
-      interface class IGeodeSerializable;
+      interface class ISerializable;
 
       generic<class TResult>
       ref class SelectResultsIterator;
@@ -100,7 +100,7 @@ namespace Apache
         String^ GetFieldName( int32_t index );
 
 
-        // Region: IEnumerable<IGeodeSerializable^> Members
+        // Region: IEnumerable<ISerializable^> Members
 
         /// <summary>
         /// Returns an enumerator that iterates through the <c>StructSet</c>.
@@ -112,7 +112,7 @@ namespace Apache
         virtual System::Collections::Generic::IEnumerator<TResult>^
           GetEnumerator( );
 
-        // End Region: IEnumerable<IGeodeSerializable^> Members
+        // End Region: IEnumerable<ISerializable^> Members
 
 
       internal:
diff --git a/clicache/src/TypeRegistry.cpp b/clicache/src/TypeRegistry.cpp
index 3fa919e..6de9585 100644
--- a/clicache/src/TypeRegistry.cpp
+++ b/clicache/src/TypeRegistry.cpp
@@ -44,6 +44,7 @@
 #include "impl/DotNetTypes.hpp"
 #include "CacheRegionHelper.hpp"
 #include "Cache.hpp"
+#include "Properties.hpp"
 
 using namespace apache::geode::client;
 using namespace System::Reflection;
@@ -172,7 +173,7 @@ namespace Apache
         return retVal();
       }
 
-      void TypeRegistry::RegisterTypeGeneric(TypeFactoryMethodGeneric^ creationMethod)
+      void TypeRegistry::RegisterType(TypeFactoryMethod^ creationMethod)
       {
         if (creationMethod == nullptr) {
           throw gcnew IllegalArgumentException("Serializable.RegisterType(): "
@@ -181,91 +182,94 @@ namespace Apache
 
         //--------------------------------------------------------------
 
-        auto typeRegistry = m_cache->TypeRegistry;
+        int32_t classId;
 
         //adding user type as well in global builtin hashmap
-        System::Int64 classId = ((System::Int64)creationMethod()->ClassId);
-        if (!typeRegistry->ManagedDelegatesGeneric->ContainsKey(classId))
-          typeRegistry->ManagedDelegatesGeneric->Add(classId, creationMethod);
+        auto obj = creationMethod();
+        if (auto dataSerializable = dynamic_cast<IDataSerializable^>(obj))
+        {
+          classId = dataSerializable->ClassId;
+        } else
+        {
+          throw gcnew IllegalArgumentException("Unknown serialization type.");
+        }
+
+        if (!ManagedDelegatesGeneric->ContainsKey(classId))
+        {
+          ManagedDelegatesGeneric->Add(classId, creationMethod);
+        }
 
         auto delegateObj = gcnew DelegateWrapperGeneric(creationMethod);
         auto nativeDelegate = gcnew TypeFactoryNativeMethodGeneric(delegateObj,
             &DelegateWrapperGeneric::NativeDelegateGeneric);
 
         // this is avoid object being Gced
-        m_cache->TypeRegistry->NativeDelegatesGeneric->Add(nativeDelegate);
+        NativeDelegatesGeneric->Add(nativeDelegate);
 
         // register the type in the DelegateMap, this is pure c# for create domain object 
-        IGeodeSerializable^ tmp = creationMethod();
-        Log::Fine("Registering serializable class ID " + tmp->ClassId);
-        m_cache->TypeRegistry->DelegateMapGeneric[tmp->ClassId] = creationMethod;
+        Log::Fine("Registering serializable class ID " + classId);
+        DelegateMapGeneric[classId] = creationMethod;
 
         _GF_MG_EXCEPTION_TRY2
-          CacheImpl *cacheImpl = CacheRegionHelper::getCacheImpl(m_cache->GetNative().get());
-        cacheImpl->getSerializationRegistry()->addType((std::shared_ptr<native::Serializable>(*)())System::Runtime::InteropServices::Marshal::GetFunctionPointerForDelegate(nativeDelegate).ToPointer());
-
+          auto&& nativeTypeRegistry = CacheRegionHelper::getCacheImpl(m_cache->GetNative().get())->getSerializationRegistry();
+          auto nativeDelegateFunction = static_cast<std::shared_ptr<native::Serializable>(*)()>(
+              System::Runtime::InteropServices::Marshal::GetFunctionPointerForDelegate(nativeDelegate).ToPointer());
+          nativeTypeRegistry->addType(nativeDelegateFunction);
         _GF_MG_EXCEPTION_CATCH_ALL2
       }
 
-      void TypeRegistry::RegisterTypeGeneric(Byte typeId,
-        TypeFactoryMethodGeneric^ creationMethod, Type^ type)
+      void TypeRegistry::RegisterDataSerializablePrimitiveOverrideNativeDeserialization(
+          int8_t dsCode, TypeFactoryMethod^ creationMethod, Type^ managedType)
       {
         if (creationMethod == nullptr) {
           throw gcnew IllegalArgumentException("Serializable.RegisterType(): ");
         }
-        DelegateWrapperGeneric^ delegateObj = gcnew DelegateWrapperGeneric(creationMethod);
-        TypeFactoryNativeMethodGeneric^ nativeDelegate =
-          gcnew TypeFactoryNativeMethodGeneric(delegateObj,
+        auto delegateObj = gcnew DelegateWrapperGeneric(creationMethod);
+        auto nativeDelegate = gcnew TypeFactoryNativeMethodGeneric(delegateObj,
             &DelegateWrapperGeneric::NativeDelegateGeneric);
 
-        m_cache->TypeRegistry->BuiltInDelegatesGeneric[typeId] = nativeDelegate;
+        DsCodeToDataSerializablePrimitiveTypeFactoryMethod[dsCode] = creationMethod;
+        DsCodeToDataSerializablePrimitiveNativeDelegate[dsCode] = nativeDelegate;
 
-        if (type != nullptr)
+        if (managedType != nullptr)
         {
-          m_cache->TypeRegistry->ManagedTypeToTypeId[type] = typeId;
+          ManagedTypeToDsCode[managedType] = dsCode;
         }
 
-        auto typeRegistry = m_cache->TypeRegistry;
+        _GF_MG_EXCEPTION_TRY2
+          auto&& serializationRegistry = CacheRegionHelper::getCacheImpl(m_cache->GetNative().get())->getSerializationRegistry();
+          auto nativeDelegateFunction = static_cast<std::shared_ptr<native::Serializable>(*)()>(
+              System::Runtime::InteropServices::Marshal::GetFunctionPointerForDelegate(nativeDelegate).ToPointer());
+          serializationRegistry->addType(dsCode, nativeDelegateFunction);
+        _GF_MG_EXCEPTION_CATCH_ALL2
+      }
 
-        //This is hashmap for manged builtin objects
-        if (!typeRegistry->ManagedDelegatesGeneric->ContainsKey(typeId + 0x80000000))
-        {
-          typeRegistry->ManagedDelegatesGeneric->Add(typeId + 0x80000000, creationMethod);
+      void TypeRegistry::RegisterDataSerializableFixedIdTypeOverrideNativeDeserialization(
+          Int32 fixedId, TypeFactoryMethod^ creationMethod)
+      {
+        if (creationMethod == nullptr) {
+          throw gcnew IllegalArgumentException("Serializable.RegisterType(): ");
         }
+        auto delegateObj = gcnew DelegateWrapperGeneric(creationMethod);
+        auto nativeDelegate = gcnew TypeFactoryNativeMethodGeneric(delegateObj,
+            &DelegateWrapperGeneric::NativeDelegateGeneric);
 
-        // register the type in the DelegateMap
-        IGeodeSerializable^ tmp = creationMethod();
-        Log::Finer("Registering(,) serializable class ID " + tmp->ClassId);
-        m_cache->TypeRegistry->DelegateMapGeneric[tmp->ClassId] = creationMethod;
+        FixedIdToDataSerializableFixedIdTypeFactoryMethod[fixedId] = creationMethod;
+        FixedIdToDataSerializableFixedIdNativeDelegate[fixedId] = nativeDelegate;
 
-        try
-        {
-          CacheImpl *cacheImpl = CacheRegionHelper::getCacheImpl(m_cache->GetNative().get());
-          if (tmp->ClassId < 0xa0000000)
-          {
-            cacheImpl->getSerializationRegistry()->addType(typeId,
-              (std::shared_ptr<native::Serializable>(*)())System::Runtime::InteropServices::
-              Marshal::GetFunctionPointerForDelegate(
-                nativeDelegate).ToPointer());
-          }
-          else
-          {//special case for CacheableUndefined type
-            cacheImpl->getSerializationRegistry()->addType2(typeId,
-              (std::shared_ptr<native::Serializable>(*)())System::Runtime::InteropServices::
-              Marshal::GetFunctionPointerForDelegate(
-                nativeDelegate).ToPointer());
-          }
+        Log::Finer("Registering serializable fixed ID " + fixedId);
 
-        }
-        catch (native::IllegalStateException&)
-        {
-          //ignore it as this is internal only
-        }
+        _GF_MG_EXCEPTION_TRY2
+          auto&& serializationRegistry = CacheRegionHelper::getCacheImpl(m_cache->GetNative().get())->getSerializationRegistry();
+          auto nativeDelegateFunction = static_cast<std::shared_ptr<native::Serializable>(*)()>(
+              System::Runtime::InteropServices::Marshal::GetFunctionPointerForDelegate(nativeDelegate).ToPointer());
+          serializationRegistry->addType2(fixedId, nativeDelegateFunction);
+        _GF_MG_EXCEPTION_CATCH_ALL2
       }
 
       void TypeRegistry::UnregisterTypeGeneric(Byte typeId)
       {
-        BuiltInDelegatesGeneric->Remove(typeId);
+        DsCodeToDataSerializablePrimitiveNativeDelegate->Remove(typeId);
         _GF_MG_EXCEPTION_TRY2
 
           CacheRegionHelper::getCacheImpl(m_cache->GetNative().get())->getSerializationRegistry()->removeType(typeId);
@@ -273,26 +277,16 @@ namespace Apache
         _GF_MG_EXCEPTION_CATCH_ALL2
       }
 
-      void TypeRegistry::RegisterWrapperGeneric(
-        WrapperDelegateGeneric^ wrapperMethod, Byte typeId, System::Type^ type)
+      void TypeRegistry::RegisterDataSerializablePrimitiveWrapper(
+          DataSerializablePrimitiveWrapperDelegate^ wrapperMethod,
+          int8_t dsCode, System::Type^ managedType)
       {
-        if (typeId < 0 || typeId > WrapperEndGeneric)
-        {
-          throw gcnew GeodeException("The TypeID (" + typeId + ") being "
-            "registered is beyond acceptable range of 0-" + WrapperEndGeneric);
-        }
-        NativeWrappersGeneric[typeId] = wrapperMethod;
-        ManagedTypeToTypeId[type] = typeId;
+        DsCodeToDataSerializablePrimitiveWrapperDelegate[dsCode] = wrapperMethod;
       }
 
       void TypeRegistry::UnregisterNativesGeneric(Cache^ cache)
       {
-        cache->TypeRegistry->BuiltInDelegatesGeneric->Clear();
-        for (Byte typeId = 0; typeId <= WrapperEndGeneric; ++typeId) {
-          cache->TypeRegistry->NativeWrappersGeneric[typeId] = nullptr;
-        }
-        //TODO:: unregister from managed hashmap as well.
-        //  ManagedDelegates->Clear();
+        cache->TypeRegistry->DsCodeToDataSerializablePrimitiveNativeDelegate->Clear();
       }
 
       Type^ TypeRegistry::GetTypeFromRefrencedAssemblies(String^ className, Dictionary<Assembly^, bool>^ referedAssembly, Assembly^ currentAssembly)
@@ -329,387 +323,422 @@ namespace Apache
       }
 
       generic<class TValue>
-        TValue TypeRegistry::GetManagedValueGeneric(std::shared_ptr<native::Serializable> val)
+      TValue wrap(std::shared_ptr<native::DataSerializablePrimitive> dataSerializablePrimitive)
+      {
+        switch (dataSerializablePrimitive->getDsCode())
         {
-          if (val == nullptr)
-          {
-            return TValue();
-          }
-
-          Byte typeId = val->typeId();
-          //Log::Debug("TypeRegistry::GetManagedValueGeneric typeid = " + typeId);
-          switch (typeId)
-          {
-          case native::GeodeTypeIds::CacheableByte:
-          {
-            return (TValue)(int8_t)safe_cast<int8_t>(Serializable::getByte(val));
-          }
-          case native::GeodeTypeIds::CacheableBoolean:
-          {
-            return safe_cast<TValue>(Serializable::getBoolean(val));
-          }
-          case native::GeodeTypeIds::CacheableCharacter:
-          {
-            return safe_cast<TValue>(Serializable::getChar(val));
-          }
-          case native::GeodeTypeIds::CacheableDouble:
-          {
-            return safe_cast<TValue>(Serializable::getDouble(val));
-          }
-          case native::GeodeTypeIds::CacheableASCIIString:
-          case native::GeodeTypeIds::CacheableASCIIStringHuge:
-          case native::GeodeTypeIds::CacheableString:
-          case native::GeodeTypeIds::CacheableStringHuge:
-          {
-            //TODO: need to look all strings types
-            return safe_cast<TValue>(Serializable::getASCIIString(val));
-          }
-          case native::GeodeTypeIds::CacheableFloat:
-          {
-            return safe_cast<TValue>(Serializable::getFloat(val));
-          }
-          case native::GeodeTypeIds::CacheableInt16:
-          {
-            return safe_cast<TValue>(Serializable::getInt16(val));
-          }
-          case native::GeodeTypeIds::CacheableInt32:
-          {
-            return safe_cast<TValue>(Serializable::getInt32(val));
-          }
-          case native::GeodeTypeIds::CacheableInt64:
-          {
-            return safe_cast<TValue>(Serializable::getInt64(val));
-          }
           case native::GeodeTypeIds::CacheableDate:
           {
-            //TODO::
-            Apache::Geode::Client::CacheableDate^ ret = static_cast<Apache::Geode::Client::CacheableDate ^>
-              (SafeGenericUMSerializableConvert<Apache::Geode::Client::CacheableDate^>(val));
-
-            System::DateTime dt(ret->Value.Ticks);
-            return safe_cast<TValue>(dt);
-          }
-          case native::GeodeTypeIdsImpl::CacheableUserData:
-          case native::GeodeTypeIdsImpl::CacheableUserData2:
-          case native::GeodeTypeIdsImpl::CacheableUserData4:
-          {
-            //TODO::split 
-            IGeodeSerializable^ ret = SafeUMSerializableConvertGeneric(val);
-            return safe_cast<TValue>(ret);
-            //return TValue();
-          }
-          case native::GeodeTypeIdsImpl::PDX:
-          {
-            IPdxSerializable^ ret = SafeUMSerializablePDXConvert(val);
-
-            PdxWrapper^ pdxWrapper = dynamic_cast<PdxWrapper^>(ret);
-
-            if (pdxWrapper != nullptr)
-            {
-              return safe_cast<TValue>(pdxWrapper->GetObject());
-            }
-
-            return safe_cast<TValue>(ret);
+            auto ret = SafeGenericUMSerializableConvert<CacheableDate^>(dataSerializablePrimitive);
+            return safe_cast<TValue>(ret->Value);
           }
           case native::GeodeTypeIds::CacheableBytes:
           {
-            Apache::Geode::Client::CacheableBytes^ ret = safe_cast<Apache::Geode::Client::CacheableBytes ^>
-              (SafeGenericUMSerializableConvert<Apache::Geode::Client::CacheableBytes^>(val));
-
+            auto ret = SafeGenericUMSerializableConvert<CacheableBytes^>(dataSerializablePrimitive);
             return safe_cast<TValue>(ret->Value);
           }
           case native::GeodeTypeIds::CacheableDoubleArray:
           {
-            Apache::Geode::Client::CacheableDoubleArray^ ret = safe_cast<Apache::Geode::Client::CacheableDoubleArray ^>
-              (SafeGenericUMSerializableConvert<Apache::Geode::Client::CacheableDoubleArray^>(val));
-
+            auto ret = SafeGenericUMSerializableConvert<CacheableDoubleArray^>(dataSerializablePrimitive);
             return safe_cast<TValue>(ret->Value);
           }
           case native::GeodeTypeIds::CacheableFloatArray:
           {
-            Apache::Geode::Client::CacheableFloatArray^ ret = safe_cast<Apache::Geode::Client::CacheableFloatArray^>
-              (SafeGenericUMSerializableConvert<Apache::Geode::Client::CacheableFloatArray^>(val));
-
+            auto ret = SafeGenericUMSerializableConvert<CacheableFloatArray^>(dataSerializablePrimitive);
             return safe_cast<TValue>(ret->Value);
           }
           case native::GeodeTypeIds::CacheableInt16Array:
           {
-            Apache::Geode::Client::CacheableInt16Array^ ret = safe_cast<Apache::Geode::Client::CacheableInt16Array^>
-              (SafeGenericUMSerializableConvert<Apache::Geode::Client::CacheableInt16Array^>(val));
-
+            auto ret = SafeGenericUMSerializableConvert<CacheableInt16Array^>(dataSerializablePrimitive);
             return safe_cast<TValue>(ret->Value);
           }
           case native::GeodeTypeIds::CacheableInt32Array:
           {
-            Apache::Geode::Client::CacheableInt32Array^ ret = safe_cast<Apache::Geode::Client::CacheableInt32Array^>
-              (SafeGenericUMSerializableConvert<Apache::Geode::Client::CacheableInt32Array^>(val));
-
+            auto ret = SafeGenericUMSerializableConvert<CacheableInt32Array^>(dataSerializablePrimitive);
             return safe_cast<TValue>(ret->Value);
           }
           case native::GeodeTypeIds::CacheableInt64Array:
           {
-            Apache::Geode::Client::CacheableInt64Array^ ret = safe_cast<Apache::Geode::Client::CacheableInt64Array^>
-              (SafeGenericUMSerializableConvert<Apache::Geode::Client::CacheableInt64Array^>(val));
-
+            auto ret = SafeGenericUMSerializableConvert<CacheableInt64Array^>(dataSerializablePrimitive);
             return safe_cast<TValue>(ret->Value);
           }
           case native::GeodeTypeIds::CacheableStringArray:
           {
-            Apache::Geode::Client::CacheableStringArray^ ret = safe_cast<Apache::Geode::Client::CacheableStringArray^>
-              (SafeGenericUMSerializableConvert<Apache::Geode::Client::CacheableStringArray^>(val));
-
+            auto ret = SafeGenericUMSerializableConvert<CacheableStringArray^>(dataSerializablePrimitive);
             return safe_cast<TValue>(ret->GetValues());
           }
           case native::GeodeTypeIds::CacheableArrayList://Ilist generic
           {
-            Apache::Geode::Client::CacheableArrayList^ ret = safe_cast<Apache::Geode::Client::CacheableArrayList^>
-              (SafeGenericUMSerializableConvert<Apache::Geode::Client::CacheableArrayList^>(val));
-
+            auto ret = SafeGenericUMSerializableConvert<CacheableArrayList^>(dataSerializablePrimitive);
             return safe_cast<TValue>(ret->Value);
           }
           case native::GeodeTypeIds::CacheableLinkedList://LinkedList generic
           {
-            Apache::Geode::Client::CacheableLinkedList^ ret = safe_cast<Apache::Geode::Client::CacheableLinkedList^>
-              (SafeGenericUMSerializableConvert<Apache::Geode::Client::CacheableLinkedList^>(val));
-
+            auto ret = SafeGenericUMSerializableConvert<CacheableLinkedList^>(dataSerializablePrimitive);
             return safe_cast<TValue>(ret->Value);
           }
           case native::GeodeTypeIds::CacheableHashTable://collection::hashtable
           {
-            Apache::Geode::Client::CacheableHashTable^ ret = safe_cast<Apache::Geode::Client::CacheableHashTable^>
-              (SafeGenericUMSerializableConvert<Apache::Geode::Client::CacheableHashTable^>(val));
-
+            auto ret = SafeGenericUMSerializableConvert<CacheableHashTable^>(dataSerializablePrimitive);
             return safe_cast<TValue>(ret->Value);
           }
           case native::GeodeTypeIds::CacheableHashMap://generic dictionary
           {
-            Apache::Geode::Client::CacheableHashMap^ ret = safe_cast<Apache::Geode::Client::CacheableHashMap^>
-              (SafeGenericUMSerializableConvert<Apache::Geode::Client::CacheableHashMap^>(val));
-
+            auto ret = SafeGenericUMSerializableConvert<CacheableHashMap^>(dataSerializablePrimitive);
             return safe_cast<TValue>(ret->Value);
           }
           case native::GeodeTypeIds::CacheableIdentityHashMap:
           {
-            Apache::Geode::Client::CacheableIdentityHashMap^ ret = static_cast<Apache::Geode::Client::CacheableIdentityHashMap^>
-              (SafeGenericUMSerializableConvert<Apache::Geode::Client::CacheableIdentityHashMap^>(val));
+            auto ret = SafeGenericUMSerializableConvert<CacheableIdentityHashMap^>(dataSerializablePrimitive);
             return safe_cast<TValue>(ret->Value);
           }
           case native::GeodeTypeIds::CacheableHashSet://no need of it, default case should work
           {
-            Apache::Geode::Client::CacheableHashSet^ ret = static_cast<Apache::Geode::Client::CacheableHashSet^>
-              (SafeGenericUMSerializableConvert<Apache::Geode::Client::CacheableHashSet^>(val));
+            auto ret = SafeGenericUMSerializableConvert<CacheableHashSet^>(dataSerializablePrimitive);
             return safe_cast<TValue>(ret);
           }
           case native::GeodeTypeIds::CacheableLinkedHashSet://no need of it, default case should work
           {
-            Apache::Geode::Client::CacheableLinkedHashSet^ ret = static_cast<Apache::Geode::Client::CacheableLinkedHashSet^>
-              (SafeGenericUMSerializableConvert<Apache::Geode::Client::CacheableLinkedHashSet^>(val));
+            auto ret = SafeGenericUMSerializableConvert<CacheableLinkedHashSet^>(dataSerializablePrimitive);
             return safe_cast<TValue>(ret);
           }
           case native::GeodeTypeIds::CacheableFileName:
           {
-            Apache::Geode::Client::CacheableFileName^ ret = static_cast<Apache::Geode::Client::CacheableFileName^>
-              (SafeGenericUMSerializableConvert<Apache::Geode::Client::CacheableFileName^>(val));
+            auto ret = SafeGenericUMSerializableConvert<CacheableFileName^>(dataSerializablePrimitive);
             return safe_cast<TValue>(ret);
           }
           case native::GeodeTypeIds::CacheableObjectArray:
           {
-            Apache::Geode::Client::CacheableObjectArray^ ret = static_cast<Apache::Geode::Client::CacheableObjectArray^>
-              (SafeGenericUMSerializableConvert<Apache::Geode::Client::CacheableObjectArray^>(val));
+            auto ret = SafeGenericUMSerializableConvert<CacheableObjectArray^>(dataSerializablePrimitive);
             return safe_cast<TValue>(ret);
           }
           case native::GeodeTypeIds::CacheableVector://collection::arraylist
           {
-            Apache::Geode::Client::CacheableVector^ ret = static_cast<Apache::Geode::Client::CacheableVector^>
-              (SafeGenericUMSerializableConvert<Apache::Geode::Client::CacheableVector^>(val));
+            auto ret = SafeGenericUMSerializableConvert<CacheableVector^>(dataSerializablePrimitive);
             return safe_cast<TValue>(ret->Value);
           }
           case native::GeodeTypeIds::CacheableUndefined:
           {
-            Apache::Geode::Client::CacheableUndefined^ ret = static_cast<Apache::Geode::Client::CacheableUndefined^>
-              (SafeGenericUMSerializableConvert<Apache::Geode::Client::CacheableUndefined^>(val));
+            auto ret = SafeGenericUMSerializableConvert<CacheableUndefined^>(dataSerializablePrimitive);
             return safe_cast<TValue>(ret);
           }
           case native::GeodeTypeIds::Struct:
           {
-            return safe_cast<TValue>(Apache::Geode::Client::Struct::Create(val));
+            return safe_cast<TValue>(Struct::Create(dataSerializablePrimitive));
           }
           case native::GeodeTypeIds::CacheableStack:
           {
-            Apache::Geode::Client::CacheableStack^ ret = static_cast<Apache::Geode::Client::CacheableStack^>
-              (SafeGenericUMSerializableConvert<Apache::Geode::Client::CacheableStack^>(val));
+            auto ret = SafeGenericUMSerializableConvert<CacheableStack^>(dataSerializablePrimitive);
             return safe_cast<TValue>(ret->Value);
           }
-          case 7: //GeodeClassIds::CacheableManagedObject
+          case native::GeodeTypeIds::CacheableManagedObject:
           {
-            Apache::Geode::Client::CacheableObject^ ret = static_cast<Apache::Geode::Client::CacheableObject^>
-              (SafeGenericUMSerializableConvert<Apache::Geode::Client::CacheableObject^>(val));
+            auto ret = SafeGenericUMSerializableConvert<CacheableObject^>(dataSerializablePrimitive);
             return safe_cast<TValue>(ret);
           }
-          case 8://GeodeClassIds::CacheableManagedObjectXml
+          case native::GeodeTypeIds::CacheableManagedObjectXml:
           {
-            Apache::Geode::Client::CacheableObjectXml^ ret = static_cast<Apache::Geode::Client::CacheableObjectXml^>
-              (SafeGenericUMSerializableConvert<Apache::Geode::Client::CacheableObjectXml^>(val));
+            auto ret = SafeGenericUMSerializableConvert<CacheableObjectXml^>(dataSerializablePrimitive);
             return safe_cast<TValue>(ret);
           }
-          /*  TODO: replace with IDictionary<K, V>
-          case native::GeodeTypeIds::Properties:
+					/*
+          case native::GeodeTypeIds::Properties: // TODO: replace with IDictionary<K, V>
           {
-          Apache::Geode::Client::Properties^ ret = safe_cast<Apache::Geode::Client::Properties^>
-          ( SafeGenericUMSerializableConvert<Apache::Geode::Client::Properties^>(val));
-
-          return safe_cast<TValue>(ret);
-          }*/
-
+            auto ret = SafeGenericUMSerializableConvert<Properties<Object^, Object^>^>(dataSerializablePrimitive);
+            return safe_cast<TValue>(ret);
+          }
+					*/
           case native::GeodeTypeIds::BooleanArray:
           {
-            Apache::Geode::Client::BooleanArray^ ret = safe_cast<Apache::Geode::Client::BooleanArray^>
-              (SafeGenericUMSerializableConvert<Apache::Geode::Client::BooleanArray^>(val));
-
+            auto ret = SafeGenericUMSerializableConvert<BooleanArray^>(dataSerializablePrimitive);
             return safe_cast<TValue>(ret->Value);
           }
           case native::GeodeTypeIds::CharArray:
           {
-            Apache::Geode::Client::CharArray^ ret = safe_cast<Apache::Geode::Client::CharArray^>
-              (SafeGenericUMSerializableConvert<Apache::Geode::Client::CharArray^>(val));
-
+            auto ret = SafeGenericUMSerializableConvert<CharArray^>(dataSerializablePrimitive);
             return safe_cast<TValue>(ret->Value);
           }
           case 0://UserFunctionExecutionException unregistered
           {
-            Apache::Geode::Client::UserFunctionExecutionException^ ret = static_cast<Apache::Geode::Client::UserFunctionExecutionException^>
-              (SafeGenericUMSerializableConvert<Apache::Geode::Client::UserFunctionExecutionException^>(val));
+            auto ret = SafeGenericUMSerializableConvert<UserFunctionExecutionException^>(dataSerializablePrimitive);
             return safe_cast<TValue>(ret);
           }
-          default:
-            throw gcnew System::Exception("not found typeid");
-          }
-          throw gcnew System::Exception("not found typeid");
         }
 
-        Object^ TypeRegistry::CreateObject(String^ className)
+        throw gcnew IllegalArgumentException("Unknown type");
+      }
+
+      generic<class TValue>
+      TValue TypeRegistry::GetManagedValueGeneric(std::shared_ptr<native::Serializable> val)
+      {
+        if (val == nullptr)
         {
-          Object^ retVal = CreateObjectEx(className);
+          return TValue();
+        }
 
-          if (retVal == nullptr)
+        if (auto dataSerializablePrimitive = std::dynamic_pointer_cast<native::DataSerializablePrimitive>(val))
+        {
+          switch (dataSerializablePrimitive->getDsCode())
           {
-            auto type = GetType(className);
-            if (type)
+            case native::GeodeTypeIds::CacheableByte:
+            {
+              return safe_cast<TValue>(Serializable::getByte(dataSerializablePrimitive));
+            }
+            case native::GeodeTypeIds::CacheableBoolean:
+            {
+              return safe_cast<TValue>(Serializable::getBoolean(dataSerializablePrimitive));
+            }
+            case native::GeodeTypeIds::CacheableCharacter:
+            {
+              return safe_cast<TValue>(Serializable::getChar(dataSerializablePrimitive));
+            }
+            case native::GeodeTypeIds::CacheableDouble:
+            {
+              return safe_cast<TValue>(Serializable::getDouble(dataSerializablePrimitive));
+            }
+            case native::GeodeTypeIds::CacheableASCIIString:
+            case native::GeodeTypeIds::CacheableASCIIStringHuge:
+            case native::GeodeTypeIds::CacheableString:
+            case native::GeodeTypeIds::CacheableStringHuge:
+            {
+              return safe_cast<TValue>(Serializable::getString(dataSerializablePrimitive));
+            }
+            case native::GeodeTypeIds::CacheableFloat:
+            {
+              return safe_cast<TValue>(Serializable::getFloat(dataSerializablePrimitive));
+            }
+            case native::GeodeTypeIds::CacheableInt16:
             {
-              retVal = type->GetConstructor(Type::EmptyTypes)->Invoke(nullptr);
-              return retVal;
+              return safe_cast<TValue>(Serializable::getInt16(dataSerializablePrimitive));
             }
+            case native::GeodeTypeIds::CacheableInt32:
+            {
+              return safe_cast<TValue>(Serializable::getInt32(dataSerializablePrimitive));
+            }
+            case native::GeodeTypeIds::CacheableInt64:
+            {
+              return safe_cast<TValue>(Serializable::getInt64(dataSerializablePrimitive));
+            }
+            default:
+              return wrap<TValue>(dataSerializablePrimitive);
           }
-          return retVal;
         }
-
-        Object^ TypeRegistry::CreateObjectEx(String^ className)
+        else if (auto dataSerializableFixedId = std::dynamic_pointer_cast<native::DataSerializableFixedId>(val))
         {
-          CreateNewObjectDelegate^ del = nullptr;
-          Dictionary<String^, CreateNewObjectDelegate^>^ tmp = ClassNameVsCreateNewObjectDelegate;
-
-          tmp->TryGetValue(className, del);
-
-          if (del != nullptr)
+          switch (dataSerializableFixedId->getDSFID())
           {
-            return del();
+          case native::GeodeTypeIds::Struct:
+          {
+            return safe_cast<TValue>(Struct::Create(val));
           }
-          auto type = GetType(className);
-          if (type)
+          case native::GeodeTypeIds::CacheableUndefined:
           {
-            msclr::lock lockInstance(ClassNameVsCreateNewObjectLockObj);
-            {
-              tmp = ClassNameVsCreateNewObjectDelegate;
-              tmp->TryGetValue(className, del);
-              if (del != nullptr)
-                return del();
-              del = CreateNewObjectDelegateF(type);
-              ClassNameVsCreateNewObjectDelegate[className] = del;
-              return del();
-            }
+            return safe_cast<TValue>(CacheableUndefined::Create());
           }
-          return nullptr;
+          default:
+            break;
+          }
+        }
+        else if (auto dataSerializable = std::dynamic_pointer_cast<native::DataSerializable>(val))
+        {
+          auto ret = SafeUMSerializableConvertGeneric(dataSerializable);
+          return safe_cast<TValue>(ret);
         }
+        else if (auto pdxSerializable = std::dynamic_pointer_cast<native::PdxSerializable>(val))
+        {
+          auto ret = SafeUMSerializablePDXConvert(pdxSerializable);
+          if (auto pdxWrapper = dynamic_cast<PdxWrapper^>(ret))
+          {
+            return safe_cast<TValue>(pdxWrapper->GetObject());
+          }
 
-        Object^ TypeRegistry::GetArrayObject(String^ className, int length)
+          return safe_cast<TValue>(ret);
+        }
+				else if (auto userFunctionExecutionException = std::dynamic_pointer_cast<native::UserFunctionExecutionException>(val))
+        {
+          return safe_cast<TValue>(gcnew UserFunctionExecutionException(userFunctionExecutionException));
+        }
+        else if (auto pdxManagedCacheableKey = std::dynamic_pointer_cast<native::PdxManagedCacheableKey>(val))
         {
-          Object^ retArr = GetArrayObjectEx(className, length);
-          if (retArr == nullptr)
+          auto pdx = pdxManagedCacheableKey->ptr();
+          if (auto pdxWrapper = dynamic_cast<PdxWrapper^>(pdx))
           {
-            Type^ type = GetType(className);
-            if (type)
-            {
-              retArr = type->MakeArrayType()->GetConstructor(singleIntType)->Invoke(gcnew array<Object^>(1) { length });
-              return retArr;
-            }
+            return safe_cast<TValue>(pdxWrapper->GetObject());
           }
-          return retArr;
+          return safe_cast<TValue>(pdx);
         }
+        else
+        {
+          throw gcnew IllegalStateException("Unknown serialization type.");
+        }
+
+        throw gcnew System::Exception("not found typeid");
+      }
+
+      Object^ TypeRegistry::CreateObject(String^ className)
+      {
+        Object^ retVal = CreateObjectEx(className);
 
-        Object^ TypeRegistry::GetArrayObjectEx(String^ className, int length)
+        if (retVal == nullptr)
         {
-          CreateNewObjectArrayDelegate^ del = nullptr;
-          Dictionary<String^, CreateNewObjectArrayDelegate^>^ tmp = ClassNameVsCreateNewObjectArrayDelegate;
+          auto type = GetType(className);
+          if (type)
+          {
+            retVal = type->GetConstructor(Type::EmptyTypes)->Invoke(nullptr);
+            return retVal;
+          }
+        }
+        return retVal;
+      }
 
-          tmp->TryGetValue(className, del);
+      Object^ TypeRegistry::CreateObjectEx(String^ className)
+      {
+        CreateNewObjectDelegate^ del = nullptr;
+        Dictionary<String^, CreateNewObjectDelegate^>^ tmp = ClassNameVsCreateNewObjectDelegate;
+
+        tmp->TryGetValue(className, del);
 
-          if (del != nullptr)
+        if (del != nullptr)
+        {
+          return del();
+        }
+        auto type = GetType(className);
+        if (type)
+        {
+          msclr::lock lockInstance(ClassNameVsCreateNewObjectLockObj);
           {
-            return del(length);
+            tmp = ClassNameVsCreateNewObjectDelegate;
+            tmp->TryGetValue(className, del);
+            if (del != nullptr)
+              return del();
+            del = CreateNewObjectDelegateF(type);
+            ClassNameVsCreateNewObjectDelegate[className] = del;
+            return del();
           }
+        }
+        return nullptr;
+      }
 
-          Type^ t = GetType(className);
-          if (t)
+      Object^ TypeRegistry::GetArrayObject(String^ className, int length)
+      {
+        Object^ retArr = GetArrayObjectEx(className, length);
+        if (retArr == nullptr)
+        {
+          Type^ type = GetType(className);
+          if (type)
           {
-            msclr::lock lockInstance(ClassNameVsCreateNewObjectLockObj);
-            {
-              tmp = ClassNameVsCreateNewObjectArrayDelegate;
-              tmp->TryGetValue(className, del);
-              if (del != nullptr)
-                return del(length);
-              del = CreateNewObjectArrayDelegateF(t);
-              tmp = gcnew Dictionary<String^, CreateNewObjectArrayDelegate^>(ClassNameVsCreateNewObjectArrayDelegate);
-              tmp[className] = del;
-              ClassNameVsCreateNewObjectArrayDelegate = tmp;
-              return del(length);
-            }
+            retArr = type->MakeArrayType()->GetConstructor(singleIntType)->Invoke(gcnew array<Object^>(1) { length });
+            return retArr;
           }
-          return nullptr;
         }
+        return retArr;
+      }
 
-        //delegate Object^ CreateNewObject();
-        //static CreateNewObjectDelegate^ CreateNewObjectDelegateF(Type^ type);
-        TypeRegistry::CreateNewObjectDelegate^ TypeRegistry::CreateNewObjectDelegateF(Type^ type)
+      Object^ TypeRegistry::GetArrayObjectEx(String^ className, int length)
+      {
+        CreateNewObjectArrayDelegate^ del = nullptr;
+        Dictionary<String^, CreateNewObjectArrayDelegate^>^ tmp = ClassNameVsCreateNewObjectArrayDelegate;
+
+        tmp->TryGetValue(className, del);
+
+        if (del != nullptr)
         {
-          DynamicMethod^ dynam = gcnew DynamicMethod("", Internal::DotNetTypes::ObjectType, Type::EmptyTypes, type, true);
-          ILGenerator^ il = dynam->GetILGenerator();
+          return del(length);
+        }
 
-          ConstructorInfo^ ctorInfo = type->GetConstructor(Type::EmptyTypes);
-          if (ctorInfo == nullptr) {
-            Log::Error("Object missing public no arg constructor");
-            throw gcnew IllegalStateException("Object missing public no arg constructor");
+        Type^ t = GetType(className);
+        if (t)
+        {
+          msclr::lock lockInstance(ClassNameVsCreateNewObjectLockObj);
+          {
+            tmp = ClassNameVsCreateNewObjectArrayDelegate;
+            tmp->TryGetValue(className, del);
+            if (del != nullptr)
+              return del(length);
+            del = CreateNewObjectArrayDelegateF(t);
+            tmp = gcnew Dictionary<String^, CreateNewObjectArrayDelegate^>(ClassNameVsCreateNewObjectArrayDelegate);
+            tmp[className] = del;
+            ClassNameVsCreateNewObjectArrayDelegate = tmp;
+            return del(length);
           }
+        }
+        return nullptr;
+      }
 
-          il->Emit(OpCodes::Newobj, ctorInfo);
-          il->Emit(OpCodes::Ret);
+      //delegate Object^ CreateNewObject();
+      //static CreateNewObjectDelegate^ CreateNewObjectDelegateF(Type^ type);
+      TypeRegistry::CreateNewObjectDelegate^ TypeRegistry::CreateNewObjectDelegateF(Type^ type)
+      {
+        DynamicMethod^ dynam = gcnew DynamicMethod("", Internal::DotNetTypes::ObjectType, Type::EmptyTypes, type, true);
+        ILGenerator^ il = dynam->GetILGenerator();
 
-          return (TypeRegistry::CreateNewObjectDelegate^)dynam->CreateDelegate(createNewObjectDelegateType);
+        ConstructorInfo^ ctorInfo = type->GetConstructor(Type::EmptyTypes);
+        if (ctorInfo == nullptr) {
+          Log::Error("Object missing public no arg constructor");
+          throw gcnew IllegalStateException("Object missing public no arg constructor");
         }
 
-        //delegate Object^ CreateNewObjectArray(int len);
-        TypeRegistry::CreateNewObjectArrayDelegate^ TypeRegistry::CreateNewObjectArrayDelegateF(Type^ type)
-        {
-          DynamicMethod^ dynam = gcnew DynamicMethod("", Internal::DotNetTypes::ObjectType, singleIntTypeA, type, true);
-          ILGenerator^ il = dynam->GetILGenerator();
+        il->Emit(OpCodes::Newobj, ctorInfo);
+        il->Emit(OpCodes::Ret);
+
+        return (TypeRegistry::CreateNewObjectDelegate^)dynam->CreateDelegate(createNewObjectDelegateType);
+      }
 
-          il->Emit(OpCodes::Ldarg_0);
+      //delegate Object^ CreateNewObjectArray(int len);
+      TypeRegistry::CreateNewObjectArrayDelegate^ TypeRegistry::CreateNewObjectArrayDelegateF(Type^ type)
+      {
+        DynamicMethod^ dynam = gcnew DynamicMethod("", Internal::DotNetTypes::ObjectType, singleIntTypeA, type, true);
+        ILGenerator^ il = dynam->GetILGenerator();
 
-          il->Emit(OpCodes::Newarr, type);
-          il->Emit(OpCodes::Ret);
+        il->Emit(OpCodes::Ldarg_0);
 
-          return (TypeRegistry::CreateNewObjectArrayDelegate^)dynam->CreateDelegate(createNewObjectArrayDelegateType);
-        }
+        il->Emit(OpCodes::Newarr, type);
+        il->Emit(OpCodes::Ret);
+
+        return (TypeRegistry::CreateNewObjectArrayDelegate^)dynam->CreateDelegate(createNewObjectArrayDelegateType);
+      }
+
+      void TypeRegistry::RegisterDataSerializablePrimitivesWrapNativeDeserialization()
+      {
+        // Register wrappers for primitive types
+        // Does not intercept deserialization
+
+        RegisterDataSerializablePrimitiveWrapper(
+          gcnew DataSerializablePrimitiveWrapperDelegate(CacheableByte::Create),
+          native::GeodeTypeIds::CacheableByte, Byte::typeid);
+
+        RegisterDataSerializablePrimitiveWrapper(
+          gcnew DataSerializablePrimitiveWrapperDelegate(CacheableBoolean::Create),
+          native::GeodeTypeIds::CacheableBoolean, Boolean::typeid);
+
+        RegisterDataSerializablePrimitiveWrapper(
+          gcnew DataSerializablePrimitiveWrapperDelegate(CacheableCharacter::Create),
+          native::GeodeTypeIds::CacheableCharacter, Char::typeid);
 
+        RegisterDataSerializablePrimitiveWrapper(
+          gcnew DataSerializablePrimitiveWrapperDelegate(CacheableDouble::Create),
+          native::GeodeTypeIds::CacheableDouble, Double::typeid);
+
+        RegisterDataSerializablePrimitiveWrapper(
+          gcnew DataSerializablePrimitiveWrapperDelegate(CacheableString::Create),
+          native::GeodeTypeIds::CacheableASCIIString, String::typeid);
+
+        RegisterDataSerializablePrimitiveWrapper(
+          gcnew DataSerializablePrimitiveWrapperDelegate(CacheableFloat::Create),
+          native::GeodeTypeIds::CacheableFloat, float::typeid);
+
+        RegisterDataSerializablePrimitiveWrapper(
+          gcnew DataSerializablePrimitiveWrapperDelegate(CacheableInt16::Create),
+          native::GeodeTypeIds::CacheableInt16, Int16::typeid);
+
+        RegisterDataSerializablePrimitiveWrapper(
+          gcnew DataSerializablePrimitiveWrapperDelegate(CacheableInt32::Create),
+          native::GeodeTypeIds::CacheableInt32, Int32::typeid);
+
+        RegisterDataSerializablePrimitiveWrapper(
+          gcnew DataSerializablePrimitiveWrapperDelegate(CacheableInt64::Create),
+          native::GeodeTypeIds::CacheableInt64, Int64::typeid);
+      }
 
     }  // namespace Client
   }  // namespace Geode
diff --git a/clicache/src/TypeRegistry.hpp b/clicache/src/TypeRegistry.hpp
index 78e2d19..f99c5ff 100644
--- a/clicache/src/TypeRegistry.hpp
+++ b/clicache/src/TypeRegistry.hpp
@@ -108,7 +108,7 @@ namespace Apache
         /// <summary>
         /// Register an instance factory method for a given type.
         /// This should be used when registering types that implement
-        /// IGeodeSerializable.
+        /// ISerializable.
         /// </summary>
         /// <param name="creationMethod">
         /// the creation function to register
@@ -121,23 +121,15 @@ namespace Apache
         /// in registering the type; check <c>Utils::LastError</c> for more
         /// information in the latter case.
         /// </exception>
-        void RegisterTypeGeneric(TypeFactoryMethodGeneric^ creationMethod);
+        void RegisterType(TypeFactoryMethod^ creationMethod);
 
-        /// <summary>
-        /// Register an instance factory method for a given type and typeId.
-        /// This should be used when registering types that implement
-        /// IGeodeSerializable.
-        /// </summary>
-        /// <param name="typeId">typeId of the type being registered.</param>
-        /// <param name="creationMethod">
-        /// the creation function to register
-        /// </param>
-        /// <exception cref="IllegalArgumentException">
-        /// if the method is null
-        /// </exception>
-        void RegisterTypeGeneric(Byte typeId, TypeFactoryMethodGeneric^ creationMethod, 
-          Type^ type);
+      internal:
+        void RegisterDataSerializablePrimitiveOverrideNativeDeserialization(
+            int8_t dsCode, TypeFactoryMethod^ creationMethod, Type^ managedType);
 
+        void RegisterDataSerializableFixedIdTypeOverrideNativeDeserialization(
+            Int32 fixedId, TypeFactoryMethod^ creationMethod);
+        
 
         /// <summary>
         /// Unregister the type with the given typeId
@@ -148,29 +140,19 @@ namespace Apache
         /// <summary>
         /// This is to get manged delegates.
         /// </summary>
-        TypeFactoryMethodGeneric^ GetManagedDelegateGeneric(System::Int64 typeId)
+        TypeFactoryMethod^ GetManagedDelegateGeneric(System::Int64 typeId)
         {
-          TypeFactoryMethodGeneric^ ret = nullptr;
+          TypeFactoryMethod^ ret = nullptr;
           ManagedDelegatesGeneric->TryGetValue(typeId, ret);
           return ret;
         }
 
-      internal:
         generic<class TValue>
           static TValue GetManagedValueGeneric(std::shared_ptr<native::Serializable> val);
 
-        /// <summary>
-        /// Static method to register a managed wrapper for a native
-        /// <c>native::Serializable</c> type.
-        /// </summary>
-        /// <param name="wrapperMethod">
-        /// A factory delegate of the managed wrapper class that returns the
-        /// managed object given the native object.
-        /// </param>
-        /// <param name="typeId">The typeId of the native type.</param>
-        /// <seealso cref="NativeWrappers" />
-        static void RegisterWrapperGeneric(WrapperDelegateGeneric^ wrapperMethod,
-          Byte typeId, System::Type^ type);
+        static void RegisterDataSerializablePrimitiveWrapper(
+            DataSerializablePrimitiveWrapperDelegate^ wrapperMethod,
+            int8_t dsCode, System::Type^ type);
 
         /// <summary>
         /// Internal static method to remove managed artifacts created by
@@ -188,19 +170,32 @@ namespace Apache
           ClassNameVsCreateNewObjectArrayDelegate->Clear();
         }
 
-        static Byte GetManagedTypeMappingGeneric(Type^ type)
+        static inline int8_t GetDsCodeForManagedType(Type^ managedType)
         {
-          Byte retVal = 0;
-          ManagedTypeToTypeId->TryGetValue(type, retVal);
+          int8_t retVal = 0;
+          if (!ManagedTypeToDsCode->TryGetValue(managedType, retVal))
+          {
+            if (managedType->IsGenericType)
+            {
+              ManagedTypeToDsCode->TryGetValue(managedType->GetGenericTypeDefinition(), retVal);
+            }
+          }
           return retVal;
         }
 
-        static inline WrapperDelegateGeneric^ GetWrapperGeneric(Byte typeId)
+        inline TypeFactoryMethod^ GetDataSerializableFixedTypeFactoryMethodForFixedId(Int32 fixedId)
         {
-          if (typeId >= 0 && typeId <= WrapperEndGeneric) {
-            return NativeWrappersGeneric[typeId];
-          }
-          return nullptr;
+          return FixedIdToDataSerializableFixedIdTypeFactoryMethod[fixedId];
+        }
+
+        inline TypeFactoryMethod^ GetDataSerializablePrimitiveTypeFactoryMethodForDsCode(int8_t dsCode)
+        {
+          return DsCodeToDataSerializablePrimitiveTypeFactoryMethod[dsCode];
+        }
+
+        static inline DataSerializablePrimitiveWrapperDelegate^ GetDataSerializablePrimitiveWrapperDelegateForDsCode(int8_t dsCode)
+        {
+          return DsCodeToDataSerializablePrimitiveWrapperDelegate[dsCode];
         }
         
         delegate Object^ CreateNewObjectDelegate();
@@ -228,23 +223,31 @@ namespace Apache
         Dictionary<String^, PdxTypeFactoryMethod^>^ PdxDelegateMap =
           gcnew Dictionary<String^, PdxTypeFactoryMethod^>();
 
-        Dictionary<System::Int64, TypeFactoryMethodGeneric^>^ ManagedDelegatesGeneric =
-          gcnew Dictionary<System::Int64, TypeFactoryMethodGeneric^>();
+        Dictionary<System::Int64, TypeFactoryMethod^>^ ManagedDelegatesGeneric =
+          gcnew Dictionary<System::Int64, TypeFactoryMethod^>();
         List<TypeFactoryNativeMethodGeneric^>^ NativeDelegatesGeneric =
           gcnew List<TypeFactoryNativeMethodGeneric^>();
-        Dictionary<UInt32, TypeFactoryMethodGeneric^>^ DelegateMapGeneric =
-          gcnew Dictionary<UInt32, TypeFactoryMethodGeneric^>();
+        Dictionary<UInt32, TypeFactoryMethod^>^ DelegateMapGeneric =
+          gcnew Dictionary<UInt32, TypeFactoryMethod^>();
 
-        Dictionary<Byte, TypeFactoryNativeMethodGeneric^>^ BuiltInDelegatesGeneric =
+        Dictionary<Byte, TypeFactoryMethod^>^ DsCodeToDataSerializablePrimitiveTypeFactoryMethod =
+          gcnew Dictionary<Byte, TypeFactoryMethod^>();
+
+        Dictionary<Byte, TypeFactoryNativeMethodGeneric^>^ DsCodeToDataSerializablePrimitiveNativeDelegate =
           gcnew Dictionary<Byte, TypeFactoryNativeMethodGeneric^>();
 
+        Dictionary<Int32, TypeFactoryMethod^>^ FixedIdToDataSerializableFixedIdTypeFactoryMethod =
+          gcnew Dictionary<Int32, TypeFactoryMethod^>();
+
+        Dictionary<Int32, TypeFactoryNativeMethodGeneric^>^ FixedIdToDataSerializableFixedIdNativeDelegate =
+          gcnew Dictionary<Int32, TypeFactoryNativeMethodGeneric^>();
+
         // Fixed .NET to DSCode mapping
-        static Dictionary<System::Type^, Byte>^ ManagedTypeToTypeId =
-          gcnew Dictionary<System::Type^, Byte>();
+        static Dictionary<System::Type^, int8_t>^ ManagedTypeToDsCode =
+          gcnew Dictionary<System::Type^, int8_t>();
 
-        literal Byte WrapperEndGeneric = 128;
-        static array<WrapperDelegateGeneric^>^ NativeWrappersGeneric =
-          gcnew array<WrapperDelegateGeneric^>(WrapperEndGeneric + 1);
+        static array<DataSerializablePrimitiveWrapperDelegate^>^ DsCodeToDataSerializablePrimitiveWrapperDelegate =
+          gcnew array<DataSerializablePrimitiveWrapperDelegate^>(128);
 
         Type^ GetTypeFromRefrencedAssemblies(String^ className, Dictionary<Assembly^, bool>^ referedAssembly, Assembly^ currentAssembly);
         
@@ -261,58 +264,60 @@ namespace Apache
 
         static TypeRegistry()
         {
-          InitializeManagedTypeToTypeId();
+          InitializeManagedTypeToDsCode();
+          RegisterDataSerializablePrimitivesWrapNativeDeserialization();
         }
 
         /// <summary>
         /// Initializes a static map of .NET types to DataSerializable codes. Internally
         /// we call it TypeId.
         /// </summary>
-        static void InitializeManagedTypeToTypeId()
+        static void InitializeManagedTypeToDsCode()
         {
           Dictionary<Object^, Object^>^ dic = gcnew Dictionary<Object^, Object^>();
-          ManagedTypeToTypeId[dic->GetType()] = native::GeodeTypeIds::CacheableHashMap;
-          ManagedTypeToTypeId[dic->GetType()->GetGenericTypeDefinition()] = native::GeodeTypeIds::CacheableHashMap;
+          ManagedTypeToDsCode[dic->GetType()] = native::GeodeTypeIds::CacheableHashMap;
+          ManagedTypeToDsCode[dic->GetType()->GetGenericTypeDefinition()] = native::GeodeTypeIds::CacheableHashMap;
 
... 11928 lines suppressed ...

-- 
To stop receiving notification emails like this one, please contact
jbarrett@apache.org.

Mime
View raw message