You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@geode.apache.org by ec...@apache.org on 2018/04/04 15:15:11 UTC

[geode-native] branch develop updated: Geode 4799: Removing static members from Serializable

This is an automated email from the ASF dual-hosted git repository.

echobravo 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 fc9c81c  Geode 4799: Removing static members from Serializable
fc9c81c is described below

commit fc9c81c24c0d07bfeabd69d9a3bc436058179695
Author: Ernie Burghardt <eb...@pivotal.io>
AuthorDate: Wed Apr 4 09:15:05 2018 -0600

    Geode 4799: Removing static members from Serializable
    
    * Cleanup warnings
    
    * Replace GetPdxSerializer
    
    * PDXSerializerRegistry passes test
    
    * PdxTypeMapper moved to TypeRegistry
    
    * Moved PDX to LocalType maps to TypeRegistry.
    
    * Move GetType to TypeRegistry
      Signed-off-by: Ernie Burghardt <eb...@pivotal.io>
    
    * Put back reference assembly recursive search
      Signed-off-by: Michael Oleske <mo...@pivotal.io>
    
    *  Add new project for multiple cache testing
    
    * Attempt at test, but server fails to start
    
    *  multi cache test running
       Signed-off-by: Jacob Barrett <jb...@pivotal.io>
    
    * move RegisterPdxType to TypeRegistry
      Signed-off-by: Michael Oleske <mo...@pivotal.io>
    
    * Temporary commit to get stuff in the shared repo
    
    * Added a new MultiCache test and
    - rolled back to a compilable state
    
    * Made ManagedDelegatesGeneric instance based
    - added test for RegisterPdxType
    
    * Remove static from:
    - NativeDelegatesGeneric
    - DelegateMapGeneric
    - BuiltInDelegatesGeneric
    
    * Keeps ManagedTypeToTypeId static.
    
    * Removed static from RegisterTypeGeneric
    
    * Removed cache param from RegisterTypeGeneric since no longer needed
    
    * Removed static from UnregisterTypeGeneric
    
    * Add TypeRegistry files to MakeLists and fixed typo in file name
    
    * Split the integration and unit tests in clicache multcache tests.
    
    * Fixing Travis CI build.
    
    * Remove unneeded files from unittests
    
    * Rename test projects and remove GEODE_ROOT from top cmake file
    
    * Undo .travis.yml change
    
    * Rename to remove MultipleCache prefix
    
    * Remove MultipleCache prefix and
    - make test project name configurable and rename test class
    - remove Serializable::Clear()
    - moved statics used for object creation to TypeRegistry
    
    * GEODE-4799: Fixing compilation issue due to namespacing
      Signed-off-by: Mike Martell <mm...@pivotal.io>
    
    * GEODE-4799: Removing generated file from source control
      Signed-off-by: Mike Martell <mm...@pivotal.io>
    
    * GEODE-4799: First set of PR feedback changes
      Signed-off-by: Ryan McMahon <rm...@pivotal.io>
    
    * Changes:
    - test rename
    - moved configurable bits to a separate file
    
    * Added packages.config to project and add newline at the end of some files.
    
    * Remove commented out code
    
    * GEODE-4799: Adding missing GeodeServer.cs file
    
    * GEODE-4799: GeodeServer.cs was in wrong location
      Signed-off-by: Mike Martell <mm...@pivotal.io>
    
    * GEODE-4799: Fix to use proper relative nuget packages
    
    * Removed bad ignore line
---
 clicache/CMakeLists.txt                            |  13 +-
 .../integration-test/BuiltinCacheableWrappersN.cs  |   6 +-
 clicache/integration-test/CMakeLists.txt           |   6 +-
 clicache/integration-test/CacheHelperN.cs          |   4 +-
 clicache/integration-test/DistOpsStepsN.cs         |   2 +-
 clicache/integration-test/RegionOperationN.cs      |   4 +-
 clicache/integration-test/SerializationTestsN.cs   |  16 +-
 .../ThinClientAppDomainQueryTests.cs               |   8 +-
 clicache/integration-test/ThinClientCSTXN.cs       |   2 +-
 .../integration-test/ThinClientCallbackArgN.cs     |   8 +-
 clicache/integration-test/ThinClientCqIRTestsN.cs  |   4 +-
 clicache/integration-test/ThinClientCqTestsN.cs    |   8 +-
 clicache/integration-test/ThinClientDeltaTestN.cs  |  16 +-
 .../ThinClientFunctionExecutionTestsN.cs           |   4 +-
 .../integration-test/ThinClientHARegionTestsN.cs   |   4 +-
 .../integration-test/ThinClientListenerWriterN.cs  |   3 +-
 clicache/integration-test/ThinClientPdxTests.cs    | 339 ++++-----
 clicache/integration-test/ThinClientQueryTestsN.cs |   8 +-
 .../ThinClientRegionInterestListWithPdxTests.cs    |   8 +-
 .../integration-test/ThinClientRegionQueryTests.cs |   8 +-
 .../integration-test/ThinClientRegionStepsN.cs     |  12 +-
 .../integration-test/ThinClientRegionTestsN.cs     |   2 +-
 .../ThinClientRemoteParamQueryResultSetTests.cs    |   8 +-
 .../ThinClientRemoteParamQueryStructSetTests.cs    |   8 +-
 .../ThinClientRemoteQueryExclusivenessTests.cs     |   8 +-
 .../ThinClientRemoteQueryFailoverTests.cs          |   8 +-
 .../ThinClientRemoteQueryResultSetTests.cs         |   8 +-
 .../ThinClientRemoteQueryStructSetTests.cs         |   8 +-
 .../ThinClientSecurityAuthTestsMUN.cs              |   4 +-
 .../ThinClientSecurityAuthTestsN.cs                |   2 +-
 .../ThinClientSecurityAuthzTestsMUN.cs             |   8 +-
 .../ThinClientStringArrayTestsN.cs                 |   4 +-
 clicache/integration-test/UnitTests.csproj.in      |  10 +-
 clicache/integration-test2/CMakeLists.txt          |  72 ++
 clicache/integration-test2/CacheXml.cs             |  61 ++
 clicache/integration-test2/CacheXmlTests.cs        |  66 ++
 .../Config.cs.in}                                  |  35 +-
 clicache/integration-test2/GeodeServer.cs          | 138 ++++
 .../GeodeServerTests.cs}                           |  54 +-
 clicache/integration-test2/RegionTest.cs           | 284 +++++++
 clicache/integration-test2/cache.xml               |  41 +
 clicache/integration-test2/geode.properties        |  99 +++
 clicache/integration-test2/packages.config         |  29 +
 clicache/integration-test2/xunit.runner.json       |   4 +
 clicache/src/CMakeLists.txt                        |   4 +-
 clicache/src/Cache.cpp                             |   6 +-
 clicache/src/Cache.hpp                             |   8 +
 clicache/src/CacheFactory.cpp                      |   4 +-
 clicache/src/CacheableHashSet.hpp                  |   6 +-
 clicache/src/CqEvent.cpp                           |   4 +-
 clicache/src/DataInput.cpp                         |  18 +-
 clicache/src/DataInput.hpp                         |   4 +-
 clicache/src/DataOutput.cpp                        |   8 +-
 clicache/src/DistributedSystem.cpp                 | 168 ++---
 clicache/src/EntryEvent.cpp                        |   8 +-
 clicache/src/IPdxReader.hpp                        |   6 +
 clicache/src/IPdxTypeMapper.hpp                    |  10 +-
 clicache/src/IPdxWriter.hpp                        |   7 +
 clicache/src/LocalRegion.cpp                       |  24 +-
 clicache/src/Properties.cpp                        |   2 +-
 clicache/src/Properties.hpp                        |   4 +-
 clicache/src/ReflectionBasedAutoSerializer.cpp     |  33 +-
 clicache/src/ReflectionBasedAutoSerializer.hpp     |   2 +-
 clicache/src/Region.cpp                            |  36 +-
 clicache/src/RegionAttributes.hpp                  |   2 +-
 clicache/src/RegionEntry.cpp                       |   4 +-
 clicache/src/RegionEvent.cpp                       |   2 +-
 clicache/src/ResultCollector.cpp                   |  16 +-
 clicache/src/ResultSet.cpp                         |   2 +-
 clicache/src/SelectResultsIterator.cpp             |   4 +-
 clicache/src/Serializable.cpp                      | 826 +--------------------
 clicache/src/Serializable.hpp                      | 311 +-------
 clicache/src/Struct.cpp                            |   6 +-
 clicache/src/StructSet.cpp                         |   2 +-
 ...iterAdapte.hpp => TransactionWriterAdapter.hpp} |   0
 clicache/src/TypeRegistry.cpp                      | 716 ++++++++++++++++++
 clicache/src/TypeRegistry.hpp                      | 318 ++++++++
 clicache/src/impl/CacheLoader.hpp                  |   4 +-
 clicache/src/impl/EnumInfo.cpp                     |   9 +-
 clicache/src/impl/EnumInfo.hpp                     |   3 +-
 clicache/src/impl/ManagedResultCollector.cpp       |   2 +-
 clicache/src/impl/PdxHelper.cpp                    |  41 +-
 clicache/src/impl/PdxLocalReader.cpp               |  11 +-
 clicache/src/impl/PdxLocalReader.hpp               |  15 +-
 clicache/src/impl/PdxLocalWriter.cpp               |   4 +-
 clicache/src/impl/PdxLocalWriter.hpp               |   6 +
 clicache/src/impl/PdxWrapper.hpp                   |  12 +-
 clicache/src/impl/PersistenceManagerProxy.hpp      |   8 +-
 clicache/src/impl/ResultCollectorProxy.hpp         |   2 +-
 clicache/src/impl/SafeConvert.hpp                  |  50 +-
 clicache/test2/CMakeLists.txt                      |  62 ++
 clicache/test2/Tests2.cs                           | 337 +++++++++
 clicache/test2/packages.config                     |  13 +
 clicache/test2/xunit.runner.json                   |   4 +
 cppcache/integration-test/CMakeLists.txt           |  16 +-
 tests/cli/NewFwkLib/DeltaTest/DeltaTest.cs         |   5 +-
 tests/cli/NewFwkLib/PdxTest/PdxTests.cs            |  35 +-
 tests/cli/NewFwkLib/QueryTest/QueryTests.cs        |  27 +-
 98 files changed, 2927 insertions(+), 1754 deletions(-)

diff --git a/clicache/CMakeLists.txt b/clicache/CMakeLists.txt
index 23a851b..1b26f25 100644
--- a/clicache/CMakeLists.txt
+++ b/clicache/CMakeLists.txt
@@ -4,9 +4,9 @@
 # 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.
@@ -17,6 +17,13 @@ cmake_minimum_required(VERSION 3.10)
 
 project(clicache_src)
 
+find_program(NUGET nuget)
+add_custom_target(nuget-restore 
+  COMMAND ${NUGET} restore ${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}.sln
+)
+
 add_subdirectory(src)
 add_subdirectory(test)
-add_subdirectory(integration-test)
\ No newline at end of file
+add_subdirectory(test2)
+add_subdirectory(integration-test)
+add_subdirectory(integration-test2)
diff --git a/clicache/integration-test/BuiltinCacheableWrappersN.cs b/clicache/integration-test/BuiltinCacheableWrappersN.cs
index 444fe71..740ac22 100644
--- a/clicache/integration-test/BuiltinCacheableWrappersN.cs
+++ b/clicache/integration-test/BuiltinCacheableWrappersN.cs
@@ -174,7 +174,7 @@ namespace Apache.Geode.Client.UnitTests
       typeof(PdxCDataWrapper), PdxCDataWrapper.Create, typeof(PdxCData));
 
       //need to register pdx type
-      Serializable.RegisterPdxType(PdxCData.CreateDeserializable);
+      CacheHelper.DCache.TypeRegistry.RegisterPdxType(PdxCData.CreateDeserializable);
 
       #endregion
 
@@ -270,7 +270,7 @@ namespace Apache.Geode.Client.UnitTests
         typeof(CacheableHugeUnicodeStringWrapper), CacheableHugeUnicodeStringWrapper.Create);
 
       //need to register pdx type
-      Serializable.RegisterPdxType(PdxCData.CreateDeserializable);
+      CacheHelper.DCache.TypeRegistry.RegisterPdxType(PdxCData.CreateDeserializable);
 
       #endregion
 
@@ -370,7 +370,7 @@ namespace Apache.Geode.Client.UnitTests
      typeof(PdxCDataWrapper), PdxCDataWrapper.Create, typeof(PdxCData));
 
       //need to register pdx type
-      Serializable.RegisterPdxType(PdxCData.CreateDeserializable);
+      CacheHelper.DCache.TypeRegistry.RegisterPdxType(PdxCData.CreateDeserializable);
 
 
       #endregion
diff --git a/clicache/integration-test/CMakeLists.txt b/clicache/integration-test/CMakeLists.txt
index 1912a09..76be042 100644
--- a/clicache/integration-test/CMakeLists.txt
+++ b/clicache/integration-test/CMakeLists.txt
@@ -4,9 +4,9 @@
 # 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.
@@ -78,7 +78,7 @@ foreach(FILE ${SOURCES})
 		  file(STRINGS ${FILE} NameSpaceLine REGEX "namespace Apache.Geode.Client.UnitTests")
 		  string(REGEX REPLACE "namespace.*Apache" "Apache" NAMESPACE ${NameSpaceLine})
 
-          string(REGEX REPLACE "\\.cs" "" TEST ${FILE})        
+          string(REGEX REPLACE "\\.cs" "" TEST ${FILE})
           set(TESTS ${TESTS} ${TEST})
           set(TEST_DIR ${CMAKE_CURRENT_BINARY_DIR}/.tests/${TEST})
 
diff --git a/clicache/integration-test/CacheHelperN.cs b/clicache/integration-test/CacheHelperN.cs
index 4d7eeec..926e54b 100644
--- a/clicache/integration-test/CacheHelperN.cs
+++ b/clicache/integration-test/CacheHelperN.cs
@@ -122,7 +122,7 @@ namespace Apache.Geode.Client.UnitTests
 
     public void pdxPutGet(bool caching, bool readPdxSerialized)
     {
-      Serializable.RegisterPdxType(PdxTests.PdxType.CreateDeserializable);
+      CacheHelper.DCache.TypeRegistry.RegisterPdxType(PdxTests.PdxType.CreateDeserializable);
       IRegion<object, object> reg = CacheHelper.GetRegion<object, object>(m_regionName);
       PdxTests.PdxType pt = new PdxTests.PdxType();
       reg["pi"] = pt;
@@ -151,7 +151,7 @@ namespace Apache.Geode.Client.UnitTests
 
     public void pdxGetPut(bool caching, bool readPdxSerialized)
     {
-      Serializable.RegisterPdxType(PdxTests.PdxType.CreateDeserializable);
+      CacheHelper.DCache.TypeRegistry.RegisterPdxType(PdxTests.PdxType.CreateDeserializable);
       IRegion<object, object> reg = CacheHelper.GetRegion<object, object>(m_regionName);
       PdxTests.PdxType pt = new PdxTests.PdxType();
 
diff --git a/clicache/integration-test/DistOpsStepsN.cs b/clicache/integration-test/DistOpsStepsN.cs
index 365e05b..b2ef485 100644
--- a/clicache/integration-test/DistOpsStepsN.cs
+++ b/clicache/integration-test/DistOpsStepsN.cs
@@ -553,7 +553,7 @@ namespace Apache.Geode.Client.UnitTests
       try
       {
         //   m_chw_forSecondAppDomain.CreateTCRegions_Pool_AD(regionNames, endpoints, locators, poolName, clientNotification, ssl);
-        Serializable.RegisterPdxType(PdxTests.PdxType.CreateDeserializable);
+        CacheHelper.DCache.TypeRegistry.RegisterPdxType(PdxTests.PdxType.CreateDeserializable);
         CacheHelperWrapper chw = new CacheHelperWrapper();
         chw.CreateTCRegions_Pool_AD<object, object>(regionNames, locators, poolName, clientNotification, ssl, caching, pdxReadSerialized);
       }
diff --git a/clicache/integration-test/RegionOperationN.cs b/clicache/integration-test/RegionOperationN.cs
index a0db56f..e2d773e 100644
--- a/clicache/integration-test/RegionOperationN.cs
+++ b/clicache/integration-test/RegionOperationN.cs
@@ -39,8 +39,8 @@ namespace Apache.Geode.Client.UnitTests
 
     public RegionOperation(string RegionName)
     {
-      Serializable.RegisterPdxType(PdxTests.PdxTypes1.CreateDeserializable);
-      Serializable.RegisterPdxType(PdxTests.PdxTypes8.CreateDeserializable);
+      CacheHelper.DCache.TypeRegistry.RegisterPdxType(PdxTests.PdxTypes1.CreateDeserializable);
+      CacheHelper.DCache.TypeRegistry.RegisterPdxType(PdxTests.PdxTypes8.CreateDeserializable);
       m_region = CacheHelper.GetRegion<object, object>(RegionName);
     }
 
diff --git a/clicache/integration-test/SerializationTestsN.cs b/clicache/integration-test/SerializationTestsN.cs
index ad5fed0..d1e54d6 100644
--- a/clicache/integration-test/SerializationTestsN.cs
+++ b/clicache/integration-test/SerializationTestsN.cs
@@ -92,19 +92,19 @@ namespace Apache.Geode.Client.UnitTests
     {
       CacheHelper.CreateTCRegion2<object, object>(RegionNames[0], true, false,
         null, locators, false);
-      Serializable.RegisterTypeGeneric(OtherType.CreateDeserializable, CacheHelper.DCache);
-      Serializable.RegisterTypeGeneric(OtherType2.CreateDeserializable, CacheHelper.DCache);
-      Serializable.RegisterTypeGeneric(OtherType22.CreateDeserializable, CacheHelper.DCache);
-      Serializable.RegisterTypeGeneric(OtherType4.CreateDeserializable, CacheHelper.DCache);
-      Serializable.RegisterTypeGeneric(OtherType42.CreateDeserializable, CacheHelper.DCache);
-      Serializable.RegisterTypeGeneric(OtherType43.CreateDeserializable, CacheHelper.DCache);
+      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);
     }
 
     public void DoNPuts(int n)
     {
       try
       {
-        Serializable.RegisterTypeGeneric(OtherType.CreateDeserializable, CacheHelper.DCache);
+        CacheHelper.DCache.TypeRegistry.RegisterTypeGeneric(OtherType.CreateDeserializable);
         Assert.Fail("Expected exception in registering the type again.");
       }
       catch (IllegalStateException ex)
@@ -126,7 +126,7 @@ namespace Apache.Geode.Client.UnitTests
     {
       try
       {
-        Serializable.RegisterTypeGeneric(OtherType.CreateDeserializable, CacheHelper.DCache);
+        CacheHelper.DCache.TypeRegistry.RegisterTypeGeneric(OtherType.CreateDeserializable);
         Assert.Fail("Expected exception in registering the type again.");
       }
       catch (IllegalStateException ex)
diff --git a/clicache/integration-test/ThinClientAppDomainQueryTests.cs b/clicache/integration-test/ThinClientAppDomainQueryTests.cs
index 6ebc8ac..5eece34 100644
--- a/clicache/integration-test/ThinClientAppDomainQueryTests.cs
+++ b/clicache/integration-test/ThinClientAppDomainQueryTests.cs
@@ -64,10 +64,10 @@ namespace Apache.Geode.Client.UnitTests
 
     public void InitClient()
     {
-      Serializable.RegisterTypeGeneric(Portfolio.CreateDeserializable, CacheHelper.DCache);
-      Serializable.RegisterTypeGeneric(Position.CreateDeserializable, CacheHelper.DCache);
-      Serializable.RegisterPdxType(Apache.Geode.Client.Tests.PortfolioPdx.CreateDeserializable);
-      Serializable.RegisterPdxType(Apache.Geode.Client.Tests.PositionPdx.CreateDeserializable);
+      CacheHelper.DCache.TypeRegistry.RegisterTypeGeneric(Portfolio.CreateDeserializable);
+      CacheHelper.DCache.TypeRegistry.RegisterTypeGeneric(Position.CreateDeserializable);
+      CacheHelper.DCache.TypeRegistry.RegisterPdxType(PortfolioPdx.CreateDeserializable);
+      CacheHelper.DCache.TypeRegistry.RegisterPdxType(PositionPdx.CreateDeserializable);
     }
 
     public void CreateCache(string locators)
diff --git a/clicache/integration-test/ThinClientCSTXN.cs b/clicache/integration-test/ThinClientCSTXN.cs
index 589a920..4143446 100644
--- a/clicache/integration-test/ThinClientCSTXN.cs
+++ b/clicache/integration-test/ThinClientCSTXN.cs
@@ -777,7 +777,7 @@ namespace Apache.Geode.Client.UnitTests
 
     public void initializePdxSerializer()
     {
-      Serializable.RegisterPdxSerializer(new PdxSerializer());
+      CacheHelper.DCache.TypeRegistry.PdxSerializer = new PdxSerializer();
     }
 
     public void doPutGetWithPdxSerializer()
diff --git a/clicache/integration-test/ThinClientCallbackArgN.cs b/clicache/integration-test/ThinClientCallbackArgN.cs
index 33c2662..5f86715 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);
-      Serializable.RegisterTypeGeneric(Portfolio.CreateDeserializable, CacheHelper.DCache);
-      Serializable.RegisterTypeGeneric(Position.CreateDeserializable, CacheHelper.DCache);
+      CacheHelper.DCache.TypeRegistry.RegisterTypeGeneric(Portfolio.CreateDeserializable);
+      CacheHelper.DCache.TypeRegistry.RegisterTypeGeneric(Position.CreateDeserializable);
     }
 
     public void ValidateLocalListenerWriterData()
@@ -294,7 +294,7 @@ namespace Apache.Geode.Client.UnitTests
 
     void RegisterPdxType8()
     {
-      Serializable.RegisterPdxType(PdxTests.PdxTypes8.CreateDeserializable);
+      CacheHelper.DCache.TypeRegistry.RegisterPdxType(PdxTests.PdxTypes8.CreateDeserializable);
     }
 
     void runCallbackArgTest()
@@ -454,7 +454,7 @@ namespace Apache.Geode.Client.UnitTests
     {
       if (!isRegistered)
       {
-        Serializable.RegisterTypeGeneric(DefaultType.CreateDeserializable, CacheHelper.DCache);
+        CacheHelper.DCache.TypeRegistry.RegisterTypeGeneric(DefaultType.CreateDeserializable);
         isRegistered = true;
       }
     }
diff --git a/clicache/integration-test/ThinClientCqIRTestsN.cs b/clicache/integration-test/ThinClientCqIRTestsN.cs
index dfdc8b2..b0bb6ad 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
       {
-        Serializable.RegisterTypeGeneric(Portfolio.CreateDeserializable, CacheHelper.DCache);
-        Serializable.RegisterTypeGeneric(Position.CreateDeserializable, CacheHelper.DCache);
+        CacheHelper.DCache.TypeRegistry.RegisterTypeGeneric(Portfolio.CreateDeserializable);
+        CacheHelper.DCache.TypeRegistry.RegisterTypeGeneric(Position.CreateDeserializable);
       }
       catch (IllegalStateException)
       {
diff --git a/clicache/integration-test/ThinClientCqTestsN.cs b/clicache/integration-test/ThinClientCqTestsN.cs
index 62800cd..039a4e3 100644
--- a/clicache/integration-test/ThinClientCqTestsN.cs
+++ b/clicache/integration-test/ThinClientCqTestsN.cs
@@ -298,8 +298,8 @@ namespace Apache.Geode.Client.UnitTests
       CacheHelper.Init();
       try
       {
-        Serializable.RegisterTypeGeneric(Portfolio.CreateDeserializable, CacheHelper.DCache);
-        Serializable.RegisterTypeGeneric(Position.CreateDeserializable, CacheHelper.DCache);
+        CacheHelper.DCache.TypeRegistry.RegisterTypeGeneric(Portfolio.CreateDeserializable);
+        CacheHelper.DCache.TypeRegistry.RegisterTypeGeneric(Position.CreateDeserializable);
       }
       catch (IllegalStateException)
       {
@@ -352,8 +352,8 @@ namespace Apache.Geode.Client.UnitTests
       }
       else
       {
-        Serializable.RegisterPdxType(PortfolioPdx.CreateDeserializable);
-        Serializable.RegisterPdxType(PositionPdx.CreateDeserializable);
+        CacheHelper.DCache.TypeRegistry.RegisterPdxType(PortfolioPdx.CreateDeserializable);
+        CacheHelper.DCache.TypeRegistry.RegisterPdxType(PositionPdx.CreateDeserializable);
         qh.PopulatePortfolioPdxData(region0, qh.PortfolioSetSize,
          qh.PortfolioNumSets);
         qh.PopulatePortfolioPdxData(subRegion0, qh.PortfolioSetSize,
diff --git a/clicache/integration-test/ThinClientDeltaTestN.cs b/clicache/integration-test/ThinClientDeltaTestN.cs
index 0067942..6cb387f 100644
--- a/clicache/integration-test/ThinClientDeltaTestN.cs
+++ b/clicache/integration-test/ThinClientDeltaTestN.cs
@@ -254,7 +254,7 @@ namespace Apache.Geode.Client.UnitTests
     {
       try
       {
-        Serializable.RegisterTypeGeneric(DeltaEx.create, CacheHelper.DCache);
+        CacheHelper.DCache.TypeRegistry.RegisterTypeGeneric(DeltaEx.create);
       }
       catch (IllegalStateException)
       {
@@ -289,7 +289,7 @@ namespace Apache.Geode.Client.UnitTests
     {
       try
       {
-        Serializable.RegisterTypeGeneric(DeltaEx.create, CacheHelper.DCache);
+        CacheHelper.DCache.TypeRegistry.RegisterTypeGeneric(DeltaEx.create);
       }
       catch (IllegalStateException)
       {
@@ -337,7 +337,7 @@ namespace Apache.Geode.Client.UnitTests
     {
       try
       {
-        Serializable.RegisterTypeGeneric(DeltaEx.create, CacheHelper.DCache);
+        CacheHelper.DCache.TypeRegistry.RegisterTypeGeneric(DeltaEx.create);
       }
       catch (IllegalStateException)
       {
@@ -381,7 +381,7 @@ namespace Apache.Geode.Client.UnitTests
     {
       try
       {
-        Serializable.RegisterTypeGeneric(DeltaEx.create, CacheHelper.DCache);
+        CacheHelper.DCache.TypeRegistry.RegisterTypeGeneric(DeltaEx.create);
       }
       catch (IllegalStateException)
       {
@@ -414,7 +414,7 @@ namespace Apache.Geode.Client.UnitTests
     {
       try
       {
-        Serializable.RegisterTypeGeneric(DeltaEx.create, CacheHelper.DCache);
+        CacheHelper.DCache.TypeRegistry.RegisterTypeGeneric(DeltaEx.create);
       }
       catch (IllegalStateException)
       {
@@ -447,7 +447,7 @@ namespace Apache.Geode.Client.UnitTests
     {
       try
       {
-        Serializable.RegisterTypeGeneric(DeltaTestAD.Create, CacheHelper.DCache);
+        CacheHelper.DCache.TypeRegistry.RegisterTypeGeneric(DeltaTestAD.Create);
       }
       catch (IllegalStateException)
       {
@@ -571,7 +571,7 @@ namespace Apache.Geode.Client.UnitTests
     {
       try
       {
-        Serializable.RegisterTypeGeneric(DeltaEx.create, CacheHelper.DCache);
+        CacheHelper.DCache.TypeRegistry.RegisterTypeGeneric(DeltaEx.create);
       }
       catch (IllegalStateException)
       {
@@ -588,7 +588,7 @@ namespace Apache.Geode.Client.UnitTests
     {
       try
       {
-        Serializable.RegisterTypeGeneric(DeltaTestImpl.CreateDeserializable, CacheHelper.DCache);
+        CacheHelper.DCache.TypeRegistry.RegisterTypeGeneric(DeltaTestImpl.CreateDeserializable);
       }
       catch (IllegalStateException)
       {
diff --git a/clicache/integration-test/ThinClientFunctionExecutionTestsN.cs b/clicache/integration-test/ThinClientFunctionExecutionTestsN.cs
index 3dca0c5..00f5469 100644
--- a/clicache/integration-test/ThinClientFunctionExecutionTestsN.cs
+++ b/clicache/integration-test/ThinClientFunctionExecutionTestsN.cs
@@ -558,8 +558,8 @@ namespace Apache.Geode.Client.UnitTests
 
     public void genericFEResultDCPdxTest(string locators)
     {
-      Serializable.RegisterPdxType(PdxTests.PdxTypes1.CreateDeserializable);
-      Serializable.RegisterPdxType(PdxTests.PdxTypes8.CreateDeserializable);
+      CacheHelper.DCache.TypeRegistry.RegisterPdxType(PdxTests.PdxTypes1.CreateDeserializable);
+      CacheHelper.DCache.TypeRegistry.RegisterPdxType(PdxTests.PdxTypes8.CreateDeserializable);
       IRegion<string, IPdxSerializable> region = CacheHelper.GetVerifyRegion<string, IPdxSerializable>(QERegionName);
       Pool pl = CacheHelper.DCache.GetPoolManager().Find(poolName);
 
diff --git a/clicache/integration-test/ThinClientHARegionTestsN.cs b/clicache/integration-test/ThinClientHARegionTestsN.cs
index 81b1963..8f17929 100644
--- a/clicache/integration-test/ThinClientHARegionTestsN.cs
+++ b/clicache/integration-test/ThinClientHARegionTestsN.cs
@@ -641,8 +641,8 @@ namespace Apache.Geode.Client.UnitTests
 
       try
       {
-        Serializable.RegisterTypeGeneric(Portfolio.CreateDeserializable, CacheHelper.DCache);
-        Serializable.RegisterTypeGeneric(Position.CreateDeserializable, CacheHelper.DCache);
+        CacheHelper.DCache.TypeRegistry.RegisterTypeGeneric(Portfolio.CreateDeserializable);
+        CacheHelper.DCache.TypeRegistry.RegisterTypeGeneric(Position.CreateDeserializable);
       }
       catch (IllegalStateException)
       {
diff --git a/clicache/integration-test/ThinClientListenerWriterN.cs b/clicache/integration-test/ThinClientListenerWriterN.cs
index 3c0afc5..ccf72cb 100644
--- a/clicache/integration-test/ThinClientListenerWriterN.cs
+++ b/clicache/integration-test/ThinClientListenerWriterN.cs
@@ -153,8 +153,9 @@ namespace Apache.Geode.Client.UnitTests
 
     public void registerPdxType8()
     {
-      Serializable.RegisterPdxType(PdxTests.PdxTypes8.CreateDeserializable);
+      CacheHelper.DCache.TypeRegistry.RegisterPdxType(PdxTests.PdxTypes8.CreateDeserializable);
     }
+
     void runThinClientListenerWriterTest()
     {
       CacheHelper.SetupJavaServers(true, "cacheserver_notify_subscription.xml");
diff --git a/clicache/integration-test/ThinClientPdxTests.cs b/clicache/integration-test/ThinClientPdxTests.cs
index 34db77e..0510b6d 100755
--- a/clicache/integration-test/ThinClientPdxTests.cs
+++ b/clicache/integration-test/ThinClientPdxTests.cs
@@ -149,7 +149,7 @@ namespace Apache.Geode.Client.UnitTests
 
     void PutAndVerifyPdxInGet()
     {
-      Serializable.RegisterPdxType(PdxType.CreateDeserializable);
+      CacheHelper.DCache.TypeRegistry.RegisterPdxType(PdxType.CreateDeserializable);
 
       Region region0 = CacheHelper.GetVerifyRegion<object,object>(m_regionNames[0]);
 
@@ -164,7 +164,7 @@ namespace Apache.Geode.Client.UnitTests
 
      void VerifyGetOnly()
      {
-       Serializable.RegisterPdxType(PdxType.CreateDeserializable);
+       CacheHelper.DCache.TypeRegistry.RegisterPdxType(PdxType.CreateDeserializable);
 
        Region region0 = CacheHelper.GetVerifyRegion<object, object>(m_regionNames[0]);
        
@@ -176,18 +176,19 @@ namespace Apache.Geode.Client.UnitTests
 
     void PutAndVerifyVariousPdxTypes()
     {
-      Serializable.RegisterPdxType(PdxTypes1.CreateDeserializable);
-      Serializable.RegisterPdxType(PdxTypes2.CreateDeserializable);
-      Serializable.RegisterPdxType(PdxTypes3.CreateDeserializable);
-      Serializable.RegisterPdxType(PdxTypes4.CreateDeserializable);
-      Serializable.RegisterPdxType(PdxTypes5.CreateDeserializable);
-      Serializable.RegisterPdxType(PdxTypes6.CreateDeserializable);
-      Serializable.RegisterPdxType(PdxTypes7.CreateDeserializable);
-      Serializable.RegisterPdxType(PdxTypes8.CreateDeserializable);
-      Serializable.RegisterPdxType(PdxTypes9.CreateDeserializable);
-      Serializable.RegisterPdxType(PdxTests.PortfolioPdx.CreateDeserializable);
-      Serializable.RegisterPdxType(PdxTests.PositionPdx.CreateDeserializable);
-      Serializable.RegisterPdxType(PdxTests.AllPdxTypes.Create);
+      var typeRegistry = CacheHelper.DCache.TypeRegistry;
+      typeRegistry.RegisterPdxType(PdxTypes1.CreateDeserializable);
+      typeRegistry.RegisterPdxType(PdxTypes2.CreateDeserializable);
+      typeRegistry.RegisterPdxType(PdxTypes3.CreateDeserializable);
+      typeRegistry.RegisterPdxType(PdxTypes4.CreateDeserializable);
+      typeRegistry.RegisterPdxType(PdxTypes5.CreateDeserializable);
+      typeRegistry.RegisterPdxType(PdxTypes6.CreateDeserializable);
+      typeRegistry.RegisterPdxType(PdxTypes7.CreateDeserializable);
+      typeRegistry.RegisterPdxType(PdxTypes8.CreateDeserializable);
+      typeRegistry.RegisterPdxType(PdxTypes9.CreateDeserializable);
+      typeRegistry.RegisterPdxType(PdxTests.PortfolioPdx.CreateDeserializable);
+      typeRegistry.RegisterPdxType(PdxTests.PositionPdx.CreateDeserializable);
+      typeRegistry.RegisterPdxType(PdxTests.AllPdxTypes.Create);
 
 
       Region region0 = CacheHelper.GetVerifyRegion<object, object>(m_regionNames[0]);
@@ -300,18 +301,19 @@ namespace Apache.Geode.Client.UnitTests
 
      void VerifyVariousPdxGets()
      {
-       Serializable.RegisterPdxType(PdxTypes1.CreateDeserializable);
-       Serializable.RegisterPdxType(PdxTypes2.CreateDeserializable);
-       Serializable.RegisterPdxType(PdxTypes3.CreateDeserializable);
-       Serializable.RegisterPdxType(PdxTypes4.CreateDeserializable);
-       Serializable.RegisterPdxType(PdxTypes5.CreateDeserializable);
-       Serializable.RegisterPdxType(PdxTypes6.CreateDeserializable);
-       Serializable.RegisterPdxType(PdxTypes7.CreateDeserializable);
-       Serializable.RegisterPdxType(PdxTypes8.CreateDeserializable);
-       Serializable.RegisterPdxType(PdxTypes9.CreateDeserializable);
-       Serializable.RegisterPdxType(PdxTests.PortfolioPdx.CreateDeserializable);
-       Serializable.RegisterPdxType(PdxTests.PositionPdx.CreateDeserializable);
-       Serializable.RegisterPdxType(PdxTests.AllPdxTypes.Create);
+       var typeRegistry = CacheHelper.DCache.TypeRegistry;
+       typeRegistry.RegisterPdxType(PdxTypes1.CreateDeserializable);
+       typeRegistry.RegisterPdxType(PdxTypes2.CreateDeserializable);
+       typeRegistry.RegisterPdxType(PdxTypes3.CreateDeserializable);
+       typeRegistry.RegisterPdxType(PdxTypes4.CreateDeserializable);
+       typeRegistry.RegisterPdxType(PdxTypes5.CreateDeserializable);
+       typeRegistry.RegisterPdxType(PdxTypes6.CreateDeserializable);
+       typeRegistry.RegisterPdxType(PdxTypes7.CreateDeserializable);
+       typeRegistry.RegisterPdxType(PdxTypes8.CreateDeserializable);
+       typeRegistry.RegisterPdxType(PdxTypes9.CreateDeserializable);
+       typeRegistry.RegisterPdxType(PdxTests.PortfolioPdx.CreateDeserializable);
+       typeRegistry.RegisterPdxType(PdxTests.PositionPdx.CreateDeserializable);
+       typeRegistry.RegisterPdxType(PdxTests.AllPdxTypes.Create);
 
        Region region0 = CacheHelper.GetVerifyRegion<object, object>(m_regionNames[0]);
 
@@ -547,8 +549,8 @@ namespace Apache.Geode.Client.UnitTests
 
      void VerifyDataOutputAdvance()
      {
-       Serializable.RegisterPdxType(MyClass.Create);
-       Serializable.RegisterPdxType(MyClasses.Create);
+       CacheHelper.DCache.TypeRegistry.RegisterPdxType(MyClass.Create);
+       CacheHelper.DCache.TypeRegistry.RegisterPdxType(MyClasses.Create);
 
        Region region0 = CacheHelper.GetVerifyRegion<object, object>(m_regionNames[0]);
 
@@ -601,15 +603,15 @@ namespace Apache.Geode.Client.UnitTests
 
     void PutAndVerifyNestedPdxInGet()
     {
-      Serializable.RegisterPdxType(NestedPdx.CreateDeserializable);
-      Serializable.RegisterPdxType(PdxTypes1.CreateDeserializable);
-      Serializable.RegisterPdxType(PdxTypes2.CreateDeserializable);
-      Serializable.RegisterPdxType(PdxTypes3.CreateDeserializable);
-      Serializable.RegisterPdxType(PdxTypes4.CreateDeserializable);
-      Serializable.RegisterPdxType(PdxTypes5.CreateDeserializable);
-      Serializable.RegisterPdxType(PdxTypes6.CreateDeserializable);
-      Serializable.RegisterPdxType(PdxTypes7.CreateDeserializable);
-      Serializable.RegisterPdxType(PdxTypes8.CreateDeserializable);
+      CacheHelper.DCache.TypeRegistry.RegisterPdxType(NestedPdx.CreateDeserializable);
+      CacheHelper.DCache.TypeRegistry.RegisterPdxType(PdxTypes1.CreateDeserializable);
+      CacheHelper.DCache.TypeRegistry.RegisterPdxType(PdxTypes2.CreateDeserializable);
+      CacheHelper.DCache.TypeRegistry.RegisterPdxType(PdxTypes3.CreateDeserializable);
+      CacheHelper.DCache.TypeRegistry.RegisterPdxType(PdxTypes4.CreateDeserializable);
+      CacheHelper.DCache.TypeRegistry.RegisterPdxType(PdxTypes5.CreateDeserializable);
+      CacheHelper.DCache.TypeRegistry.RegisterPdxType(PdxTypes6.CreateDeserializable);
+      CacheHelper.DCache.TypeRegistry.RegisterPdxType(PdxTypes7.CreateDeserializable);
+      CacheHelper.DCache.TypeRegistry.RegisterPdxType(PdxTypes8.CreateDeserializable);
 
       Region region0 = CacheHelper.GetVerifyRegion<object, object>(m_regionNames[0]);
       NestedPdx np = new NestedPdx();
@@ -622,15 +624,15 @@ namespace Apache.Geode.Client.UnitTests
 
      void VerifyNestedGetOnly()
      {
-       Serializable.RegisterPdxType(NestedPdx.CreateDeserializable);
-       Serializable.RegisterPdxType(PdxTypes1.CreateDeserializable);
-       Serializable.RegisterPdxType(PdxTypes2.CreateDeserializable);
-       Serializable.RegisterPdxType(PdxTypes3.CreateDeserializable);
-       Serializable.RegisterPdxType(PdxTypes4.CreateDeserializable);
-       Serializable.RegisterPdxType(PdxTypes5.CreateDeserializable);
-       Serializable.RegisterPdxType(PdxTypes6.CreateDeserializable);
-       Serializable.RegisterPdxType(PdxTypes7.CreateDeserializable);
-       Serializable.RegisterPdxType(PdxTypes8.CreateDeserializable);
+       CacheHelper.DCache.TypeRegistry.RegisterPdxType(NestedPdx.CreateDeserializable);
+       CacheHelper.DCache.TypeRegistry.RegisterPdxType(PdxTypes1.CreateDeserializable);
+       CacheHelper.DCache.TypeRegistry.RegisterPdxType(PdxTypes2.CreateDeserializable);
+       CacheHelper.DCache.TypeRegistry.RegisterPdxType(PdxTypes3.CreateDeserializable);
+       CacheHelper.DCache.TypeRegistry.RegisterPdxType(PdxTypes4.CreateDeserializable);
+       CacheHelper.DCache.TypeRegistry.RegisterPdxType(PdxTypes5.CreateDeserializable);
+       CacheHelper.DCache.TypeRegistry.RegisterPdxType(PdxTypes6.CreateDeserializable);
+       CacheHelper.DCache.TypeRegistry.RegisterPdxType(PdxTypes7.CreateDeserializable);
+       CacheHelper.DCache.TypeRegistry.RegisterPdxType(PdxTypes8.CreateDeserializable);
 
 
        Region region0 = CacheHelper.GetVerifyRegion<object, object>(m_regionNames[0]);
@@ -685,16 +687,16 @@ namespace Apache.Geode.Client.UnitTests
      {
        try
        {
-         Serializable.RegisterTypeGeneric(PdxTests.PdxInsideIGeodeSerializable.CreateDeserializable, CacheHelper.DCache);
-         Serializable.RegisterPdxType(NestedPdx.CreateDeserializable);
-         Serializable.RegisterPdxType(PdxTypes1.CreateDeserializable);
-         Serializable.RegisterPdxType(PdxTypes2.CreateDeserializable);
-         Serializable.RegisterPdxType(PdxTypes3.CreateDeserializable);
-         Serializable.RegisterPdxType(PdxTypes4.CreateDeserializable);
-         Serializable.RegisterPdxType(PdxTypes5.CreateDeserializable);
-         Serializable.RegisterPdxType(PdxTypes6.CreateDeserializable);
-         Serializable.RegisterPdxType(PdxTypes7.CreateDeserializable);
-         Serializable.RegisterPdxType(PdxTypes8.CreateDeserializable);
+         CacheHelper.DCache.TypeRegistry.RegisterTypeGeneric(PdxInsideIGeodeSerializable.CreateDeserializable);
+         CacheHelper.DCache.TypeRegistry.RegisterPdxType(NestedPdx.CreateDeserializable);
+         CacheHelper.DCache.TypeRegistry.RegisterPdxType(PdxTypes1.CreateDeserializable);
+         CacheHelper.DCache.TypeRegistry.RegisterPdxType(PdxTypes2.CreateDeserializable);
+         CacheHelper.DCache.TypeRegistry.RegisterPdxType(PdxTypes3.CreateDeserializable);
+         CacheHelper.DCache.TypeRegistry.RegisterPdxType(PdxTypes4.CreateDeserializable);
+         CacheHelper.DCache.TypeRegistry.RegisterPdxType(PdxTypes5.CreateDeserializable);
+         CacheHelper.DCache.TypeRegistry.RegisterPdxType(PdxTypes6.CreateDeserializable);
+         CacheHelper.DCache.TypeRegistry.RegisterPdxType(PdxTypes7.CreateDeserializable);
+         CacheHelper.DCache.TypeRegistry.RegisterPdxType(PdxTypes8.CreateDeserializable);
        }
        catch (Exception )
        { 
@@ -713,16 +715,16 @@ namespace Apache.Geode.Client.UnitTests
      {
        try
        {
-         Serializable.RegisterTypeGeneric(PdxTests.PdxInsideIGeodeSerializable.CreateDeserializable, CacheHelper.DCache);
-         Serializable.RegisterPdxType(NestedPdx.CreateDeserializable);
-         Serializable.RegisterPdxType(PdxTypes1.CreateDeserializable);
-         Serializable.RegisterPdxType(PdxTypes2.CreateDeserializable);
-         Serializable.RegisterPdxType(PdxTypes3.CreateDeserializable);
-         Serializable.RegisterPdxType(PdxTypes4.CreateDeserializable);
-         Serializable.RegisterPdxType(PdxTypes5.CreateDeserializable);
-         Serializable.RegisterPdxType(PdxTypes6.CreateDeserializable);
-         Serializable.RegisterPdxType(PdxTypes7.CreateDeserializable);
-         Serializable.RegisterPdxType(PdxTypes8.CreateDeserializable);
+         CacheHelper.DCache.TypeRegistry.RegisterTypeGeneric(PdxInsideIGeodeSerializable.CreateDeserializable);
+         CacheHelper.DCache.TypeRegistry.RegisterPdxType(NestedPdx.CreateDeserializable);
+         CacheHelper.DCache.TypeRegistry.RegisterPdxType(PdxTypes1.CreateDeserializable);
+         CacheHelper.DCache.TypeRegistry.RegisterPdxType(PdxTypes2.CreateDeserializable);
+         CacheHelper.DCache.TypeRegistry.RegisterPdxType(PdxTypes3.CreateDeserializable);
+         CacheHelper.DCache.TypeRegistry.RegisterPdxType(PdxTypes4.CreateDeserializable);
+         CacheHelper.DCache.TypeRegistry.RegisterPdxType(PdxTypes5.CreateDeserializable);
+         CacheHelper.DCache.TypeRegistry.RegisterPdxType(PdxTypes6.CreateDeserializable);
+         CacheHelper.DCache.TypeRegistry.RegisterPdxType(PdxTypes7.CreateDeserializable);
+         CacheHelper.DCache.TypeRegistry.RegisterPdxType(PdxTypes8.CreateDeserializable);
        }
        catch (Exception )
        { }
@@ -818,7 +820,7 @@ namespace Apache.Geode.Client.UnitTests
      {
        try
        {
-         Serializable.RegisterPdxType(PdxTests.PdxType.CreateDeserializable);         
+         CacheHelper.DCache.TypeRegistry.RegisterPdxType(PdxTests.PdxType.CreateDeserializable);         
        }
        catch (Exception )
        {
@@ -839,7 +841,7 @@ namespace Apache.Geode.Client.UnitTests
      {
        try
        {
-         Serializable.RegisterPdxType(PdxTests.PdxType.CreateDeserializable);
+         CacheHelper.DCache.TypeRegistry.RegisterPdxType(PdxTests.PdxType.CreateDeserializable);
        }
        catch (Exception )
        {
@@ -928,16 +930,16 @@ namespace Apache.Geode.Client.UnitTests
      {
        try
        {
-         Serializable.RegisterTypeGeneric(PdxTests.PdxInsideIGeodeSerializable.CreateDeserializable, CacheHelper.DCache);
-         Serializable.RegisterPdxType(NestedPdx.CreateDeserializable);
-         Serializable.RegisterPdxType(PdxTypes1.CreateDeserializable);
-         Serializable.RegisterPdxType(PdxTypes2.CreateDeserializable);
-         Serializable.RegisterPdxType(PdxTypes3.CreateDeserializable);
-         Serializable.RegisterPdxType(PdxTypes4.CreateDeserializable);
-         Serializable.RegisterPdxType(PdxTypes5.CreateDeserializable);
-         Serializable.RegisterPdxType(PdxTypes6.CreateDeserializable);
-         Serializable.RegisterPdxType(PdxTypes7.CreateDeserializable);
-         Serializable.RegisterPdxType(PdxTypes8.CreateDeserializable);
+         CacheHelper.DCache.TypeRegistry.RegisterTypeGeneric(PdxInsideIGeodeSerializable.CreateDeserializable);
+         CacheHelper.DCache.TypeRegistry.RegisterPdxType(NestedPdx.CreateDeserializable);
+         CacheHelper.DCache.TypeRegistry.RegisterPdxType(PdxTypes1.CreateDeserializable);
+         CacheHelper.DCache.TypeRegistry.RegisterPdxType(PdxTypes2.CreateDeserializable);
+         CacheHelper.DCache.TypeRegistry.RegisterPdxType(PdxTypes3.CreateDeserializable);
+         CacheHelper.DCache.TypeRegistry.RegisterPdxType(PdxTypes4.CreateDeserializable);
+         CacheHelper.DCache.TypeRegistry.RegisterPdxType(PdxTypes5.CreateDeserializable);
+         CacheHelper.DCache.TypeRegistry.RegisterPdxType(PdxTypes6.CreateDeserializable);
+         CacheHelper.DCache.TypeRegistry.RegisterPdxType(PdxTypes7.CreateDeserializable);
+         CacheHelper.DCache.TypeRegistry.RegisterPdxType(PdxTypes8.CreateDeserializable);
        }
        catch (Exception )
        { }
@@ -1040,14 +1042,14 @@ namespace Apache.Geode.Client.UnitTests
      {
          try
          {
-             Serializable.RegisterTypeGeneric(PdxTests.PdxInsideIGeodeSerializable.CreateDeserializable, CacheHelper.DCache);
-             Serializable.RegisterPdxType(NestedPdx.CreateDeserializable);
-             Serializable.RegisterPdxType(PdxTypes1.CreateDeserializable);
-             Serializable.RegisterPdxType(PdxTypes2.CreateDeserializable);
-             Serializable.RegisterPdxType(PdxTypes3.CreateDeserializable);
-             Serializable.RegisterPdxType(PdxTypes4.CreateDeserializable);
-             Serializable.RegisterPdxType(PdxTypes5.CreateDeserializable);
-             Serializable.RegisterPdxType(PdxTypes6.CreateDeserializable);
+            CacheHelper.DCache.TypeRegistry.RegisterTypeGeneric(PdxTests.PdxInsideIGeodeSerializable.CreateDeserializable);
+            CacheHelper.DCache.TypeRegistry.RegisterPdxType(NestedPdx.CreateDeserializable);
+            CacheHelper.DCache.TypeRegistry.RegisterPdxType(PdxTypes1.CreateDeserializable);
+            CacheHelper.DCache.TypeRegistry.RegisterPdxType(PdxTypes2.CreateDeserializable);
+            CacheHelper.DCache.TypeRegistry.RegisterPdxType(PdxTypes3.CreateDeserializable);
+            CacheHelper.DCache.TypeRegistry.RegisterPdxType(PdxTypes4.CreateDeserializable);
+            CacheHelper.DCache.TypeRegistry.RegisterPdxType(PdxTypes5.CreateDeserializable);
+            CacheHelper.DCache.TypeRegistry.RegisterPdxType(PdxTypes6.CreateDeserializable);
 
          }
          catch (Exception)
@@ -1169,7 +1171,7 @@ namespace Apache.Geode.Client.UnitTests
      {
        m_pdxVesionOneAsm = Assembly.LoadFrom("PdxVersion1Lib.dll");
        
-       Serializable.RegisterPdxType(registerPdxTypeOne);
+       CacheHelper.DCache.TypeRegistry.RegisterPdxType(registerPdxTypeOne);
 
        Type pt = m_pdxVesionOneAsm.GetType("PdxVersionTests.PdxTypes1");
 
@@ -1190,7 +1192,7 @@ namespace Apache.Geode.Client.UnitTests
      {
        m_pdxVesionTwoAsm = Assembly.LoadFrom("PdxVersion2Lib.dll");
 
-       Serializable.RegisterPdxType(registerPdxTypeTwo);
+       CacheHelper.DCache.TypeRegistry.RegisterPdxType(registerPdxTypeTwo);
        Type pt = m_pdxVesionTwoAsm.GetType("PdxVersionTests.PdxTypes1");
 
        object ob = pt.InvokeMember("Reset", BindingFlags.Default | BindingFlags.InvokeMethod, null, null, new object[] { useWeakHashmap });
@@ -1408,7 +1410,7 @@ namespace Apache.Geode.Client.UnitTests
        Type pt = m_pdxVesionOneAsm.GetType("PdxVersionTests.TestDiffTypePdxS");
        object np = pt.InvokeMember("Create", BindingFlags.InvokeMethod, null, null, null);
 
-       Serializable.RegisterPdxSerializer((IPdxSerializer)np);
+       CacheHelper.DCache.TypeRegistry.PdxSerializer = (IPdxSerializer)np;
 
        //created new object
        np = pt.InvokeMember("TestDiffTypePdxS", BindingFlags.CreateInstance, null, null, new object[] { true });
@@ -1474,7 +1476,7 @@ namespace Apache.Geode.Client.UnitTests
 
        object np = pt.InvokeMember("Create", BindingFlags.InvokeMethod, null, null, null);
 
-       Serializable.RegisterPdxSerializer((IPdxSerializer)np);
+       CacheHelper.DCache.TypeRegistry.PdxSerializer = (IPdxSerializer)np;
 
        np = pt.InvokeMember("TestDiffTypePdxS", BindingFlags.CreateInstance, null, null, new object[] { true });
 
@@ -1638,7 +1640,7 @@ namespace Apache.Geode.Client.UnitTests
      {
        m_pdxVesionOneAsm = Assembly.LoadFrom("PdxVersion1Lib.dll");
 
-       Serializable.RegisterPdxType(registerPdxTypeOne2);
+       CacheHelper.DCache.TypeRegistry.RegisterPdxType(registerPdxTypeOne2);
 
        Type pt = m_pdxVesionOneAsm.GetType("PdxVersionTests.PdxTypes2");
 
@@ -1658,7 +1660,7 @@ namespace Apache.Geode.Client.UnitTests
      {
        m_pdxVesionTwoAsm = Assembly.LoadFrom("PdxVersion2Lib.dll");
 
-       Serializable.RegisterPdxType(registerPdxTypeTwo2);
+       CacheHelper.DCache.TypeRegistry.RegisterPdxType(registerPdxTypeTwo2);
        Type pt = m_pdxVesionTwoAsm.GetType("PdxVersionTests.PdxTypes2");
 
        object ob = pt.InvokeMember("Reset", BindingFlags.Default | BindingFlags.InvokeMethod, null, null, new object[] { useWeakHashmap });
@@ -1817,7 +1819,7 @@ namespace Apache.Geode.Client.UnitTests
      {
        m_pdxVesionOneAsm = Assembly.LoadFrom("PdxVersion1Lib.dll");
 
-       Serializable.RegisterPdxType(registerPdxTypeOne3);
+       CacheHelper.DCache.TypeRegistry.RegisterPdxType(registerPdxTypeOne3);
 
        Type pt = m_pdxVesionOneAsm.GetType("PdxVersionTests.PdxTypes3");
 
@@ -1837,7 +1839,7 @@ namespace Apache.Geode.Client.UnitTests
      {
        m_pdxVesionTwoAsm = Assembly.LoadFrom("PdxVersion2Lib.dll");
 
-       Serializable.RegisterPdxType(registerPdxTypeTwo3);
+       CacheHelper.DCache.TypeRegistry.RegisterPdxType(registerPdxTypeTwo3);
        Type pt = m_pdxVesionTwoAsm.GetType("PdxVersionTests.PdxTypes3");
 
        object ob = pt.InvokeMember("Reset", BindingFlags.Default | BindingFlags.InvokeMethod, null, null, new object[] { useWeakHashmap });
@@ -1982,7 +1984,7 @@ namespace Apache.Geode.Client.UnitTests
      {
        m_pdxVesionOneAsm = Assembly.LoadFrom("PdxVersion1Lib.dll");
 
-       Serializable.RegisterPdxType(registerPdxTypeOneR1);
+       CacheHelper.DCache.TypeRegistry.RegisterPdxType(registerPdxTypeOneR1);
 
        Type pt = m_pdxVesionOneAsm.GetType("PdxVersionTests.PdxTypesR1");
 
@@ -2004,7 +2006,7 @@ namespace Apache.Geode.Client.UnitTests
      {
        m_pdxVesionTwoAsm = Assembly.LoadFrom("PdxVersion2Lib.dll");
 
-       Serializable.RegisterPdxType(registerPdxTypeTwoR1);
+       CacheHelper.DCache.TypeRegistry.RegisterPdxType(registerPdxTypeTwoR1);
 
        Type pt = m_pdxVesionTwoAsm.GetType("PdxVersionTests.PdxTypesR1");
 
@@ -2200,7 +2202,7 @@ namespace Apache.Geode.Client.UnitTests
      {
        m_pdxVesionOneAsm = Assembly.LoadFrom("PdxVersion1Lib.dll");
 
-       Serializable.RegisterPdxType(registerPdxUIV1);
+       CacheHelper.DCache.TypeRegistry.RegisterPdxType(registerPdxUIV1);
 
        Type pt = m_pdxVesionOneAsm.GetType("PdxVersionTests.PdxTypesIgnoreUnreadFields");
 
@@ -2239,7 +2241,7 @@ namespace Apache.Geode.Client.UnitTests
      {
        m_pdxVesionTwoAsm = Assembly.LoadFrom("PdxVersion2Lib.dll");
 
-       Serializable.RegisterPdxType(registerPdxUIV2);
+       CacheHelper.DCache.TypeRegistry.RegisterPdxType(registerPdxUIV2);
 
        Type pt = m_pdxVesionTwoAsm.GetType("PdxVersionTests.PdxTypesIgnoreUnreadFields");
 
@@ -2328,7 +2330,7 @@ namespace Apache.Geode.Client.UnitTests
      {
        m_pdxVesionOneAsm = Assembly.LoadFrom("PdxVersion1Lib.dll");
 
-       Serializable.RegisterPdxType(registerPdxTypeOneR2);
+       CacheHelper.DCache.TypeRegistry.RegisterPdxType(registerPdxTypeOneR2);
 
        Type pt = m_pdxVesionOneAsm.GetType("PdxVersionTests.PdxTypesR2");
 
@@ -2350,7 +2352,7 @@ namespace Apache.Geode.Client.UnitTests
      {
        m_pdxVesionTwoAsm = Assembly.LoadFrom("PdxVersion2Lib.dll");
 
-       Serializable.RegisterPdxType(registerPdxTypeTwoR2);
+       CacheHelper.DCache.TypeRegistry.RegisterPdxType(registerPdxTypeTwoR2);
 
        Type pt = m_pdxVesionTwoAsm.GetType("PdxVersionTests.PdxTypesR2");
 
@@ -2495,7 +2497,7 @@ namespace Apache.Geode.Client.UnitTests
 
      public void putFromPool1()
      {
-       Serializable.RegisterPdxType(PdxTypes1.CreateDeserializable);
+       CacheHelper.DCache.TypeRegistry.RegisterPdxType(PdxTypes1.CreateDeserializable);
        Util.Log("Put from pool-1 started");
        Region region0 = CacheHelper.GetVerifyRegion<object, object>(RegionNames[0]);
 
@@ -2586,7 +2588,7 @@ namespace Apache.Geode.Client.UnitTests
 
     void initializePdxSerializer()
     {
-      Serializable.RegisterPdxSerializer(new PdxSerializer());
+      CacheHelper.DCache.TypeRegistry.PdxSerializer = new PdxSerializer();
 
       //Serializable.RegisterTypeForPdxSerializer(SerializePdx1.CreateDeserializable);
     }
@@ -2735,7 +2737,7 @@ namespace Apache.Geode.Client.UnitTests
 
      void initializeReflectionPdxSerializer()
      {
-       Serializable.RegisterPdxSerializer(new AutoSerializerEx());
+       CacheHelper.DCache.TypeRegistry.PdxSerializer = new AutoSerializerEx();
 
        //Serializable.RegisterTypeForPdxSerializer(SerializePdx1.CreateDeserializable);
      }
@@ -2914,7 +2916,7 @@ namespace Apache.Geode.Client.UnitTests
 
      void dinitPdxSerializer()
      {
-       Serializable.RegisterPdxSerializer(null);
+       CacheHelper.DCache.TypeRegistry.PdxSerializer = null;
      }
 
      void doPutGetWithPdxSerializerNoReg()
@@ -2995,7 +2997,7 @@ namespace Apache.Geode.Client.UnitTests
 
      void pdxPut()
      {
-       Serializable.RegisterPdxType(PdxTests.PdxType.CreateDeserializable);
+       CacheHelper.DCache.TypeRegistry.RegisterPdxType(PdxTests.PdxType.CreateDeserializable);
        Region region0 = CacheHelper.GetVerifyRegion<object, object>(m_regionNames[0]);
 
        region0["pdxput"] = new PdxTests.PdxType();
@@ -3004,7 +3006,7 @@ namespace Apache.Geode.Client.UnitTests
 
      void getObject()
      {
-       Serializable.RegisterPdxType(PdxTests.PdxType.CreateDeserializable);
+       CacheHelper.DCache.TypeRegistry.RegisterPdxType(PdxTests.PdxType.CreateDeserializable);
        Region region0 = CacheHelper.GetVerifyRegion<object, object>(m_regionNames[0]);
 
        IPdxInstance ret = (IPdxInstance)region0["pdxput"];
@@ -3029,7 +3031,7 @@ namespace Apache.Geode.Client.UnitTests
 
      void verifyPdxInstanceEquals()
      {
-       Serializable.RegisterPdxType(PdxTests.PdxType.CreateDeserializable);
+       CacheHelper.DCache.TypeRegistry.RegisterPdxType(PdxTests.PdxType.CreateDeserializable);
        Region region0 = CacheHelper.GetVerifyRegion<object, object>(m_regionNames[0]);
 
        IPdxInstance ret = (IPdxInstance)region0["pdxput"];
@@ -3049,7 +3051,7 @@ namespace Apache.Geode.Client.UnitTests
 
      void verifyPdxInstanceHashcode()
      {
-       Serializable.RegisterPdxType(PdxTests.PdxType.CreateDeserializable);
+       CacheHelper.DCache.TypeRegistry.RegisterPdxType(PdxTests.PdxType.CreateDeserializable);
        Region region0 = CacheHelper.GetVerifyRegion<object, object>(m_regionNames[0]);
 
        IPdxInstance ret = (IPdxInstance)region0["pdxput"];
@@ -3071,7 +3073,7 @@ namespace Apache.Geode.Client.UnitTests
 
      void accessPdxInstance()
      {
-       Serializable.RegisterPdxType(PdxTests.PdxType.CreateDeserializable);
+       CacheHelper.DCache.TypeRegistry.RegisterPdxType(PdxTests.PdxType.CreateDeserializable);
        Region region0 = CacheHelper.GetVerifyRegion<object, object>(m_regionNames[0]);
 
        IPdxInstance ret = (IPdxInstance)region0["pdxput"];
@@ -3545,7 +3547,7 @@ namespace Apache.Geode.Client.UnitTests
 
      void putPdxWithIdentityField()
      {
-       Serializable.RegisterPdxType(SerializePdx.Create);
+       CacheHelper.DCache.TypeRegistry.RegisterPdxType(SerializePdx.Create);
        SerializePdx sp = new SerializePdx(true);
 
        Region region0 = CacheHelper.GetVerifyRegion<object, object>(RegionNames[0]);
@@ -3645,7 +3647,7 @@ namespace Apache.Geode.Client.UnitTests
     {
       m_pdxVesionOneAsm = Assembly.LoadFrom("PdxVersion1Lib.dll");
 
-      Serializable.RegisterPdxType(registerPdxTypeForEqualv1);
+      CacheHelper.DCache.TypeRegistry.RegisterPdxType(registerPdxTypeForEqualv1);
 
      // Type pt = m_pdxVesionTwoAsm.GetType("PdxVersionTests.TestEquals");
 
@@ -3666,7 +3668,7 @@ namespace Apache.Geode.Client.UnitTests
     {
       m_pdxVesionTwoAsm= Assembly.LoadFrom("PdxVersion2Lib.dll");
 
-      Serializable.RegisterPdxType(registerPdxTypeForEqualv2);
+      CacheHelper.DCache.TypeRegistry.RegisterPdxType(registerPdxTypeForEqualv2);
 
       // Type pt = m_pdxVesionTwoAsm.GetType("PdxVersionTests.TestEquals");
 
@@ -4260,84 +4262,83 @@ namespace Apache.Geode.Client.UnitTests
 
      public void pdxTypeMapperTest1()
      {
-       Console.WriteLine("pdxTypeMapperTest 1");
-       Serializable.SetPdxTypeMapper(new PdxTypeMapper());
-       Region region0 = CacheHelper.GetVerifyRegion<object, object>(m_regionNames[0]);
-
-       if(region0 == null)
-         Console.WriteLine("pdxTypeMapperTest region is null");
-       else
-         Console.WriteLine("pdxTypeMapperTest region is NOT null");
+        Console.WriteLine("pdxTypeMapperTest 1");
+        CacheHelper.DCache.TypeRegistry.PdxTypeMapper = new PdxTypeMapper();
+        Region region0 = CacheHelper.GetVerifyRegion<object, object>(m_regionNames[0]);
 
+        if(region0 == null)
+          Console.WriteLine("pdxTypeMapperTest region is null");
+        else
+          Console.WriteLine("pdxTypeMapperTest region is NOT null");
 
-       PdxTests.PdxType pt = new PdxType();
+        PdxTests.PdxType pt = new PdxType();
 
-       for (int i = 0; i < 10; i++)
-       {
-         region0[i] = pt;
-       }
-       for (int i = 0; i < 10; i++)
-       {
-         object ret = region0[i];
+        for (int i = 0; i < 10; i++)
+        {
+           region0[i] = pt;
+        }
+        for (int i = 0; i < 10; i++)
+        {
+           object ret = region0[i];
 
-         Assert.AreEqual(ret, pt);
-       }
+           Assert.AreEqual(ret, pt);
+        }
      }
 
      public void pdxTypeMapperTest2()
      {
-       Serializable.SetPdxTypeMapper(new PdxTypeMapper());
-       Region region0 = CacheHelper.GetVerifyRegion<object, object>(m_regionNames[0]);
+        CacheHelper.DCache.TypeRegistry.PdxTypeMapper = new PdxTypeMapper();
+        Region region0 = CacheHelper.GetVerifyRegion<object, object>(m_regionNames[0]);
 
-       PdxTests.PdxType pt = new PdxType();
+        PdxTests.PdxType pt = new PdxType();
 
-       for (int i = 0; i < 10; i++)
-       {
-         object ret = region0[1];
+        for (int i = 0; i < 10; i++)
+        {
+           object ret = region0[1];
 
-         Assert.AreEqual(ret, pt);
-       }
+           Assert.AreEqual(ret, pt);
+        }
      }
 
      public void pdxITypeMapperTest()
      {
-       Serializable.SetPdxTypeMapper(new PdxTypeMapper());
-       Region region0 = CacheHelper.GetVerifyRegion<object, object>(m_regionNames[0]);
+        CacheHelper.DCache.TypeRegistry.PdxTypeMapper = new PdxTypeMapper();
+        Region region0 = CacheHelper.GetVerifyRegion<object, object>(m_regionNames[0]);
 
-       PdxTests.PdxType pt = new PdxType();
+        PdxTests.PdxType pt = new PdxType();
 
-       for (int i = 0; i < 10; i++)
-       {
-         object ret = region0[1];
+        for (int i = 0; i < 10; i++)
+        {
+          object ret = region0[1];
 
-         IPdxInstance pi = ret as IPdxInstance;
-         Assert.IsNotNull(pi);
-         //IDisposable dis = (IDisposable)pi;
-         using (pi)
-         {
-           Assert.AreEqual(pi.GetObject(), pt);
-         }
-       }
+          IPdxInstance pi = ret as IPdxInstance;
+          Assert.IsNotNull(pi);
+
+          using (pi)
+          {
+             Assert.AreEqual(pi.GetObject(), pt);
+          }
+        }
      }
 
      public void pdxASTypeMapperTest()
      {
-       Serializable.RegisterPdxSerializer(new AutoSerializerEx());
-       Serializable.SetPdxTypeMapper(new PdxTypeMapper());
-       Region region0 = CacheHelper.GetVerifyRegion<object, object>(m_regionNames[0]);
+        CacheHelper.DCache.TypeRegistry.PdxSerializer = new AutoSerializerEx();
+        CacheHelper.DCache.TypeRegistry.PdxTypeMapper = new PdxTypeMapper();
+        Region region0 = CacheHelper.GetVerifyRegion<object, object>(m_regionNames[0]);
 
-       SerializePdx3 sp3 = new SerializePdx3(true, 2);
+        SerializePdx3 sp3 = new SerializePdx3(true, 2);
 
-       for (int i = 100; i < 110; i++)
-       {
-         region0[i] = sp3;
-       }
+        for (int i = 100; i < 110; i++)
+        {
+           region0[i] = sp3;
+        }
 
-       for (int i = 100; i < 110; i++)
-       {
-         object ret = region0[i];
-         Assert.AreEqual(sp3, ret);
-       } 
+        for (int i = 100; i < 110; i++)
+        {
+           object ret = region0[i];
+           Assert.AreEqual(sp3, ret);
+        } 
      }
 
      public void runPdxTypeMapperTest()
@@ -4919,8 +4920,8 @@ namespace Apache.Geode.Client.UnitTests
 
      void putFromLongRunningClient() 
      {
-       Serializable.RegisterPdxType(PdxTests.PdxTypes1.CreateDeserializable);
-       Serializable.RegisterPdxType(PdxTests.PdxTypes2.CreateDeserializable);
+       CacheHelper.DCache.TypeRegistry.RegisterPdxType(PdxTests.PdxTypes1.CreateDeserializable);
+       CacheHelper.DCache.TypeRegistry.RegisterPdxType(PdxTests.PdxTypes2.CreateDeserializable);
        Region region0 = CacheHelper.GetVerifyRegion<object, object>(m_regionNames[0]);
 
        region0[1] = new PdxTests.PdxTypes1();
@@ -4930,8 +4931,8 @@ namespace Apache.Geode.Client.UnitTests
 
      void VerifyEntryFLRC()
      {
-       Serializable.RegisterPdxType(PdxTests.PdxTypes1.CreateDeserializable);
-       Serializable.RegisterPdxType(PdxTests.PdxTypes2.CreateDeserializable);
+       CacheHelper.DCache.TypeRegistry.RegisterPdxType(PdxTests.PdxTypes1.CreateDeserializable);
+       CacheHelper.DCache.TypeRegistry.RegisterPdxType(PdxTests.PdxTypes2.CreateDeserializable);
        Region region0 = CacheHelper.GetVerifyRegion<object, object>(m_regionNames[0]);
 
        object ret = region0[1];
diff --git a/clicache/integration-test/ThinClientQueryTestsN.cs b/clicache/integration-test/ThinClientQueryTestsN.cs
index c48035d..02d9387 100644
--- a/clicache/integration-test/ThinClientQueryTestsN.cs
+++ b/clicache/integration-test/ThinClientQueryTestsN.cs
@@ -80,10 +80,10 @@ namespace Apache.Geode.Client.UnitTests
     public void InitClient()
     {
       CacheHelper.Init();
-      Serializable.RegisterTypeGeneric(Portfolio.CreateDeserializable, CacheHelper.DCache);
-      Serializable.RegisterTypeGeneric(Position.CreateDeserializable, CacheHelper.DCache);
-      Serializable.RegisterPdxType(Apache.Geode.Client.Tests.PortfolioPdx.CreateDeserializable);
-      Serializable.RegisterPdxType(Apache.Geode.Client.Tests.PositionPdx.CreateDeserializable);
+      CacheHelper.DCache.TypeRegistry.RegisterTypeGeneric(Portfolio.CreateDeserializable);
+      CacheHelper.DCache.TypeRegistry.RegisterTypeGeneric(Position.CreateDeserializable);
+      CacheHelper.DCache.TypeRegistry.RegisterPdxType(PortfolioPdx.CreateDeserializable);
+      CacheHelper.DCache.TypeRegistry.RegisterPdxType(PositionPdx.CreateDeserializable);
     }
 
     public void StepOneQE(string locators, bool isPdx)
diff --git a/clicache/integration-test/ThinClientRegionInterestListWithPdxTests.cs b/clicache/integration-test/ThinClientRegionInterestListWithPdxTests.cs
index 43e8a2c..6fa8b38 100644
--- a/clicache/integration-test/ThinClientRegionInterestListWithPdxTests.cs
+++ b/clicache/integration-test/ThinClientRegionInterestListWithPdxTests.cs
@@ -536,8 +536,8 @@ namespace Apache.Geode.Client.UnitTests
 
     void RegisterKeysPdx()
     {
-      Serializable.RegisterPdxType(PdxTests.PdxTypes1.CreateDeserializable);
-      Serializable.RegisterPdxType(PdxTests.PdxTypes8.CreateDeserializable);
+      CacheHelper.DCache.TypeRegistry.RegisterPdxType(PdxTests.PdxTypes1.CreateDeserializable);
+      CacheHelper.DCache.TypeRegistry.RegisterPdxType(PdxTests.PdxTypes8.CreateDeserializable);
       IRegion<object, object> region = CacheHelper.GetVerifyRegion<object, object>(m_regionNames[0]);
 
       region.GetSubscriptionService().RegisterAllKeys();
@@ -545,8 +545,8 @@ namespace Apache.Geode.Client.UnitTests
 
     void StepThreePdx()
     {
-      Serializable.RegisterPdxType(PdxTests.PdxTypes1.CreateDeserializable);
-      Serializable.RegisterPdxType(PdxTests.PdxTypes8.CreateDeserializable);
+      CacheHelper.DCache.TypeRegistry.RegisterPdxType(PdxTests.PdxTypes1.CreateDeserializable);
+      CacheHelper.DCache.TypeRegistry.RegisterPdxType(PdxTests.PdxTypes8.CreateDeserializable);
       IRegion<object, object> region = CacheHelper.GetVerifyRegion<object, object>(m_regionNames[0]);
 
       region[1] = new PdxTests.PdxTypes8();
diff --git a/clicache/integration-test/ThinClientRegionQueryTests.cs b/clicache/integration-test/ThinClientRegionQueryTests.cs
index df33634..2f1df77 100644
--- a/clicache/integration-test/ThinClientRegionQueryTests.cs
+++ b/clicache/integration-test/ThinClientRegionQueryTests.cs
@@ -79,10 +79,10 @@ namespace Apache.Geode.Client.UnitTests
     public void InitClient()
     {
       CacheHelper.Init();
-      Serializable.RegisterTypeGeneric(Portfolio.CreateDeserializable, CacheHelper.DCache);
-      Serializable.RegisterTypeGeneric(Position.CreateDeserializable, CacheHelper.DCache);
-      Serializable.RegisterPdxType(Apache.Geode.Client.Tests.PortfolioPdx.CreateDeserializable);
-      Serializable.RegisterPdxType(Apache.Geode.Client.Tests.PositionPdx.CreateDeserializable);
+      CacheHelper.DCache.TypeRegistry.RegisterTypeGeneric(Portfolio.CreateDeserializable);
+      CacheHelper.DCache.TypeRegistry.RegisterTypeGeneric(Position.CreateDeserializable);
+      CacheHelper.DCache.TypeRegistry.RegisterPdxType(PortfolioPdx.CreateDeserializable);
+      CacheHelper.DCache.TypeRegistry.RegisterPdxType(PositionPdx.CreateDeserializable);
     }
 
     public void StepOne(string locators, bool isPdx)
diff --git a/clicache/integration-test/ThinClientRegionStepsN.cs b/clicache/integration-test/ThinClientRegionStepsN.cs
index dc03f78..31d3e24 100644
--- a/clicache/integration-test/ThinClientRegionStepsN.cs
+++ b/clicache/integration-test/ThinClientRegionStepsN.cs
@@ -353,8 +353,8 @@ namespace Apache.Geode.Client.UnitTests
         region = CacheHelper.GetVerifyRegion<object, object>(RegionName, credentials);
       else
         region = CacheHelper.GetVerifyRegion<object, object>(RegionName);
-      Serializable.RegisterPdxType(PdxTests.PdxTypes1.CreateDeserializable);
-      Serializable.RegisterPdxType(PdxTests.PdxTypes8.CreateDeserializable);
+      CacheHelper.DCache.TypeRegistry.RegisterPdxType(PdxTests.PdxTypes1.CreateDeserializable);
+      CacheHelper.DCache.TypeRegistry.RegisterPdxType(PdxTests.PdxTypes8.CreateDeserializable);
       for (int opNum = 1; opNum <= numOps; ++opNum)
       {
         try
@@ -436,8 +436,8 @@ namespace Apache.Geode.Client.UnitTests
           region = CacheHelper.GetVerifyRegion<object, object>(RegionName, credentials);
       else
           region = CacheHelper.GetVerifyRegion<object, object>(RegionName);
-      Serializable.RegisterPdxType(PdxTests.PdxTypes1.CreateDeserializable);
-      Serializable.RegisterPdxType(PdxTests.PdxTypes8.CreateDeserializable);
+      CacheHelper.DCache.TypeRegistry.RegisterPdxType(PdxTests.PdxTypes1.CreateDeserializable);
+      CacheHelper.DCache.TypeRegistry.RegisterPdxType(PdxTests.PdxTypes8.CreateDeserializable);
       for (int opNum = 1; opNum <= numOps; ++opNum)
       {
         try
@@ -532,8 +532,8 @@ namespace Apache.Geode.Client.UnitTests
     {
       string valPrefix = (useNewVal ? NValuePrefix : ValuePrefix);
       IRegion<object, object> region;
-      Serializable.RegisterPdxType(PdxTests.PdxTypes1.CreateDeserializable);
-      Serializable.RegisterPdxType(PdxTests.PdxTypes8.CreateDeserializable);
+      CacheHelper.DCache.TypeRegistry.RegisterPdxType(PdxTests.PdxTypes1.CreateDeserializable);
+      CacheHelper.DCache.TypeRegistry.RegisterPdxType(PdxTests.PdxTypes8.CreateDeserializable);
       if (isMultiuser)
       {
         region = CacheHelper.GetVerifyRegion<object, object>(RegionName, credential);
diff --git a/clicache/integration-test/ThinClientRegionTestsN.cs b/clicache/integration-test/ThinClientRegionTestsN.cs
index 52eaf37..98fad50 100644
--- a/clicache/integration-test/ThinClientRegionTestsN.cs
+++ b/clicache/integration-test/ThinClientRegionTestsN.cs
@@ -375,7 +375,7 @@ namespace Apache.Geode.Client.UnitTests
     {
       try
       {
-        Serializable.RegisterTypeGeneric(OtherType.CreateDeserializable, CacheHelper.DCache);
+        CacheHelper.DCache.TypeRegistry.RegisterTypeGeneric(OtherType.CreateDeserializable);
       }
       catch (IllegalStateException)
       {
diff --git a/clicache/integration-test/ThinClientRemoteParamQueryResultSetTests.cs b/clicache/integration-test/ThinClientRemoteParamQueryResultSetTests.cs
index a242f6d..0e1e2e9 100644
--- a/clicache/integration-test/ThinClientRemoteParamQueryResultSetTests.cs
+++ b/clicache/integration-test/ThinClientRemoteParamQueryResultSetTests.cs
@@ -79,10 +79,10 @@ namespace Apache.Geode.Client.UnitTests
     public void InitClient()
     {
       CacheHelper.Init();
-      Serializable.RegisterTypeGeneric(Portfolio.CreateDeserializable, CacheHelper.DCache);
-      Serializable.RegisterTypeGeneric(Position.CreateDeserializable, CacheHelper.DCache);
-      Serializable.RegisterPdxType(Apache.Geode.Client.Tests.PortfolioPdx.CreateDeserializable);
-      Serializable.RegisterPdxType(Apache.Geode.Client.Tests.PositionPdx.CreateDeserializable);
+      CacheHelper.DCache.TypeRegistry.RegisterTypeGeneric(Portfolio.CreateDeserializable);
+      CacheHelper.DCache.TypeRegistry.RegisterTypeGeneric(Position.CreateDeserializable);
+      CacheHelper.DCache.TypeRegistry.RegisterPdxType(PortfolioPdx.CreateDeserializable);
+      CacheHelper.DCache.TypeRegistry.RegisterPdxType(PositionPdx.CreateDeserializable);
     }
 
     public void StepOne(string locators, bool isPdx)
diff --git a/clicache/integration-test/ThinClientRemoteParamQueryStructSetTests.cs b/clicache/integration-test/ThinClientRemoteParamQueryStructSetTests.cs
index f6bd27e..bb5de3e 100644
--- a/clicache/integration-test/ThinClientRemoteParamQueryStructSetTests.cs
+++ b/clicache/integration-test/ThinClientRemoteParamQueryStructSetTests.cs
@@ -79,10 +79,10 @@ namespace Apache.Geode.Client.UnitTests
     public void InitClient()
     {
       CacheHelper.Init();
-      Serializable.RegisterTypeGeneric(Portfolio.CreateDeserializable, CacheHelper.DCache);
-      Serializable.RegisterTypeGeneric(Position.CreateDeserializable, CacheHelper.DCache);
-      Serializable.RegisterPdxType(Apache.Geode.Client.Tests.PortfolioPdx.CreateDeserializable);
-      Serializable.RegisterPdxType(Apache.Geode.Client.Tests.PositionPdx.CreateDeserializable);
+      CacheHelper.DCache.TypeRegistry.RegisterTypeGeneric(Portfolio.CreateDeserializable);
+      CacheHelper.DCache.TypeRegistry.RegisterTypeGeneric(Position.CreateDeserializable);
+      CacheHelper.DCache.TypeRegistry.RegisterPdxType(PortfolioPdx.CreateDeserializable);
+      CacheHelper.DCache.TypeRegistry.RegisterPdxType(PositionPdx.CreateDeserializable);
     }
 
     public void StepOne(string locators, bool isPdx)
diff --git a/clicache/integration-test/ThinClientRemoteQueryExclusivenessTests.cs b/clicache/integration-test/ThinClientRemoteQueryExclusivenessTests.cs
index 9b57e6f..a588bb1 100644
--- a/clicache/integration-test/ThinClientRemoteQueryExclusivenessTests.cs
+++ b/clicache/integration-test/ThinClientRemoteQueryExclusivenessTests.cs
@@ -78,10 +78,10 @@ namespace Apache.Geode.Client.UnitTests
     public void InitClient()
     {
       CacheHelper.Init();
-      Serializable.RegisterTypeGeneric(Portfolio.CreateDeserializable, CacheHelper.DCache);
-      Serializable.RegisterTypeGeneric(Position.CreateDeserializable, CacheHelper.DCache);
-      Serializable.RegisterPdxType(Apache.Geode.Client.Tests.PortfolioPdx.CreateDeserializable);
-      Serializable.RegisterPdxType(Apache.Geode.Client.Tests.PositionPdx.CreateDeserializable);
+      CacheHelper.DCache.TypeRegistry.RegisterTypeGeneric(Portfolio.CreateDeserializable);
+      CacheHelper.DCache.TypeRegistry.RegisterTypeGeneric(Position.CreateDeserializable);
+      CacheHelper.DCache.TypeRegistry.RegisterPdxType(PortfolioPdx.CreateDeserializable);
+      CacheHelper.DCache.TypeRegistry.RegisterPdxType(PositionPdx.CreateDeserializable);
     }
 
     public void StepOneQE(string locators, bool isPdx)
diff --git a/clicache/integration-test/ThinClientRemoteQueryFailoverTests.cs b/clicache/integration-test/ThinClientRemoteQueryFailoverTests.cs
index 0e56440..61b2dd2 100644
--- a/clicache/integration-test/ThinClientRemoteQueryFailoverTests.cs
+++ b/clicache/integration-test/ThinClientRemoteQueryFailoverTests.cs
@@ -79,10 +79,10 @@ namespace Apache.Geode.Client.UnitTests
     public void InitClient()
     {
       CacheHelper.Init();
-      Serializable.RegisterTypeGeneric(Portfolio.CreateDeserializable, CacheHelper.DCache);
-      Serializable.RegisterTypeGeneric(Position.CreateDeserializable, CacheHelper.DCache);
-      Serializable.RegisterPdxType(Apache.Geode.Client.Tests.PortfolioPdx.CreateDeserializable);
-      Serializable.RegisterPdxType(Apache.Geode.Client.Tests.PositionPdx.CreateDeserializable);
+      CacheHelper.DCache.TypeRegistry.RegisterTypeGeneric(Portfolio.CreateDeserializable);
+      CacheHelper.DCache.TypeRegistry.RegisterTypeGeneric(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 2bfce6b..dd65966 100644
--- a/clicache/integration-test/ThinClientRemoteQueryResultSetTests.cs
+++ b/clicache/integration-test/ThinClientRemoteQueryResultSetTests.cs
@@ -80,10 +80,10 @@ namespace Apache.Geode.Client.UnitTests
     public void InitClient()
     {
       CacheHelper.Init();
-      Serializable.RegisterTypeGeneric(Portfolio.CreateDeserializable, CacheHelper.DCache);
-      Serializable.RegisterTypeGeneric(Position.CreateDeserializable, CacheHelper.DCache);
-      Serializable.RegisterPdxType(Apache.Geode.Client.Tests.PortfolioPdx.CreateDeserializable);
-      Serializable.RegisterPdxType(Apache.Geode.Client.Tests.PositionPdx.CreateDeserializable);
+      CacheHelper.DCache.TypeRegistry.RegisterTypeGeneric(Portfolio.CreateDeserializable);
+      CacheHelper.DCache.TypeRegistry.RegisterTypeGeneric(Position.CreateDeserializable);
+      CacheHelper.DCache.TypeRegistry.RegisterPdxType(PortfolioPdx.CreateDeserializable);
+      CacheHelper.DCache.TypeRegistry.RegisterPdxType(PositionPdx.CreateDeserializable);
     }
 
     public void StepOne(string locators, bool isPdx)
diff --git a/clicache/integration-test/ThinClientRemoteQueryStructSetTests.cs b/clicache/integration-test/ThinClientRemoteQueryStructSetTests.cs
index 21059e3..9780e19 100644
--- a/clicache/integration-test/ThinClientRemoteQueryStructSetTests.cs
+++ b/clicache/integration-test/ThinClientRemoteQueryStructSetTests.cs
@@ -80,10 +80,10 @@ namespace Apache.Geode.Client.UnitTests
     public void InitClient()
     {
       CacheHelper.Init();
-      Serializable.RegisterTypeGeneric(Portfolio.CreateDeserializable, CacheHelper.DCache);
-      Serializable.RegisterTypeGeneric(Position.CreateDeserializable, CacheHelper.DCache);
-      Serializable.RegisterPdxType(Apache.Geode.Client.Tests.PortfolioPdx.CreateDeserializable);
-      Serializable.RegisterPdxType(Apache.Geode.Client.Tests.PositionPdx.CreateDeserializable);
+      CacheHelper.DCache.TypeRegistry.RegisterTypeGeneric(Portfolio.CreateDeserializable);
+      CacheHelper.DCache.TypeRegistry.RegisterTypeGeneric(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/ThinClientSecurityAuthTestsMUN.cs b/clicache/integration-test/ThinClientSecurityAuthTestsMUN.cs
index fe74b93..37df5fb 100644
--- a/clicache/integration-test/ThinClientSecurityAuthTestsMUN.cs
+++ b/clicache/integration-test/ThinClientSecurityAuthTestsMUN.cs
@@ -541,8 +541,8 @@ namespace Apache.Geode.Client.UnitTests
 
     public void registerPdxTypes()
     {
-      Serializable.RegisterPdxType(PdxTests.PdxTypes8.CreateDeserializable);
-      Serializable.RegisterPdxType(PdxTests.PdxTypes1.CreateDeserializable);
+      CacheHelper.DCache.TypeRegistry.RegisterPdxType(PdxTests.PdxTypes8.CreateDeserializable);
+      CacheHelper.DCache.TypeRegistry.RegisterPdxType(PdxTests.PdxTypes1.CreateDeserializable);
     }
 
     void runCredentialsForNotifications()
diff --git a/clicache/integration-test/ThinClientSecurityAuthTestsN.cs b/clicache/integration-test/ThinClientSecurityAuthTestsN.cs
index adb659e..40062dc 100644
--- a/clicache/integration-test/ThinClientSecurityAuthTestsN.cs
+++ b/clicache/integration-test/ThinClientSecurityAuthTestsN.cs
@@ -558,7 +558,7 @@ namespace Apache.Geode.Client.UnitTests
 
     public void registerPdxType8()
     {
-      Serializable.RegisterPdxType(PdxTests.PdxTypes8.CreateDeserializable);
+      CacheHelper.DCache.TypeRegistry.RegisterPdxType(PdxTests.PdxTypes8.CreateDeserializable);
     }
 
     void runCredentialsForNotifications()
diff --git a/clicache/integration-test/ThinClientSecurityAuthzTestsMUN.cs b/clicache/integration-test/ThinClientSecurityAuthzTestsMUN.cs
index 883c661..de6a1e4 100644
--- a/clicache/integration-test/ThinClientSecurityAuthzTestsMUN.cs
+++ b/clicache/integration-test/ThinClientSecurityAuthzTestsMUN.cs
@@ -238,8 +238,8 @@ namespace Apache.Geode.Client.UnitTests
 
       try
       {
-        Serializable.RegisterTypeGeneric(Portfolio.CreateDeserializable, CacheHelper.DCache);
-        Serializable.RegisterTypeGeneric(Position.CreateDeserializable, CacheHelper.DCache);
+        CacheHelper.DCache.TypeRegistry.RegisterTypeGeneric(Portfolio.CreateDeserializable);
+        CacheHelper.DCache.TypeRegistry.RegisterTypeGeneric(Position.CreateDeserializable);
         Util.Log("registerCQ portfolio registered");
       }
       catch (IllegalStateException)
@@ -267,8 +267,8 @@ namespace Apache.Geode.Client.UnitTests
 
       try
       {
-        Serializable.RegisterTypeGeneric(Portfolio.CreateDeserializable, CacheHelper.DCache);
-        Serializable.RegisterTypeGeneric(Position.CreateDeserializable, CacheHelper.DCache);
+        CacheHelper.DCache.TypeRegistry.RegisterTypeGeneric(Portfolio.CreateDeserializable);
+        CacheHelper.DCache.TypeRegistry.RegisterTypeGeneric(Position.CreateDeserializable);
         Util.Log("doCQPut portfolio registered");
       }
       catch (IllegalStateException)
diff --git a/clicache/integration-test/ThinClientStringArrayTestsN.cs b/clicache/integration-test/ThinClientStringArrayTestsN.cs
index fd5aa19..907c148 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
       {
-        Serializable.RegisterTypeGeneric(Portfolio.CreateDeserializable, CacheHelper.DCache);
-        Serializable.RegisterTypeGeneric(Position.CreateDeserializable, CacheHelper.DCache);
+        CacheHelper.DCache.TypeRegistry.RegisterTypeGeneric(Portfolio.CreateDeserializable);
+        CacheHelper.DCache.TypeRegistry.RegisterTypeGeneric(Position.CreateDeserializable);
       }
       catch (IllegalStateException)
       {
diff --git a/clicache/integration-test/UnitTests.csproj.in b/clicache/integration-test/UnitTests.csproj.in
index 460e440..f0360e4 100644
--- a/clicache/integration-test/UnitTests.csproj.in
+++ b/clicache/integration-test/UnitTests.csproj.in
@@ -6,9 +6,9 @@
   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.
@@ -91,7 +91,7 @@
   </PropertyGroup>
   <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|x64' ">
     <DefineConstants>TRACE</DefineConstants>
-    <Optimize>true</Optimize>    
+    <Optimize>true</Optimize>
     <IntermediateOutputPath>Release</IntermediateOutputPath>
     <OutputPath>Release</OutputPath>
     <DebugType>pdbonly</DebugType>
@@ -599,7 +599,7 @@
     <ProjectReference Include="$(CMAKE_BINARY_DIR)\clicache\src\Apache.Geode.vcxproj">
       <CopyLocalSatelliteAssemblies>true</CopyLocalSatelliteAssemblies>
       <ReferenceOutputAssembly>true</ReferenceOutputAssembly>
-    </ProjectReference>       
+    </ProjectReference>
     <ProjectReference Include="$(CMAKE_BINARY_DIR)\tests\cli\DUnitFramework\DUnitFramework.csproj">
       <Project>{796727E8-3A6A-46BE-A2DB-584A4774CD51}</Project>
       <Name>DUnitFramework</Name>
@@ -631,7 +631,7 @@
     </ProjectReference>
   </ItemGroup>
   <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
-  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. 
+  <!-- To modify your build process, add your task inside one of the targets below and uncomment it.
        Other similar extension points exist, see Microsoft.Common.targets.
   <Target Name="BeforeBuild">
   </Target>
diff --git a/clicache/integration-test2/CMakeLists.txt b/clicache/integration-test2/CMakeLists.txt
new file mode 100644
index 0000000..959daa1
--- /dev/null
+++ b/clicache/integration-test2/CMakeLists.txt
@@ -0,0 +1,72 @@
+# 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.
+
+cmake_minimum_required( VERSION 3.9 )
+project( Apache.Geode.IntegrationTests2 CSharp )
+
+set(CMAKE_CSharp_FLAGS "/langversion:5")
+
+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)
+
+add_library( ${PROJECT_NAME} SHARED
+    Config.cs.in
+    ${CMAKE_CURRENT_BINARY_DIR}/Config.cs
+    GeodeServer.cs
+    GeodeServerTests.cs
+    CacheXml.cs
+    CacheXmlTests.cs
+    RegionTest.cs
+    cache.xml
+    geode.properties
+    xunit.runner.json
+    packages.config
+)
+
+set_source_files_properties(cache.xml xunit.runner.json geode.properties PROPERTIES
+  VS_COPY_TO_OUT_DIR Always
+  VS_TOOL_OVERRIDE "None"
+)
+
+target_link_libraries(${PROJECT_NAME}
+  Apache.Geode
+)
+
+set_target_properties( ${PROJECT_NAME} PROPERTIES
+  VS_GLOBAL_ROOTNAMESPACE ${PROJECT_NAME}
+  VS_GLOBAL_TestProjectType UnitTest
+  VS_GLOBAL_PROJECT_TYPES "{3AC096D0-A1C2-E12C-1390-A8335801FDAB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}"
+  VS_DOTNET_TARGET_FRAMEWORK_VERSION "v4.5.2"
+  VS_DOTNET_REFERENCES "System;System.Xml;System.Web;System.Configuration"
+  VS_DOTNET_REFERENCE_Microsoft.VisualStudio.TestPlatform.TestFramework "${CMAKE_BINARY_DIR}/clicache/packages/Microsoft.VisualStudio.TestPlatform.14.0.0.1/lib/net20/Microsoft.VisualStudio.TestPlatform.TestFramework.dll"
+  VS_DOTNET_REFERENCE_Microsoft.VisualStudio.TestPlatform.TestFramework.Extensions "${CMAKE_BINARY_DIR}/clicache/packages/Microsoft.VisualStudio.TestPlatform.14.0.0.1/lib/net20/Microsoft.VisualStudio.TestPlatform.TestFramework.Extensions.dll"
+  VS_DOTNET_REFERENCE_xunit.core "${CMAKE_BINARY_DIR}/clicache/packages/xunit.extensibility.core.2.3.1/lib/netstandard1.1/xunit.core.dll"
+  VS_DOTNET_REFERENCE_xunit.assert "${CMAKE_BINARY_DIR}/clicache/packages/xunit.assert.2.3.1/lib/netstandard1.1/xunit.assert.dll"
+  VS_DOTNET_REFERENCE_xunit.abstractions "${CMAKE_BINARY_DIR}/clicache/packages/xunit.abstractions.2.0.1/lib/net35/xunit.abstractions.dll"
+  VS_DOTNET_REFERENCE_xunit.execution.desktop "${CMAKE_BINARY_DIR}/clicache/packages/xunit.extensibility.execution.2.3.1/lib/net452/xunit.execution.desktop.dll"
+)
+
+if(NOT "${STRONG_NAME_KEY}" STREQUAL "")
+  set_target_properties( ${PROJECT_NAME} PROPERTIES
+    VS_GLOBAL_SignAssembly "true"
+    VS_GLOBAL_AssemblyOriginatorKeyFile ${STRONG_NAME_KEY}
+  )
+endif()
+
+add_dependencies(${PROJECT_NAME} nuget-restore)
+
+install(TARGETS ${PROJECT_NAME}
+  RUNTIME DESTINATION bin
+)
diff --git a/clicache/integration-test2/CacheXml.cs b/clicache/integration-test2/CacheXml.cs
new file mode 100644
index 0000000..9d0f278
--- /dev/null
+++ b/clicache/integration-test2/CacheXml.cs
@@ -0,0 +1,61 @@
+/*
+ * 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 System.Diagnostics;
+
+public class CacheXml : IDisposable
+{
+    public FileInfo File
+    {
+        get;
+        private set;
+    }
+
+    public CacheXml(FileInfo template, GeodeServer gfs, string regionName = "testRegion")
+    {
+        string content;
+
+        using (var input = template.OpenText())
+        {
+            content = input.ReadToEnd();
+        }
+
+        content = content.Replace("LOCATOR_PORT", gfs.LocatorPort.ToString());
+        content = content.Replace("REGION_NAME", regionName);
+
+        Debug.WriteLine(content);
+
+        var tempFile = new FileInfo(Path.GetTempFileName()) { Attributes = FileAttributes.Temporary };
+
+        // Set the Attribute property of this file to Temporary. 
+        // Although this is not completely necessary, the .NET Framework is able 
+        // to optimize the use of Temporary files by keeping them cached in memory.
+        using (var output = new StreamWriter(tempFile.FullName))
+        {
+            output.Write(content);
+        }
+
+        File = tempFile;
+    }
+
+    public void Dispose()
+    {
+        File.Delete();
+    }
+}
diff --git a/clicache/integration-test2/CacheXmlTests.cs b/clicache/integration-test2/CacheXmlTests.cs
new file mode 100644
index 0000000..3ab291a
--- /dev/null
+++ b/clicache/integration-test2/CacheXmlTests.cs
@@ -0,0 +1,66 @@
+/*
+ * 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.IO;
+using System.Threading;
+using Xunit;
+
+[Trait("Category", "Integration")]
+public class CacheXmlTests
+{
+    [Fact]
+    public void ConstructAndGenerate()
+    {
+        using (var gfs = new GeodeServer())
+        {
+            var template = new FileInfo("cache.xml");
+            var cacheXml = new CacheXml(template, gfs);
+            Assert.NotNull(cacheXml.File);
+            Assert.True(cacheXml.File.Exists);
+
+            using (var input = cacheXml.File.OpenText())
+            {
+                var content = input.ReadToEnd();
+                Assert.True(content.Contains(gfs.LocatorPort.ToString()));
+            }
+        }
+    }
+
+    [Fact]
+    public void DisposeAndCleanup()
+    {
+        using (var gfs = new GeodeServer())
+        {
+            FileInfo file;
+
+            var template = new FileInfo("cache.xml");
+            using (var cacheXml = new CacheXml(template, gfs))
+            {
+                Assert.NotNull(cacheXml.File);
+                file = cacheXml.File;
+                Assert.True(file.Exists);
+            }
+
+            file.Refresh();
+
+            // File deletion via File.Delete (inside the file.Refresh() call)
+            // is not synchronous so we need to potentially wait until the file 
+            // has been deleted here
+            Assert.True(SpinWait.SpinUntil(() => !file.Exists, 10000));
+        }
+    }
+}
diff --git a/clicache/src/TransactionWriterAdapte.hpp b/clicache/integration-test2/Config.cs.in
similarity index 54%
copy from clicache/src/TransactionWriterAdapte.hpp
copy to clicache/integration-test2/Config.cs.in
index 4e802a7..092287e 100644
--- a/clicache/src/TransactionWriterAdapte.hpp
+++ b/clicache/integration-test2/Config.cs.in
@@ -14,36 +14,13 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-#ifdef CSTX_COMMENTED
-#pragma once
 
+// GENERATED FROM Config.cs.in DO NOT EDIT Config.cs
 
-#include "geode_defs.hpp"
-#include "ITransactionWriter.hpp"
-
-
-namespace Apache
+public class Config
 {
-  namespace Geode
+  static public string GeodeGfsh
   {
-    namespace Client
-    {
-
-      /// <summary>
-      /// Utility class that implements all methods in <c>ITransactionWriter</c>
-      /// with empty implementations.
-      /// </summary>
-      generic<class TKey, class TValue>
-      public ref class TransactionWriterAdapter
-        : public Apache::Geode::Client::ITransactionWriter<TKey, TValue>
-      {
-      public:
-        virtual void BeforeCommit(TransactionEvent<TKey, TValue>^ te)
-        {
-        }
-      };
-    }  // namespace Client
-  }  // namespace Geode
-}  // namespace Apache
-
-#endif
+    get { return @"@Geode_gfsh_EXECUTABLE@"; }
+  }
+}
diff --git a/clicache/integration-test2/GeodeServer.cs b/clicache/integration-test2/GeodeServer.cs
new file mode 100644
index 0000000..dfcacdf
--- /dev/null
+++ b/clicache/integration-test2/GeodeServer.cs
@@ -0,0 +1,138 @@
+using System;
+using System.Diagnostics;
+using System.Net;
+using System.IO;
+using System.Net.Sockets;
+using Xunit;
+
+public class GeodeServer : IDisposable
+{
+    #region Properties/Fields
+
+    public int LocatorPort { get; private set; }
+
+    #endregion
+
+    #region Public methods
+
+    public GeodeServer(string regionName = "testRegion", bool readSerialized = false)
+    {
+        try
+        {
+            //Clean up previous server dirs
+            foreach (var dir in new DirectoryInfo(Environment.CurrentDirectory).GetDirectories())
+            {
+                dir.Delete(true);
+            }
+        }
+        catch
+        {
+            //Ignored
+        }
+
+        LocatorPort = FreeTcpPort();
+        var locatorJmxPort = FreeTcpPort();
+
+        var readSerializedStr = readSerialized ? "--read-serialized=true" : "--read-serialized=false";
+
+        var gfsh = new Process
+        {
+            StartInfo =
+            {
+                FileName = Config.GeodeGfsh,
+                Arguments = " -e \"start locator --bind-address=localhost --port=" + LocatorPort +
+                            " --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 \"create region --name=" + regionName + " --type=PARTITION\"" +
+                            " -e \"create region --name=testRegion1 --type=PARTITION\"",
+                WindowStyle = ProcessWindowStyle.Hidden,
+                UseShellExecute = false,
+                RedirectStandardOutput = true,
+                RedirectStandardError = true,
+                CreateNoWindow = true
+            }
+        };
+
+        gfsh.OutputDataReceived += (sender, args) =>
+        {
+            if (null != args.Data)
+                Debug.WriteLine("GeodeServer: " + args.Data);
+        };
+
+        gfsh.ErrorDataReceived += (sender, args) =>
+        {
+            if (null != args.Data)
+                Debug.WriteLine("GeodeServer: ERROR: " + args.Data);
+        };
+
+        gfsh.Start();
+        gfsh.BeginOutputReadLine();
+        gfsh.BeginErrorReadLine();
+        gfsh.WaitForExit(60000 * 10);
+
+        Debug.WriteLine("GeodeServer Start: gfsh.HasExited = {0}, gfsh.ExitCode = {1}",
+            gfsh.HasExited, gfsh.ExitCode);
+
+        Assert.True(gfsh.HasExited);
+        Assert.Equal(0, gfsh.ExitCode);
+    }
+
+    public void Dispose()
+    {
+        try
+        {
+            var gfsh = new Process
+            {
+                StartInfo =
+                {
+                    FileName = Config.GeodeGfsh,
+                    Arguments = "-e \"connect --locator=localhost[" + LocatorPort +
+                                "]\" -e \"shutdown --include-locators true\" ",
+                    WindowStyle = ProcessWindowStyle.Hidden,
+                    UseShellExecute = false,
+                    RedirectStandardOutput = true,
+                    RedirectStandardError = true,
+                    CreateNoWindow = true
+                }
+            };
+
+            gfsh.OutputDataReceived += (sender, args) =>
+            {
+                if (null != args.Data)
+                    Debug.WriteLine("GeodeServer: " + args.Data);
+            };
+
+            gfsh.ErrorDataReceived += (sender, args) =>
+            {
+                if (null != args.Data)
+                    Debug.WriteLine("GeodeServer: ERROR: " + args.Data);
+            };
+
+            gfsh.Start();
+            gfsh.BeginOutputReadLine();
+            gfsh.BeginErrorReadLine();
+            gfsh.WaitForExit(30000);
+        }
+        catch
+        {
+            // ignored
+        }
+    }
+
+    #endregion
+
+    #region Private Methods
+
+    private static int FreeTcpPort()
+    {
+        var tcpListner = new TcpListener(IPAddress.Loopback, 0);
+        tcpListner.Start();
+        var port = ((IPEndPoint)tcpListner.LocalEndpoint).Port;
+        tcpListner.Stop();
+        return port;
+    }
+
+    #endregion
+}
diff --git a/clicache/src/TransactionWriterAdapte.hpp b/clicache/integration-test2/GeodeServerTests.cs
similarity index 54%
copy from clicache/src/TransactionWriterAdapte.hpp
copy to clicache/integration-test2/GeodeServerTests.cs
index 4e802a7..ed4b9dd 100644
--- a/clicache/src/TransactionWriterAdapte.hpp
+++ b/clicache/integration-test2/GeodeServerTests.cs
@@ -1,4 +1,4 @@
-/*
+/*
  * 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.
@@ -14,36 +14,34 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-#ifdef CSTX_COMMENTED
-#pragma once
 
+using Xunit;
 
-#include "geode_defs.hpp"
-#include "ITransactionWriter.hpp"
-
-
-namespace Apache
+[Trait("Category", "Integration")]
+public class GemFireServerTest
 {
-  namespace Geode
-  {
-    namespace Client
+    [Fact]
+    public void Start()
+    {
+        var gfs = new GeodeServer();
+        Assert.NotNull(gfs);
+        Assert.NotEqual(0, gfs.LocatorPort);
+        gfs.Dispose();
+    }
+
+    [Fact]
+    public void StartTwo()
     {
+        var gfs1 = new GeodeServer();
+        Assert.NotNull(gfs1);
+        Assert.NotEqual(0, gfs1.LocatorPort);
 
-      /// <summary>
-      /// Utility class that implements all methods in <c>ITransactionWriter</c>
-      /// with empty implementations.
-      /// </summary>
-      generic<class TKey, class TValue>
-      public ref class TransactionWriterAdapter
-        : public Apache::Geode::Client::ITransactionWriter<TKey, TValue>
-      {
-      public:
-        virtual void BeforeCommit(TransactionEvent<TKey, TValue>^ te)
-        {
-        }
-      };
-    }  // namespace Client
-  }  // namespace Geode
-}  // namespace Apache
+        var gfs2 = new GeodeServer();
+        Assert.NotNull(gfs2);
+        Assert.NotEqual(0, gfs2.LocatorPort);
 
-#endif
+        Assert.NotEqual(gfs1.LocatorPort, gfs2.LocatorPort);
+        gfs1.Dispose();
+        gfs2.Dispose();
+    }
+}
diff --git a/clicache/integration-test2/RegionTest.cs b/clicache/integration-test2/RegionTest.cs
new file mode 100644
index 0000000..61ed97a
--- /dev/null
+++ b/clicache/integration-test2/RegionTest.cs
@@ -0,0 +1,284 @@
+/*
+ * 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;
+
+namespace Apache.Geode.Client.IntegrationTests
+{
+
+  [Trait("Category", "Integration")]
+  public class RegionTest
+  {
+    Cache cacheOne;
+    Cache cacheTwo;
+
+    public RegionTest()
+    {
+      var cacheFactory = new CacheFactory();
+      cacheOne = cacheFactory.Create();
+      cacheTwo = cacheFactory.Create();
+    }
+
+    public void Dispose()
+    {
+      cacheOne.Close();
+      cacheTwo.Close();
+    }
+
+    [Fact]
+    public void PutOnOneCacheGetOnAnotherCache()
+    {
+      var geodeServer = new GeodeServer();
+      var cacheXml = new CacheXml(new FileInfo("cache.xml"), geodeServer);
+
+      var cacheFactory = new CacheFactory();
+
+      cacheOne = cacheFactory.Create();
+      cacheOne.InitializeDeclarativeCache(cacheXml.File.FullName);
+      cacheTwo = cacheFactory.Create();
+      cacheTwo.InitializeDeclarativeCache(cacheXml.File.FullName);
+
+
+      var regionForCache1 = cacheOne.GetRegion<string, string>("testRegion1");
+      var regionForCache2 = cacheTwo.GetRegion<string, string>("testRegion1");
+
+      const string key = "hello";
+      const string expectedResult = "dave";
+      regionForCache1.Put(key, expectedResult, null);
+      var actualResult = regionForCache2.Get(key, null);
+
+      Assert.Equal(expectedResult, actualResult);
+
+      cacheXml.Dispose();
+      geodeServer.Dispose();
+    }
+  }
+
+  internal class DummyPdxSerializer : IPdxSerializer
+  {
+    public object FromData(string classname, IPdxReader reader)
+    {
+      throw new NotImplementedException();
+    }
+
+    public bool ToData(object o, IPdxWriter writer)
+    {
+      throw new NotImplementedException();
+    }
+  }
+
+  internal class DummyPdxTypeMapper : IPdxTypeMapper
+  {
+    public string FromPdxTypeName(string pdxTypeName)
+    {
+      return "foo".Equals(pdxTypeName) ? "bar" : null;
+    }
+
+    public string ToPdxTypeName(string localTypeName)
+    {
+      return "bar".Equals(localTypeName) ? "foo" : null;
+    }
+  }
+
+  internal class Pdx1 : IPdxSerializable
+  {
+    // object fields
+    private int m_id;
+    private string m_pkid;
+    private string m_type;
+    private string m_status;
+    private string[] m_names;
+    private byte[] m_newVal;
+    private DateTime m_creationDate;
+    private byte[] m_arrayZeroSize;
+    private byte[] m_arrayNull;
+
+    public Pdx1() { }
+
+    public Pdx1(int id, int size, string[] names)
+    {
+      m_names = names;
+      m_id = id;
+      m_pkid = id.ToString();
+      m_status = (id % 2 == 0) ? "active" : "inactive";
+      m_type = "type" + (id % 3);
+
+      if (size > 0)
+      {
+        m_newVal = new byte[size];
+        for (int index = 0; index < size; index++)
+        {
+          m_newVal[index] = (byte)'B';
+        }
+      }
+      m_creationDate = DateTime.Now;
+      m_arrayNull = null;
+      m_arrayZeroSize = new byte[0];
+    }
+
+    public void FromData(IPdxReader reader)
+    {
+      m_id = reader.ReadInt("id");
+
+      bool isIdentity = reader.IsIdentityField("id");
+
+      if (isIdentity == false)
+        throw new IllegalStateException("Pdx1 id is identity field");
+
+      bool isId = reader.HasField("id");
+
+      if (isId == false)
+        throw new IllegalStateException("Pdx1 id field not found");
+
+      bool isNotId = reader.HasField("ID");
+
+      if (isNotId == true)
+        throw new IllegalStateException("Pdx1 isNotId field found");
+
+      m_pkid = reader.ReadString("pkid");
+      m_type = reader.ReadString("type");
+      m_status = reader.ReadString("status");
+      m_names = reader.ReadStringArray("names");
+      m_newVal = reader.ReadByteArray("newVal");
+      m_creationDate = reader.ReadDate("creationDate");
+      m_arrayNull = reader.ReadByteArray("arrayNull");
+      m_arrayZeroSize = reader.ReadByteArray("arrayZeroSize");
+    }
+
+    public void ToData(IPdxWriter writer)
+    {
+      writer
+        .WriteInt("id", m_id)
+        //identity field
+        .MarkIdentityField("id")
+        .WriteString("pkid", m_pkid)
+        .WriteString("type", m_type)
+        .WriteString("status", m_status)
+        .WriteStringArray("names", m_names)
+        .WriteByteArray("newVal", m_newVal)
+        .WriteDate("creationDate", m_creationDate)
+        .WriteByteArray("arrayNull", m_arrayNull)
+        .WriteByteArray("arrayZeroSize", m_arrayZeroSize);
+    }
+
+    public static IPdxSerializable CreateDeserializable()
+    {
+      return new Pdx1(777, 100, new string[] { "LEAF", "Volt", "Bolt" });
+    }
+  }
+
+  internal class Pdx2 : IPdxSerializable
+  {
+    // object fields
+    private int m_id;
+    private string m_pkid;
+    private string m_pkid2;
+    private string m_type;
+    private string m_status;
+    private string m_status2;
+    private string[] m_names;
+    private string[] m_addresses;
+    private byte[] m_newVal;
+    private DateTime m_creationDate;
+    private byte[] m_arrayZeroSize;
+    private byte[] m_arrayNull;
+
+    public Pdx2() { }
+
+    public Pdx2(int id, int size, string[] names, string[] addresses)
+    {
+      m_names = names;
+      m_addresses = addresses;
+      m_id = id;
+      m_pkid = id.ToString();
+      m_pkid2 = id.ToString() + "two";
+      m_status = (id % 2 == 0) ? "active" : "inactive";
+      m_status2 = (id % 3 == 0) ? "red" : "green";
+      m_type = "type" + (id % 3);
+
+      if (size > 0)
+      {
+        m_newVal = new byte[size];
+        for (int index = 0; index < size; index++)
+        {
+          m_newVal[index] = (byte)'B';
+        }
+      }
+      m_creationDate = DateTime.Now;
+      m_arrayNull = null;
+      m_arrayZeroSize = new byte[0];
+    }
+
+    public void FromData(IPdxReader reader)
+    {
+      m_id = reader.ReadInt("id");
+
+      bool isIdentity = reader.IsIdentityField("id");
+
+      if (isIdentity == false)
+        throw new IllegalStateException("Pdx1 id is identity field");
+
+      bool isId = reader.HasField("id");
+
+      if (isId == false)
+        throw new IllegalStateException("Pdx1 id field not found");
+
+      bool isNotId = reader.HasField("ID");
+
+      if (isNotId == true)
+        throw new IllegalStateException("Pdx1 isNotId field found");
+
+      m_pkid = reader.ReadString("pkid");
+      m_pkid2 = reader.ReadString("pkid2");
+      m_type = reader.ReadString("type");
+      m_status = reader.ReadString("status");
+      m_status2 = reader.ReadString("status2");
+      m_names = reader.ReadStringArray("names");
+      m_addresses = reader.ReadStringArray("addresses");
+      m_newVal = reader.ReadByteArray("newVal");
+      m_creationDate = reader.ReadDate("creationDate");
+      m_arrayNull = reader.ReadByteArray("arrayNull");
+      m_arrayZeroSize = reader.ReadByteArray("arrayZeroSize");
+    }
+
+    public void ToData(IPdxWriter writer)
+    {
+      writer
+        .WriteInt("id", m_id)
+        //identity field
+        .MarkIdentityField("id")
+        .WriteString("pkid", m_pkid)
+        .WriteString("pkid2", m_pkid2)
+        .WriteString("type", m_type)
+        .WriteString("status", m_status)
+        .WriteString("status2", m_status2)
+        .WriteStringArray("names", m_names)
+        .WriteStringArray("addresses", m_addresses)
+        .WriteByteArray("newVal", m_newVal)
+        .WriteDate("creationDate", m_creationDate)
+        .WriteByteArray("arrayNull", m_arrayNull)
+        .WriteByteArray("arrayZeroSize", m_arrayZeroSize);
+    }
+
+    public static IPdxSerializable CreateDeserializable()
+    {
+      return new Pdx2(777, 100, new string[] { "Nissan", "Chevy", "Volvo" }, new string[] { "4451 Court St", "1171 Elgin Ave", "721 NW 173rd Pl" });
+    }
+  }
+}
\ No newline at end of file
diff --git a/clicache/integration-test2/cache.xml b/clicache/integration-test2/cache.xml
new file mode 100644
index 0000000..8156491
--- /dev/null
+++ b/clicache/integration-test2/cache.xml
@@ -0,0 +1,41 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<!--
+  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.
+-->
+<client-cache
+    xmlns="http://schema.pivotal.io/gemfire/gfcpp-cache"
+    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+    xsi:schemaLocation="http://schema.pivotal.io/gemfire/gfcpp-cache
+                        http://schema.pivotal.io/gemfire/gfcpp-cache/gfcpp-cache-9.0.xsd"
+    version="9.0">
+
+  <pool name="default">
+    <locator host="localhost" port="LOCATOR_PORT"/>
+  </pool>
+
+  <region name = "REGION_NAME" >
+    <region-attributes refid="PROXY" pool-name="default" />
+  </region>
+  
+  <region name = "testRegion1" >
+    <region-attributes refid="PROXY" pool-name="default" />
+  </region>
+  
+  <region name = "testRegion2" >
+    <region-attributes refid="PROXY" pool-name="default" />
+  </region>
+  
+</client-cache>
\ No newline at end of file
diff --git a/clicache/integration-test2/geode.properties b/clicache/integration-test2/geode.properties
new file mode 100644
index 0000000..e5124ff
--- /dev/null
+++ b/clicache/integration-test2/geode.properties
@@ -0,0 +1,99 @@
+# 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.
+# Default Gemfire C++ distributed system properties
+# Copy to current directory and uncomment to override defaults.
+#
+## Debugging support, enables stacktraces in apache::geode::client::Exception.
+#
+# The default is false, uncomment to enable stacktraces in exceptions.
+#stacktrace-enabled=true
+#crash-dump-enabled=true
+#
+#
+## Cache region configurtion
+#
+#cache-xml-file=cache.xml
+#
+## Log file config
+#
+#log-file=gemfire_cpp.log
+#log-level=debug
+# zero indicates use no limit.
+#log-file-size-limit=0
+# zero indicates use no limit. 
+#log-disk-space-limit=0 
+#
+## Statistics values
+#
+# the rate is in seconds.
+#statistic-sample-rate=1
+#statistic-sampling-enabled=true
+#statistic-archive-file=statArchive.gfs
+# zero indicates use no limit.
+#archive-file-size-limit=0
+# zero indicates use no limit.
+#archive-disk-space-limit=0
+#enable-time-statistics=false 
+#
+## Heap based eviction configuration
+#
+# maximum amount of memory used by the cache for all regions, 0 disables this feature
+#heap-lru-limit=0
+# percentage over heap-lru-limit when LRU will be called. 
+#heap-lru-delta=10
+#
+## Durable client support
+#
+#durable-client-id=
+durable-timeout=12345s
+#
+## SSL socket support
+#
+#ssl-enabled=false
+#ssl-keystore=
+#ssl-keystore-password=
+#ssl-truststore=
+#
+## .NET AppDomain support
+#
+#appdomain-enabled=false
+#
+## Misc
+#
+#conflate-events=server
+#disable-shuffling-of-endpoints=false
+#grid-client=false
+#max-fe-threads=
+#max-socket-buffer-size=66560
+# the units are in seconds.
+#connect-timeout=59
+#notify-ack-interval=10
+#notify-dupcheck-life=300
+#ping-interval=10 
+#redundancy-monitor-interval=10
+#auto-ready-for-events=true
+#suspended-tx-timeout=30
+#disable-chunk-handler-thread=false
+#tombstone-timeout=480000
+#
+## module name of the initializer pointing to sample
+## implementation from templates/security
+#security-client-auth-library=securityImpl
+## static method name of the library mentioned above
+#security-client-auth-factory=createUserPasswordAuthInitInstance
+## credential for Dummy Authenticator configured in server.
+## note: security-password property will be inserted by the initializer
+## mentioned in the above property.
+#security-username=root
diff --git a/clicache/integration-test2/packages.config b/clicache/integration-test2/packages.config
new file mode 100644
index 0000000..b020c2f
--- /dev/null
+++ b/clicache/integration-test2/packages.config
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<!--
+  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.
+-->
+<packages>
+  <package id="Microsoft.VisualStudio.TestPlatform" version="14.0.0.1" targetFramework="net452" />
+  <package id="xunit" version="2.3.1" targetFramework="net452" />
+  <package id="xunit.abstractions" version="2.0.1" targetFramework="net35" />
+  <package id="xunit.analyzers" version="0.8.0" targetFramework="net452" />
+  <package id="xunit.assert" version="2.3.1" targetFramework="net452" />
+  <package id="xunit.core" version="2.3.1" targetFramework="net452" />
+  <package id="xunit.extensibility.core" version="2.3.1" targetFramework="net452" />
+  <package id="xunit.extensibility.execution" version="2.3.1" targetFramework="net452" />
+  <package id="xunit.runner.console" version="2.3.1" targetFramework="net452" developmentDependency="true" />
+  <package id="xunit.runner.visualstudio" version="2.3.1" targetFramework="net452" developmentDependency="true" />
+</packages>
diff --git a/clicache/integration-test2/xunit.runner.json b/clicache/integration-test2/xunit.runner.json
new file mode 100644
index 0000000..a7903ec
--- /dev/null
+++ b/clicache/integration-test2/xunit.runner.json
@@ -0,0 +1,4 @@
+{
+  "methodDisplay": "classAndMethod",
+  "parallelizeTestCollections": "false"
+}
diff --git a/clicache/src/CMakeLists.txt b/clicache/src/CMakeLists.txt
index 250ef87..b7d1897 100644
--- a/clicache/src/CMakeLists.txt
+++ b/clicache/src/CMakeLists.txt
@@ -193,7 +193,9 @@ add_library(${PROJECT_NAME} SHARED
   TransactionEvent.hpp
   TransactionId.hpp
   TransactionListenerAdapter.hpp
-  TransactionWriterAdapte.hpp
+  TransactionWriterAdapter.hpp
+  TypeRegistry.cpp
+  TypeRegistry.hpp
   UserFunctionExecutionException.cpp
   UserFunctionExecutionException.hpp
   Utils.cpp
diff --git a/clicache/src/Cache.cpp b/clicache/src/Cache.cpp
index 06e31d3..8fdf078 100644
--- a/clicache/src/Cache.cpp
+++ b/clicache/src/Cache.cpp
@@ -35,7 +35,7 @@
 #include "impl/PdxInstanceFactoryImpl.hpp"
 #include "CacheTransactionManager.hpp"
 #include "PoolManager.hpp"
-
+#include "TypeRegistry.hpp"
 
 #pragma warning(disable:4091)
 
@@ -54,6 +54,7 @@ namespace Apache
       {
         m_nativeptr = gcnew native_shared_ptr<native::Cache>(nativeptr);
         m_pdxTypeRegistry = gcnew Apache::Geode::Client::Internal::PdxTypeRegistry(this);
+        m_typeRegistry = gcnew Apache::Geode::Client::TypeRegistry(this);
       }
 
       String^ Cache::Name::get( )
@@ -123,7 +124,7 @@ namespace Apache
         finally
         {
 					CacheRegionHelper::getCacheImpl(m_nativeptr->get())->getPdxTypeRegistry()->clear();
-          Serializable::Clear();
+          m_typeRegistry->Clear();
           Apache::Geode::Client::DistributedSystem::unregisterCliCallback();
           GC::KeepAlive(m_nativeptr);
         }
@@ -174,6 +175,7 @@ namespace Apache
         {
           GC::KeepAlive(m_nativeptr);
         }
+
         auto rootRegions = gcnew array<Client::IRegion<TKey, TValue>^>(static_cast<int>(vrr.size()));
 
         for( System::Int32 index = 0; index < vrr.size( ); index++ )
diff --git a/clicache/src/Cache.hpp b/clicache/src/Cache.hpp
index fa7a378..89b4930 100644
--- a/clicache/src/Cache.hpp
+++ b/clicache/src/Cache.hpp
@@ -59,6 +59,8 @@ namespace Apache
 
       ref class DataOutput;
 
+      ref class TypeRegistry;
+
       /// <summary>
       /// Provides a distributed cache.
       /// </summary>
@@ -276,6 +278,11 @@ namespace Apache
 
         virtual PoolManager^ GetPoolManager();
 
+        property Apache::Geode::Client::TypeRegistry^ TypeRegistry
+        {
+          Apache::Geode::Client::TypeRegistry^ get() { return m_typeRegistry; }
+        }
+
       internal:
 
         /// <summary>
@@ -313,6 +320,7 @@ namespace Apache
         native_shared_ptr<native::Cache>^ m_nativeptr;
 
         Apache::Geode::Client::Internal::PdxTypeRegistry^ m_pdxTypeRegistry;
+        Apache::Geode::Client::TypeRegistry^ m_typeRegistry;
       };
     }  // namespace Client
   }  // namespace Geode
diff --git a/clicache/src/CacheFactory.cpp b/clicache/src/CacheFactory.cpp
index 255b2e2..3353655 100644
--- a/clicache/src/CacheFactory.cpp
+++ b/clicache/src/CacheFactory.cpp
@@ -66,10 +66,10 @@ namespace Apache
 
           Log::SetLogLevel(static_cast<LogLevel>(native::Log::logLevel( )));
           native::createAppDomainContext = &Apache::Geode::Client::createAppDomainContext;
-          Serializable::RegisterTypeGeneric(
+          cache->TypeRegistry->RegisterTypeGeneric(
             native::GeodeTypeIds::PdxType,
             gcnew TypeFactoryMethodGeneric(Apache::Geode::Client::Internal::PdxType::CreateDeserializable),
-            nullptr, cache);
+            nullptr);
 
           DistributedSystem::ManagedPostConnect(cache);
           DistributedSystem::registerCliCallback();
diff --git a/clicache/src/CacheableHashSet.hpp b/clicache/src/CacheableHashSet.hpp
index 4364cfb..d47c84c 100644
--- a/clicache/src/CacheableHashSet.hpp
+++ b/clicache/src/CacheableHashSet.hpp
@@ -58,7 +58,7 @@ namespace Apache
 
             auto set = static_cast<HSTYPE*>(m_nativeptr->get());
             for (const auto& iter : *set) {
-              auto key = Serializable::GetManagedValueGeneric<Object^>(iter);
+              auto key = TypeRegistry::GetManagedValueGeneric<Object^>(iter);
               output->WriteObject(key);
             }
 
@@ -157,7 +157,7 @@ namespace Apache
                     throw gcnew System::InvalidOperationException(
                       "Call MoveNext first.");
                   }
-                auto ret = Serializable::GetManagedValueGeneric<Object^>(*(*(m_nativeptr->get())));
+                auto ret = TypeRegistry::GetManagedValueGeneric<Object^>(*(*(m_nativeptr->get())));
                 GC::KeepAlive(this);
                 return ret;
               }
@@ -466,7 +466,7 @@ namespace Apache
                                               "elements from HashSet");
             }
             for (const auto& iter : *set) {
-              array[index++] = Serializable::GetManagedValueGeneric<Object^>(iter);
+              array[index++] = TypeRegistry::GetManagedValueGeneric<Object^>(iter);
             }
 
             GC::KeepAlive(m_nativeptr);
diff --git a/clicache/src/CqEvent.cpp b/clicache/src/CqEvent.cpp
index 9deb142..6b9163b 100644
--- a/clicache/src/CqEvent.cpp
+++ b/clicache/src/CqEvent.cpp
@@ -54,14 +54,14 @@ namespace Apache
       TKey CqEvent<TKey, TResult>::getKey( )
       {
         std::shared_ptr<native::CacheableKey>& keyptr( m_nativeptr->getKey( ) );
-        return Serializable::GetManagedValueGeneric<TKey>(keyptr);
+        return TypeRegistry::GetManagedValueGeneric<TKey>(keyptr);
       }
 
       generic<class TKey, class TResult>
       TResult CqEvent<TKey, TResult>::getNewValue( )
       {
         std::shared_ptr<native::Cacheable>& valptr( m_nativeptr->getNewValue( ) );
-        return Serializable::GetManagedValueGeneric<TResult>(valptr);
+        return TypeRegistry::GetManagedValueGeneric<TResult>(valptr);
       }
 
       generic<class TKey, class TResult>
diff --git a/clicache/src/DataInput.cpp b/clicache/src/DataInput.cpp
index f8a64ed..0fedeec 100644
--- a/clicache/src/DataInput.cpp
+++ b/clicache/src/DataInput.cpp
@@ -731,10 +731,10 @@ namespace Apache
         }
         if (findinternal) {
           compId += 0x80000000;
-          createType = Serializable::GetManagedDelegateGeneric((System::Int64)compId);
+          createType = m_cache->TypeRegistry->GetManagedDelegateGeneric((System::Int64)compId);
         }
         else {
-          createType = Serializable::GetManagedDelegateGeneric(compId);
+          createType = m_cache->TypeRegistry->GetManagedDelegateGeneric(compId);
           if (createType == nullptr)
           {
             Object^ retVal = ReadDotNetTypes(typeId);
@@ -747,7 +747,7 @@ namespace Apache
               return readDotNetObjectArray();
             }
             compId += 0x80000000;
-            createType = Serializable::GetManagedDelegateGeneric(compId);
+            createType = m_cache->TypeRegistry->GetManagedDelegateGeneric(compId);
 
             /*if (createType == nullptr)
             {
@@ -783,18 +783,18 @@ namespace Apache
         {
           ReadByte(); // ignore CLASS typeid
           className = (String^)ReadObject();
-          className = Serializable::GetLocalTypeName(className);
+          className = m_cache->TypeRegistry->GetLocalTypeName(className);
           System::Collections::IList^ list = nullptr;
           if (len == 0)
           {
-            list = (System::Collections::IList^)Serializable::GetArrayObject(className, len);
+            list = (System::Collections::IList^)m_cache->TypeRegistry->GetArrayObject(className, len);
             return list;
           }
           //read first object
 
           Object^ ret = ReadObject();//in case it returns pdxinstance or java.lang.object
 
-          list = (System::Collections::IList^)Serializable::GetArrayObject(ret->GetType()->FullName, len);
+          list = (System::Collections::IList^)m_cache->TypeRegistry->GetArrayObject(ret->GetType()->FullName, len);
 
           list[0] = ret;
           for (System::Int32 index = 1; index < list->Count; ++index)
@@ -857,10 +857,10 @@ namespace Apache
         }
         if (findinternal) {
           compId += 0x80000000;
-          createType = Serializable::GetManagedDelegateGeneric((System::Int64)compId);
+          createType = m_cache->TypeRegistry->GetManagedDelegateGeneric((System::Int64)compId);
         }
         else {
-          createType = Serializable::GetManagedDelegateGeneric(compId);
+          createType = m_cache->TypeRegistry->GetManagedDelegateGeneric(compId);
           if (createType == nullptr)
           {
             Object^ retVal = ReadDotNetTypes(typeId);
@@ -869,7 +869,7 @@ namespace Apache
               return retVal;
 
             compId += 0x80000000;
-            createType = Serializable::GetManagedDelegateGeneric(compId);
+            createType = m_cache->TypeRegistry->GetManagedDelegateGeneric(compId);
           }
         }
 
diff --git a/clicache/src/DataInput.hpp b/clicache/src/DataInput.hpp
index ca6cc0b..0d8eeb1 100644
--- a/clicache/src/DataInput.hpp
+++ b/clicache/src/DataInput.hpp
@@ -564,7 +564,7 @@ namespace Apache
           {
             m_buffer = const_cast<System::Byte*> (m_nativeptr->get()->currentBufferPosition());
             m_cursor = 0;
-            m_bufferLength = m_nativeptr->get()->getBytesRemaining();   
+            m_bufferLength = static_cast<decltype(m_bufferLength)>(m_nativeptr->get()->getBytesRemaining());
           }
           finally
           {
@@ -665,7 +665,7 @@ namespace Apache
           m_forStringDecode = gcnew array<Char>(100);
           m_buffer = const_cast<System::Byte*>(nativeptr->currentBufferPosition());
           if ( m_buffer != NULL) {
-            m_bufferLength = nativeptr->getBytesRemaining();     
+            m_bufferLength = static_cast<decltype(m_bufferLength)>(nativeptr->getBytesRemaining());
 					}
           else {
             m_bufferLength = 0;
diff --git a/clicache/src/DataOutput.cpp b/clicache/src/DataOutput.cpp
index 3d5423b..9724f61 100644
--- a/clicache/src/DataOutput.cpp
+++ b/clicache/src/DataOutput.cpp
@@ -320,7 +320,7 @@ namespace Apache
         System::Collections::IList^ list = (System::Collections::IList^)objectArray;
         this->WriteArrayLen(list->Count);
         WriteByte((int8_t)apache::geode::client::GeodeTypeIdsImpl::Class);
-        String^ pdxDomainClassname = Serializable::GetPdxTypeName(objectArray->GetType()->GetElementType()->FullName);
+        String^ pdxDomainClassname = m_cache->TypeRegistry->GetPdxTypeName(objectArray->GetType()->GetElementType()->FullName);
         WriteByte((int8_t)apache::geode::client::GeodeTypeIds::CacheableASCIIString);
         WriteUTF(pdxDomainClassname);
         for each(Object^ o in list)
@@ -484,9 +484,7 @@ namespace Apache
           return;
         }
 
-        //Apache::Geode::Client::Log::Debug("DataOutput::WriteObject " + obj);
-
-        Byte typeId = Apache::Geode::Client::Serializable::GetManagedTypeMappingGeneric(obj->GetType());
+        Byte typeId = m_cache->TypeRegistry->GetManagedTypeMappingGeneric(obj->GetType());
 
         switch (typeId)
         {
@@ -679,7 +677,7 @@ namespace Apache
               return;
             }
 
-            if (Serializable::IsObjectAndPdxSerializerRegistered(nullptr))
+            if (m_cache->TypeRegistry->PdxSerializer)
             {
               pdxObj = gcnew PdxWrapper(obj);
               WriteByte(GeodeClassIds::PDX);
diff --git a/clicache/src/DistributedSystem.cpp b/clicache/src/DistributedSystem.cpp
index 9e99b33..0a1dcab 100644
--- a/clicache/src/DistributedSystem.cpp
+++ b/clicache/src/DistributedSystem.cpp
@@ -152,7 +152,7 @@ namespace Apache
         _GF_MG_EXCEPTION_TRY2
 
 
-        Serializable::UnregisterNativesGeneric();
+        TypeRegistry::UnregisterNativesGeneric(cache);
         DistributedSystem::UnregisterBuiltinManagedTypes(cache);
         m_nativeDistributedSystem->get()->disconnect();
         GC::KeepAlive(m_nativeDistributedSystem);
@@ -170,115 +170,115 @@ namespace Apache
           // Register wrapper types for built-in types, this are still cpp wrapper
 
         //byte
-        Serializable::RegisterWrapperGeneric(
+        TypeRegistry::RegisterWrapperGeneric(
         gcnew WrapperDelegateGeneric(CacheableByte::Create),
         native::GeodeTypeIds::CacheableByte, SByte::typeid);
 
         //boolean
-        Serializable::RegisterWrapperGeneric(
+        TypeRegistry::RegisterWrapperGeneric(
           gcnew WrapperDelegateGeneric(CacheableBoolean::Create),
           native::GeodeTypeIds::CacheableBoolean, Boolean::typeid);
         //wide char
-        Serializable::RegisterWrapperGeneric(
+        TypeRegistry::RegisterWrapperGeneric(
           gcnew WrapperDelegateGeneric(CacheableCharacter::Create),
           native::GeodeTypeIds::CacheableCharacter, Char::typeid);
         //double
-        Serializable::RegisterWrapperGeneric(
+        TypeRegistry::RegisterWrapperGeneric(
           gcnew WrapperDelegateGeneric(CacheableDouble::Create),
           native::GeodeTypeIds::CacheableDouble, Double::typeid);
         //ascii string
-        Serializable::RegisterWrapperGeneric(
+        TypeRegistry::RegisterWrapperGeneric(
           gcnew WrapperDelegateGeneric(CacheableString::Create),
           native::GeodeTypeIds::CacheableASCIIString, String::typeid);
 
-        Serializable::RegisterWrapperGeneric(
+        TypeRegistry::RegisterWrapperGeneric(
           gcnew WrapperDelegateGeneric(CacheableFloat::Create),
           native::GeodeTypeIds::CacheableFloat, float::typeid);
         //int 16
-        Serializable::RegisterWrapperGeneric(
+        TypeRegistry::RegisterWrapperGeneric(
           gcnew WrapperDelegateGeneric(CacheableInt16::Create),
           native::GeodeTypeIds::CacheableInt16, Int16::typeid);
         //int32
-        Serializable::RegisterWrapperGeneric(
+        TypeRegistry::RegisterWrapperGeneric(
           gcnew WrapperDelegateGeneric(CacheableInt32::Create),
           native::GeodeTypeIds::CacheableInt32, Int32::typeid);
         //int64
-        Serializable::RegisterWrapperGeneric(
+        TypeRegistry::RegisterWrapperGeneric(
           gcnew WrapperDelegateGeneric(CacheableInt64::Create),
           native::GeodeTypeIds::CacheableInt64, Int64::typeid);
 
         //Now onwards all will be wrap in managed cacheable key..
 
-        Serializable::RegisterTypeGeneric(
+        cache->TypeRegistry->RegisterTypeGeneric(
           native::GeodeTypeIds::CacheableBytes,
           gcnew TypeFactoryMethodGeneric(CacheableBytes::CreateDeserializable),
-          Type::GetType("System.Byte[]"), cache);
+          Type::GetType("System.Byte[]"));
 
-        Serializable::RegisterTypeGeneric(
+        cache->TypeRegistry->RegisterTypeGeneric(
           native::GeodeTypeIds::CacheableDoubleArray,
           gcnew TypeFactoryMethodGeneric(CacheableDoubleArray::CreateDeserializable),
-          Type::GetType("System.Double[]"), cache);
+          Type::GetType("System.Double[]"));
 
-        Serializable::RegisterTypeGeneric(
+        cache->TypeRegistry->RegisterTypeGeneric(
           native::GeodeTypeIds::CacheableFloatArray,
           gcnew TypeFactoryMethodGeneric(CacheableFloatArray::CreateDeserializable),
-          Type::GetType("System.Single[]"), cache);
+          Type::GetType("System.Single[]"));
 
         //TODO:
         //as it is
-        Serializable::RegisterTypeGeneric(
+        cache->TypeRegistry->RegisterTypeGeneric(
           native::GeodeTypeIds::CacheableHashSet,
           gcnew TypeFactoryMethodGeneric(CacheableHashSet::CreateDeserializable),
-          nullptr, cache);
+          nullptr);
 
         //as it is
-        Serializable::RegisterTypeGeneric(
+        cache->TypeRegistry->RegisterTypeGeneric(
           native::GeodeTypeIds::CacheableLinkedHashSet,
           gcnew TypeFactoryMethodGeneric(CacheableLinkedHashSet::CreateDeserializable),
-          nullptr, cache);
+          nullptr);
 
 
-        Serializable::RegisterTypeGeneric(
+        cache->TypeRegistry->RegisterTypeGeneric(
           native::GeodeTypeIds::CacheableInt16Array,
           gcnew TypeFactoryMethodGeneric(CacheableInt16Array::CreateDeserializable),
-          Type::GetType("System.Int16[]"), cache);
+          Type::GetType("System.Int16[]"));
 
-        Serializable::RegisterTypeGeneric(
+        cache->TypeRegistry->RegisterTypeGeneric(
           native::GeodeTypeIds::CacheableInt32Array,
           gcnew TypeFactoryMethodGeneric(CacheableInt32Array::CreateDeserializable),
-          Type::GetType("System.Int32[]"), cache);
+          Type::GetType("System.Int32[]"));
 
 
-        Serializable::RegisterTypeGeneric(
+        cache->TypeRegistry->RegisterTypeGeneric(
           native::GeodeTypeIds::CacheableInt64Array,
           gcnew TypeFactoryMethodGeneric(CacheableInt64Array::CreateDeserializable),
-          Type::GetType("System.Int64[]"), cache);
+          Type::GetType("System.Int64[]"));
 
-        Serializable::RegisterTypeGeneric(
+        cache->TypeRegistry->RegisterTypeGeneric(
           native::GeodeTypeIds::BooleanArray,
           gcnew TypeFactoryMethodGeneric(BooleanArray::CreateDeserializable),
-          Type::GetType("System.Boolean[]"), cache);
+          Type::GetType("System.Boolean[]"));
 
-        Serializable::RegisterTypeGeneric(
+        cache->TypeRegistry->RegisterTypeGeneric(
           native::GeodeTypeIds::CharArray,
           gcnew TypeFactoryMethodGeneric(CharArray::CreateDeserializable),
-          Type::GetType("System.Char[]"), cache);
+          Type::GetType("System.Char[]"));
 
-        Serializable::RegisterTypeGeneric(
+        cache->TypeRegistry->RegisterTypeGeneric(
           native::GeodeTypeIds::CacheableStringArray,
           gcnew TypeFactoryMethodGeneric(CacheableStringArray::CreateDeserializable),
-          Type::GetType("System.String[]"), cache);
+          Type::GetType("System.String[]"));
 
         //as it is
-        Serializable::RegisterTypeGeneric(
+        cache->TypeRegistry->RegisterTypeGeneric(
           native::GeodeTypeIds::Struct,
           gcnew TypeFactoryMethodGeneric(Struct::CreateDeserializable),
-          nullptr, cache);
+          nullptr);
 
-        Serializable::RegisterTypeGeneric(
+        cache->TypeRegistry->RegisterTypeGeneric(
           native::GeodeTypeIds::EnumInfo,
           gcnew TypeFactoryMethodGeneric(Apache::Geode::Client::Internal::EnumInfo::CreateDeserializable),
-          nullptr, cache);
+          nullptr);
 
         // End register generic wrapper types for built-in types
 
@@ -317,78 +317,78 @@ namespace Apache
         // Register other built-in types for generics
         //c# datatime
 
-        Serializable::RegisterTypeGeneric(
+        cache->TypeRegistry->RegisterTypeGeneric(
           native::GeodeTypeIds::CacheableDate,
           gcnew TypeFactoryMethodGeneric(CacheableDate::CreateDeserializable),
-          Type::GetType("System.DateTime"), cache);
+          Type::GetType("System.DateTime"));
 
         //as it is
-        Serializable::RegisterTypeGeneric(
+        cache->TypeRegistry->RegisterTypeGeneric(
           native::GeodeTypeIds::CacheableFileName,
           gcnew TypeFactoryMethodGeneric(CacheableFileName::CreateDeserializable),
-          nullptr, cache);
+          nullptr);
 
         //for generic dictionary define its type in static constructor of Serializable.hpp
-        Serializable::RegisterTypeGeneric(
+        cache->TypeRegistry->RegisterTypeGeneric(
           native::GeodeTypeIds::CacheableHashMap,
           gcnew TypeFactoryMethodGeneric(CacheableHashMap::CreateDeserializable),
-          nullptr, cache);
+          nullptr);
 
         //c# hashtable
-        Serializable::RegisterTypeGeneric(
+        cache->TypeRegistry->RegisterTypeGeneric(
           native::GeodeTypeIds::CacheableHashTable,
           gcnew TypeFactoryMethodGeneric(CacheableHashTable::CreateDeserializable),
-          Type::GetType("System.Collections.Hashtable"), cache);
+          Type::GetType("System.Collections.Hashtable"));
 
         //Need to keep public as no counterpart in c#
-        Serializable::RegisterTypeGeneric(
+        cache->TypeRegistry->RegisterTypeGeneric(
           native::GeodeTypeIds::CacheableIdentityHashMap,
           gcnew TypeFactoryMethodGeneric(
           CacheableIdentityHashMap::CreateDeserializable),
-          nullptr, cache);
+          nullptr);
 
         //keep as it is
-        Serializable::RegisterTypeGeneric(
+        cache->TypeRegistry->RegisterTypeGeneric(
           native::GeodeTypeIds::CacheableUndefined,
           gcnew TypeFactoryMethodGeneric(CacheableUndefined::CreateDeserializable),
-          nullptr, cache);
+          nullptr);
 
         //c# arraylist
-        Serializable::RegisterTypeGeneric(
+        cache->TypeRegistry->RegisterTypeGeneric(
           native::GeodeTypeIds::CacheableVector,
           gcnew TypeFactoryMethodGeneric(CacheableVector::CreateDeserializable),
-          nullptr, cache);
+          nullptr);
 
         //as it is
-        Serializable::RegisterTypeGeneric(
+        cache->TypeRegistry->RegisterTypeGeneric(
           native::GeodeTypeIds::CacheableObjectArray,
           gcnew TypeFactoryMethodGeneric(
           CacheableObjectArray::CreateDeserializable),
-          nullptr, cache);
+          nullptr);
 
         //Generic::List
-        Serializable::RegisterTypeGeneric(
+        cache->TypeRegistry->RegisterTypeGeneric(
           native::GeodeTypeIds::CacheableArrayList,
           gcnew TypeFactoryMethodGeneric(CacheableArrayList::CreateDeserializable),
-          nullptr, cache);
+          nullptr);
 
         //c# generic stack
-        Serializable::RegisterTypeGeneric(
+        cache->TypeRegistry->RegisterTypeGeneric(
           native::GeodeTypeIds::CacheableStack,
           gcnew TypeFactoryMethodGeneric(CacheableStack::CreateDeserializable),
-          nullptr, cache);
+          nullptr);
 
         //as it is
-        Serializable::RegisterTypeGeneric(
+        cache->TypeRegistry->RegisterTypeGeneric(
           GeodeClassIds::CacheableManagedObject - 0x80000000,
           gcnew TypeFactoryMethodGeneric(CacheableObject::CreateDeserializable),
-          nullptr, cache);
+          nullptr);
 
         //as it is
-        Serializable::RegisterTypeGeneric(
+        cache->TypeRegistry->RegisterTypeGeneric(
           GeodeClassIds::CacheableManagedObjectXml - 0x80000000,
           gcnew TypeFactoryMethodGeneric(CacheableObjectXml::CreateDeserializable),
-          nullptr, cache);
+          nullptr);
 
         // End register other built-in types
 
@@ -407,30 +407,30 @@ namespace Apache
       {
         _GF_MG_EXCEPTION_TRY2
 
-          Serializable::UnregisterNativesGeneric();
-
-          Serializable::UnregisterTypeGeneric(
-            native::GeodeTypeIds::CacheableDate, cache);
-          Serializable::UnregisterTypeGeneric(
-            native::GeodeTypeIds::CacheableFileName, cache);
-          Serializable::UnregisterTypeGeneric(
-            native::GeodeTypeIds::CacheableHashMap, cache);
-          Serializable::UnregisterTypeGeneric(
-            native::GeodeTypeIds::CacheableHashTable, cache);
-          Serializable::UnregisterTypeGeneric(
-            native::GeodeTypeIds::CacheableIdentityHashMap, cache);
-          Serializable::UnregisterTypeGeneric(
-            native::GeodeTypeIds::CacheableVector, cache);
-          Serializable::UnregisterTypeGeneric(
-            native::GeodeTypeIds::CacheableObjectArray, cache);
-          Serializable::UnregisterTypeGeneric(
-            native::GeodeTypeIds::CacheableArrayList, cache);
-          Serializable::UnregisterTypeGeneric(
-            native::GeodeTypeIds::CacheableStack, cache);
-          Serializable::UnregisterTypeGeneric(
-            GeodeClassIds::CacheableManagedObject - 0x80000000, cache);
-          Serializable::UnregisterTypeGeneric(
-            GeodeClassIds::CacheableManagedObjectXml - 0x80000000, cache);
+          TypeRegistry::UnregisterNativesGeneric(cache);
+
+          cache->TypeRegistry->UnregisterTypeGeneric(
+            native::GeodeTypeIds::CacheableDate);
+          cache->TypeRegistry->UnregisterTypeGeneric(
+            native::GeodeTypeIds::CacheableFileName);
+          cache->TypeRegistry->UnregisterTypeGeneric(
+            native::GeodeTypeIds::CacheableHashMap);
+          cache->TypeRegistry->UnregisterTypeGeneric(
+            native::GeodeTypeIds::CacheableHashTable);
+          cache->TypeRegistry->UnregisterTypeGeneric(
+            native::GeodeTypeIds::CacheableIdentityHashMap);
+          cache->TypeRegistry->UnregisterTypeGeneric(
+            native::GeodeTypeIds::CacheableVector);
+          cache->TypeRegistry->UnregisterTypeGeneric(
+            native::GeodeTypeIds::CacheableObjectArray);
+          cache->TypeRegistry->UnregisterTypeGeneric(
+            native::GeodeTypeIds::CacheableArrayList);
+          cache->TypeRegistry->UnregisterTypeGeneric(
+            native::GeodeTypeIds::CacheableStack);
+          cache->TypeRegistry->UnregisterTypeGeneric(
+            GeodeClassIds::CacheableManagedObject - 0x80000000);
+          cache->TypeRegistry->UnregisterTypeGeneric(
+            GeodeClassIds::CacheableManagedObjectXml - 0x80000000);
 
         _GF_MG_EXCEPTION_CATCH_ALL2
       }
diff --git a/clicache/src/EntryEvent.cpp b/clicache/src/EntryEvent.cpp
index c1bdcae..d3b94a9 100644
--- a/clicache/src/EntryEvent.cpp
+++ b/clicache/src/EntryEvent.cpp
@@ -40,28 +40,28 @@ namespace Apache
       TKey EntryEvent<TKey, TValue>::Key::get( )
       {
         std::shared_ptr<apache::geode::client::CacheableKey>& keyptr( m_nativeptr->getKey( ) );
-        return Serializable::GetManagedValueGeneric<TKey>( keyptr );
+        return TypeRegistry::GetManagedValueGeneric<TKey>( keyptr );
       }
 
       generic<class TKey, class TValue>
       TValue EntryEvent<TKey, TValue>::OldValue::get( )
       {
         std::shared_ptr<apache::geode::client::Cacheable>& valptr( m_nativeptr->getOldValue( ) );
-        return Serializable::GetManagedValueGeneric<TValue>( valptr );
+        return TypeRegistry::GetManagedValueGeneric<TValue>( valptr );
       }
 
       generic<class TKey, class TValue>
       TValue EntryEvent<TKey, TValue>::NewValue::get( )
       {
         std::shared_ptr<apache::geode::client::Cacheable>& valptr( m_nativeptr->getNewValue( ) );
-        return Serializable::GetManagedValueGeneric<TValue>( valptr );
+        return TypeRegistry::GetManagedValueGeneric<TValue>( valptr );
       }
 
       generic<class TKey, class TValue>
       Object^ EntryEvent<TKey, TValue>::CallbackArgument::get()
       {
         std::shared_ptr<apache::geode::client::Serializable>& valptr(m_nativeptr->getCallbackArgument());
-        return Serializable::GetManagedValueGeneric<Object^>( valptr );
+        return TypeRegistry::GetManagedValueGeneric<Object^>( valptr );
       }
 
       generic<class TKey, class TValue>
diff --git a/clicache/src/IPdxReader.hpp b/clicache/src/IPdxReader.hpp
index b05c821..60e4ac4 100644
--- a/clicache/src/IPdxReader.hpp
+++ b/clicache/src/IPdxReader.hpp
@@ -27,6 +27,7 @@ namespace Apache
   {
     namespace Client
     {
+      ref class Cache;
 
 				/// <summary>
 				/// A IPdxReader will be passed to IPdxSerializable.fromData or 
@@ -205,6 +206,11 @@ namespace Apache
           /// <param name="fieldName">The name of a member field.</param>
           /// <param name="type">The type of a member field, which value needs to read.</param>
           Object^ ReadField(String^ fieldName, Type^ type);
+
+          property Apache::Geode::Client::Cache^ Cache
+          {
+            Apache::Geode::Client::Cache^ get();
+          }
 				};
     }  // namespace Client
   }  // namespace Geode
diff --git a/clicache/src/IPdxTypeMapper.hpp b/clicache/src/IPdxTypeMapper.hpp
index f406756..70b8b0d 100755
--- a/clicache/src/IPdxTypeMapper.hpp
+++ b/clicache/src/IPdxTypeMapper.hpp
@@ -26,10 +26,10 @@ namespace Apache
     namespace Client
     {
 
-         /// <summary>
-         /// Application can implement this interface to map pdx type name to local type name.
+        /// <summary>
+        /// Application can implement this interface to map pdx type name to local type name.
         /// Need to set this using <see cref="Serializable.SetPdxTypeMapper" />
-         /// </summary>
+        /// </summary>
         public interface class IPdxTypeMapper
         {
           public:
@@ -38,14 +38,14 @@ namespace Apache
            /// <param name="localTypeName"> local type name </param>
            /// @return the pdx type name.
            /// </summary>
-          String^ ToPdxTypeName(String^ localTypeName);
+           String^ ToPdxTypeName(String^ localTypeName);
 
            /// <summary>
            /// To map the pdx type name to local type
            /// <param name="pdxTypeName"> pdx type name </param>
            /// @return the local type name.
            /// </summary>          
-            String^ FromPdxTypeName(String^ pdxTypeName);
+           String^ FromPdxTypeName(String^ pdxTypeName);
         };
     }  // namespace Client
   }  // namespace Geode
diff --git a/clicache/src/IPdxWriter.hpp b/clicache/src/IPdxWriter.hpp
index b04291c..c5b392d 100644
--- a/clicache/src/IPdxWriter.hpp
+++ b/clicache/src/IPdxWriter.hpp
@@ -29,6 +29,7 @@ namespace Apache
   {
     namespace Client
     {
+      ref class Cache;
 
 				/// <summary>
 				/// A IPdxWriter will be passed to IPdxSerializable.toData
@@ -241,6 +242,12 @@ namespace Apache
 					/// </summary>
 					/// <returns>this PdxWriter</returns>
           IPdxWriter^ WriteField(String^ fieldName, Object^ fieldValue, Type^ type);
+
+          property Apache::Geode::Client::Cache^ Cache
+          {
+            Apache::Geode::Client::Cache^ get();
+          }
+
 				};
     }  // namespace Client
   }  // namespace Geode
diff --git a/clicache/src/LocalRegion.cpp b/clicache/src/LocalRegion.cpp
index 8d0a30d..61097a5 100644
--- a/clicache/src/LocalRegion.cpp
+++ b/clicache/src/LocalRegion.cpp
@@ -50,7 +50,7 @@ namespace Apache
         {
           throw gcnew KeyNotFoundException("The given key was not present in the region");
         }
-        TValue returnVal = Serializable::GetManagedValueGeneric<TValue>( nativeptr );
+        TValue returnVal = TypeRegistry::GetManagedValueGeneric<TValue>( nativeptr );
         return returnVal;        
       }     
 
@@ -103,7 +103,7 @@ namespace Apache
         {
           throw gcnew KeyNotFoundException("The given key was not present in the region");
         }
-        TValue returnVal = Serializable::GetManagedValueGeneric<TValue>( nativeptr );
+        TValue returnVal = TypeRegistry::GetManagedValueGeneric<TValue>( nativeptr );
         return returnVal;
       }
 
@@ -149,8 +149,8 @@ namespace Apache
         for( System::Int32 index = 0; index < vc.size( ); index++ )
         {
           auto nativeptr = vc[ index ];  
-          TKey key = Serializable::GetManagedValueGeneric<TKey> (nativeptr->getKey());
-          TValue val = Serializable::GetManagedValueGeneric<TValue> (nativeptr->getValue());
+          TKey key = TypeRegistry::GetManagedValueGeneric<TKey> (nativeptr->getKey());
+          TValue val = TypeRegistry::GetManagedValueGeneric<TValue> (nativeptr->getValue());
           toArray[ index ] = KeyValuePair<TKey,TValue>(key, val);           
         }                      
         return ((System::Collections::Generic::IEnumerable<KeyValuePair<TKey,TValue>>^)toArray)->GetEnumerator();
@@ -179,8 +179,8 @@ namespace Apache
         for( System::Int32 index = 0; index < vc.size( ); index++ )
         {
           auto nativeptr = vc[ index ];                       
-          TKey key = Serializable::GetManagedValueGeneric<TKey> (nativeptr->getKey());
-          TValue val = Serializable::GetManagedValueGeneric<TValue> (nativeptr->getValue());            
+          TKey key = TypeRegistry::GetManagedValueGeneric<TKey> (nativeptr->getKey());
+          TValue val = TypeRegistry::GetManagedValueGeneric<TValue> (nativeptr->getValue());            
           toArray[ index ] = KeyValuePair<TKey,TValue>(key, val);           
         }
         return ((System::Collections::Generic::IEnumerable<Object^>^)toArray)->GetEnumerator();        
@@ -230,7 +230,7 @@ namespace Apache
         if (nativeptr == nullptr) {
           return false;
         }        
-        TValue value = Serializable::GetManagedValueGeneric<TValue>(nativeptr);
+        TValue value = TypeRegistry::GetManagedValueGeneric<TValue>(nativeptr);
         return ((Object^)value)->Equals(keyValuePair.Value);
       } 
 
@@ -262,7 +262,7 @@ namespace Apache
           return false;
         }
         else {
-          val = Serializable::GetManagedValueGeneric<TValue>( nativeptr );
+          val = TypeRegistry::GetManagedValueGeneric<TValue>( nativeptr );
           return true;
         }          
       }      
@@ -286,7 +286,7 @@ namespace Apache
         for( System::Int32 index = 0; index < vc.size( ); index++ )
         {            
           auto& nativeptr = vc[ index ];
-          keyarr[ index ] = Serializable::GetManagedValueGeneric<TKey>(nativeptr);
+          keyarr[ index ] = TypeRegistry::GetManagedValueGeneric<TKey>(nativeptr);
         }
         auto collectionlist = (System::Collections::Generic::ICollection<TKey>^)keyarr;
         return collectionlist;
@@ -314,7 +314,7 @@ namespace Apache
           for( System::Int32 index = 0; index < vc.size( ); index++ )
           {
             auto& nativeptr = vc[ index ];            
-            valarr[ index ] = Serializable::GetManagedValueGeneric<TValue>(nativeptr);
+            valarr[ index ] = TypeRegistry::GetManagedValueGeneric<TValue>(nativeptr);
           }
           auto collectionlist = (System::Collections::Generic::ICollection<TValue>^)valarr;
           return collectionlist;
@@ -913,8 +913,8 @@ namespace Apache
         for( System::Int32 index = 0; index < vc.size( ); index++ )
         {
           std::shared_ptr<apache::geode::client::RegionEntry> nativeptr =  vc[ index ];
-          TKey key = Serializable::GetManagedValueGeneric<TKey> (nativeptr->getKey());
-          TValue val = Serializable::GetManagedValueGeneric<TValue> (nativeptr->getValue());            
+          TKey key = TypeRegistry::GetManagedValueGeneric<TKey> (nativeptr->getKey());
+          TValue val = TypeRegistry::GetManagedValueGeneric<TValue> (nativeptr->getValue());            
           toArray[ startIdx ] = KeyValuePair<TKey,TValue>(key, val);
           ++startIdx;
         }               
diff --git a/clicache/src/Properties.cpp b/clicache/src/Properties.cpp
index 3971c65..e2b33ff 100644
--- a/clicache/src/Properties.cpp
+++ b/clicache/src/Properties.cpp
@@ -71,7 +71,7 @@ namespace Apache
         {
           std::shared_ptr<native::CacheableKey> keyptr = Serializable::GetUnmanagedValueGeneric<TPropKey>(key);
           auto nativeptr = m_nativeptr->get()->find(keyptr);
-          return Serializable::GetManagedValueGeneric<TPropValue>(nativeptr);
+          return TypeRegistry::GetManagedValueGeneric<TPropValue>(nativeptr);
         }
         finally
         {
diff --git a/clicache/src/Properties.hpp b/clicache/src/Properties.hpp
index 60fa854..4e762ad 100644
--- a/clicache/src/Properties.hpp
+++ b/clicache/src/Properties.hpp
@@ -266,9 +266,9 @@ namespace Apache
         void Visit(Apache::Geode::Client::ICacheableKey^ key,
           Apache::Geode::Client::IGeodeSerializable^ value)
         {
-          TPropKey tpkey = Apache::Geode::Client::Serializable::
+          TPropKey tpkey = Apache::Geode::Client::TypeRegistry::
             GetManagedValueGeneric<TPropKey>(std::shared_ptr<apache::geode::client::Serializable>(SafeMSerializableConvertGeneric(key)));
-          TPropValue tpvalue = Apache::Geode::Client::Serializable::
+          TPropValue tpvalue = Apache::Geode::Client::TypeRegistry::
             GetManagedValueGeneric<TPropValue>(std::shared_ptr<apache::geode::client::Serializable>(SafeMSerializableConvertGeneric(value)));
           m_visitor->Invoke(tpkey, tpvalue);
         }
diff --git a/clicache/src/ReflectionBasedAutoSerializer.cpp b/clicache/src/ReflectionBasedAutoSerializer.cpp
index 5611b44..a5de40c 100755
--- a/clicache/src/ReflectionBasedAutoSerializer.cpp
+++ b/clicache/src/ReflectionBasedAutoSerializer.cpp
@@ -15,6 +15,7 @@
  * limitations under the License.
  */
 
+#include "Cache.hpp"
 #include "ReflectionBasedAutoSerializer.hpp"
 #include "PdxIdentityFieldAttribute.hpp"
 #include "Serializable.hpp"
@@ -22,6 +23,8 @@
 #include <msclr/lock.h>
 #include "ExceptionTypes.hpp"
 #include "impl/DotNetTypes.hpp"
+#include "TypeRegistry.hpp"
+
 namespace Apache
 {
   namespace Geode
@@ -309,7 +312,7 @@ namespace Apache
           return true;
         }
 
-        Object^ ReflectionBasedAutoSerializer::FromData(String^ o, IPdxReader^ reader )
+        Object^ ReflectionBasedAutoSerializer::FromData(String^ o, IPdxReader^ reader)
         {
           return deserializeFields(o, reader);
         }
@@ -340,37 +343,23 @@ namespace Apache
         //  serializeBaseClassFields(o, writer, ty->BaseType);
         }
 
-		  
-        /*void ReflectionBasedAutoSerializer::SerializeField(Object^ o, FieldInfo^ fi, IPdxWriter^ writer)
-        {
-          writer->WriteField(fi->Name, fi->GetValue(o), fi->FieldType);
-        }
-
-        Object^ ReflectionBasedAutoSerializer::DeserializeField(Object^ o, FieldInfo^ fi, IPdxReader^ reader)
-        {
-           return reader->ReadField(fi->Name,  fi->FieldType);  
-        }*/
-
         Object^ ReflectionBasedAutoSerializer::deserializeFields(String^ className, IPdxReader^ reader)
         {
-          Object^ o = CreateObject(className);
-          //Log::Debug("ReflectionBasedAutoSerializer::deserializeFields classname {0}: objectType {1}", className,o->GetType());
-          for each(FieldWrapper^ fi in GetFields(o->GetType()))
+          Object^ object = this->CreateObject(className, reader->Cache);
+
+          for each(FieldWrapper^ fi in GetFields(object->GetType()))
           {
-            //Log::Debug("1ReflectionBasedAutoSerializer::deserializeFields fieldName: {0}, fieldType: {1}", fi->FieldName, fi->FType);
             Object^ serializeValue = fi->DeserializeField(reader);
             serializeValue = ReadTransform( fi->FI, fi->FType, serializeValue);
-            //fi->FI->SetValue(o, serializeValue);            
-            fi->SetFieldValue(o, serializeValue);
+            fi->SetFieldValue(object, serializeValue);
           }
 
-          return o;
-          //deserializeBaseClassFields(o, reader, ty->BaseType);
+          return object;
         }
         
-        Object^ ReflectionBasedAutoSerializer::CreateObject(String^ className)
+        Object^ ReflectionBasedAutoSerializer::CreateObject(String^ className, Cache^ cache)
         {
-          return Serializable::CreateObject(className);
+          return cache->TypeRegistry->CreateObject(className);
         }
 
         bool ReflectionBasedAutoSerializer::IsPdxIdentityField(FieldInfo^ fi)
diff --git a/clicache/src/ReflectionBasedAutoSerializer.hpp b/clicache/src/ReflectionBasedAutoSerializer.hpp
index 5dd0888..9fff3f8 100755
--- a/clicache/src/ReflectionBasedAutoSerializer.hpp
+++ b/clicache/src/ReflectionBasedAutoSerializer.hpp
@@ -201,7 +201,7 @@ namespace Apache
           /// <param name="className"> name of the class to create default instance </param>
           /// <returns> the defaulf instance </returns>
 
-          virtual Object^ CreateObject(String^ className);
+          virtual Object^ CreateObject(String^ className, Cache^ cache);
 
           ReflectionBasedAutoSerializer();
         private:
diff --git a/clicache/src/Region.cpp b/clicache/src/Region.cpp
index 05ac785..8d8e764 100644
--- a/clicache/src/Region.cpp
+++ b/clicache/src/Region.cpp
@@ -65,7 +65,7 @@ namespace Apache
         {
           throw gcnew KeyNotFoundException("The given key was not present in the region.");
         }
-        TValue returnVal = Serializable::GetManagedValueGeneric<TValue>(nativeptr);
+        TValue returnVal = TypeRegistry::GetManagedValueGeneric<TValue>(nativeptr);
         return returnVal;
       }
 
@@ -146,7 +146,7 @@ namespace Apache
         {
           throw gcnew KeyNotFoundException("The given key was not present in the region.");
         }
-        TValue returnVal = Serializable::GetManagedValueGeneric<TValue>(nativeptr);
+        TValue returnVal = TypeRegistry::GetManagedValueGeneric<TValue>(nativeptr);
         return returnVal;
       }
 
@@ -193,8 +193,8 @@ namespace Apache
         for (System::Int32 index = 0; index < toArray->Length; index++)
         {
           auto& nativeptr = vc[index];
-          auto key = Serializable::GetManagedValueGeneric<TKey>(nativeptr->getKey());
-          auto val = Serializable::GetManagedValueGeneric<TValue>(nativeptr->getValue());
+          auto key = TypeRegistry::GetManagedValueGeneric<TKey>(nativeptr->getKey());
+          auto val = TypeRegistry::GetManagedValueGeneric<TValue>(nativeptr->getValue());
           toArray[index] = KeyValuePair<TKey, TValue>(key, val);
         }
         return ((System::Collections::Generic::IEnumerable<KeyValuePair<TKey, TValue>>^)toArray)->GetEnumerator();
@@ -224,8 +224,8 @@ namespace Apache
         for (System::Int32 index = 0; index < toArray->Length; index++)
         {
           auto& nativeptr = vc[index];
-          auto key = Serializable::GetManagedValueGeneric<TKey>(nativeptr->getKey());
-          auto val = Serializable::GetManagedValueGeneric<TValue>(nativeptr->getValue());
+          auto key = TypeRegistry::GetManagedValueGeneric<TKey>(nativeptr->getKey());
+          auto val = TypeRegistry::GetManagedValueGeneric<TValue>(nativeptr->getValue());
           toArray[index] = KeyValuePair<TKey, TValue>(key, val);
         }
         return ((System::Collections::Generic::IEnumerable<Object^>^)toArray)->GetEnumerator();
@@ -277,7 +277,7 @@ namespace Apache
         if (nativeptr == nullptr) {
           return false;
         }
-        auto value = Serializable::GetManagedValueGeneric<TValue>(nativeptr);
+        auto value = TypeRegistry::GetManagedValueGeneric<TValue>(nativeptr);
         return ((Object^)value)->Equals(keyValuePair.Value);
       }
 
@@ -311,7 +311,7 @@ namespace Apache
           return false;
         }
         else {
-          val = Serializable::GetManagedValueGeneric<TValue>(nativeptr);
+          val = TypeRegistry::GetManagedValueGeneric<TValue>(nativeptr);
           return true;
         }
 
@@ -336,7 +336,7 @@ namespace Apache
         for (System::Int32 index = 0; index < keyarr->Length; index++)
         {
           auto& nativeptr = vc[index];
-          keyarr[index] = Serializable::GetManagedValueGeneric<TKey>(nativeptr);
+          keyarr[index] = TypeRegistry::GetManagedValueGeneric<TKey>(nativeptr);
         }
         auto collectionlist = (System::Collections::Generic::ICollection<TKey>^)keyarr;
         return collectionlist;
@@ -362,7 +362,7 @@ namespace Apache
         for (System::Int32 index = 0; index < vc.size(); index++)
         {
           auto& nativeptr = vc[index];
-          valarr[index] = Serializable::GetManagedValueGeneric<TValue>(nativeptr);
+          valarr[index] = TypeRegistry::GetManagedValueGeneric<TValue>(nativeptr);
         }
         auto collectionlist = (System::Collections::Generic::ICollection<TValue>^)valarr;
         return collectionlist;
@@ -696,8 +696,8 @@ namespace Apache
           }
           if (values != nullptr) {
             for (const auto& iter : native_value) {
-              TKey key = Serializable::GetManagedValueGeneric<TKey>(iter.first);
-              TValue val = Serializable::GetManagedValueGeneric<TValue>(iter.second);
+              TKey key = TypeRegistry::GetManagedValueGeneric<TKey>(iter.first);
+              TValue val = TypeRegistry::GetManagedValueGeneric<TValue>(iter.second);
               values->Add(key, val);
             }
           }
@@ -742,8 +742,8 @@ namespace Apache
           }
           if (values != nullptr) {
             for (const auto& iter : native_value) {
-              TKey key = Serializable::GetManagedValueGeneric<TKey>(iter.first);
-              TValue val = Serializable::GetManagedValueGeneric<TValue>(iter.second);
+              TKey key = TypeRegistry::GetManagedValueGeneric<TKey>(iter.first);
+              TValue val = TypeRegistry::GetManagedValueGeneric<TValue>(iter.second);
               values->Add(key, val);
             }
           }
@@ -1096,8 +1096,8 @@ namespace Apache
         for (System::Int32 index = 0; index < vc.size(); index++)
         {
           auto& nativeptr = vc[index];
-          auto key = Serializable::GetManagedValueGeneric<TKey>(nativeptr->getKey());
-          auto val = Serializable::GetManagedValueGeneric<TValue>(nativeptr->getValue());
+          auto key = TypeRegistry::GetManagedValueGeneric<TKey>(nativeptr->getKey());
+          auto val = TypeRegistry::GetManagedValueGeneric<TValue>(nativeptr->getValue());
           toArray[startIdx] = KeyValuePair<TKey, TValue>(key, val);
           ++startIdx;
         }
@@ -1243,7 +1243,7 @@ namespace Apache
         for (System::Int32 index = 0; index < keyarr->Length; index++)
         {
           auto& nativeptr = vc[index];
-          keyarr[index] = Serializable::GetManagedValueGeneric<TKey>(nativeptr);
+          keyarr[index] = TypeRegistry::GetManagedValueGeneric<TKey>(nativeptr);
         }
 
         auto collectionlist = (System::Collections::Generic::ICollection<TKey>^)keyarr;
@@ -1422,7 +1422,7 @@ namespace Apache
         try
         {
           auto nativeptr = m_nativeptr->get()->selectValue(marshal_as<std::string>(predicate), TimeUtils::TimeSpanToDurationCeil<std::chrono::seconds>(timeout));
-          return Serializable::GetManagedValueGeneric<Object^>(nativeptr);
+          return TypeRegistry::GetManagedValueGeneric<Object^>(nativeptr);
         }
         finally
         {
diff --git a/clicache/src/RegionAttributes.hpp b/clicache/src/RegionAttributes.hpp
index 6d0c0ee..b4774df 100644
--- a/clicache/src/RegionAttributes.hpp
+++ b/clicache/src/RegionAttributes.hpp
@@ -496,7 +496,7 @@ namespace Apache
         /// <summary>
         /// Private constructor to wrap a native object pointer
         /// </summary>
-        /// <param name="nativeptr">The native object pointer</param>
+        /// <param name="nativeobj">The native object pointer</param>
         inline RegionAttributes<TKey, TValue>(native::RegionAttributes nativeobj)
         {
           const std::shared_ptr<native::RegionAttributes> nativeptr = std::make_shared<native::RegionAttributes>(nativeobj);
diff --git a/clicache/src/RegionEntry.cpp b/clicache/src/RegionEntry.cpp
index b54332c..bb9e05f 100644
--- a/clicache/src/RegionEntry.cpp
+++ b/clicache/src/RegionEntry.cpp
@@ -36,7 +36,7 @@ namespace Apache
       {        
         try
         {
-          return Serializable::GetManagedValueGeneric<TKey>(m_nativeptr->get()->getKey());
+          return TypeRegistry::GetManagedValueGeneric<TKey>(m_nativeptr->get()->getKey());
         }
         finally
         {
@@ -49,7 +49,7 @@ namespace Apache
       {
         try
         {
-          return Serializable::GetManagedValueGeneric<TValue>(m_nativeptr->get()->getValue());
+          return TypeRegistry::GetManagedValueGeneric<TValue>(m_nativeptr->get()->getValue());
         }
         finally
         {
diff --git a/clicache/src/RegionEvent.cpp b/clicache/src/RegionEvent.cpp
index 0960582..1d988e8 100644
--- a/clicache/src/RegionEvent.cpp
+++ b/clicache/src/RegionEvent.cpp
@@ -40,7 +40,7 @@ namespace Apache
       Object^ RegionEvent<TKey, TValue>::CallbackArgument::get()
       {
         std::shared_ptr<apache::geode::client::Serializable>& valptr(m_nativeptr->getCallbackArgument());
-        return Serializable::GetManagedValueGeneric<Object^>( valptr );
+        return TypeRegistry::GetManagedValueGeneric<Object^>( valptr );
       }
 
       generic<class TKey, class TValue>
diff --git a/clicache/src/ResultCollector.cpp b/clicache/src/ResultCollector.cpp
index cfe9414..68f8d61 100644
--- a/clicache/src/ResultCollector.cpp
+++ b/clicache/src/ResultCollector.cpp
@@ -36,19 +36,7 @@ namespace Apache
       generic<class TResult>
       void ResultCollector<TResult>::AddResult( const TResult rs )
       {
-        _GF_MG_EXCEPTION_TRY2/* due to auto replace */
-
-          try
-          {
-            auto result = std::shared_ptr<native::Cacheable>(SafeGenericMSerializableConvert((IGeodeSerializable^)rs));
-            m_nativeptr->get()->addResult(result);
-          }
-          finally
-          {
-            GC::KeepAlive(m_nativeptr);
-          }
-
-        _GF_MG_EXCEPTION_CATCH_ALL2/* due to auto replace */
+        throw gcnew UnsupportedOperationException();
       }
 
       generic<class TResult>
@@ -68,7 +56,7 @@ namespace Apache
             for (System::Int32 index = 0; index < results->size(); index++)
             {
               auto nativeptr = results->operator[](index);
-              rs[index] = Serializable::GetManagedValueGeneric<TResult>(nativeptr);
+              rs[index] = TypeRegistry::GetManagedValueGeneric<TResult>(nativeptr);
             }
             auto collectionlist = (ICollection<TResult>^)rs;
             return collectionlist;
diff --git a/clicache/src/ResultSet.cpp b/clicache/src/ResultSet.cpp
index 2b24182..e91c9ad 100644
--- a/clicache/src/ResultSet.cpp
+++ b/clicache/src/ResultSet.cpp
@@ -62,7 +62,7 @@ namespace Apache
       {
         try
         {
-          return (Serializable::GetManagedValueGeneric<TResult>(m_nativeptr->get()->operator[](static_cast<System::Int32>(index))));
+          return (TypeRegistry::GetManagedValueGeneric<TResult>(m_nativeptr->get()->operator[](static_cast<System::Int32>(index))));
         }
         finally
         {
diff --git a/clicache/src/SelectResultsIterator.cpp b/clicache/src/SelectResultsIterator.cpp
index de589e0..9db0f85 100644
--- a/clicache/src/SelectResultsIterator.cpp
+++ b/clicache/src/SelectResultsIterator.cpp
@@ -32,7 +32,7 @@ namespace Apache
       {
         try
         {
-          return Serializable::GetManagedValueGeneric<TResult>(m_nativeptr->get()->current( ));
+          return TypeRegistry::GetManagedValueGeneric<TResult>(m_nativeptr->get()->current( ));
         }
         finally
         {
@@ -71,7 +71,7 @@ namespace Apache
       {
         try
         {
-          return Serializable::GetManagedValueGeneric<TResult>(m_nativeptr->get()->next( ));
+          return TypeRegistry::GetManagedValueGeneric<TResult>(m_nativeptr->get()->next( ));
         }
         finally
         {
diff --git a/clicache/src/Serializable.cpp b/clicache/src/Serializable.cpp
index c10fd1f..9a032ec 100644
--- a/clicache/src/Serializable.cpp
+++ b/clicache/src/Serializable.cpp
@@ -272,239 +272,6 @@ namespace Apache
         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::RegisterPdxType(PdxTypeFactoryMethod^ creationMethod)
-      {
-        if (creationMethod == nullptr) {
-          throw gcnew IllegalArgumentException("Serializable.RegisterPdxType(): "
-                                               "null PdxTypeFactoryMethod delegate passed");
-        }
-        IPdxSerializable^ obj = creationMethod();
-        PdxDelegateMap[obj->GetType()->FullName] = creationMethod;
-        Log::Debug("RegisterPdxType: class registered: " + obj->GetType()->FullName);
-      }
-
-      Object^ Serializable::CreateObject(String^ className)
-      {
-
-        Object^ retVal = CreateObjectEx(className);
-
-        if (retVal == nullptr)
-        {
-          Type^ t = GetType(className);
-          if (t)
-          {
-            retVal = t->GetConstructor(Type::EmptyTypes)->Invoke(nullptr);
-            return retVal;
-          }
-        }
-        return retVal;
-      }
-
-      Object^ Serializable::CreateObjectEx(String^ className)
-      {
-        CreateNewObjectDelegate^ del = nullptr;
-        Dictionary<String^, CreateNewObjectDelegate^>^ tmp = ClassNameVsCreateNewObjectDelegate;
-
-        tmp->TryGetValue(className, del);
-
-        if (del != nullptr)
-        {
-          return del();
-        }
-
-        Type^ t = GetType(className);
-        if (t)
-        {
-          msclr::lock lockInstance(ClassNameVsTypeLockObj);
-          {
-            tmp = ClassNameVsCreateNewObjectDelegate;
-            tmp->TryGetValue(className, del);
-            if (del != nullptr)
-              return del();
-            del = CreateNewObjectDelegateF(t);
-            tmp = gcnew Dictionary<String^, CreateNewObjectDelegate^>(ClassNameVsCreateNewObjectDelegate);
-            tmp[className] = del;
-            ClassNameVsCreateNewObjectDelegate = tmp;
-            return del();
-          }
-        }
-        return nullptr;
-      }
-
-      Object^ Serializable::GetArrayObject(String^ className, int len)
-      {
-        Object^ retArr = GetArrayObjectEx(className, len);
-        if (retArr == nullptr)
-        {
-          Type^ t = GetType(className);
-          if (t)
-          {
-            retArr = t->MakeArrayType()->GetConstructor(singleIntType)->Invoke(gcnew array<Object^>(1) { len });
-            return retArr;
-          }
-        }
-        return retArr;
-      }
-
-      Object^ Serializable::GetArrayObjectEx(String^ className, int len)
-      {
-        CreateNewObjectArrayDelegate^ del = nullptr;
-        Dictionary<String^, CreateNewObjectArrayDelegate^>^ tmp = ClassNameVsCreateNewObjectArrayDelegate;
-
-        tmp->TryGetValue(className, del);
-
-        if (del != nullptr)
-        {
-          return del(len);
-        }
-
-        Type^ t = GetType(className);
-        if (t)
-        {
-          msclr::lock lockInstance(ClassNameVsTypeLockObj);
-          {
-            tmp = ClassNameVsCreateNewObjectArrayDelegate;
-            tmp->TryGetValue(className, del);
-            if (del != nullptr)
-              return del(len);
-            del = CreateNewObjectArrayDelegateF(t);
-            tmp = gcnew Dictionary<String^, CreateNewObjectArrayDelegate^>(ClassNameVsCreateNewObjectArrayDelegate);
-            tmp[className] = del;
-            ClassNameVsCreateNewObjectArrayDelegate = tmp;
-            return del(len);
-          }
-        }
-        return nullptr;
-      }
-
-      //delegate Object^ CreateNewObject();
-      //static CreateNewObjectDelegate^ CreateNewObjectDelegateF(Type^ type);
-      Serializable::CreateNewObjectDelegate^ Serializable::CreateNewObjectDelegateF(Type^ type)
-      {
-        DynamicMethod^ dynam = gcnew DynamicMethod("", Internal::DotNetTypes::ObjectType, Type::EmptyTypes, type, true);
-        ILGenerator^ il = dynam->GetILGenerator();
-
-        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");
-        }
-
-        il->Emit(OpCodes::Newobj, ctorInfo);
-        il->Emit(OpCodes::Ret);
-
-        return (Serializable::CreateNewObjectDelegate^)dynam->CreateDelegate(createNewObjectDelegateType);
-      }
-
-      //delegate Object^ CreateNewObjectArray(int len);
-      Serializable::CreateNewObjectArrayDelegate^ Serializable::CreateNewObjectArrayDelegateF(Type^ type)
-      {
-        DynamicMethod^ dynam = gcnew DynamicMethod("", Internal::DotNetTypes::ObjectType, singleIntTypeA, type, true);
-        ILGenerator^ il = dynam->GetILGenerator();
-
-        il->Emit(OpCodes::Ldarg_0);
-
-        il->Emit(OpCodes::Newarr, type);
-        il->Emit(OpCodes::Ret);
-
-        return (Serializable::CreateNewObjectArrayDelegate^)dynam->CreateDelegate(createNewObjectArrayDelegateType);
-      }
-
-      Type^ Serializable::getTypeFromRefrencedAssemblies(String^ className, Dictionary<Assembly^, bool>^ referedAssembly, Assembly^ currentAsm)
-      {
-        Type^ t = currentAsm->GetType(className);
-        if (t != nullptr)
-        {
-          Dictionary<String^, Type^>^ tmp = gcnew Dictionary<String^, Type^>(ClassNameVsType);
-          tmp[className] = t;
-          ClassNameVsType = tmp;
-          return t;
-        }
-        //already touched
-        if (referedAssembly->ContainsKey(currentAsm))
-          return nullptr;
-        referedAssembly[currentAsm] = true;
-
-        //get all refrenced assembly
-        array<AssemblyName^>^ ReferencedAssemblies = currentAsm->GetReferencedAssemblies();
-        for each(AssemblyName^ tmpAsm in ReferencedAssemblies)
-        {
-          try
-          {
-            Assembly^ la = Assembly::Load(tmpAsm);
-            if (la != nullptr && (!referedAssembly->ContainsKey(la)))
-            {
-              t = getTypeFromRefrencedAssemblies(className, referedAssembly, la);
-              if (!t)
-                return t;
-            }
-          }
-          catch (System::Exception^){//ignore
-          }
-        }
-        return nullptr;
-      }
-
-      Type^ Serializable::GetType(String^ className)
-      {
-        Type^ retVal = nullptr;
-        Dictionary<String^, Type^>^ tmp = ClassNameVsType;
-        tmp->TryGetValue(className, retVal);
-
-        if (retVal != nullptr)
-          return retVal;
-        msclr::lock lockInstance(ClassNameVsTypeLockObj);
-        {
-          tmp = ClassNameVsType;
-          tmp->TryGetValue(className, retVal);
-
-          if (retVal != nullptr)
-            return retVal;
-
-          Dictionary<Assembly^, bool>^ referedAssembly = gcnew Dictionary<Assembly^, bool>();
-          AppDomain^ MyDomain = AppDomain::CurrentDomain;
-          array<Assembly^>^ AssembliesLoaded = MyDomain->GetAssemblies();
-          for each(Assembly^ tmpAsm in AssembliesLoaded)
-          {
-            retVal = getTypeFromRefrencedAssemblies(className, referedAssembly, tmpAsm);
-            if (retVal)
-              return retVal;
-          }
-        }
-        return retVal;
-      }
-
-      IPdxSerializable^ Serializable::GetPdxType(String^ className)
-      {
-        PdxTypeFactoryMethod^ retVal = nullptr;
-        PdxDelegateMap->TryGetValue(className, retVal);
-
-        if (retVal == nullptr){
-
-          if (PdxSerializer != nullptr)
-          {
-            return gcnew PdxWrapper(className);
-          }
-          try
-          {
-            Object^ retObj = CreateObject(className);
-
-            IPdxSerializable^ retPdx = dynamic_cast<IPdxSerializable^>(retObj);
-            if (retPdx != nullptr)
-              return retPdx;
-          }
-          catch (System::Exception^ ex)
-          {
-            Log::Error("Unable to create object usqing reflection for class: " + className + " : " + ex->Message);
-          }
-          throw gcnew IllegalStateException("Pdx factory method (or PdxSerializer ) not registered (or don't have zero arg constructor)"
-                                            " to create default instance for class: " + className);
-        }
-
-        return retVal();
-      }
-
       void Serializable::RegisterPDXManagedCacheableKey(Cache^ cache)
       {
         auto cacheImpl = CacheRegionHelper::getCacheImpl(cache->GetNative().get());
@@ -515,412 +282,6 @@ namespace Apache
         });
       }
 
-      void Apache::Geode::Client::Serializable::RegisterTypeGeneric(TypeFactoryMethodGeneric^ creationMethod, Cache^ cache)
-      {
-        if (creationMethod == nullptr) {
-          throw gcnew IllegalArgumentException("Serializable.RegisterType(): "
-                                               "null TypeFactoryMethod delegate passed");
-        }
-
-        //--------------------------------------------------------------
-
-        //adding user type as well in global builtin hashmap
-        System::Int64 classId = ((System::Int64)creationMethod()->ClassId);
-        if (!ManagedDelegatesGeneric->ContainsKey(classId))
-          ManagedDelegatesGeneric->Add(classId, creationMethod);
-
-        DelegateWrapperGeneric^ delegateObj = gcnew DelegateWrapperGeneric(creationMethod);
-        TypeFactoryNativeMethodGeneric^ nativeDelegate =
-          gcnew TypeFactoryNativeMethodGeneric(delegateObj,
-          &DelegateWrapperGeneric::NativeDelegateGeneric);
-
-        // this is avoid object being Gced
-        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);
-        DelegateMapGeneric[tmp->ClassId] = creationMethod;
-
-        _GF_MG_EXCEPTION_TRY2
-          CacheImpl *cacheImpl = CacheRegionHelper::getCacheImpl(cache->GetNative().get());
-          cacheImpl->getSerializationRegistry()->addType((std::shared_ptr<native::Serializable>(*)())System::Runtime::InteropServices::Marshal::GetFunctionPointerForDelegate(nativeDelegate).ToPointer());
-
-        _GF_MG_EXCEPTION_CATCH_ALL2
-      }
-
-      void Apache::Geode::Client::Serializable::RegisterTypeGeneric(Byte typeId,
-                                                                    TypeFactoryMethodGeneric^ creationMethod, Type^ type, Cache^ cache)
-      {
-        if (creationMethod == nullptr) {
-          throw gcnew IllegalArgumentException("Serializable.RegisterType(): "
-                                               "null TypeFactoryMethod delegate passed");
-        }
-        DelegateWrapperGeneric^ delegateObj = gcnew DelegateWrapperGeneric(creationMethod);
-        TypeFactoryNativeMethodGeneric^ nativeDelegate =
-          gcnew TypeFactoryNativeMethodGeneric(delegateObj,
-          &DelegateWrapperGeneric::NativeDelegateGeneric);
-
-        BuiltInDelegatesGeneric[typeId] = nativeDelegate;
-
-        if (type != nullptr)
-          ManagedTypeMappingGeneric[type] = typeId;
-
-        //This is hashmap for manged builtin objects
-        if (!ManagedDelegatesGeneric->ContainsKey(typeId + 0x80000000))
-          ManagedDelegatesGeneric->Add(typeId + 0x80000000, creationMethod);
-
-        // register the type in the DelegateMap
-        IGeodeSerializable^ tmp = creationMethod();
-        Log::Finer("Registering(,) serializable class ID " + tmp->ClassId);
-        DelegateMapGeneric[tmp->ClassId] = creationMethod;
-
-        try
-        {
-           CacheImpl *cacheImpl = CacheRegionHelper::getCacheImpl(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());
-          }
-
-        }
-        catch (native::IllegalStateException&)
-        {
-          //ignore it as this is internal only
-        }
-      }
-
-      void Apache::Geode::Client::Serializable::UnregisterTypeGeneric(Byte typeId, Cache^ cache)
-      {
-        BuiltInDelegatesGeneric->Remove(typeId);
-        _GF_MG_EXCEPTION_TRY2
-
-          CacheRegionHelper::getCacheImpl(cache->GetNative().get())->getSerializationRegistry()->removeType(typeId);
-
-        _GF_MG_EXCEPTION_CATCH_ALL2
-      }
-
-      void Apache::Geode::Client::Serializable::RegisterWrapperGeneric(
-        WrapperDelegateGeneric^ wrapperMethod, Byte typeId, System::Type^ type)
-      {
-        if (typeId < 0 || typeId > WrapperEndGeneric)
-        {
-          throw gcnew GeodeException("The TypeID (" + typeId + ") being "
-                                       "registered is beyond acceptable range of 0-" + WrapperEndGeneric);
-        }
-        NativeWrappersGeneric[typeId] = wrapperMethod;
-        ManagedTypeMappingGeneric[type] = typeId;
-      }
-
-      void Apache::Geode::Client::Serializable::UnregisterNativesGeneric()
-      {
-        BuiltInDelegatesGeneric->Clear();
-        for (Byte typeId = 0; typeId <= WrapperEndGeneric; ++typeId) {
-          NativeWrappersGeneric[typeId] = nullptr;
-        }
-        //TODO:: unregister from managed hashmap as well.
-        //  ManagedDelegates->Clear();
-      }
-
-      generic<class TValue>
-      TValue Serializable::GetManagedValueGeneric(std::shared_ptr<native::Serializable> val)
-      {
-        if (val == nullptr)
-        {
-          return TValue();
-        }
-
-        Byte typeId = val->typeId();
-        //Log::Debug("Serializable::GetManagedValueGeneric typeid = " + typeId);
-        switch (typeId)
-        {
-        case native::GeodeTypeIds::CacheableByte:
-        {
-          return (TValue)(int8_t)safe_cast<int8_t>(Serializable::getByte(val));
-          /* if (TValue::typeid == System::SByte::typeid) {
-              return (TValue)(int8_t)safe_cast<int8_t>(Serializable::getByte(val));
-              }
-              else {
-              return (TValue)(System::Byte)safe_cast<int8_t>(Serializable::getByte(val));
-              }
-              return safe_cast<TValue>(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:
-        {
-          /* if (TValue::typeid == System::Int16::typeid) {
-              return (TValue)(System::Int16)safe_cast<System::Int16>(Serializable::getInt16(val));
-              }
-              else {
-              return (TValue)(System::UInt16)safe_cast<System::Int16>(Serializable::getInt16(val));
-              }*/
-          return safe_cast<TValue>(Serializable::getInt16(val));
-        }
-        case native::GeodeTypeIds::CacheableInt32:
-        {
-          /* if (TValue::typeid == System::Int32::typeid) {
-              return (TValue)(System::Int32)safe_cast<System::Int32>(Serializable::getInt32(val));
-              }
-              else {
-              return (TValue)(System::UInt32)safe_cast<System::Int32>(Serializable::getInt32(val));
-              }  */
-          return safe_cast<TValue>(Serializable::getInt32(val));
-        }
-        case native::GeodeTypeIds::CacheableInt64:
-        {
-          /*if (TValue::typeid == System::Int64::typeid) {
-            return (TValue)(System::Int64)safe_cast<System::Int64>(Serializable::getInt64(val));
-            }
-            else {
-            return (TValue)(System::UInt64)safe_cast<System::Int64>(Serializable::getInt64(val));
-            }*/
-          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);
-        }
-        case native::GeodeTypeIds::CacheableBytes:
-        {
-          Apache::Geode::Client::CacheableBytes^ ret = safe_cast<Apache::Geode::Client::CacheableBytes ^>
-            (SafeGenericUMSerializableConvert<Apache::Geode::Client::CacheableBytes^>(val));
-
-          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));
-
-          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));
-
-          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));
-
-          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));
-
-          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));
-
-          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));
-
-          /* array<String^>^ str = gcnew array<String^>(ret->GetValues()->Length);
-            for(int i=0; i<ret->GetValues()->Length; i++ ) {
-            str[i] = ret->GetValues()[i];
-            }*/
-
-          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));
-
-          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));
-
-          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));
-
-          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));
-
-          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));
-          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));
-          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));
-          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));
-          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));
-          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));
-          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));
-          return safe_cast<TValue>(ret);
-        }
-        case native::GeodeTypeIds::Struct:
-        {
-          return safe_cast<TValue>(Apache::Geode::Client::Struct::Create(val));
-        }
-        case native::GeodeTypeIds::CacheableStack:
-        {
-          Apache::Geode::Client::CacheableStack^ ret = static_cast<Apache::Geode::Client::CacheableStack^>
-            (SafeGenericUMSerializableConvert<Apache::Geode::Client::CacheableStack^>(val));
-          return safe_cast<TValue>(ret->Value);
-        }
-        case 7: //GeodeClassIds::CacheableManagedObject
-        {
-          Apache::Geode::Client::CacheableObject^ ret = static_cast<Apache::Geode::Client::CacheableObject^>
-            (SafeGenericUMSerializableConvert<Apache::Geode::Client::CacheableObject^>(val));
-          return safe_cast<TValue>(ret);
-        }
-        case 8://GeodeClassIds::CacheableManagedObjectXml
-        {
-          Apache::Geode::Client::CacheableObjectXml^ ret = static_cast<Apache::Geode::Client::CacheableObjectXml^>
-            (SafeGenericUMSerializableConvert<Apache::Geode::Client::CacheableObjectXml^>(val));
-          return safe_cast<TValue>(ret);
-        }
-        /*  TODO: replace with IDictionary<K, V>
-      case native::GeodeTypeIds::Properties:
-      {
-      Apache::Geode::Client::Properties^ ret = safe_cast<Apache::Geode::Client::Properties^>
-      ( SafeGenericUMSerializableConvert<Apache::Geode::Client::Properties^>(val));
-
-      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));
-
-          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));
-
-          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));
-          return safe_cast<TValue>(ret);
-        }
-        default:
-          throw gcnew System::Exception("not found typeid");
-        }
-        throw gcnew System::Exception("not found typeid");
-      }
-
       generic<class TKey>
       std::shared_ptr<native::CacheableKey> Serializable::GetUnmanagedValueGeneric(TKey key)
       {
@@ -939,114 +300,6 @@ namespace Apache
         return nullptr;
       }
 
-      void Serializable::RegisterPdxSerializer(IPdxSerializer^ pdxSerializer)
-      {
-        /*if(PdxSerializer != nullptr )
-        {
-        throw gcnew IllegalStateException("IPdxSerializer is already registered: " + PdxSerializer->GetType());
-        }*/
-        PdxSerializer = pdxSerializer;
-      }
-
-      void Serializable::SetPdxTypeMapper(IPdxTypeMapper^ pdxTypeMapper)
-      {
-        if (pdxTypeMapper != nullptr)
-          PdxTypeMapper = pdxTypeMapper;
-      }
-
-      String^ Serializable::GetPdxTypeName(String^ localTypeName)
-      {
-        if (PdxTypeMapper == nullptr)
-          return localTypeName;
-        IDictionary<String^, String^>^ tmp = LocalTypeNameToPdx;
-        String^ pdxTypeName = nullptr;
-        tmp->TryGetValue(localTypeName, pdxTypeName);
-
-        if (pdxTypeName != nullptr)
-          return pdxTypeName;
-
-        {
-          msclr::lock lockInstance(LockObj);
-          tmp->TryGetValue(localTypeName, pdxTypeName);
-
-          if (pdxTypeName != nullptr)
-            return pdxTypeName;
-          if (PdxTypeMapper != nullptr)
-          {
-            pdxTypeName = PdxTypeMapper->ToPdxTypeName(localTypeName);
-            if (pdxTypeName == nullptr)
-            {
-              throw gcnew IllegalStateException("PdxTypeName should not be null for local type " + localTypeName);
-            }
-
-            Dictionary<String^, String^>^ localToPdx = gcnew Dictionary<String^, String^>(LocalTypeNameToPdx);
-            localToPdx[localTypeName] = pdxTypeName;
-            LocalTypeNameToPdx = localToPdx;
-            Dictionary<String^, String^>^ pdxToLocal = gcnew Dictionary<String^, String^>(PdxTypeNameToLocal);
-            localToPdx[pdxTypeName] = localTypeName;
-            PdxTypeNameToLocal = pdxToLocal;
-          }
-        }
-        return pdxTypeName;
-      }
-
-      String^ Serializable::GetLocalTypeName(String^ pdxTypeName)
-      {
-        if (PdxTypeMapper == nullptr)
-          return pdxTypeName;
-
-        IDictionary<String^, String^>^ tmp = PdxTypeNameToLocal;
-        String^ localTypeName = nullptr;
-        tmp->TryGetValue(pdxTypeName, localTypeName);
-
-        if (localTypeName != nullptr)
-          return localTypeName;
-
-        {
-          msclr::lock lockInstance(LockObj);
-          tmp->TryGetValue(pdxTypeName, localTypeName);
-
-          if (localTypeName != nullptr)
-            return localTypeName;
-          if (PdxTypeMapper != nullptr)
-          {
-            localTypeName = PdxTypeMapper->FromPdxTypeName(pdxTypeName);
-            if (localTypeName == nullptr)
-            {
-              throw gcnew IllegalStateException("LocalTypeName should not be null for pdx type " + pdxTypeName);
-            }
-
-            Dictionary<String^, String^>^ localToPdx = gcnew Dictionary<String^, String^>(LocalTypeNameToPdx);
-            localToPdx[localTypeName] = pdxTypeName;
-            LocalTypeNameToPdx = localToPdx;
-            Dictionary<String^, String^>^ pdxToLocal = gcnew Dictionary<String^, String^>(PdxTypeNameToLocal);
-            localToPdx[pdxTypeName] = localTypeName;
-            PdxTypeNameToLocal = pdxToLocal;
-          }
-        }
-        return localTypeName;
-      }
-
-      void Serializable::Clear()
-      {
-        PdxTypeMapper = nullptr;
-        LocalTypeNameToPdx->Clear();
-        PdxTypeNameToLocal->Clear();
-        ClassNameVsCreateNewObjectDelegate->Clear();
-        ClassNameVsType->Clear();
-        ClassNameVsCreateNewObjectArrayDelegate->Clear();
-      }
-
-      IPdxSerializer^ Serializable::GetPdxSerializer()
-      {
-        return PdxSerializer;
-      }
-
-      bool Serializable::IsObjectAndPdxSerializerRegistered(String^ className)
-      {
-        return PdxSerializer != nullptr;
-      }
-
       generic<class TKey>
       std::shared_ptr<native::CacheableKey> Serializable::GetUnmanagedValueGeneric(
         Type^ managedType, TKey key)
@@ -1058,7 +311,7 @@ namespace Apache
       std::shared_ptr<native::CacheableKey> Serializable::GetUnmanagedValueGeneric(
         Type^ managedType, TKey key, bool isAsciiChar)
       {
-        Byte typeId = Apache::Geode::Client::Serializable::GetManagedTypeMappingGeneric(managedType);
+        Byte typeId = Apache::Geode::Client::TypeRegistry::GetManagedTypeMappingGeneric(managedType);
 
         switch (typeId)
         {
@@ -1086,118 +339,95 @@ namespace Apache
         }
         case native::GeodeTypeIds::CacheableBytes:
         {
-          std::shared_ptr<native::Cacheable> kPtr(SafeGenericMSerializableConvert((IGeodeSerializable^)Apache::Geode::Client::CacheableBytes::Create((array<Byte>^)key)));
-          return std::dynamic_pointer_cast<native::CacheableKey>(kPtr);
+          return wrapIGeodeSerializable(Apache::Geode::Client::CacheableBytes::Create((array<Byte>^)key));
         }
         case native::GeodeTypeIds::CacheableDoubleArray:
         {
-          std::shared_ptr<native::Cacheable> kPtr(SafeGenericMSerializableConvert((IGeodeSerializable^)Apache::Geode::Client::CacheableDoubleArray::Create((array<Double>^)key)));
-          return std::dynamic_pointer_cast<native::CacheableKey>(kPtr);
+          return wrapIGeodeSerializable(Apache::Geode::Client::CacheableDoubleArray::Create((array<Double>^)key));
         }
         case native::GeodeTypeIds::CacheableFloatArray:
         {
-          std::shared_ptr<native::Cacheable> kPtr(SafeGenericMSerializableConvert((IGeodeSerializable^)Apache::Geode::Client::CacheableFloatArray::Create((array<float>^)key)));
-          return std::dynamic_pointer_cast<native::CacheableKey>(kPtr);
+          return wrapIGeodeSerializable(Apache::Geode::Client::CacheableFloatArray::Create((array<float>^)key));
         }
         case native::GeodeTypeIds::CacheableInt16Array:
         {
-          std::shared_ptr<native::Cacheable> kPtr(SafeGenericMSerializableConvert((IGeodeSerializable^)Apache::Geode::Client::CacheableInt16Array::Create((array<Int16>^)key)));
-          return std::dynamic_pointer_cast<native::CacheableKey>(kPtr);
+          return wrapIGeodeSerializable(Apache::Geode::Client::CacheableInt16Array::Create((array<Int16>^)key));
         }
         case native::GeodeTypeIds::CacheableInt32Array:
         {
-          std::shared_ptr<native::Cacheable> kPtr(SafeGenericMSerializableConvert((IGeodeSerializable^)Apache::Geode::Client::CacheableInt32Array::Create((array<Int32>^)key)));
-          return std::dynamic_pointer_cast<native::CacheableKey>(kPtr);
+          return wrapIGeodeSerializable(Apache::Geode::Client::CacheableInt32Array::Create((array<Int32>^)key));
         }
         case native::GeodeTypeIds::CacheableInt64Array:
         {
-          std::shared_ptr<native::Cacheable> kPtr(SafeGenericMSerializableConvert((IGeodeSerializable^)Apache::Geode::Client::CacheableInt64Array::Create((array<Int64>^)key)));
-          return std::dynamic_pointer_cast<native::CacheableKey>(kPtr);
+          return wrapIGeodeSerializable(Apache::Geode::Client::CacheableInt64Array::Create((array<Int64>^)key));
         }
         case native::GeodeTypeIds::CacheableStringArray:
         {
-          std::shared_ptr<native::Cacheable> kPtr(SafeGenericMSerializableConvert((IGeodeSerializable^)Apache::Geode::Client::CacheableStringArray::Create((array<String^>^)key)));
-          return std::dynamic_pointer_cast<native::CacheableKey>(kPtr);
+          return wrapIGeodeSerializable(Apache::Geode::Client::CacheableStringArray::Create((array<String^>^)key));
         }
         case native::GeodeTypeIds::CacheableFileName:
         {
-          std::shared_ptr<native::Cacheable> kPtr(SafeGenericMSerializableConvert((IGeodeSerializable^)(Apache::Geode::Client::CacheableFileName^)key));
-          return std::dynamic_pointer_cast<native::CacheableKey>(kPtr);
+          return wrapIGeodeSerializable((Apache::Geode::Client::CacheableFileName^)key);
         }
         case native::GeodeTypeIds::CacheableHashTable://collection::hashtable
         {
-          std::shared_ptr<native::Cacheable> kPtr(SafeGenericMSerializableConvert((IGeodeSerializable^)Apache::Geode::Client::CacheableHashTable::Create((System::Collections::Hashtable^)key)));
-          return std::dynamic_pointer_cast<native::CacheableKey>(kPtr);
+          return wrapIGeodeSerializable(Apache::Geode::Client::CacheableHashTable::Create((System::Collections::Hashtable^)key));
         }
         case native::GeodeTypeIds::CacheableHashMap://generic dictionary
         {
-          std::shared_ptr<native::Cacheable> kPtr(SafeGenericMSerializableConvert((IGeodeSerializable^)Apache::Geode::Client::CacheableHashMap::Create((System::Collections::IDictionary^)key)));
-          return std::dynamic_pointer_cast<native::CacheableKey>(kPtr);
+          return wrapIGeodeSerializable(Apache::Geode::Client::CacheableHashMap::Create((System::Collections::IDictionary^)key));
         }
         case native::GeodeTypeIds::CacheableVector://collection::arraylist
         {
-          std::shared_ptr<native::Cacheable> kPtr(SafeGenericMSerializableConvert((IGeodeSerializable^)CacheableVector::Create((System::Collections::IList^)key)));
-          return std::dynamic_pointer_cast<native::CacheableKey>(kPtr);
+          return wrapIGeodeSerializable(CacheableVector::Create((System::Collections::IList^)key));
         }
         case native::GeodeTypeIds::CacheableArrayList://generic ilist
         {
-          std::shared_ptr<native::Cacheable> kPtr(SafeGenericMSerializableConvert((IGeodeSerializable^)Apache::Geode::Client::CacheableArrayList::Create((System::Collections::IList^)key)));
-          return std::dynamic_pointer_cast<native::CacheableKey>(kPtr);
+          return wrapIGeodeSerializable(Apache::Geode::Client::CacheableArrayList::Create((System::Collections::IList^)key));
         }
         case native::GeodeTypeIds::CacheableLinkedList://generic linked list
         {
-          std::shared_ptr<native::Cacheable> kPtr(SafeGenericMSerializableConvert((IGeodeSerializable^)Apache::Geode::Client::CacheableLinkedList::Create((System::Collections::Generic::LinkedList<Object^>^)key)));
-          return std::dynamic_pointer_cast<native::CacheableKey>(kPtr);
+          return wrapIGeodeSerializable(Apache::Geode::Client::CacheableLinkedList::Create((System::Collections::Generic::LinkedList<Object^>^)key));
         }
         case native::GeodeTypeIds::CacheableStack:
         {
-          std::shared_ptr<native::Cacheable> kPtr(SafeGenericMSerializableConvert(Apache::Geode::Client::CacheableStack::Create((System::Collections::ICollection^)key)));
-          return std::dynamic_pointer_cast<native::CacheableKey>(kPtr);
+          return wrapIGeodeSerializable(Apache::Geode::Client::CacheableStack::Create((System::Collections::ICollection^)key));
         }
         case 7: //GeodeClassIds::CacheableManagedObject
         {
-          std::shared_ptr<native::Cacheable> kPtr(SafeGenericMSerializableConvert((Apache::Geode::Client::CacheableObject^)key));
-          return std::dynamic_pointer_cast<native::CacheableKey>(kPtr);
+          return wrapIGeodeSerializable((Apache::Geode::Client::CacheableObject^)key);
         }
         case 8://GeodeClassIds::CacheableManagedObjectXml
         {
-          std::shared_ptr<native::Cacheable> kPtr(SafeGenericMSerializableConvert((Apache::Geode::Client::CacheableObjectXml^)key));
-          return std::dynamic_pointer_cast<native::CacheableKey>(kPtr);
+          return wrapIGeodeSerializable((Apache::Geode::Client::CacheableObjectXml^)key);
         }
         case native::GeodeTypeIds::CacheableObjectArray:
         {
-          std::shared_ptr<native::Cacheable> kPtr(SafeGenericMSerializableConvert((Apache::Geode::Client::CacheableObjectArray^)key));
-          return std::dynamic_pointer_cast<native::CacheableKey>(kPtr);
+          return wrapIGeodeSerializable((Apache::Geode::Client::CacheableObjectArray^)key);
         }
         case native::GeodeTypeIds::CacheableIdentityHashMap:
         {
-          std::shared_ptr<native::Cacheable> kPtr(SafeGenericMSerializableConvert(Apache::Geode::Client::CacheableIdentityHashMap::Create((System::Collections::IDictionary^)key)));
-          return std::dynamic_pointer_cast<native::CacheableKey>(kPtr);
+          return wrapIGeodeSerializable(Apache::Geode::Client::CacheableIdentityHashMap::Create((System::Collections::IDictionary^)key));
         }
         case native::GeodeTypeIds::CacheableHashSet://no need of it, default case should work
         {
-          std::shared_ptr<native::Cacheable> kPtr(SafeGenericMSerializableConvert((Apache::Geode::Client::CacheableHashSet^)key));
-          return std::dynamic_pointer_cast<native::CacheableKey>(kPtr);
+          return wrapIGeodeSerializable((Apache::Geode::Client::CacheableHashSet^)key);
         }
         case native::GeodeTypeIds::CacheableLinkedHashSet://no need of it, default case should work
         {
-          std::shared_ptr<native::Cacheable> kPtr(SafeGenericMSerializableConvert((Apache::Geode::Client::CacheableLinkedHashSet^)key));
-          return std::dynamic_pointer_cast<native::CacheableKey>(kPtr);
+          return wrapIGeodeSerializable((Apache::Geode::Client::CacheableLinkedHashSet^)key);
         }
         case native::GeodeTypeIds::CacheableDate:
         {
-          std::shared_ptr<native::Cacheable> kPtr(SafeGenericMSerializableConvert((IGeodeSerializable^)Apache::Geode::Client::CacheableDate::Create((System::DateTime)key)));
-          return std::dynamic_pointer_cast<native::CacheableKey>(kPtr);
+          return wrapIGeodeSerializable(Apache::Geode::Client::CacheableDate::Create((System::DateTime)key));
         }
         case native::GeodeTypeIds::BooleanArray:
         {
-          std::shared_ptr<native::Cacheable> kPtr(SafeGenericMSerializableConvert((IGeodeSerializable^)Apache::Geode::Client::BooleanArray::Create((array<bool>^)key)));
-          return std::dynamic_pointer_cast<native::CacheableKey>(kPtr);
+          return wrapIGeodeSerializable(Apache::Geode::Client::BooleanArray::Create((array<bool>^)key));
         }
         case native::GeodeTypeIds::CharArray:
         {
-          std::shared_ptr<native::Cacheable> kPtr(SafeGenericMSerializableConvert((IGeodeSerializable^)Apache::Geode::Client::CharArray::Create((array<Char>^)key)));
-          return std::dynamic_pointer_cast<native::CacheableKey>(kPtr);
+          return wrapIGeodeSerializable(Apache::Geode::Client::CharArray::Create((array<Char>^)key));
         }
         default:
         {
@@ -1206,6 +436,14 @@ namespace Apache
         }
         }
       } //
+      
+      std::shared_ptr<native::CacheableKey> Serializable::wrapIGeodeSerializable(IGeodeSerializable^ managedObject) {
+        if (nullptr == managedObject) {
+          return __nullptr;
+        }
+        auto wrappedObject = new native::ManagedCacheableKeyGeneric(managedObject);
+        return std::shared_ptr<native::CacheableKey>(wrappedObject);
+      }
 
       // These are the new static methods to get/put data from c++
 
diff --git a/clicache/src/Serializable.hpp b/clicache/src/Serializable.hpp
index b207bd7..39f808a 100644
--- a/clicache/src/Serializable.hpp
+++ b/clicache/src/Serializable.hpp
@@ -44,7 +44,7 @@ namespace Apache
     {
       namespace native = apache::geode::client;
 
-				interface class IPdxSerializable;
+        interface class IPdxSerializable;
         interface class IPdxSerializer;
         ref class Cache;
 
@@ -246,78 +246,16 @@ namespace Apache
         /// to a <c>Serializable</c>.
         /// </summary>
         static operator Apache::Geode::Client::Serializable^ (array<String^>^ value);
-        
-        
-        /// <summary>
-        /// Register an instance factory method for a given type.
-        /// This should be used when registering types that implement
-        /// IGeodeSerializable.
-        /// </summary>
-        /// <param name="creationMethod">
-        /// the creation function to register
-        /// </param>
-        /// <exception cref="IllegalArgumentException">
-        /// if the method is null
-        /// </exception>
-        /// <exception cref="IllegalStateException">
-        /// if the typeId has already been registered, or there is an error
-        /// in registering the type; check <c>Utils::LastError</c> for more
-        /// information in the latter case.
-        /// </exception>
-        static void RegisterTypeGeneric(TypeFactoryMethodGeneric^ creationMethod, Cache^ cache);
-
-        /// <summary>
-        /// Set the PDX serializer for the cache. If this serializer is set,
-        /// it will be consulted to see if it can serialize any domain classes which are 
-        /// added to the cache in portable data exchange format. 
-        /// </summary>
-        static void RegisterPdxSerializer(IPdxSerializer^ pdxSerializer);
-        
-				/// <summary>
-        /// Register an instance factory method for a given type.
-        /// This should be used when registering types that implement
-        /// IPdxSerializable.
-        /// </summary>
-        /// <param name="creationMethod">
-        /// the creation function to register
-        /// </param>
-        /// <exception cref="IllegalArgumentException">
-        /// if the method is null
-        /// </exception>
-        
-        static void RegisterPdxType(PdxTypeFactoryMethod^ creationMethod);
-
-        /// <summary>
-        /// Register an PdxTypeMapper to map the local types to pdx types
-        /// </summary>
-        /// <param name="pdxTypeMapper">
-        /// Object which implements IPdxTypeMapper interface
-        /// </param>
-       
-
-        static void SetPdxTypeMapper(IPdxTypeMapper^ pdxTypeMapper);        
 
       internal:
-
+        static std::shared_ptr<CacheableKey> wrapIGeodeSerializable(IGeodeSerializable^ managedObject);
 				static System::Int32 GetPDXIdForType(String^ poolName, IGeodeSerializable^ pdxType, Cache^ cache);
 				static IGeodeSerializable^ GetPDXTypeById(String^ poolName, System::Int32 typeId, Cache^ cache);
-				static IPdxSerializable^ Serializable::GetPdxType(String^ className);
 				static void RegisterPDXManagedCacheableKey(Cache^ cache);
-        static bool IsObjectAndPdxSerializerRegistered(String^ className);
-
-        static IPdxSerializer^ GetPdxSerializer();
-        static String^ GetPdxTypeName(String^ localTypeName);
-        static String^ GetLocalTypeName(String^ pdxTypeName);
-        static void Clear();
-
-        static Type^ GetType(String^ className);
-
+        
         static int GetEnumValue(Internal::EnumInfo^ ei, Cache^ cache);
         static Internal::EnumInfo^ GetEnum(int val, Cache^ cache);
 
-         static Dictionary<String^, PdxTypeFactoryMethod^>^ PdxDelegateMap =
-          gcnew Dictionary<String^, PdxTypeFactoryMethod^>();
-               
         // These are the new static methods to get/put data from c++
 
         //byte
@@ -410,32 +348,8 @@ namespace Apache
           m_nativeptr = gcnew native_shared_ptr<native::Serializable>(nativeptr);
         }
 
-        /// <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>
-        static void RegisterTypeGeneric(Byte typeId, TypeFactoryMethodGeneric^ creationMethod, Type^ type, Cache^ cache);
-
-
-        /// <summary>
-        /// Unregister the type with the given typeId
-        /// </summary>
-        /// <param name="typeId">typeId of the type to unregister.</param>
-        static void UnregisterTypeGeneric(Byte typeId, Cache^ cache);
-
-        generic<class TValue>
-        static TValue GetManagedValueGeneric(std::shared_ptr<native::Serializable> val);
-
         generic<class TKey>
-        static std::shared_ptr<native::CacheableKey> GetUnmanagedValueGeneric(TKey key);
+        static std::shared_ptr<native::CacheableKey> GetUnmanagedValueGeneric(TKey ky);
 
         generic<class TKey>
         static std::shared_ptr<native::CacheableKey> GetUnmanagedValueGeneric(TKey key, bool isAciiChar);
@@ -446,222 +360,9 @@ namespace Apache
         generic<class TKey>
         static std::shared_ptr<native::CacheableKey> GetUnmanagedValueGeneric(Type^ managedType, TKey key, bool isAsciiChar);
 
-        /// <summary>
-        /// Static map of <c>TypeFactoryMethod</c> delegates created
-        /// for managed <c>TypeFactoryMethod</c> delegates.
-        /// </summary>
-        static Dictionary<System::Type^, Byte>^ ManagedTypeMappingGeneric =
-          gcnew Dictionary<System::Type^, Byte>();
-
-        static Byte GetManagedTypeMappingGeneric (Type^ type)
-        {
-          Byte retVal = 0;
-          ManagedTypeMappingGeneric->TryGetValue(type, retVal);
-          return retVal;
-        }
-
-        /// <summary>
-        /// Static list of <c>TypeFactoryNativeMethod</c> delegates created
-        /// from registered managed <c>TypeFactoryMethod</c> delegates.
-        /// This is so that the underlying managed objects do not get GCed.
-        /// </summary>
-        static List<TypeFactoryNativeMethodGeneric^>^ NativeDelegatesGeneric =
-          gcnew List<TypeFactoryNativeMethodGeneric^>();
-
-        // TODO AppDomain remove statics
-
-        /// <summary>
-        /// Static map of <c>TypeFactoryMethod</c> delegates created
-        /// from registered managed <c>TypeFactoryMethod</c> delegates.
-        /// This is for cross AppDomain object creations.
-        /// </summary>
-        static Dictionary<UInt32, TypeFactoryMethodGeneric^>^ DelegateMapGeneric =
-          gcnew Dictionary<UInt32, TypeFactoryMethodGeneric^>();
-
-        static Dictionary<UInt32, TypeFactoryMethodGeneric^>^ InternalDelegateMapGeneric =
-          gcnew Dictionary<UInt32, TypeFactoryMethodGeneric^>();
-
-        static TypeFactoryMethodGeneric^ GetTypeFactoryMethodGeneric(UInt32 classid)
-        {
-         // Log::Finer("TypeFactoryMethodGeneric type id " + classid + " domainid :" + System::Threading::Thread::GetDomainID() );
-          if(DelegateMapGeneric->ContainsKey(classid) )
-            return DelegateMapGeneric[classid];
-          else
-            return InternalDelegateMapGeneric[classid];//builtin types
-        }
-
-        /// <summary>
-        /// Static map of <c>TypeFactoryNativeMethod</c> delegates created
-        /// for builtin managed <c>TypeFactoryMethod</c> delegates.
-        /// This is so that the underlying managed objects do not get GCed.
-        /// </summary>
-        static Dictionary<Byte, TypeFactoryNativeMethodGeneric^>^ BuiltInDelegatesGeneric =
-          gcnew Dictionary<Byte, TypeFactoryNativeMethodGeneric^>();
-
-        /// <summary>
-        /// Static map of <c>TypeFactoryMethod</c> delegates created
-        /// for managed <c>TypeFactoryMethod</c> delegates.
-        /// </summary>
-        static Dictionary<System::Int64, TypeFactoryMethodGeneric^>^ ManagedDelegatesGeneric =
-          gcnew Dictionary<System::Int64, TypeFactoryMethodGeneric^>();
-
-        /// <summary>
-        /// This is to get manged delegates.
-        /// </summary>
-        static TypeFactoryMethodGeneric^ GetManagedDelegateGeneric(System::Int64 typeId)
-        {
-          TypeFactoryMethodGeneric^ ret = nullptr;
-          ManagedDelegatesGeneric->TryGetValue(typeId, ret);
-          return ret;
-        }
-
-        static IPdxSerializer^ PdxSerializer = nullptr;
-        static IPdxTypeMapper^ PdxTypeMapper = nullptr;
-        static Object^ LockObj = gcnew Object();
-        static Dictionary<String^, String^>^ PdxTypeNameToLocal =
-          gcnew Dictionary<String^, String^>();
-        static Dictionary<String^, String^>^ LocalTypeNameToPdx =
-          gcnew Dictionary<String^, String^>();
-
-
-        static Object^ ClassNameVsTypeLockObj = gcnew Object();
-        static Dictionary<String^, Type^>^ ClassNameVsType =
-          gcnew Dictionary<String^, Type^>();
-
-        delegate Object^ CreateNewObjectDelegate();
-        static CreateNewObjectDelegate^ CreateNewObjectDelegateF(Type^ type);
-       
-        delegate Object^ CreateNewObjectArrayDelegate(int len);
-        static CreateNewObjectArrayDelegate^ CreateNewObjectArrayDelegateF(Type^ type);
-        
-        static array<Type^>^ singleIntTypeA = gcnew array<Type^>{ Int32::typeid };
-
-        static Type^ createNewObjectDelegateType = Type::GetType("Apache.Geode.Client.Serializable+CreateNewObjectDelegate");
-        static Type^ createNewObjectArrayDelegateType = Type::GetType("Apache.Geode.Client.Serializable+CreateNewObjectArrayDelegate");
-
-        static array<Type^>^ singleIntType = gcnew array<Type^>(1){Int32::typeid};
-
-        static Object^ CreateObject(String^ className);
-        static Object^ GetArrayObject(String^ className, int len);
-        static Type^ getTypeFromRefrencedAssemblies(String^ className, Dictionary<Assembly^, bool>^ referedAssembly, Assembly^ currentAsm);
-
-        static Dictionary<String^, CreateNewObjectDelegate^>^ ClassNameVsCreateNewObjectDelegate =
-          gcnew Dictionary<String^, CreateNewObjectDelegate^>();
-
-        static Dictionary<String^, CreateNewObjectArrayDelegate^>^ ClassNameVsCreateNewObjectArrayDelegate =
-          gcnew Dictionary<String^, CreateNewObjectArrayDelegate^>();
-
-        static Object^ CreateObjectEx(String^ className);
-        static Object^ GetArrayObjectEx(String^ className, int len);
-        /// <summary>
-        /// Static array of managed <c>WrapperDelegate</c> delegates that
-        /// maintains a mapping of built-in native typeIds to their corresponding
-        /// wrapper type delegates.
-        /// </summary>
-        /// <remarks>
-        /// This is as an array to make lookup as fast as possible, taking
-        /// advantage of the fact that the range of wrapped built-in typeIds is
-        /// small. <b>IMPORTANT:</b> If the built-in native typeIds encompass a
-        /// greater range then change <c>WrapperEnd</c> in this accordingly
-        /// or move to using a Dictionary instead.
-        /// </remarks>
-        static array<WrapperDelegateGeneric^>^ NativeWrappersGeneric =
-          gcnew array<WrapperDelegateGeneric^>(WrapperEndGeneric + 1);
-        literal Byte WrapperEndGeneric = 128;
-
-        /// <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);
-
-        /// <summary>
-        /// Internal static method to remove managed artifacts created by
-        /// RegisterType and RegisterWrapper methods when
-        /// <see cref="DistributedSystem.Disconnect" /> is called.
-        /// </summary>
-        static void UnregisterNativesGeneric();
-
-        /// <summary>
-        /// Static method to lookup the wrapper delegate for a given typeId.
-        /// </summary>
-        /// <param name="typeId">
-        /// The typeId of the native <c>native::Serializable</c> type.
-        /// </param>
-        /// <returns>
-        /// If a managed wrapper is registered for the given typeId then the
-        /// wrapper delegate is returned, else this returns null.
-        /// </returns>
-        inline static WrapperDelegateGeneric^ GetWrapperGeneric(Byte typeId)
-        {
-          if (typeId >= 0 && typeId <= WrapperEndGeneric) {
-            return NativeWrappersGeneric[typeId];
-          }
-          return nullptr;
-        }
-
-				static Serializable()
+        static Serializable()
         {
-          PdxTypeMapper = nullptr;
-          //RegisterPDXManagedCacheableKey();
-
-          {
-          Dictionary<Object^, Object^>^ dic = gcnew Dictionary<Object^, Object^>();
-          ManagedTypeMappingGeneric[dic->GetType()] = native::GeodeTypeIds::CacheableHashMap;
-          ManagedTypeMappingGeneric[dic->GetType()->GetGenericTypeDefinition()] = native::GeodeTypeIds::CacheableHashMap;
-          }
-
-          {
-          System::Collections::ArrayList^ arr = gcnew System::Collections::ArrayList();
-          ManagedTypeMappingGeneric[arr->GetType()] = native::GeodeTypeIds::CacheableVector;
-          }
-		  
-          {
-          System::Collections::Generic::LinkedList<Object^>^ linketList = gcnew  System::Collections::Generic::LinkedList<Object^>();
-          ManagedTypeMappingGeneric[linketList->GetType()] = native::GeodeTypeIds::CacheableLinkedList;
-          ManagedTypeMappingGeneric[linketList->GetType()->GetGenericTypeDefinition()] = native::GeodeTypeIds::CacheableLinkedList;
-          }
-		  
-          {
-          System::Collections::Generic::IList<Object^>^ iList = gcnew System::Collections::Generic::List<Object^>();
-          ManagedTypeMappingGeneric[iList->GetType()] = native::GeodeTypeIds::CacheableArrayList;
-          ManagedTypeMappingGeneric[iList->GetType()->GetGenericTypeDefinition()] = native::GeodeTypeIds::CacheableArrayList;
-          }
-
-          //TODO: Linked list, non generic stack, some other map types and see if more
-
-          {
-            System::Collections::Generic::Stack<Object^>^ stack = gcnew System::Collections::Generic::Stack<Object^>();
-            ManagedTypeMappingGeneric[stack->GetType()] = native::GeodeTypeIds::CacheableStack;
-            ManagedTypeMappingGeneric[stack->GetType()->GetGenericTypeDefinition()] = native::GeodeTypeIds::CacheableStack;
-          }
-          {
-            ManagedTypeMappingGeneric[SByte::typeid] = native::GeodeTypeIds::CacheableByte;
-            ManagedTypeMappingGeneric[Boolean::typeid] = native::GeodeTypeIds::CacheableBoolean;
-            ManagedTypeMappingGeneric[Char::typeid] = native::GeodeTypeIds::CacheableCharacter;
-            ManagedTypeMappingGeneric[Double::typeid] = native::GeodeTypeIds::CacheableDouble;
-            ManagedTypeMappingGeneric[String::typeid] = native::GeodeTypeIds::CacheableASCIIString;
-            ManagedTypeMappingGeneric[float::typeid] = native::GeodeTypeIds::CacheableFloat;
-            ManagedTypeMappingGeneric[Int16::typeid] = native::GeodeTypeIds::CacheableInt16;
-            ManagedTypeMappingGeneric[Int32::typeid] = native::GeodeTypeIds::CacheableInt32;
-            ManagedTypeMappingGeneric[Int64::typeid] = native::GeodeTypeIds::CacheableInt64;
-            ManagedTypeMappingGeneric[Type::GetType("System.Byte[]")] = native::GeodeTypeIds::CacheableBytes;
-            ManagedTypeMappingGeneric[Type::GetType("System.Double[]")] = native::GeodeTypeIds::CacheableDoubleArray;
-            ManagedTypeMappingGeneric[Type::GetType("System.Single[]")] = native::GeodeTypeIds::CacheableFloatArray;
-            ManagedTypeMappingGeneric[Type::GetType("System.Int16[]")] = native::GeodeTypeIds::CacheableInt16Array;
-            ManagedTypeMappingGeneric[Type::GetType("System.Int32[]")] = native::GeodeTypeIds::CacheableInt32Array;
-            ManagedTypeMappingGeneric[Type::GetType("System.Int64[]")] = native::GeodeTypeIds::CacheableInt64Array;
-            ManagedTypeMappingGeneric[Type::GetType("System.String[]")] = native::GeodeTypeIds::CacheableStringArray;
-            ManagedTypeMappingGeneric[Type::GetType("System.DateTime")] = native::GeodeTypeIds::CacheableDate;
-            ManagedTypeMappingGeneric[Type::GetType("System.Collections.Hashtable")] = native::GeodeTypeIds::CacheableHashTable;
-          }
+          
         }
 
         protected:
diff --git a/clicache/src/Struct.cpp b/clicache/src/Struct.cpp
index aee6b54..4339412 100644
--- a/clicache/src/Struct.cpp
+++ b/clicache/src/Struct.cpp
@@ -40,7 +40,7 @@ namespace Apache
       {
         try
         {
-          return (Serializable::GetManagedValueGeneric<Object^>(
+          return (TypeRegistry::GetManagedValueGeneric<Object^>(
             static_cast<native::Struct*>(m_nativeptr->get())->operator[](static_cast<System::Int32>(index))));
         }
         finally
@@ -53,7 +53,7 @@ namespace Apache
       {
         try
         {
-          return (Serializable::GetManagedValueGeneric<Object^>(
+          return (TypeRegistry::GetManagedValueGeneric<Object^>(
             static_cast<native::Struct*>(m_nativeptr->get())->operator[](marshal_as<std::string>(fieldName))));
         }
         finally
@@ -104,7 +104,7 @@ namespace Apache
       {
         try
         {
-          return (Serializable::GetManagedValueGeneric<Object^>(
+          return (TypeRegistry::GetManagedValueGeneric<Object^>(
             static_cast<native::Struct*>(m_nativeptr->get())->next()));
         }
         finally
diff --git a/clicache/src/StructSet.cpp b/clicache/src/StructSet.cpp
index b7b4a58..769e3e5 100644
--- a/clicache/src/StructSet.cpp
+++ b/clicache/src/StructSet.cpp
@@ -62,7 +62,7 @@ namespace Apache
       {
         try
         {
-          return Serializable::GetManagedValueGeneric<TResult>((m_nativeptr->get()->operator[](static_cast<System::Int32>(index))));
+          return TypeRegistry::GetManagedValueGeneric<TResult>((m_nativeptr->get()->operator[](static_cast<System::Int32>(index))));
         }
         finally
         {
diff --git a/clicache/src/TransactionWriterAdapte.hpp b/clicache/src/TransactionWriterAdapter.hpp
similarity index 100%
rename from clicache/src/TransactionWriterAdapte.hpp
rename to clicache/src/TransactionWriterAdapter.hpp
diff --git a/clicache/src/TypeRegistry.cpp b/clicache/src/TypeRegistry.cpp
new file mode 100644
index 0000000..3fa919e
--- /dev/null
+++ b/clicache/src/TypeRegistry.cpp
@@ -0,0 +1,716 @@
+/*
+ * 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.
+ */
+
+#include "begin_native.hpp"
+#include <geode/Cache.hpp>
+#include <geode/PoolManager.hpp>
+#include "SerializationRegistry.hpp"
+#include "CacheRegionHelper.hpp"
+#include "end_native.hpp"
+
+#include "TypeRegistry.hpp"
+#include "impl/DelegateWrapper.hpp"
+#include "DataOutput.hpp"
+#include "DataInput.hpp"
+#include "CacheableStringArray.hpp"
+#include "CacheableBuiltins.hpp"
+#include "impl/SafeConvert.hpp"
+#include "CacheableHashTable.hpp"
+#include "Struct.hpp"
+#include "CacheableUndefined.hpp"
+#include "CacheableObject.hpp"
+#include "CacheableStack.hpp"
+#include "CacheableObjectXml.hpp"
+#include "CacheableHashSet.hpp"
+#include "CacheableObjectArray.hpp"
+#include "CacheableLinkedList.hpp"
+#include "CacheableFileName.hpp"
+#include "CacheableIdentityHashMap.hpp"
+#include "IPdxSerializer.hpp"
+#include "impl/DotNetTypes.hpp"
+#include "CacheRegionHelper.hpp"
+#include "Cache.hpp"
+
+using namespace apache::geode::client;
+using namespace System::Reflection;
+using namespace System::Reflection::Emit;
+
+namespace Apache
+{
+  namespace Geode
+  {
+    namespace Client
+    {
+      namespace native = apache::geode::client;
+
+      String^ TypeRegistry::GetPdxTypeName(String^ localTypeName)
+      {
+        if (pdxTypeMapper == nullptr)
+        {
+          return localTypeName;
+        }
+
+        String^ pdxTypeName;
+        if (localTypeNameToPdx->TryGetValue(localTypeName, pdxTypeName)) {
+          return pdxTypeName;
+        }
+
+
+        pdxTypeName = pdxTypeMapper->ToPdxTypeName(localTypeName);
+        if (pdxTypeName == nullptr)
+        {
+          throw gcnew IllegalStateException("PdxTypeName should not be null for local type " + localTypeName);
+        }
+
+        localTypeNameToPdx[localTypeName] = pdxTypeName;
+        pdxTypeNameToLocal[pdxTypeName] = localTypeName;
+
+        return pdxTypeName;
+      }
+
+      String^ TypeRegistry::GetLocalTypeName(String^ pdxTypeName)
+      {
+        if (pdxTypeMapper == nullptr)
+        {
+          return pdxTypeName;
+        }
+
+        String^ localTypeName;
+        if (pdxTypeNameToLocal->TryGetValue(pdxTypeName, localTypeName))
+        {
+          return localTypeName;
+        }
+
+        localTypeName = pdxTypeMapper->FromPdxTypeName(pdxTypeName);
+        if (localTypeName == nullptr)
+        {
+          throw gcnew IllegalStateException("LocalTypeName should not be null for pdx type " + pdxTypeName);
+        }
+
+        localTypeNameToPdx[localTypeName] = pdxTypeName;
+        pdxTypeNameToLocal[pdxTypeName] = localTypeName;
+
+        return localTypeName;
+      }
+
+      Type^ TypeRegistry::GetType(String^ className)
+      {
+        Type^ type = nullptr;
+
+        if (classNameVsType->TryGetValue(className, type)) {
+          return type;
+        }
+
+        auto referedAssembly = gcnew Dictionary<Assembly^, bool>();
+        auto MyDomain = AppDomain::CurrentDomain;
+        array<Assembly^>^ AssembliesLoaded = MyDomain->GetAssemblies();
+        for each(Assembly^ assembly in AssembliesLoaded)
+        {
+          type = GetTypeFromRefrencedAssemblies(className, referedAssembly, assembly);
+          if (type) {
+            classNameVsType[className] = type;
+            return type;
+          }
+        }
+        
+        return type;
+      }
+
+      void TypeRegistry::RegisterPdxType(PdxTypeFactoryMethod^ creationMethod)
+      {
+        if (creationMethod == nullptr) {
+          throw gcnew IllegalArgumentException("Serializable.RegisterPdxType(): "
+            "null PdxTypeFactoryMethod delegate passed");
+        }
+        IPdxSerializable^ obj = creationMethod();
+        PdxDelegateMap[obj->GetType()->FullName] = creationMethod;
+        Log::Debug("RegisterPdxType: class registered: " + obj->GetType()->FullName);
+      }
+
+      IPdxSerializable^ TypeRegistry::GetPdxType(String^ className)
+      {
+        PdxTypeFactoryMethod^ retVal = nullptr;
+
+        if (!PdxDelegateMap->TryGetValue(className, retVal))
+        {
+          if (pdxSerializer != nullptr)
+          {
+            return gcnew PdxWrapper(className);
+          }
+          try
+          {
+            Object^ retObj = CreateObject(className);
+
+            IPdxSerializable^ retPdx = dynamic_cast<IPdxSerializable^>(retObj);
+            if (retPdx != nullptr)
+            {
+              return retPdx;
+            }
+          }
+          catch (System::Exception^ ex)
+          {
+            Log::Error("Unable to create object using reflection for class: " + className + " : " + ex->Message);
+          }
+          throw gcnew IllegalStateException("Pdx factory method (or PdxSerializer ) not registered (or don't have zero arg constructor)"
+            " to create default instance for class: " + className);
+        }
+
+        return retVal();
+      }
+
+      void TypeRegistry::RegisterTypeGeneric(TypeFactoryMethodGeneric^ creationMethod)
+      {
+        if (creationMethod == nullptr) {
+          throw gcnew IllegalArgumentException("Serializable.RegisterType(): "
+            "null TypeFactoryMethod delegate passed");
+        }
+
+        //--------------------------------------------------------------
+
+        auto typeRegistry = m_cache->TypeRegistry;
+
+        //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 delegateObj = gcnew DelegateWrapperGeneric(creationMethod);
+        auto nativeDelegate = gcnew TypeFactoryNativeMethodGeneric(delegateObj,
+            &DelegateWrapperGeneric::NativeDelegateGeneric);
+
+        // this is avoid object being Gced
+        m_cache->TypeRegistry->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;
+
+        _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());
+
+        _GF_MG_EXCEPTION_CATCH_ALL2
+      }
+
+      void TypeRegistry::RegisterTypeGeneric(Byte typeId,
+        TypeFactoryMethodGeneric^ creationMethod, Type^ type)
+      {
+        if (creationMethod == nullptr) {
+          throw gcnew IllegalArgumentException("Serializable.RegisterType(): ");
+        }
+        DelegateWrapperGeneric^ delegateObj = gcnew DelegateWrapperGeneric(creationMethod);
+        TypeFactoryNativeMethodGeneric^ nativeDelegate =
+          gcnew TypeFactoryNativeMethodGeneric(delegateObj,
+            &DelegateWrapperGeneric::NativeDelegateGeneric);
+
+        m_cache->TypeRegistry->BuiltInDelegatesGeneric[typeId] = nativeDelegate;
+
+        if (type != nullptr)
+        {
+          m_cache->TypeRegistry->ManagedTypeToTypeId[type] = typeId;
+        }
+
+        auto typeRegistry = m_cache->TypeRegistry;
+
+        //This is hashmap for manged builtin objects
+        if (!typeRegistry->ManagedDelegatesGeneric->ContainsKey(typeId + 0x80000000))
+        {
+          typeRegistry->ManagedDelegatesGeneric->Add(typeId + 0x80000000, creationMethod);
+        }
+
+        // register the type in the DelegateMap
+        IGeodeSerializable^ tmp = creationMethod();
+        Log::Finer("Registering(,) serializable class ID " + tmp->ClassId);
+        m_cache->TypeRegistry->DelegateMapGeneric[tmp->ClassId] = creationMethod;
+
+        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());
+          }
+
+        }
+        catch (native::IllegalStateException&)
+        {
+          //ignore it as this is internal only
+        }
+      }
+
+      void TypeRegistry::UnregisterTypeGeneric(Byte typeId)
+      {
+        BuiltInDelegatesGeneric->Remove(typeId);
+        _GF_MG_EXCEPTION_TRY2
+
+          CacheRegionHelper::getCacheImpl(m_cache->GetNative().get())->getSerializationRegistry()->removeType(typeId);
+
+        _GF_MG_EXCEPTION_CATCH_ALL2
+      }
+
+      void TypeRegistry::RegisterWrapperGeneric(
+        WrapperDelegateGeneric^ wrapperMethod, Byte typeId, System::Type^ type)
+      {
+        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;
+      }
+
+      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();
+      }
+
+      Type^ TypeRegistry::GetTypeFromRefrencedAssemblies(String^ className, Dictionary<Assembly^, bool>^ referedAssembly, Assembly^ currentAssembly)
+      {
+        auto type = currentAssembly->GetType(className);
+        if (type != nullptr)
+        {          
+          return type;
+        }
+
+        if (referedAssembly->ContainsKey(currentAssembly))
+          return nullptr;
+        referedAssembly[currentAssembly] = true;
+
+        //get all refrenced assembly
+        array<AssemblyName^>^ ReferencedAssemblies = currentAssembly->GetReferencedAssemblies();
+        for each(AssemblyName^ assembly in ReferencedAssemblies)
+        {
+          try
+          {
+            Assembly^ loadedAssembly = Assembly::Load(assembly);
+            if (loadedAssembly != nullptr && (!referedAssembly->ContainsKey(loadedAssembly)))
+            {
+              type = GetTypeFromRefrencedAssemblies(className, referedAssembly, loadedAssembly);
+              if (!type) {
+                return type;
+              }
+            }
+          }
+          catch (System::Exception^){//ignore
+          }
+        }
+        return nullptr;
+      }
+
+      generic<class TValue>
+        TValue TypeRegistry::GetManagedValueGeneric(std::shared_ptr<native::Serializable> val)
+        {
+          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);
+          }
+          case native::GeodeTypeIds::CacheableBytes:
+          {
+            Apache::Geode::Client::CacheableBytes^ ret = safe_cast<Apache::Geode::Client::CacheableBytes ^>
+              (SafeGenericUMSerializableConvert<Apache::Geode::Client::CacheableBytes^>(val));
+
+            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));
+
+            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));
+
+            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));
+
+            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));
+
+            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));
+
+            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));
+
+            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));
+
+            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));
+
+            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));
+
+            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));
+
+            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));
+            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));
+            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));
+            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));
+            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));
+            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));
+            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));
+            return safe_cast<TValue>(ret);
+          }
+          case native::GeodeTypeIds::Struct:
+          {
+            return safe_cast<TValue>(Apache::Geode::Client::Struct::Create(val));
+          }
+          case native::GeodeTypeIds::CacheableStack:
+          {
+            Apache::Geode::Client::CacheableStack^ ret = static_cast<Apache::Geode::Client::CacheableStack^>
+              (SafeGenericUMSerializableConvert<Apache::Geode::Client::CacheableStack^>(val));
+            return safe_cast<TValue>(ret->Value);
+          }
+          case 7: //GeodeClassIds::CacheableManagedObject
+          {
+            Apache::Geode::Client::CacheableObject^ ret = static_cast<Apache::Geode::Client::CacheableObject^>
+              (SafeGenericUMSerializableConvert<Apache::Geode::Client::CacheableObject^>(val));
+            return safe_cast<TValue>(ret);
+          }
+          case 8://GeodeClassIds::CacheableManagedObjectXml
+          {
+            Apache::Geode::Client::CacheableObjectXml^ ret = static_cast<Apache::Geode::Client::CacheableObjectXml^>
+              (SafeGenericUMSerializableConvert<Apache::Geode::Client::CacheableObjectXml^>(val));
+            return safe_cast<TValue>(ret);
+          }
+          /*  TODO: replace with IDictionary<K, V>
+          case native::GeodeTypeIds::Properties:
+          {
+          Apache::Geode::Client::Properties^ ret = safe_cast<Apache::Geode::Client::Properties^>
+          ( SafeGenericUMSerializableConvert<Apache::Geode::Client::Properties^>(val));
+
+          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));
+
+            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));
+
+            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));
+            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)
+        {
+          Object^ retVal = CreateObjectEx(className);
+
+          if (retVal == nullptr)
+          {
+            auto type = GetType(className);
+            if (type)
+            {
+              retVal = type->GetConstructor(Type::EmptyTypes)->Invoke(nullptr);
+              return retVal;
+            }
+          }
+          return retVal;
+        }
+
+        Object^ TypeRegistry::CreateObjectEx(String^ className)
+        {
+          CreateNewObjectDelegate^ del = nullptr;
+          Dictionary<String^, CreateNewObjectDelegate^>^ tmp = ClassNameVsCreateNewObjectDelegate;
+
+          tmp->TryGetValue(className, del);
+
+          if (del != nullptr)
+          {
+            return del();
+          }
+          auto type = GetType(className);
+          if (type)
+          {
+            msclr::lock lockInstance(ClassNameVsCreateNewObjectLockObj);
+            {
+              tmp = ClassNameVsCreateNewObjectDelegate;
+              tmp->TryGetValue(className, del);
+              if (del != nullptr)
+                return del();
+              del = CreateNewObjectDelegateF(type);
+              ClassNameVsCreateNewObjectDelegate[className] = del;
+              return del();
+            }
+          }
+          return nullptr;
+        }
+
+        Object^ TypeRegistry::GetArrayObject(String^ className, int length)
+        {
+          Object^ retArr = GetArrayObjectEx(className, length);
+          if (retArr == nullptr)
+          {
+            Type^ type = GetType(className);
+            if (type)
+            {
+              retArr = type->MakeArrayType()->GetConstructor(singleIntType)->Invoke(gcnew array<Object^>(1) { length });
+              return retArr;
+            }
+          }
+          return retArr;
+        }
+
+        Object^ TypeRegistry::GetArrayObjectEx(String^ className, int length)
+        {
+          CreateNewObjectArrayDelegate^ del = nullptr;
+          Dictionary<String^, CreateNewObjectArrayDelegate^>^ tmp = ClassNameVsCreateNewObjectArrayDelegate;
+
+          tmp->TryGetValue(className, del);
+
+          if (del != nullptr)
+          {
+            return del(length);
+          }
+
+          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;
+        }
+
+        //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();
+
+          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");
+          }
+
+          il->Emit(OpCodes::Newobj, ctorInfo);
+          il->Emit(OpCodes::Ret);
+
+          return (TypeRegistry::CreateNewObjectDelegate^)dynam->CreateDelegate(createNewObjectDelegateType);
+        }
+
+        //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::Ldarg_0);
+
+          il->Emit(OpCodes::Newarr, type);
+          il->Emit(OpCodes::Ret);
+
+          return (TypeRegistry::CreateNewObjectArrayDelegate^)dynam->CreateDelegate(createNewObjectArrayDelegateType);
+        }
+
+
+    }  // namespace Client
+  }  // namespace Geode
+}  // namespace Apache
diff --git a/clicache/src/TypeRegistry.hpp b/clicache/src/TypeRegistry.hpp
new file mode 100644
index 0000000..78e2d19
--- /dev/null
+++ b/clicache/src/TypeRegistry.hpp
@@ -0,0 +1,318 @@
+/*
+ * 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 "IPdxSerializer.hpp"
+#include "Serializable.hpp"
+#include <geode/CacheableBuiltins.hpp>
+
+
+
+namespace Apache
+{
+  namespace Geode
+  {
+    namespace Client
+    {
+
+      using namespace System::Collections::Concurrent;
+      using namespace System::Reflection;
+
+      namespace native = apache::geode::client;
+      
+      ref class Cache;
+
+      public ref class TypeRegistry
+      {
+      public:
+        TypeRegistry(Cache^ cache) : m_cache(cache)
+        {
+          ClassNameVsCreateNewObjectLockObj = gcnew Object();
+
+          singleIntTypeA = gcnew array<Type^>{ Int32::typeid };
+          singleIntType = gcnew array<Type^>(1) { Int32::typeid };
+
+          ClassNameVsCreateNewObjectDelegate =
+            gcnew Dictionary<String^, CreateNewObjectDelegate^>();
+          ClassNameVsCreateNewObjectArrayDelegate =
+            gcnew Dictionary<String^, CreateNewObjectArrayDelegate^>();
+
+          createNewObjectDelegateType = Type::GetType("Apache.Geode.Client.TypeRegistry+CreateNewObjectDelegate");
+          createNewObjectArrayDelegateType = Type::GetType("Apache.Geode.Client.TypeRegistry+CreateNewObjectArrayDelegate");
+        }
+
+        property IPdxSerializer^ PdxSerializer
+        {
+          IPdxSerializer^ get() {
+            return pdxSerializer; 
+          }
+
+          void set(IPdxSerializer^ pdxSerializer) {
+            this->pdxSerializer = pdxSerializer; 
+          }
+        }
+
+        /// <summary>
+        /// Register an PdxTypeMapper to map the local types to pdx types
+        /// </summary>
+        property IPdxTypeMapper^ PdxTypeMapper
+        {
+          IPdxTypeMapper^ get()
+          {
+            return pdxTypeMapper;
+          }
+
+          void set(IPdxTypeMapper^ pdxTypeMapper)
+          {
+            this->pdxTypeMapper = pdxTypeMapper;
+          }
+        }
+
+        String^ GetPdxTypeName(String^ localTypeName);
+ 
+        String^ GetLocalTypeName(String^ pdxTypeName);
+
+        Type^ GetType(String^ className);
+
+        /// <summary>
+        /// Register an instance factory method for a given type.
+        /// This should be used when registering types that implement
+        /// IPdxSerializable.
+        /// </summary>
+        /// <param name="creationMethod">
+        /// the creation function to register
+        /// </param>
+        /// <exception cref="IllegalArgumentException">
+        /// if the method is null
+        /// </exception>
+
+        void RegisterPdxType(PdxTypeFactoryMethod^ creationMethod);
+
+        IPdxSerializable^ GetPdxType(String^ className);
+
+        /// <summary>
+        /// Register an instance factory method for a given type.
+        /// This should be used when registering types that implement
+        /// IGeodeSerializable.
+        /// </summary>
+        /// <param name="creationMethod">
+        /// the creation function to register
+        /// </param>
+        /// <exception cref="IllegalArgumentException">
+        /// if the method is null
+        /// </exception>
+        /// <exception cref="IllegalStateException">
+        /// if the typeId has already been registered, or there is an error
+        /// in registering the type; check <c>Utils::LastError</c> for more
+        /// information in the latter case.
+        /// </exception>
+        void RegisterTypeGeneric(TypeFactoryMethodGeneric^ 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);
+
+
+        /// <summary>
+        /// Unregister the type with the given typeId
+        /// </summary>
+        /// <param name="typeId">typeId of the type to unregister.</param>
+        void UnregisterTypeGeneric(Byte typeId);
+
+        /// <summary>
+        /// This is to get manged delegates.
+        /// </summary>
+        TypeFactoryMethodGeneric^ GetManagedDelegateGeneric(System::Int64 typeId)
+        {
+          TypeFactoryMethodGeneric^ 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);
+
+        /// <summary>
+        /// Internal static method to remove managed artifacts created by
+        /// RegisterType and RegisterWrapper methods when
+        /// <see cref="DistributedSystem.Disconnect" /> is called.
+        /// </summary>
+        static void UnregisterNativesGeneric(Cache^ cache);
+
+        void Clear()
+        {
+          pdxTypeNameToLocal->Clear();
+          localTypeNameToPdx->Clear();
+          classNameVsType->Clear();
+          ClassNameVsCreateNewObjectDelegate->Clear();
+          ClassNameVsCreateNewObjectArrayDelegate->Clear();
+        }
+
+        static Byte GetManagedTypeMappingGeneric(Type^ type)
+        {
+          Byte retVal = 0;
+          ManagedTypeToTypeId->TryGetValue(type, retVal);
+          return retVal;
+        }
+
+        static inline WrapperDelegateGeneric^ GetWrapperGeneric(Byte typeId)
+        {
+          if (typeId >= 0 && typeId <= WrapperEndGeneric) {
+            return NativeWrappersGeneric[typeId];
+          }
+          return nullptr;
+        }
+        
+        delegate Object^ CreateNewObjectDelegate();
+        CreateNewObjectDelegate^ CreateNewObjectDelegateF(Type^ type);
+
+        delegate Object^ CreateNewObjectArrayDelegate(int len);
+        CreateNewObjectArrayDelegate^ CreateNewObjectArrayDelegateF(Type^ type);
+
+        Object^ CreateObject(String^ className);
+        Object^ GetArrayObject(String^ className, int length);
+
+        Object^ CreateObjectEx(String^ className);
+        Object^ GetArrayObjectEx(String^ className, int length);
+
+      private:
+        Cache^ m_cache;
+        IPdxSerializer^ pdxSerializer;
+        IPdxTypeMapper^ pdxTypeMapper;
+        ConcurrentDictionary<String^, String^>^ pdxTypeNameToLocal =
+          gcnew ConcurrentDictionary<String^, String^>();
+        ConcurrentDictionary<String^, String^>^ localTypeNameToPdx =
+          gcnew ConcurrentDictionary<String^, String^>();
+        ConcurrentDictionary<String^, Type^>^ classNameVsType =
+          gcnew ConcurrentDictionary<String^, Type^>();
+        Dictionary<String^, PdxTypeFactoryMethod^>^ PdxDelegateMap =
+          gcnew Dictionary<String^, PdxTypeFactoryMethod^>();
+
+        Dictionary<System::Int64, TypeFactoryMethodGeneric^>^ ManagedDelegatesGeneric =
+          gcnew Dictionary<System::Int64, TypeFactoryMethodGeneric^>();
+        List<TypeFactoryNativeMethodGeneric^>^ NativeDelegatesGeneric =
+          gcnew List<TypeFactoryNativeMethodGeneric^>();
+        Dictionary<UInt32, TypeFactoryMethodGeneric^>^ DelegateMapGeneric =
+          gcnew Dictionary<UInt32, TypeFactoryMethodGeneric^>();
+
+        Dictionary<Byte, TypeFactoryNativeMethodGeneric^>^ BuiltInDelegatesGeneric =
+          gcnew Dictionary<Byte, TypeFactoryNativeMethodGeneric^>();
+
+        // Fixed .NET to DSCode mapping
+        static Dictionary<System::Type^, Byte>^ ManagedTypeToTypeId =
+          gcnew Dictionary<System::Type^, Byte>();
+
+        literal Byte WrapperEndGeneric = 128;
+        static array<WrapperDelegateGeneric^>^ NativeWrappersGeneric =
+          gcnew array<WrapperDelegateGeneric^>(WrapperEndGeneric + 1);
+
+        Type^ GetTypeFromRefrencedAssemblies(String^ className, Dictionary<Assembly^, bool>^ referedAssembly, Assembly^ currentAssembly);
+        
+        Object^ ClassNameVsCreateNewObjectLockObj;
+        
+        array<Type^>^ singleIntTypeA;
+        array<Type^>^ singleIntType;
+        
+        Dictionary<String^, CreateNewObjectDelegate^>^ ClassNameVsCreateNewObjectDelegate;
+                Dictionary<String^, CreateNewObjectArrayDelegate^>^ ClassNameVsCreateNewObjectArrayDelegate;
+        
+        Type^ createNewObjectDelegateType;
+        Type^ createNewObjectArrayDelegateType;
+
+        static TypeRegistry()
+        {
+          InitializeManagedTypeToTypeId();
+        }
+
+        /// <summary>
+        /// Initializes a static map of .NET types to DataSerializable codes. Internally
+        /// we call it TypeId.
+        /// </summary>
+        static void InitializeManagedTypeToTypeId()
+        {
+          Dictionary<Object^, Object^>^ dic = gcnew Dictionary<Object^, Object^>();
+          ManagedTypeToTypeId[dic->GetType()] = native::GeodeTypeIds::CacheableHashMap;
+          ManagedTypeToTypeId[dic->GetType()->GetGenericTypeDefinition()] = native::GeodeTypeIds::CacheableHashMap;
+
+          System::Collections::ArrayList^ arr = gcnew System::Collections::ArrayList();
+          ManagedTypeToTypeId[arr->GetType()] = native::GeodeTypeIds::CacheableVector;
+
+          System::Collections::Generic::LinkedList<Object^>^ linketList = gcnew  System::Collections::Generic::LinkedList<Object^>();
+          ManagedTypeToTypeId[linketList->GetType()] = native::GeodeTypeIds::CacheableLinkedList;
+          ManagedTypeToTypeId[linketList->GetType()->GetGenericTypeDefinition()] = native::GeodeTypeIds::CacheableLinkedList;
+
+          System::Collections::Generic::IList<Object^>^ iList = gcnew System::Collections::Generic::List<Object^>();
+          ManagedTypeToTypeId[iList->GetType()] = native::GeodeTypeIds::CacheableArrayList;
+          ManagedTypeToTypeId[iList->GetType()->GetGenericTypeDefinition()] = native::GeodeTypeIds::CacheableArrayList;
+
+          //TODO: Linked list, non generic stack, some other map types and see if more
+
+          System::Collections::Generic::Stack<Object^>^ stack = gcnew System::Collections::Generic::Stack<Object^>();
+          ManagedTypeToTypeId[stack->GetType()] = native::GeodeTypeIds::CacheableStack;
+          ManagedTypeToTypeId[stack->GetType()->GetGenericTypeDefinition()] = native::GeodeTypeIds::CacheableStack;
+
+          ManagedTypeToTypeId[SByte::typeid] = native::GeodeTypeIds::CacheableByte;
+          ManagedTypeToTypeId[Boolean::typeid] = native::GeodeTypeIds::CacheableBoolean;
+          ManagedTypeToTypeId[Char::typeid] = native::GeodeTypeIds::CacheableCharacter;
+          ManagedTypeToTypeId[Double::typeid] = native::GeodeTypeIds::CacheableDouble;
+          ManagedTypeToTypeId[String::typeid] = native::GeodeTypeIds::CacheableASCIIString;
+          ManagedTypeToTypeId[float::typeid] = native::GeodeTypeIds::CacheableFloat;
+          ManagedTypeToTypeId[Int16::typeid] = native::GeodeTypeIds::CacheableInt16;
+          ManagedTypeToTypeId[Int32::typeid] = native::GeodeTypeIds::CacheableInt32;
+          ManagedTypeToTypeId[Int64::typeid] = native::GeodeTypeIds::CacheableInt64;
+          ManagedTypeToTypeId[Type::GetType("System.Byte[]")] = native::GeodeTypeIds::CacheableBytes;
+          ManagedTypeToTypeId[Type::GetType("System.Double[]")] = native::GeodeTypeIds::CacheableDoubleArray;
+          ManagedTypeToTypeId[Type::GetType("System.Single[]")] = native::GeodeTypeIds::CacheableFloatArray;
+          ManagedTypeToTypeId[Type::GetType("System.Int16[]")] = native::GeodeTypeIds::CacheableInt16Array;
+          ManagedTypeToTypeId[Type::GetType("System.Int32[]")] = native::GeodeTypeIds::CacheableInt32Array;
+          ManagedTypeToTypeId[Type::GetType("System.Int64[]")] = native::GeodeTypeIds::CacheableInt64Array;
+          ManagedTypeToTypeId[Type::GetType("System.String[]")] = native::GeodeTypeIds::CacheableStringArray;
+          ManagedTypeToTypeId[Type::GetType("System.DateTime")] = native::GeodeTypeIds::CacheableDate;
+          ManagedTypeToTypeId[Type::GetType("System.Collections.Hashtable")] = native::GeodeTypeIds::CacheableHashTable;
+        }
+
+      };
+    }  // namespace Client
+  }  // namespace Geode
+}  // namespace Apache
+
diff --git a/clicache/src/impl/CacheLoader.hpp b/clicache/src/impl/CacheLoader.hpp
index c7c1af7..29f4822 100644
--- a/clicache/src/impl/CacheLoader.hpp
+++ b/clicache/src/impl/CacheLoader.hpp
@@ -66,9 +66,9 @@ namespace Apache
           {
             IRegion<TKey, TValue>^ gregion = Region<TKey, TValue>::Create(&region);
 
-            TKey gkey = Serializable::GetManagedValueGeneric<TKey>(key);
+            TKey gkey = TypeRegistry::GetManagedValueGeneric<TKey>(key);
 
-            Object^ ghelper = Serializable::GetManagedValueGeneric<Object^>(helper);
+            Object^ ghelper = TypeRegistry::GetManagedValueGeneric<Object^>(helper);
 
             return Serializable::GetUnmanagedValueGeneric<TValue>(m_loader->Load(gregion, gkey, ghelper));
           }
diff --git a/clicache/src/impl/EnumInfo.cpp b/clicache/src/impl/EnumInfo.cpp
index 0a7abeb..de94db4 100755
--- a/clicache/src/impl/EnumInfo.cpp
+++ b/clicache/src/impl/EnumInfo.cpp
@@ -22,6 +22,9 @@
 #include "EnumInfo.hpp"
 #include "../DataOutput.hpp"
 #include "../DataInput.hpp"
+#include "../Cache.hpp"
+#include "../TypeRegistry.hpp"
+
 using namespace System;
 
 namespace Apache
@@ -47,10 +50,10 @@ namespace Apache
           _hashcode = input->ReadInt32();
         }
 
-       Object^ EnumInfo::GetEnum()
+       Object^ EnumInfo::GetEnum(Cache^ cache)
        {
-         String^ tmp = Serializable::GetLocalTypeName(_enumClassName);
-         Type^ t = Serializable::GetType(tmp);
+         String^ tmp = cache->TypeRegistry->GetLocalTypeName(_enumClassName);
+         Type^ t = cache->TypeRegistry->GetType(tmp);
          Object^ obj = Enum::Parse(t, _enumName);
 
          return obj;
diff --git a/clicache/src/impl/EnumInfo.hpp b/clicache/src/impl/EnumInfo.hpp
index c2db651..133376d 100755
--- a/clicache/src/impl/EnumInfo.hpp
+++ b/clicache/src/impl/EnumInfo.hpp
@@ -28,6 +28,7 @@ namespace Apache
   {
     namespace Client
     {
+      ref class Cache;
 
       namespace Internal
       {
@@ -95,7 +96,7 @@ namespace Apache
             return false;
           }
 
-          Object^ GetEnum();
+          Object^ GetEnum(Cache^ cache);
 
         };
       }  // namespace Client
diff --git a/clicache/src/impl/ManagedResultCollector.cpp b/clicache/src/impl/ManagedResultCollector.cpp
index 906bc18..7b11434 100644
--- a/clicache/src/impl/ManagedResultCollector.cpp
+++ b/clicache/src/impl/ManagedResultCollector.cpp
@@ -148,7 +148,7 @@ namespace apache
       void ManagedResultCollectorGeneric::addResult(const std::shared_ptr<Cacheable>& result)
       {
         try {
-          Object^ rs = Apache::Geode::Client::Serializable::GetManagedValueGeneric<Object^>(result);
+          Object^ rs = Apache::Geode::Client::TypeRegistry::GetManagedValueGeneric<Object^>(result);
           m_managedptr->AddResult(rs);
         }
         catch (Apache::Geode::Client::GeodeException^ ex) {
diff --git a/clicache/src/impl/PdxHelper.cpp b/clicache/src/impl/PdxHelper.cpp
index ba604a2..2da7a4b 100644
--- a/clicache/src/impl/PdxHelper.cpp
+++ b/clicache/src/impl/PdxHelper.cpp
@@ -92,7 +92,9 @@ namespace Apache
             pdxType = pdxObject->GetType();
           }
   
-          pdxClassname = Serializable::GetPdxTypeName(pdxType->FullName);        
+          auto cache = dataOutput->Cache;
+
+          pdxClassname = cache->TypeRegistry->GetPdxTypeName(pdxType->FullName);
           PdxType^ localPdxType = dataOutput->Cache->GetPdxTypeRegistry()->GetLocalPdxType(pdxClassname);         
 
           if(localPdxType == nullptr)
@@ -111,8 +113,8 @@ namespace Apache
 
             ptc->EndObjectWriting();//now write typeid
 
-            dataOutput->Cache->GetPdxTypeRegistry()->AddLocalPdxType(pdxClassname, nType);//add classname VS pdxType
-            dataOutput->Cache->GetPdxTypeRegistry()->AddPdxType(nTypeId, nType);//add typeid vs pdxtype
+            cache->GetPdxTypeRegistry()->AddLocalPdxType(pdxClassname, nType);//add classname VS pdxType
+            cache->GetPdxTypeRegistry()->AddPdxType(nTypeId, nType);//add typeid vs pdxtype
 
             //This is for pdx Statistics
             System::Byte* stPos = dataOutput->GetStartBufferPosition() + ptc->getStartPositionOffset();
@@ -124,14 +126,14 @@ namespace Apache
           else//we know locasl type, need to see preerved data
           {
             //if object got from server than create instance of RemoteWriter otherwise local writer.
-            PdxRemotePreservedData^ pd = dataOutput->Cache->GetPdxTypeRegistry()->GetPreserveData(pdxObject);
+            auto pd = cache->GetPdxTypeRegistry()->GetPreserveData(pdxObject);
 
             //now always remotewriter as we have API Read/WriteUnreadFields 
 						//so we don't know whether user has used those or not;; Can we do some trick here?
             PdxRemoteWriter^ prw = nullptr;
             if(pd != nullptr)
             {
-              PdxType^ mergedPdxType = dataOutput->Cache->GetPdxTypeRegistry()->GetPdxType(pd->MergedTypeId);
+              PdxType^ mergedPdxType = cache->GetPdxTypeRegistry()->GetPdxType(pd->MergedTypeId);
             
               prw = gcnew PdxRemoteWriter(dataOutput, mergedPdxType, pd);
             }
@@ -157,24 +159,25 @@ namespace Apache
         IPdxSerializable^ PdxHelper::DeserializePdx(DataInput^ dataInput, bool forceDeserialize, int typeId, int len, const native::SerializationRegistry* serializationRegistry)
         {
           dataInput->setPdxdeserialization(true);
-           String^ pdxClassname = nullptr;
-           String^ pdxDomainClassname = nullptr; 
+          String^ pdxClassname = nullptr;
+          String^ pdxDomainClassname = nullptr; 
           IPdxSerializable^ pdxObject = nullptr;
-            dataInput->AdvanceUMCursor();//it will increase the cursor in c++ layer
-            dataInput->SetBuffer();//it will c++ buffer in cli layer
+          dataInput->AdvanceUMCursor();//it will increase the cursor in c++ layer
+          dataInput->SetBuffer();//it will c++ buffer in cli layer
 
-            PdxType^ pType = dataInput->Cache->GetPdxTypeRegistry()->GetPdxType(typeId);
+            auto cache = dataInput->Cache;
+            PdxType^ pType = cache->GetPdxTypeRegistry()->GetPdxType(typeId);
             PdxType^ pdxLocalType = nullptr;
 
             if(pType != nullptr)//this may happen with PdxInstanceFactory
-              pdxLocalType = dataInput->Cache->GetPdxTypeRegistry()->GetLocalPdxType(pType->PdxClassName);//this should be fine for IPdxTypeMapper
+              pdxLocalType = cache->GetPdxTypeRegistry()->GetLocalPdxType(pType->PdxClassName);//this should be fine for IPdxTypeMapper
 
             if(pType != nullptr && pdxLocalType != nullptr)//type found 
             {
               pdxClassname = pType->PdxClassName;
-              pdxDomainClassname = Serializable::GetLocalTypeName(pdxClassname);
+              pdxDomainClassname = cache->TypeRegistry->GetLocalTypeName(pdxClassname);
               //Log::Debug("found type " + typeId + " " + pType->IsLocal);
-              pdxObject = Serializable::GetPdxType(pdxDomainClassname);
+              pdxObject = cache->TypeRegistry->GetPdxType(pdxDomainClassname);
               if(pType->IsLocal)//local type no need to read Unread data
               {
                 PdxLocalReader^ plr = gcnew PdxLocalReader(dataInput, pType, len);
@@ -186,10 +189,10 @@ namespace Apache
                 PdxRemoteReader^ prr = gcnew PdxRemoteReader(dataInput, pType, len);              
                 pdxObject->FromData(prr);
 
-                PdxType^ mergedVersion = dataInput->Cache->GetPdxTypeRegistry()->GetMergedType(pType->TypeId);
+                PdxType^ mergedVersion = cache->GetPdxTypeRegistry()->GetMergedType(pType->TypeId);
                 PdxRemotePreservedData^ preserveData = prr->GetPreservedData(mergedVersion, pdxObject);
                 if(preserveData != nullptr)
-                  dataInput->Cache->GetPdxTypeRegistry()->SetPreserveData(pdxObject, preserveData);//it will set data in weakhashmap
+                  cache->GetPdxTypeRegistry()->SetPreserveData(pdxObject, preserveData);//it will set data in weakhashmap
                 prr->MoveStream();
               }
             }
@@ -202,9 +205,9 @@ namespace Apache
               }
               
               pdxClassname = pType->PdxClassName;
-              pdxDomainClassname = Serializable::GetLocalTypeName(pdxClassname);
+              pdxDomainClassname = cache->TypeRegistry->GetLocalTypeName(pdxClassname);
 
-              pdxObject = Serializable::GetPdxType(pdxDomainClassname);
+              pdxObject = cache->TypeRegistry->GetPdxType(pdxDomainClassname);
               
               Object^ pdxRealObject = pdxObject;
               bool isPdxWrapper = false;
@@ -349,7 +352,7 @@ namespace Apache
         Int32 PdxHelper::GetEnumValue(String^ enumClassName, String^ enumName, int hashcode, Cache^ cache)
         {
           //in case app want different name
-          enumClassName = Serializable::GetPdxTypeName(enumClassName);
+          enumClassName = cache->TypeRegistry->GetPdxTypeName(enumClassName);
           EnumInfo^ ei = gcnew EnumInfo(enumClassName, enumName, hashcode);
           return cache->GetPdxTypeRegistry()->GetEnumValue(ei);        
         }
@@ -357,7 +360,7 @@ namespace Apache
         Object^ PdxHelper::GetEnum(int enumId, Cache^ cache)
         {
           EnumInfo^ ei = cache->GetPdxTypeRegistry()->GetEnum(enumId);
-          return ei->GetEnum();
+          return ei->GetEnum(cache);
         }
 
         void PdxHelper::CreateMergedType(PdxType^ localType, PdxType^ remoteType, DataInput^ dataInput, const native::SerializationRegistry* serializationRegistry)
diff --git a/clicache/src/impl/PdxLocalReader.cpp b/clicache/src/impl/PdxLocalReader.cpp
index 418a532..2898365 100644
--- a/clicache/src/impl/PdxLocalReader.cpp
+++ b/clicache/src/impl/PdxLocalReader.cpp
@@ -415,10 +415,13 @@ namespace Apache
               return this->ReadObject(fieldName);
                //throw gcnew IllegalStateException("ReadField unable to de-serialize  " 
 								//																	+ fieldName + " of " + type); 
+
+            }
+          }
+
+        Apache::Geode::Client::Cache^ PdxLocalReader::Cache::get() { return m_dataInput->Cache; }
+        
+      }  // namepsace Internal
     }  // namespace Client
   }  // namespace Geode
 }  // namespace Apache
-
-    }
-  }
-}
diff --git a/clicache/src/impl/PdxLocalReader.hpp b/clicache/src/impl/PdxLocalReader.hpp
index ae6830d..72a8b18 100644
--- a/clicache/src/impl/PdxLocalReader.hpp
+++ b/clicache/src/impl/PdxLocalReader.hpp
@@ -300,11 +300,16 @@ namespace Apache
 
         virtual IPdxUnreadFields^ ReadUnreadFields();
      
-          /// <summary>
-          /// Reads the named field and returns its value.
-          /// </summary>
-          virtual Object^ ReadField(String^ fieldName, Type^ type);
-        };
+        /// <summary>
+        /// Reads the named field and returns its value.
+        /// </summary>
+        virtual Object^ ReadField(String^ fieldName, Type^ type);
+
+        property Apache::Geode::Client::Cache^ Cache
+        {
+          virtual Apache::Geode::Client::Cache^ get();
+        }
+      };
     }  // namespace Client
   }  // namespace Geode
 }  // namespace Apache
diff --git a/clicache/src/impl/PdxLocalWriter.cpp b/clicache/src/impl/PdxLocalWriter.cpp
index fa2ad4f..51bdc7c 100644
--- a/clicache/src/impl/PdxLocalWriter.cpp
+++ b/clicache/src/impl/PdxLocalWriter.cpp
@@ -511,7 +511,9 @@ namespace Apache
           {
             return m_dataOutput->Cache->GetPdxTypeRegistry()->GetLocalPdxType(pdxClassName);
           }
-
+         
+          Apache::Geode::Client::Cache^ PdxLocalWriter::Cache::get() { return m_dataOutput->Cache; }
+ 
       }  // namespace Internal
     }  // namespace Client
   }  // namespace Geode
diff --git a/clicache/src/impl/PdxLocalWriter.hpp b/clicache/src/impl/PdxLocalWriter.hpp
index 2b6bc00..7a596ba 100644
--- a/clicache/src/impl/PdxLocalWriter.hpp
+++ b/clicache/src/impl/PdxLocalWriter.hpp
@@ -348,6 +348,12 @@ namespace Apache
           virtual IPdxWriter^ WriteField(String^ fieldName, Object^ fieldValue, Type^ type);
 
           virtual void WriteByte(Byte byte);//for internal purpose
+
+          property Apache::Geode::Client::Cache^ Cache
+          {
+            virtual Apache::Geode::Client::Cache^ get();
+          }
+
         };
       }
     }  // namespace Client
diff --git a/clicache/src/impl/PdxWrapper.hpp b/clicache/src/impl/PdxWrapper.hpp
index 135cedc..5f75c60 100755
--- a/clicache/src/impl/PdxWrapper.hpp
+++ b/clicache/src/impl/PdxWrapper.hpp
@@ -22,6 +22,9 @@
 #include "../IPdxReader.hpp"
 #include "../IPdxSerializer.hpp"
 #include "../Serializable.hpp"
+#include "../Cache.hpp"
+#include "../TypeRegistry.hpp"
+
 namespace Apache
 {
   namespace Geode
@@ -46,18 +49,19 @@ namespace Apache
 
           virtual void ToData( IPdxWriter^ writer )
           {
-            if(!Serializable::GetPdxSerializer()->ToData(m_object, writer))
+            auto cache = writer->Cache;
+            if(!cache->TypeRegistry->PdxSerializer->ToData(m_object, writer))
               throw gcnew IllegalStateException("PdxSerilizer unable serialize data for type " + m_object->GetType());
           }
           
           virtual void FromData( IPdxReader^ reader )
           {
             String^ className = dynamic_cast<String^>(m_object);
-
+            auto pdxSerializer = reader->Cache->TypeRegistry->PdxSerializer;
             if(className != nullptr)
-              m_object = Serializable::GetPdxSerializer()->FromData((String^)m_object, reader);
+              m_object = pdxSerializer->FromData((String^)m_object, reader);
             else
-              m_object = Serializable::GetPdxSerializer()->FromData(m_object->GetType()->FullName, reader);
+              m_object = pdxSerializer->FromData(m_object->GetType()->FullName, reader);
             if(m_object == nullptr)
               throw gcnew IllegalStateException("PdxSerilizer unable de-serialize data for type " + m_object->GetType());           
           }
diff --git a/clicache/src/impl/PersistenceManagerProxy.hpp b/clicache/src/impl/PersistenceManagerProxy.hpp
index e633e03..f267b63 100644
--- a/clicache/src/impl/PersistenceManagerProxy.hpp
+++ b/clicache/src/impl/PersistenceManagerProxy.hpp
@@ -56,8 +56,8 @@ namespace Apache
             }
             virtual void write(const std::shared_ptr<native::CacheableKey>&  key, const std::shared_ptr<native::Cacheable>&  value/*, void *& PersistenceInfo*/)
             {
-               TKey gKey = Serializable::GetManagedValueGeneric<TKey>(key);
-               TValue gValue = Serializable::GetManagedValueGeneric<TValue>(value);
+               TKey gKey = TypeRegistry::GetManagedValueGeneric<TKey>(key);
+               TValue gValue = TypeRegistry::GetManagedValueGeneric<TValue>(value);
                m_persistenceManager->Write(gKey, gValue);
             }
             
@@ -75,7 +75,7 @@ namespace Apache
             
             virtual std::shared_ptr<native::Cacheable> read(const std::shared_ptr<native::CacheableKey>& key/*, void *& PersistenceInfo*/)
             {
-              TKey gKey = Serializable::GetManagedValueGeneric<TKey>(key);
+              TKey gKey = TypeRegistry::GetManagedValueGeneric<TKey>(key);
               return Serializable::GetUnmanagedValueGeneric<TValue>(m_persistenceManager->Read(gKey));
             }
             
@@ -86,7 +86,7 @@ namespace Apache
             
             virtual void destroy(const std::shared_ptr<native::CacheableKey>& key/*, void *& PersistenceInfo*/)
             {
-              TKey gKey = Serializable::GetManagedValueGeneric<TKey>(key);
+              TKey gKey = TypeRegistry::GetManagedValueGeneric<TKey>(key);
               m_persistenceManager->Destroy(gKey);
             }
             
diff --git a/clicache/src/impl/ResultCollectorProxy.hpp b/clicache/src/impl/ResultCollectorProxy.hpp
index da8a98a..e27e817 100644
--- a/clicache/src/impl/ResultCollectorProxy.hpp
+++ b/clicache/src/impl/ResultCollectorProxy.hpp
@@ -55,7 +55,7 @@ namespace Apache
           virtual void AddResult( const Object^ rs ) 
           {
             //std::shared_ptr<apache::geode::client::Cacheable> nativeptr(rs);
-            //TResult grs =  Serializable::GetManagedValueGeneric<TResult>( nativeptr);
+            //TResult grs =  TypeRegistry::GetManagedValueGeneric<TResult>( nativeptr);
             m_rscoll->AddResult(safe_cast<const TResult>(rs));
           }
 
diff --git a/clicache/src/impl/SafeConvert.hpp b/clicache/src/impl/SafeConvert.hpp
index c3cd705..88388ea 100644
--- a/clicache/src/impl/SafeConvert.hpp
+++ b/clicache/src/impl/SafeConvert.hpp
@@ -35,6 +35,8 @@
 //TODO::split
 #include "../CqEvent.hpp"
 #include "../UserFunctionExecutionException.hpp"
+#include "../Cache.hpp"
+
 namespace Apache
 {
   namespace Geode
@@ -53,34 +55,34 @@ namespace Apache
       /// to managed <see cref="IGeodeSerializable" /> object.
       /// </summary>
       inline static Apache::Geode::Client::IGeodeSerializable^
-        SafeUMSerializableConvertGeneric(std::shared_ptr<native::Serializable> obj)
+        SafeUMSerializableConvertGeneric(std::shared_ptr<native::Serializable> serializableObject)
       {
-        if (obj == nullptr) return nullptr;
+        if (serializableObject == nullptr) return nullptr;
 
-        if (auto mg_obj = std::dynamic_pointer_cast<native::ManagedCacheableKeyGeneric>(obj))
+        if (auto mg_obj = std::dynamic_pointer_cast<native::ManagedCacheableKeyGeneric>(serializableObject))
         {
           return mg_obj->ptr();
         }
-        if (auto mg_obj_delta = std::dynamic_pointer_cast<native::ManagedCacheableDeltaGeneric>(obj))
+        if (auto mg_obj_delta = std::dynamic_pointer_cast<native::ManagedCacheableDeltaGeneric>(serializableObject))
         {
           return dynamic_cast<Apache::Geode::Client::IGeodeSerializable^>(mg_obj_delta->ptr());
         }
 
-        if (obj->typeId() == 0)
+        if (serializableObject->typeId() == 0)
         {
-          if (auto mg_UFEEobj = std::dynamic_pointer_cast<native::UserFunctionExecutionException>(obj))
+          if (auto mg_UFEEobj = std::dynamic_pointer_cast<native::UserFunctionExecutionException>(serializableObject))
           {
             return gcnew UserFunctionExecutionException(mg_UFEEobj);
           }
         }
 
-        auto wrapperMethod = Apache::Geode::Client::Serializable::GetWrapperGeneric( obj->typeId( ) );             
+        auto wrapperMethod = TypeRegistry::GetWrapperGeneric( serializableObject->typeId( ) );             
         if (wrapperMethod != nullptr)
         {
-          return wrapperMethod( obj );
+          return wrapperMethod(serializableObject);
         }
 
-        return gcnew Apache::Geode::Client::Serializable( obj );
+        return gcnew Apache::Geode::Client::Serializable( serializableObject );
       }
 
       /// <summary>
@@ -131,7 +133,7 @@ namespace Apache
       }
 
       generic<class TValue>
-      inline static TValue SafeGenericUMSerializableConvert( std::shared_ptr<native::Serializable> obj )
+      inline static TValue SafeGenericUMSerializableConvert( std::shared_ptr<native::Serializable> obj)
       {
 
         if (obj == nullptr) return TValue();
@@ -154,7 +156,7 @@ namespace Apache
           }
         }
 
-        auto wrapperMethod = Apache::Geode::Client::Serializable::GetWrapperGeneric( obj->typeId( ) );             
+        auto wrapperMethod = TypeRegistry::GetWrapperGeneric( obj->typeId( ) );             
         if (wrapperMethod != nullptr)
         {
           return safe_cast<TValue>(wrapperMethod( obj ));
@@ -198,17 +200,12 @@ namespace Apache
 				{
 					return new native::ManagedCacheableKeyGeneric(tmpIGFS);
 				}
-            
-        if(Serializable::IsObjectAndPdxSerializerRegistered(mg_obj->GetType()->FullName))
-        {
-				  return new native::PdxManagedCacheableKey(gcnew PdxWrapper(mg_obj));
-        }
 
-        throw gcnew Apache::Geode::Client::IllegalStateException(String::Format("Unable to map object type {0}. Possible Object type may not be registered or PdxSerializer is not registered. ", mg_obj->GetType()));
+        return new native::PdxManagedCacheableKey(gcnew PdxWrapper(mg_obj));
       }
 
       generic<class TValue>
-      inline static native::Cacheable* SafeGenericMSerializableConvert( TValue mg_obj )
+      inline static native::Cacheable* SafeGenericMSerializableConvert( TValue mg_obj)
       {
         return SafeGenericM2UMConvert<TValue>( mg_obj );
       }
@@ -236,7 +233,7 @@ namespace Apache
             return (Client::ICacheableKey^)mg_obj->ptr( );
         }
 
-        auto wrapperMethod = Apache::Geode::Client::Serializable::GetWrapperGeneric( obj->typeId( ) );
+        auto wrapperMethod = TypeRegistry::GetWrapperGeneric( obj->typeId( ) );
         if (wrapperMethod != nullptr)
         {
           return (Client::ICacheableKey^)wrapperMethod( obj );
@@ -244,21 +241,6 @@ namespace Apache
         return gcnew Client::CacheableKey( obj );
       }
 
-      //generic <class TKey>
-      //inline static native::CacheableKey* SafeGenericMKeyConvert( TKey mg_obj, Cache^ cache )
-      //{
-      //  if (mg_obj == nullptr) return NULL;
-      //  auto obj = Apache::Geode::Client::Serializable::GetUnmanagedValueGeneric<TKey>( mg_obj, cache );
-      //  if (obj.get() != nullptr)
-      //  {
-      //    return obj.get();
-      //  }
-      //  else
-      //  {
-      //    return new native::ManagedCacheableKeyGeneric(SafeUMSerializableConvertGeneric(obj));
-      //  }
-      //}
-
       template<typename NativeType, typename ManagedType>
       inline static NativeType* GetNativePtr2( ManagedType^ mg_obj )
       {
diff --git a/clicache/test2/CMakeLists.txt b/clicache/test2/CMakeLists.txt
new file mode 100644
index 0000000..c2c3c12
--- /dev/null
+++ b/clicache/test2/CMakeLists.txt
@@ -0,0 +1,62 @@
+# 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.
+
+cmake_minimum_required( VERSION 3.9 )
+project( Apache.Geode.Tests2 CSharp )
+
+set(CMAKE_CSharp_FLAGS "/langversion:5")
+
+configure_file(${CMAKE_CURRENT_SOURCE_DIR}/packages.config ${CMAKE_CURRENT_BINARY_DIR}/packages.config COPYONLY)
+
+add_library( ${PROJECT_NAME} SHARED
+    Tests2.cs
+    xunit.runner.json
+)
+
+set_source_files_properties(cache.xml xunit.runner.json geode.properties PROPERTIES
+  VS_COPY_TO_OUT_DIR Always
+  VS_TOOL_OVERRIDE "None"
+)
+
+target_link_libraries(${PROJECT_NAME}
+  Apache.Geode
+)
+
+set_target_properties( ${PROJECT_NAME} PROPERTIES
+  VS_GLOBAL_ROOTNAMESPACE ${PROJECT_NAME}
+  VS_GLOBAL_TestProjectType UnitTest
+  VS_GLOBAL_PROJECT_TYPES "{3AC096D0-A1C2-E12C-1390-A8335801FDAB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}"
+  VS_DOTNET_TARGET_FRAMEWORK_VERSION "v4.5.2"
+  VS_DOTNET_REFERENCES "System;System.Xml;System.Web;System.Configuration"
+  VS_DOTNET_REFERENCE_Microsoft.VisualStudio.TestPlatform.TestFramework "${CMAKE_BINARY_DIR}/clicache/packages/Microsoft.VisualStudio.TestPlatform.14.0.0.1/lib/net20/Microsoft.VisualStudio.TestPlatform.TestFramework.dll"
+  VS_DOTNET_REFERENCE_Microsoft.VisualStudio.TestPlatform.TestFramework.Extensions "${CMAKE_BINARY_DIR}/clicache/packages/Microsoft.VisualStudio.TestPlatform.14.0.0.1/lib/net20/Microsoft.VisualStudio.TestPlatform.TestFramework.Extensions.dll"
+  VS_DOTNET_REFERENCE_xunit.core "${CMAKE_BINARY_DIR}/clicache/packages/xunit.extensibility.core.2.3.1/lib/netstandard1.1/xunit.core.dll"
+  VS_DOTNET_REFERENCE_xunit.assert "${CMAKE_BINARY_DIR}/clicache/packages/xunit.assert.2.3.1/lib/netstandard1.1/xunit.assert.dll"
+  VS_DOTNET_REFERENCE_xunit.abstractions "${CMAKE_BINARY_DIR}/clicache/packages/xunit.abstractions.2.0.1/lib/net35/xunit.abstractions.dll"
+  VS_DOTNET_REFERENCE_xunit.execution.desktop "${CMAKE_BINARY_DIR}/clicache/packages/xunit.extensibility.execution.2.3.1/lib/net452/xunit.execution.desktop.dll"
+)
+
+if(NOT "${STRONG_NAME_KEY}" STREQUAL "")
+  set_target_properties( ${PROJECT_NAME} PROPERTIES
+    VS_GLOBAL_SignAssembly "true"
+    VS_GLOBAL_AssemblyOriginatorKeyFile ${STRONG_NAME_KEY}
+  )
+endif()
+
+add_dependencies(${PROJECT_NAME} nuget-restore)
+
+install(TARGETS ${PROJECT_NAME}
+  RUNTIME DESTINATION bin
+)
diff --git a/clicache/test2/Tests2.cs b/clicache/test2/Tests2.cs
new file mode 100644
index 0000000..99897dc
--- /dev/null
+++ b/clicache/test2/Tests2.cs
@@ -0,0 +1,337 @@
+/*
+ * 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;
+
+namespace Apache.Geode.Client.UnitTests
+{
+
+  [Trait("Category", "UnitTests")]
+  public class Tests2
+  {
+    Cache cacheOne;
+    Cache cacheTwo;
+
+    public Tests2()
+    {
+      var cacheFactory = new CacheFactory();
+      cacheOne = cacheFactory.Create();
+      cacheTwo = cacheFactory.Create();
+    }
+
+    public void Dispose()
+    {
+      cacheOne.Close();
+      cacheTwo.Close();
+    }
+
+    [Fact]
+    public void RegisterSerializerForTwoCaches()
+    {
+      Assert.NotEqual(cacheOne, cacheTwo);
+
+      var dummyPdxSerializerOne = new DummyPdxSerializer();
+      cacheOne.TypeRegistry.PdxSerializer = dummyPdxSerializerOne;
+
+      var dummyPdxSerializerTwo = new DummyPdxSerializer();
+      cacheTwo.TypeRegistry.PdxSerializer = dummyPdxSerializerTwo;
+
+      var cacheOnePdxSerializer = cacheOne.TypeRegistry.PdxSerializer;
+      var cacheTwoPdxSerializer = cacheTwo.TypeRegistry.PdxSerializer;
+
+      Assert.Same(dummyPdxSerializerOne, cacheOnePdxSerializer);
+      Assert.Same(dummyPdxSerializerTwo, cacheTwoPdxSerializer);
+      Assert.NotSame(cacheOnePdxSerializer, cacheTwoPdxSerializer);
+    }
+
+    [Fact]
+    public void SetPdxTypeMapper()
+    {
+      var dummyPdxTypeMapper = new DummyPdxTypeMapper();
+      cacheOne.TypeRegistry.PdxTypeMapper = dummyPdxTypeMapper;
+
+      Assert.Same(dummyPdxTypeMapper, cacheOne.TypeRegistry.PdxTypeMapper);
+      Assert.Null(cacheTwo.TypeRegistry.PdxTypeMapper);
+    }
+
+    [Fact]
+    public void GetPdxTypeName()
+    {
+      var dummyPdxTypeMapper = new DummyPdxTypeMapper();
+      cacheOne.TypeRegistry.PdxTypeMapper = dummyPdxTypeMapper;
+
+      var pdxName = cacheOne.TypeRegistry.GetPdxTypeName("bar");
+
+      Assert.Equal("foo", pdxName);
+      Assert.Equal("bar", cacheTwo.TypeRegistry.GetPdxTypeName("bar"));
+    }
+
+    [Fact]
+    public void GetLocalTypeName()
+    {
+      var dummyPdxTypeMapper = new DummyPdxTypeMapper();
+      cacheOne.TypeRegistry.PdxTypeMapper = dummyPdxTypeMapper;
+
+      var localName = cacheOne.TypeRegistry.GetLocalTypeName("foo");
+
+      Assert.Equal("bar", localName);
+      Assert.Equal("foo", cacheTwo.TypeRegistry.GetLocalTypeName("foo"));
+    }
+
+    static bool pdxDelegate1Called = false;
+    static IPdxSerializable delegateForPdx1()
+    {
+      pdxDelegate1Called = true;
+      return Pdx1.CreateDeserializable();
+    }
+    static bool pdxDelegate2Called = false;
+    static IPdxSerializable delegateForPdx2()
+    {
+      pdxDelegate2Called = true;
+      return Pdx2.CreateDeserializable();
+    }
+
+    [Fact]
+    public void RegisterPdxType()
+    {
+      cacheOne.TypeRegistry.RegisterPdxType(delegateForPdx1);
+      cacheTwo.TypeRegistry.RegisterPdxType(delegateForPdx2);
+
+      pdxDelegate1Called = false;
+      var pdx1Type = cacheOne.TypeRegistry.GetPdxType(typeof(Pdx1).FullName);
+      Assert.True(pdxDelegate1Called);
+
+      pdxDelegate2Called = false;
+      var pdx2Type = cacheOne.TypeRegistry.GetPdxType(typeof(Pdx2).FullName);
+      Assert.False(pdxDelegate2Called);
+    }
+
+    internal class DummyPdxSerializer : IPdxSerializer
+    {
+      public object FromData(string classname, IPdxReader reader)
+      {
+        throw new NotImplementedException();
+      }
+
+      public bool ToData(object o, IPdxWriter writer)
+      {
+        throw new NotImplementedException();
+      }
+    }
+
+    internal class DummyPdxTypeMapper : IPdxTypeMapper
+    {
+      public string FromPdxTypeName(string pdxTypeName)
+      {
+        return "foo".Equals(pdxTypeName) ? "bar" : null;
+      }
+
+      public string ToPdxTypeName(string localTypeName)
+      {
+        return "bar".Equals(localTypeName) ? "foo" : null;
+      }
+    }
+
+    internal class Pdx1 : IPdxSerializable
+    {
+      // object fields
+      private int m_id;
+      private string m_pkid;
+      private string m_type;
+      private string m_status;
+      private string[] m_names;
+      private byte[] m_newVal;
+      private DateTime m_creationDate;
+      private byte[] m_arrayZeroSize;
+      private byte[] m_arrayNull;
+
+      public Pdx1() { }
+
+      public Pdx1(int id, int size, string[] names)
+      {
+        m_names = names;
+        m_id = id;
+        m_pkid = id.ToString();
+        m_status = (id % 2 == 0) ? "active" : "inactive";
+        m_type = "type" + (id % 3);
+
+        if (size > 0)
+        {
+          m_newVal = new byte[size];
+          for (int index = 0; index < size; index++)
+          {
+            m_newVal[index] = (byte)'B';
+          }
+        }
+        m_creationDate = DateTime.Now;
+        m_arrayNull = null;
+        m_arrayZeroSize = new byte[0];
+      }
+
+      public void FromData(IPdxReader reader)
+      {
+        m_id = reader.ReadInt("id");
+
+        bool isIdentity = reader.IsIdentityField("id");
+
+        if (isIdentity == false)
+          throw new IllegalStateException("Pdx1 id is identity field");
+
+        bool isId = reader.HasField("id");
+
+        if (isId == false)
+          throw new IllegalStateException("Pdx1 id field not found");
+
+        bool isNotId = reader.HasField("ID");
+
+        if (isNotId == true)
+          throw new IllegalStateException("Pdx1 isNotId field found");
+
+        m_pkid = reader.ReadString("pkid");
+        m_type = reader.ReadString("type");
+        m_status = reader.ReadString("status");
+        m_names = reader.ReadStringArray("names");
+        m_newVal = reader.ReadByteArray("newVal");
+        m_creationDate = reader.ReadDate("creationDate");
+        m_arrayNull = reader.ReadByteArray("arrayNull");
+        m_arrayZeroSize = reader.ReadByteArray("arrayZeroSize");
+      }
+
+      public void ToData(IPdxWriter writer)
+      {
+        writer
+          .WriteInt("id", m_id)
+          //identity field
+          .MarkIdentityField("id")
+          .WriteString("pkid", m_pkid)
+          .WriteString("type", m_type)
+          .WriteString("status", m_status)
+          .WriteStringArray("names", m_names)
+          .WriteByteArray("newVal", m_newVal)
+          .WriteDate("creationDate", m_creationDate)
+          .WriteByteArray("arrayNull", m_arrayNull)
+          .WriteByteArray("arrayZeroSize", m_arrayZeroSize);
+      }
+
+      public static IPdxSerializable CreateDeserializable()
+      {
+        return new Pdx1(777, 100, new string[] { "LEAF", "Volt", "Bolt" });
+      }
+    }
+
+    internal class Pdx2 : IPdxSerializable
+    {
+      // object fields
+      private int m_id;
+      private string m_pkid;
+      private string m_pkid2;
+      private string m_type;
+      private string m_status;
+      private string m_status2;
+      private string[] m_names;
+      private string[] m_addresses;
+      private byte[] m_newVal;
+      private DateTime m_creationDate;
+      private byte[] m_arrayZeroSize;
+      private byte[] m_arrayNull;
+
+      public Pdx2() { }
+
+      public Pdx2(int id, int size, string[] names, string[] addresses)
+      {
+        m_names = names;
+        m_addresses = addresses;
+        m_id = id;
+        m_pkid = id.ToString();
+        m_pkid2 = id.ToString() + "two";
+        m_status = (id % 2 == 0) ? "active" : "inactive";
+        m_status2 = (id % 3 == 0) ? "red" : "green";
+        m_type = "type" + (id % 3);
+
+        if (size > 0)
+        {
+          m_newVal = new byte[size];
+          for (int index = 0; index < size; index++)
+          {
+            m_newVal[index] = (byte)'B';
+          }
+        }
+        m_creationDate = DateTime.Now;
+        m_arrayNull = null;
+        m_arrayZeroSize = new byte[0];
+      }
+
+      public void FromData(IPdxReader reader)
+      {
+        m_id = reader.ReadInt("id");
+
+        bool isIdentity = reader.IsIdentityField("id");
+
+        if (isIdentity == false)
+          throw new IllegalStateException("Pdx2 id is identity field");
+
+        bool isId = reader.HasField("id");
+
+        if (isId == false)
+          throw new IllegalStateException("Pdx2 id field not found");
+
+        bool isNotId = reader.HasField("ID");
+
+        if (isNotId == true)
+          throw new IllegalStateException("Pdx2 isNotId field found");
+
+        m_pkid = reader.ReadString("pkid");
+        m_pkid2 = reader.ReadString("pkid2");
+        m_type = reader.ReadString("type");
+        m_status = reader.ReadString("status");
+        m_status2 = reader.ReadString("status2");
+        m_names = reader.ReadStringArray("names");
+        m_addresses = reader.ReadStringArray("addresses");
+        m_newVal = reader.ReadByteArray("newVal");
+        m_creationDate = reader.ReadDate("creationDate");
+        m_arrayNull = reader.ReadByteArray("arrayNull");
+        m_arrayZeroSize = reader.ReadByteArray("arrayZeroSize");
+      }
+
+      public void ToData(IPdxWriter writer)
+      {
+        writer
+          .WriteInt("id", m_id)
+          //identity field
+          .MarkIdentityField("id")
+          .WriteString("pkid", m_pkid)
+          .WriteString("pkid2", m_pkid2)
+          .WriteString("type", m_type)
+          .WriteString("status", m_status)
+          .WriteString("status2", m_status2)
+          .WriteStringArray("names", m_names)
+          .WriteStringArray("addresses", m_addresses)
+          .WriteByteArray("newVal", m_newVal)
+          .WriteDate("creationDate", m_creationDate)
+          .WriteByteArray("arrayNull", m_arrayNull)
+          .WriteByteArray("arrayZeroSize", m_arrayZeroSize);
+      }
+
+      public static IPdxSerializable CreateDeserializable()
+      {
+        return new Pdx2(777, 100, new string[] { "Nissan", "Chevy", "Volvo" }, new string[] { "4451 Court St", "1171 Elgin Ave", "721 NW 173rd Pl" });
+      }
+    }
+  }
+}
\ No newline at end of file
diff --git a/clicache/test2/packages.config b/clicache/test2/packages.config
new file mode 100644
index 0000000..428e078
--- /dev/null
+++ b/clicache/test2/packages.config
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="utf-8"?>
+<packages>
+  <package id="Microsoft.VisualStudio.TestPlatform" version="14.0.0.1" targetFramework="net452" />
+  <package id="xunit" version="2.3.1" targetFramework="net452" />
+  <package id="xunit.abstractions" version="2.0.1" targetFramework="net35" />
+  <package id="xunit.analyzers" version="0.8.0" targetFramework="net452" />
+  <package id="xunit.assert" version="2.3.1" targetFramework="net452" />
+  <package id="xunit.core" version="2.3.1" targetFramework="net452" />
+  <package id="xunit.extensibility.core" version="2.3.1" targetFramework="net452" />
+  <package id="xunit.extensibility.execution" version="2.3.1" targetFramework="net452" />
+  <package id="xunit.runner.console" version="2.3.1" targetFramework="net452" developmentDependency="true" />
+  <package id="xunit.runner.visualstudio" version="2.3.1" targetFramework="net452" developmentDependency="true" />
+</packages>
\ No newline at end of file
diff --git a/clicache/test2/xunit.runner.json b/clicache/test2/xunit.runner.json
new file mode 100644
index 0000000..dcfc797
--- /dev/null
+++ b/clicache/test2/xunit.runner.json
@@ -0,0 +1,4 @@
+{
+    "methodDisplay": "classAndMethod",
+    "parallelizeTestCollections": "false"
+}
\ No newline at end of file
diff --git a/cppcache/integration-test/CMakeLists.txt b/cppcache/integration-test/CMakeLists.txt
index 37cfd37..5f5de4c 100644
--- a/cppcache/integration-test/CMakeLists.txt
+++ b/cppcache/integration-test/CMakeLists.txt
@@ -4,9 +4,9 @@
 # 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.
@@ -75,7 +75,7 @@ foreach(FILE ${SOURCES})
   set(TESTS ${TESTS} ${TEST})
   add_dependencies(integration-tests ${TEST})
   add_executable(${TEST} ${FILE})
-  set_target_properties(${TEST} PROPERTIES FOLDER test/cppTests)  
+  set_target_properties(${TEST} PROPERTIES FOLDER test/cppTests)
 
   target_link_libraries(${TEST}
     PRIVATE
@@ -93,11 +93,11 @@ foreach(FILE ${SOURCES})
 
   # Some tests depend on these library
   add_dependencies(${TEST} securityImpl cryptoImpl DHImpl SqLiteImpl)
-  
+
   set(TEST_DIR ${CMAKE_CURRENT_BINARY_DIR}/.tests/${TEST})
-    
+
   math(EXPR PORT "${PORT} + 1")
-    
+
   if (WIN32)
     set (TEST_SCRIPT_SUFFIX .bat)
     generate_config(${CMAKE_CURRENT_SOURCE_DIR}/test.bat.in ${CMAKE_CURRENT_BINARY_DIR}/.${TEST}.bat.in $<TARGET_FILE:${TEST}>${TEST_SCRIPT_SUFFIX})
@@ -110,13 +110,13 @@ foreach(FILE ${SOURCES})
 
     # TODO fix file permissions on .sh
     set(TEST_COMMAND bash $<TARGET_FILE:${TEST}>${TEST_SCRIPT_SUFFIX})
-    
+
   endif()
 
   add_test(NAME ${TEST}
       COMMAND ${TEST_COMMAND}
   )
-        
+
   set_property(TEST ${TEST} PROPERTY LABELS STABLE)
 endforeach()
 
diff --git a/tests/cli/NewFwkLib/DeltaTest/DeltaTest.cs b/tests/cli/NewFwkLib/DeltaTest/DeltaTest.cs
index f193865..2e2fb04 100644
--- a/tests/cli/NewFwkLib/DeltaTest/DeltaTest.cs
+++ b/tests/cli/NewFwkLib/DeltaTest/DeltaTest.cs
@@ -520,8 +520,9 @@ namespace Apache.Geode.Client.FwkLib
       {
         if (!isObjectRegistered)
         {
-          Serializable.RegisterTypeGeneric(DeltaTestImpl.CreateDeserializable, CacheHelper<TKey, TVal>.DCache);
-          Serializable.RegisterTypeGeneric(TestObject1.CreateDeserializable, CacheHelper<TKey, TVal>.DCache);
+
+          CacheHelper<TKey, TVal>.DCache.TypeRegistry.RegisterTypeGeneric(DeltaTestImpl.CreateDeserializable);
+          CacheHelper<TKey, TVal>.DCache.TypeRegistry.RegisterTypeGeneric(TestObject1.CreateDeserializable);
           isObjectRegistered = true;
         }
           IRegion<TKey, TVal> region = CreateRootRegion();
diff --git a/tests/cli/NewFwkLib/PdxTest/PdxTests.cs b/tests/cli/NewFwkLib/PdxTest/PdxTests.cs
index c56e717..f1475a6 100644
--- a/tests/cli/NewFwkLib/PdxTest/PdxTests.cs
+++ b/tests/cli/NewFwkLib/PdxTest/PdxTests.cs
@@ -1329,37 +1329,38 @@ namespace Apache.Geode.Client.FwkLib
                 m_sharePath = Path.Combine(sharedpath , "framework/csharp/bin");
                 if (objectType != null)
                 {
+                    var typeRegistry = CacheHelper<TKey, TVal>.DCache.TypeRegistry;
                     if (objectType.Equals("PdxVersioned") && versionnum == 1)
                     {
                         m_pdxVersionOneAsm = Assembly.LoadFrom(Path.Combine(m_sharePath, "PdxVersion1Lib.dll"));
-                        Serializable.RegisterPdxType(registerPdxTypeOne);
-                        Serializable.SetPdxTypeMapper(new PdxTypeMapper());
+                        typeRegistry.RegisterPdxType(registerPdxTypeOne);
+                        typeRegistry.PdxTypeMapper = new PdxTypeMapper();
                     }
                     else if (objectType.Equals("PdxVersioned") && versionnum == 2)
                     {
-                        m_pdxVersionTwoAsm = Assembly.LoadFrom(Path.Combine(m_sharePath, "PdxVersion2Lib.dll"));
-                        Serializable.RegisterPdxType(registerPdxTypeTwo);
-                        Serializable.SetPdxTypeMapper(new PdxTypeMapper());
+                       m_pdxVersionTwoAsm = Assembly.LoadFrom(Path.Combine(m_sharePath, "PdxVersion2Lib.dll"));
+                       typeRegistry.RegisterPdxType(registerPdxTypeTwo);
+                       typeRegistry.PdxTypeMapper = new PdxTypeMapper();
                     }
                     else if (objectType.Equals("Nested"))
                     {
-                        Serializable.RegisterPdxType(NestedPdx.CreateDeserializable);
-                        Serializable.RegisterPdxType(PdxTypes1.CreateDeserializable);
-                        Serializable.RegisterPdxType(PdxTypes2.CreateDeserializable);
-                        Serializable.RegisterPdxType(PdxTypes3.CreateDeserializable);
-                        Serializable.RegisterPdxType(PdxTypes4.CreateDeserializable);
-                        Serializable.RegisterPdxType(PdxTypes5.CreateDeserializable);
-                        Serializable.RegisterPdxType(PdxTypes6.CreateDeserializable);
-                        Serializable.RegisterPdxType(PdxTypes7.CreateDeserializable);
-                        Serializable.RegisterPdxType(PdxTypes8.CreateDeserializable);
+                        typeRegistry.RegisterPdxType(NestedPdx.CreateDeserializable);
+                        typeRegistry.RegisterPdxType(PdxTypes1.CreateDeserializable);
+                        typeRegistry.RegisterPdxType(PdxTypes2.CreateDeserializable);
+                        typeRegistry.RegisterPdxType(PdxTypes3.CreateDeserializable);
+                        typeRegistry.RegisterPdxType(PdxTypes4.CreateDeserializable);
+                        typeRegistry.RegisterPdxType(PdxTypes5.CreateDeserializable);
+                        typeRegistry.RegisterPdxType(PdxTypes6.CreateDeserializable);
+                        typeRegistry.RegisterPdxType(PdxTypes7.CreateDeserializable);
+                        typeRegistry.RegisterPdxType(PdxTypes8.CreateDeserializable);
                     }
                     else if (objectType.Equals("PdxType"))
                     {
-                        Serializable.RegisterPdxType(PdxType.CreateDeserializable);
+                        typeRegistry.RegisterPdxType(PdxType.CreateDeserializable);
                     }
                     else if (objectType.Equals("AutoSerilizer"))
                     {
-                        Serializable.RegisterPdxSerializer(new ReflectionBasedAutoSerializer());
+                        typeRegistry.PdxSerializer = new ReflectionBasedAutoSerializer();
                     }
                 }
                 isSerialExecution = GetBoolValue("serialExecution");
@@ -2722,7 +2723,7 @@ namespace Apache.Geode.Client.FwkLib
 
         void doAccessPdxInstanceAndVerify()
         {
-            Serializable.RegisterPdxType(PdxType.CreateDeserializable);
+            CacheHelper<TKey, TVal>.DCache.TypeRegistry.RegisterPdxType(PdxType.CreateDeserializable);
             FwkInfo("In doAccessPdxInstanceAndVerify");
             IRegion<TKey, TVal> region0 = GetRegion();
             PdxType dPdxType = new PdxType();
diff --git a/tests/cli/NewFwkLib/QueryTest/QueryTests.cs b/tests/cli/NewFwkLib/QueryTest/QueryTests.cs
index da45a8e..b627995 100644
--- a/tests/cli/NewFwkLib/QueryTest/QueryTests.cs
+++ b/tests/cli/NewFwkLib/QueryTest/QueryTests.cs
@@ -689,18 +689,13 @@ namespace Apache.Geode.Client.FwkLib
           FwkInfo("isObjectRegistered value is {0}",isObjectRegistered);
         if (!isObjectRegistered)
         {
-            {
-                Serializable.RegisterTypeGeneric(Portfolio.CreateDeserializable, CacheHelper<TKey, TVal>.DCache);
-                FwkInfo("Completed Portfolio registeration");
-            }
-            {
-                Serializable.RegisterTypeGeneric(Position.CreateDeserializable, CacheHelper<TKey, TVal>.DCache);
-                Serializable.RegisterPdxType(PortfolioPdx.CreateDeserializable);
-                Serializable.RegisterPdxType(PositionPdx.CreateDeserializable);
-                FwkInfo("Completed other object registeration");
-            }
-
-            isObjectRegistered = true;
+          CacheHelper<TKey, TVal>.DCache.TypeRegistry.RegisterTypeGeneric(Portfolio.CreateDeserializable);
+          FwkInfo("Completed Portfolio registeration");
+          CacheHelper<TKey, TVal>.DCache.TypeRegistry.RegisterTypeGeneric(Position.CreateDeserializable);
+          CacheHelper<TKey, TVal>.DCache.TypeRegistry.RegisterPdxType(PortfolioPdx.CreateDeserializable);
+          CacheHelper<TKey, TVal>.DCache.TypeRegistry.RegisterPdxType(PositionPdx.CreateDeserializable);
+          FwkInfo("Completed other object registeration");
+          isObjectRegistered = true;
         }
         string regionName = GetStringValue(RegionName);
         bool isDurable = GetBoolValue("isDurable");
@@ -1395,10 +1390,10 @@ namespace Apache.Geode.Client.FwkLib
         if (isTypeRegistered != "registered")
         {
           FwkInfo("Getting inside for registeration");
-          Serializable.RegisterTypeGeneric(Position.CreateDeserializable, CacheHelper<TKey, TVal>.DCache);
-          Serializable.RegisterTypeGeneric(Portfolio.CreateDeserializable, CacheHelper<TKey, TVal>.DCache);
-          Serializable.RegisterPdxType(Apache.Geode.Client.Tests.PortfolioPdx.CreateDeserializable);
-          Serializable.RegisterPdxType(Apache.Geode.Client.Tests.PositionPdx.CreateDeserializable);
+          CacheHelper<TKey, TVal>.DCache.TypeRegistry.RegisterTypeGeneric(Position.CreateDeserializable);
+          CacheHelper<TKey, TVal>.DCache.TypeRegistry.RegisterTypeGeneric(Portfolio.CreateDeserializable);
+          CacheHelper<TKey, TVal>.DCache.TypeRegistry.RegisterPdxType(Apache.Geode.Client.Tests.PortfolioPdx.CreateDeserializable);
+          CacheHelper<TKey, TVal>.DCache.TypeRegistry.RegisterPdxType(Apache.Geode.Client.Tests.PositionPdx.CreateDeserializable);
 
         }
         IRegion<TKey, TVal> parentRegion = null;

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