diff --git a/CMakeLists.txt b/CMakeLists.txt
index 8f517ac..d820960 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -365,8 +365,6 @@
   add_subdirectory(templates/security/csharp)
 endif()
 add_subdirectory(tests)
-add_subdirectory(c-bindings)
-add_subdirectory(netcore)
 
 install(DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/xsds/ DESTINATION xsds)
 install(DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/defaultSystem/ DESTINATION defaultSystem)
diff --git a/c-bindings/CMakeLists.txt b/c-bindings/CMakeLists.txt
deleted file mode 100644
index 4b3a217..0000000
--- a/c-bindings/CMakeLists.txt
+++ /dev/null
@@ -1,63 +0,0 @@
-# Licensed to the Apache Software Foundation (ASF) under one or more
-# contributor license agreements.  See the NOTICE file distributed with
-# this work for additional information regarding copyright ownership.
-# The ASF licenses this file to You under the Apache License, Version 2.0
-# (the "License"); you may not use this file except in compliance with
-# the License.  You may obtain a copy of the License at
-#
-#      http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-project(apache-geode-c)
-
-add_library(${PROJECT_NAME} SHARED "src/auth_initialize.cpp"
-"src/cache.cpp"
-"src/client.cpp"
-"src/pool.cpp"
-"src/region.cpp"
-"src/cache/factory.cpp"
-"src/pool/factory.cpp"
-"src/pool/manager.cpp"
-"src/region/factory.cpp")
-
-target_compile_features(${PROJECT_NAME} PRIVATE cxx_std_11)
-
-target_link_libraries(${PROJECT_NAME} PRIVATE apache-geode-static)
-
-target_include_directories(${PROJECT_NAME} PRIVATE $<TARGET_PROPERTY:apache-geode-static,SOURCE_DIR>/../src)
-
-include(GenerateExportHeader)
-
-generate_export_header(${PROJECT_NAME}
-  BASE_NAME APACHE_GEODE_C
-  EXPORT_FILE_NAME apache-geode-c_export.h
-  CUSTOM_CONTENT_FROM_VARIABLE EXPORT_HEADER_CUSTOM_CONTENT
-)
-
-include_directories("include" "src" $<BUILD_INTERFACE:${CMAKE_CURRENT_BINARY_DIR}>)
-
-if (${CMAKE_SYSTEM_NAME} MATCHES "Darwin")
-  set_target_properties(${PROJECT_NAME} PROPERTIES
-    LINK_FLAGS "-exported_symbols_list \"${CMAKE_CURRENT_SOURCE_DIR}/symbols\"")
-elseif (${CMAKE_SYSTEM_NAME} MATCHES "Linux")
-  set_target_properties(${PROJECT_NAME} PROPERTIES
-    LINK_FLAGS "-Wl,--version-script=\"${CMAKE_CURRENT_SOURCE_DIR}/symbols.version\"")
-endif()
-
-install(TARGETS ${PROJECT_NAME}
-  RUNTIME DESTINATION bin
-  LIBRARY DESTINATION lib
-  ARCHIVE DESTINATION lib)
-
-install(DIRECTORY "include/geode/" DESTINATION "c/include/geode")
-
-install(FILES ${CMAKE_CURRENT_BINARY_DIR}/apache-geode-c_export.h DESTINATION c/include/geode/internal)
-
-add_subdirectory(integration)
-
-add_clangformat(apache-geode-c)
diff --git a/c-bindings/include/geode/auth_initialize.h b/c-bindings/include/geode/auth_initialize.h
deleted file mode 100644
index c10b1de..0000000
--- a/c-bindings/include/geode/auth_initialize.h
+++ /dev/null
@@ -1,39 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#pragma once
-
-#ifndef APACHE_GEODE_C_AUTH_INITIALIZE_H
-#define APACHE_GEODE_C_AUTH_INITIALIZE_H
-
-#include "geode/internal/geode_base.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif  // __cplusplus
-
-struct apache_geode_properties_s;
-typedef struct apache_geode_properties_s apache_geode_properties_t;
-
-void APACHE_GEODE_C_EXPORT apache_geode_AuthInitialize_AddProperty(
-    apache_geode_properties_t* properties, const char* key, const char* value);
-
-#ifdef __cplusplus
-}
-#endif  // __cplusplus
-
-#endif  // APACHE_GEODE_C_AUTH_INITIALIZE_H
diff --git a/c-bindings/include/geode/cache.h b/c-bindings/include/geode/cache.h
deleted file mode 100644
index 2876a1f..0000000
--- a/c-bindings/include/geode/cache.h
+++ /dev/null
@@ -1,82 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#pragma once
-
-#ifndef APACHE_GEODE_C_CACHE_H
-#define APACHE_GEODE_C_CACHE_H
-
-#include "geode/internal/geode_base.h"
-
-#ifdef __cplusplus
-#include <cstdint>
-#else
-#include <stdint.h>
-#endif
-
-#ifndef __cplusplus
-#include <stdbool.h>
-#endif
-
-#ifdef __cplusplus
-extern "C" {
-#endif  // __cplusplus
-
-struct apache_geode_cache_s;
-typedef struct apache_geode_cache_s apache_geode_cache_t;
-
-struct apache_geode_pool_manager_s;
-typedef struct apache_geode_pool_manager_s apache_geode_pool_manager_t;
-
-struct apache_geode_region_factory_s;
-typedef struct apache_geode_region_factory_s apache_geode_region_factory_t;
-
-APACHE_GEODE_C_EXPORT void apache_geode_DestroyCache(apache_geode_cache_t* cache);
-
-APACHE_GEODE_C_EXPORT bool apache_geode_Cache_GetPdxIgnoreUnreadFields(
-    apache_geode_cache_t* cache);
-
-APACHE_GEODE_C_EXPORT bool apache_geode_Cache_GetPdxReadSerialized(
-    apache_geode_cache_t* cache);
-
-APACHE_GEODE_C_EXPORT apache_geode_pool_manager_t*
-apache_geode_Cache_GetPoolManager(apache_geode_cache_t* cache);
-
-#ifdef __cplusplus
-APACHE_GEODE_C_EXPORT apache_geode_region_factory_t*
-apache_geode_Cache_CreateRegionFactory(apache_geode_cache_t* cache,
-                                       std::int32_t regionType);
-#else
-APACHE_GEODE_C_EXPORT apache_geode_region_factory_t*
-apache_geode_Cache_CreateRegionFactory(apache_geode_cache_t* cache,
-                                       int32_t regionType);
-#endif
-
-APACHE_GEODE_C_EXPORT const char* apache_geode_Cache_GetName(
-    apache_geode_cache_t* cache);
-
-APACHE_GEODE_C_EXPORT void apache_geode_Cache_Close(apache_geode_cache_t* cache,
-                                                  bool keepalive);
-
-APACHE_GEODE_C_EXPORT bool apache_geode_Cache_IsClosed(
-    apache_geode_cache_t* cache);
-
-#ifdef __cplusplus
-}
-#endif  // __cplusplus
-
-#endif  // APACHE_GEODE_C_CACHE_H
diff --git a/c-bindings/include/geode/cache/factory.h b/c-bindings/include/geode/cache/factory.h
deleted file mode 100644
index 96a0d9c..0000000
--- a/c-bindings/include/geode/cache/factory.h
+++ /dev/null
@@ -1,77 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#pragma once
-
-#ifndef APACHE_GEODE_C_CACHE_FACTORY_H
-#define APACHE_GEODE_C_CACHE_FACTORY_H
-
-#include "geode/internal/geode_base.h"
-
-#ifndef __cplusplus
-#include <stdbool.h>
-#endif
-
-#ifdef __cplusplus
-extern "C" {
-#endif  // __cplusplus
-
-struct apache_geode_client_s;
-typedef struct apache_geode_client_s apache_geode_client_t;
-
-struct apache_geode_cache_factory_s;
-typedef struct apache_geode_cache_factory_s apache_geode_cache_factory_t;
-
-struct apache_geode_cache_s;
-typedef struct apache_geode_cache_s apache_geode_cache_t;
-
-struct apache_geode_properties_s;
-typedef struct apache_geode_properties_s apache_geode_properties_t;
-
-APACHE_GEODE_C_EXPORT apache_geode_cache_factory_t*
-apache_geode_CreateCacheFactory();
-
-APACHE_GEODE_C_EXPORT apache_geode_cache_t* apache_geode_CacheFactory_CreateCache(
-    apache_geode_cache_factory_t* factory);
-
-APACHE_GEODE_C_EXPORT const char* apache_geode_CacheFactory_GetVersion(
-    apache_geode_cache_factory_t* factory);
-
-APACHE_GEODE_C_EXPORT const char* apache_geode_CacheFactory_GetProductDescription(
-    apache_geode_cache_factory_t* factory);
-
-APACHE_GEODE_C_EXPORT void apache_geode_CacheFactory_SetPdxIgnoreUnreadFields(
-    apache_geode_cache_factory_t* factory, bool pdxIgnoreUnreadFields);
-
-APACHE_GEODE_C_EXPORT void apache_geode_CacheFactory_SetAuthInitialize(
-    apache_geode_cache_factory_t* factory,
-    void (*getCredentials)(apache_geode_properties_t*), void (*close)());
-
-APACHE_GEODE_C_EXPORT void apache_geode_CacheFactory_SetPdxReadSerialized(
-    apache_geode_cache_factory_t* factory, bool pdxReadSerialized);
-
-APACHE_GEODE_C_EXPORT void apache_geode_CacheFactory_SetProperty(
-    apache_geode_cache_factory_t* factory, const char* key, const char* value);
-
-APACHE_GEODE_C_EXPORT void apache_geode_DestroyCacheFactory(
-    apache_geode_cache_factory_t* factory);
-
-#ifdef __cplusplus
-}
-#endif  // __cplusplus
-
-#endif  // APACHE_GEODE_C_CACHE_FACTORY_H
diff --git a/c-bindings/include/geode/client.h b/c-bindings/include/geode/client.h
deleted file mode 100644
index eac1711..0000000
--- a/c-bindings/include/geode/client.h
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#pragma once
-
-#ifndef APACHE_GEODE_C_CLIENT_H
-#define APACHE_GEODE_C_CLIENT_H
-
-#include "geode/internal/geode_base.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif  // __cplusplus
-
-struct apache_geode_client_s;
-typedef struct apache_geode_client_s apache_geode_client_t;
-
-APACHE_GEODE_C_EXPORT apache_geode_client_t* apache_geode_ClientInitialize();
-
-APACHE_GEODE_C_EXPORT int apache_geode_ClientUninitialize(
-    apache_geode_client_t* client);
-
-#ifdef __cplusplus
-}
-#endif  // __cplusplus
-
-#endif  // APACHE_GEODE_C_CLIENT_H
diff --git a/c-bindings/include/geode/internal/geode_base.h b/c-bindings/include/geode/internal/geode_base.h
deleted file mode 100644
index 9fd0512..0000000
--- a/c-bindings/include/geode/internal/geode_base.h
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#pragma once
-
-#ifndef APACHE_GEODE_C_INTERNAL_GEODE_BASE_H
-#define APACHE_GEODE_C_INTERNAL_GEODE_BASE_H
-
-#include "apache-geode-c_export.h"
-
-#endif  // APACHE_GEODE_C_INTERNAL_GEODE_BASE_H
diff --git a/c-bindings/include/geode/pool.h b/c-bindings/include/geode/pool.h
deleted file mode 100644
index 30316fb..0000000
--- a/c-bindings/include/geode/pool.h
+++ /dev/null
@@ -1,38 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#pragma once
-
-#ifndef APACHE_GEODE_C_POOL_H
-#define APACHE_GEODE_C_POOL_H
-
-#include "geode/internal/geode_base.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif  // __cplusplus
-
-struct apache_geode_pool_s;
-typedef struct apache_geode_pool_s apache_geode_pool_t;
-
-APACHE_GEODE_C_EXPORT void apache_geode_DestroyPool(apache_geode_pool_t* pool);
-
-#ifdef __cplusplus
-}
-#endif  // __cplusplus
-
-#endif  // APACHE_GEODE_C_POOL_H
diff --git a/c-bindings/include/geode/pool/factory.h b/c-bindings/include/geode/pool/factory.h
deleted file mode 100644
index 91b0e4b..0000000
--- a/c-bindings/include/geode/pool/factory.h
+++ /dev/null
@@ -1,61 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#pragma once
-
-#ifndef APACHE_GEODE_C_POOL_FACTORY_H
-#define APACHE_GEODE_C_POOL_FACTORY_H
-
-#include "geode/internal/geode_base.h"
-
-#ifdef __cplusplus
-#include <cstdint>
-#else
-#include <stdint.h>
-#endif
-
-#ifdef __cplusplus
-extern "C" {
-#endif  // __cplusplus
-
-struct apache_geode_pool_factory_s;
-typedef struct apache_geode_pool_factory_s apache_geode_pool_factory_t;
-
-struct apache_geode_pool_s;
-typedef struct apache_geode_pool_s apache_geode_pool_t;
-
-APACHE_GEODE_C_EXPORT apache_geode_pool_t* apache_geode_PoolFactory_CreatePool(
-    apache_geode_pool_factory_t* poolFactory, const char* name);
-
-#ifdef __cplusplus
-APACHE_GEODE_C_EXPORT void apache_geode_PoolFactory_AddLocator(
-    apache_geode_pool_factory_t* poolFactory, const char* hostname,
-    const std::uint16_t port);
-#else
-APACHE_GEODE_C_EXPORT void apache_geode_PoolFactory_AddLocator(
-    apache_geode_pool_factory_t* poolFactory, const char* hostname,
-    const uint16_t port);
-#endif
-
-APACHE_GEODE_C_EXPORT void apache_geode_DestroyPoolFactory(
-    apache_geode_pool_factory_t* poolFactory);
-
-#ifdef __cplusplus
-}
-#endif  // __cplusplus
-
-#endif  // APACHE_GEODE_C_POOL_FACTORY_H
diff --git a/c-bindings/include/geode/pool/manager.h b/c-bindings/include/geode/pool/manager.h
deleted file mode 100644
index d8aa85b..0000000
--- a/c-bindings/include/geode/pool/manager.h
+++ /dev/null
@@ -1,46 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#pragma once
-
-#ifndef APACHE_GEODE_C_POOL_MANAGER_H
-#define APACHE_GEODE_C_POOL_MANAGER_H
-
-#include "geode/internal/geode_base.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif  // __cplusplus
-
-struct apache_geode_pool_manager_s;
-typedef struct apache_geode_pool_manager_s apache_geode_pool_manager_t;
-
-struct apache_geode_pool_factory_s;
-typedef struct apache_geode_pool_factory_s apache_geode_pool_factory_t;
-
-APACHE_GEODE_C_EXPORT apache_geode_pool_factory_t*
-apache_geode_PoolManager_CreateFactory(
-    apache_geode_pool_manager_t* poolManager);
-
-APACHE_GEODE_C_EXPORT void apache_geode_DestroyPoolManager(
-    apache_geode_pool_manager_t* poolManager);
-
-#ifdef __cplusplus
-}
-#endif  // __cplusplus
-
-#endif  // APACHE_GEODE_C_POOL_MANAGER_H
diff --git a/c-bindings/include/geode/region.h b/c-bindings/include/geode/region.h
deleted file mode 100644
index 7355d04..0000000
--- a/c-bindings/include/geode/region.h
+++ /dev/null
@@ -1,61 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#pragma once
-
-#ifndef APACHE_GEODE_C_REGION_H
-#define APACHE_GEODE_C_REGION_H
-
-#include "geode/internal/geode_base.h"
-
-#ifndef __cplusplus
-#include <stdbool.h>
-#endif
-
-#ifdef __cplusplus
-extern "C" {
-#endif  // __cplusplus
-
-struct apache_geode_region_s;
-typedef struct apache_geode_region_s apache_geode_region_t;
-
-APACHE_GEODE_C_EXPORT void apache_geode_DestroyRegion(
-    apache_geode_region_t* region);
-
-APACHE_GEODE_C_EXPORT void apache_geode_Region_PutString(
-    apache_geode_region_t* region, const char* key, const char* value);
-
-APACHE_GEODE_C_EXPORT void apache_geode_Region_PutByteArray(
-    apache_geode_region_t* region, const char* key, const char* value, size_t size);
-
-APACHE_GEODE_C_EXPORT const char* apache_geode_Region_GetString(
-    apache_geode_region_t* region, const char* key);
-
-APACHE_GEODE_C_EXPORT void apache_geode_Region_GetByteArray(
-    apache_geode_region_t* region, const char* key, char** value, size_t* size);
-
-APACHE_GEODE_C_EXPORT void apache_geode_Region_Remove(
-    apache_geode_region_t* region, const char* key);
-
-APACHE_GEODE_C_EXPORT bool apache_geode_Region_ContainsValueForKey(
-    apache_geode_region_t* region, const char* key);
-    
-#ifdef __cplusplus
-}
-#endif  // __cplusplus
-
-#endif  // APACHE_GEODE_C_REGION_H
diff --git a/c-bindings/include/geode/region/factory.h b/c-bindings/include/geode/region/factory.h
deleted file mode 100644
index 9612833..0000000
--- a/c-bindings/include/geode/region/factory.h
+++ /dev/null
@@ -1,52 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#pragma once
-
-#ifndef APACHE_GEODE_C_REGION_FACTORY_H
-#define APACHE_GEODE_C_REGION_FACTORY_H
-
-#include "geode/internal/geode_base.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif  // __cplusplus
-
-struct apache_geode_cache_s;
-typedef struct apache_geode_cache_s apache_geode_cache_t;
-
-struct apache_geode_region_factory_s;
-typedef struct apache_geode_region_factory_s apache_geode_region_factory_t;
-
-struct apache_geode_region_s;
-typedef struct apache_geode_region_s apache_geode_region_t;
-
-APACHE_GEODE_C_EXPORT void apache_geode_DestroyRegionFactory(
-    apache_geode_region_factory_t* regionFactory);
-
-APACHE_GEODE_C_EXPORT void apache_geode_RegionFactory_SetPoolName(
-    apache_geode_region_factory_t* regionFactory, const char* poolName);
-
-APACHE_GEODE_C_EXPORT apache_geode_region_t*
-apache_geode_RegionFactory_CreateRegion(
-    apache_geode_region_factory_t* regionFactory, const char* regionName);
-
-#ifdef __cplusplus
-}
-#endif  // __cplusplus
-
-#endif  // APACHE_GEODE_C_REGION_FACTORY_H
diff --git a/c-bindings/include/geode/region/shortcut.h b/c-bindings/include/geode/region/shortcut.h
deleted file mode 100644
index e57a84d..0000000
--- a/c-bindings/include/geode/region/shortcut.h
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#pragma once
-
-#ifndef APACHE_GEODE_C_REGION_SHORTCUT_H
-#define APACHE_GEODE_C_REGION_SHORTCUT_H
-
-enum { PROXY, CACHING_PROXY, CACHING_PROXY_ENTRY_LRU, LOCAL, LOCAL_ENTRY_LRU };
-
-#endif
diff --git a/c-bindings/integration/CMakeLists.txt b/c-bindings/integration/CMakeLists.txt
deleted file mode 100644
index 255cca4..0000000
--- a/c-bindings/integration/CMakeLists.txt
+++ /dev/null
@@ -1,16 +0,0 @@
-# Licensed to the Apache Software Foundation (ASF) under one or more
-# contributor license agreements.  See the NOTICE file distributed with
-# this work for additional information regarding copyright ownership.
-# The ASF licenses this file to You under the Apache License, Version 2.0
-# (the "License"); you may not use this file except in compliance with
-# the License.  You may obtain a copy of the License at
-#
-#      http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-add_subdirectory(test)
diff --git a/c-bindings/integration/test/CAuthInitialize.cpp b/c-bindings/integration/test/CAuthInitialize.cpp
deleted file mode 100644
index 4c4460d..0000000
--- a/c-bindings/integration/test/CAuthInitialize.cpp
+++ /dev/null
@@ -1,114 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include <framework/Cluster.h>
-#include <framework/Framework.h>
-#include <framework/Gfsh.h>
-
-#include <gtest/gtest.h>
-
-#include "geode/auth_initialize.h"
-#include "geode/cache.h"
-#include "geode/cache/factory.h"
-#include "geode/client.h"
-#include "geode/pool.h"
-#include "geode/pool/factory.h"
-#include "geode/pool/manager.h"
-#include "geode/region.h"
-#include "geode/region/factory.h"
-#include "geode/region/shortcut.h"
-
-static auto credentialsRequested_ = 0;
-
-void simpleGetCredentials(apache_geode_properties_t* props) {
-  apache_geode_AuthInitialize_AddProperty(props, "security-username", "root");
-  apache_geode_AuthInitialize_AddProperty(props, "security-password",
-                                          "root-password");
-  credentialsRequested_++;
-}
-
-void simpleClose() {}
-
-TEST(CAuthInitializeTest, putGetWithBasicAuth) {
-  Cluster cluster(
-      Name(std::string(::testing::UnitTest::GetInstance()
-                           ->current_test_info()
-                           ->test_suite_name()) +
-           "/" +
-           ::testing::UnitTest::GetInstance()->current_test_info()->name()),
-      Classpath{getFrameworkString(FrameworkVariable::JavaObjectJarPath)},
-      SecurityManager{"javaobject.SimpleSecurityManager"}, User{"root"},
-      Password{"root-password"}, LocatorCount{1}, ServerCount{1});
-
-  cluster.start();
-
-  cluster.getGfsh()
-      .create()
-      .region()
-      .withName("region")
-      .withType("PARTITION")
-      .execute();
-
-  auto client = apache_geode_ClientInitialize();
-  auto cache_factory = apache_geode_CreateCacheFactory();
-
-  apache_geode_CacheFactory_SetProperty(cache_factory,
-                                        "statistic-sampling-enabled", "false");
-  apache_geode_CacheFactory_SetAuthInitialize(
-      cache_factory, simpleGetCredentials, simpleClose);
-
-  auto cache = apache_geode_CacheFactory_CreateCache(cache_factory);
-
-  auto pool_manager = apache_geode_Cache_GetPoolManager(cache);
-  auto pool_factory = apache_geode_PoolManager_CreateFactory(pool_manager);
-
-  for (const auto& locator : cluster.getLocators()) {
-    apache_geode_PoolFactory_AddLocator(pool_factory,
-                                        locator.getAddress().address.c_str(),
-                                        locator.getAddress().port);
-  }
-
-  auto pool = apache_geode_PoolFactory_CreatePool(pool_factory, "default");
-
-  auto region_factory = apache_geode_Cache_CreateRegionFactory(cache, PROXY);
-
-  apache_geode_RegionFactory_SetPoolName(region_factory, "default");
-  auto region =
-      apache_geode_RegionFactory_CreateRegion(region_factory, "region");
-
-  apache_geode_Region_PutString(region, "foo", "bar");
-  apache_geode_Region_PutString(region, "baz", "qux");
-
-  auto foo_value = apache_geode_Region_GetString(region, "foo");
-  ASSERT_STREQ(foo_value, "bar");
-
-  auto baz_value = apache_geode_Region_GetString(region, "baz");
-  ASSERT_STREQ(baz_value, "qux");
-
-  ASSERT_GT(credentialsRequested_, 0);
-
-  apache_geode_DestroyRegion(region);
-  apache_geode_DestroyRegionFactory(region_factory);
-  apache_geode_DestroyPool(pool);
-  apache_geode_DestroyPoolFactory(pool_factory);
-  apache_geode_DestroyPoolManager(pool_manager);
-  apache_geode_DestroyCache(cache);
-
-  apache_geode_DestroyCacheFactory(cache_factory);
-  auto leaks = apache_geode_ClientUninitialize(client);
-  ASSERT_EQ(leaks, 0);
-}
diff --git a/c-bindings/integration/test/CCacheCreationTest.cpp b/c-bindings/integration/test/CCacheCreationTest.cpp
deleted file mode 100644
index 37af7d8..0000000
--- a/c-bindings/integration/test/CCacheCreationTest.cpp
+++ /dev/null
@@ -1,60 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include <framework/Cluster.h>
-#include <framework/Framework.h>
-#include <framework/Gfsh.h>
-
-#include <gtest/gtest.h>
-
-#include "geode/cache.h"
-#include "geode/cache/factory.h"
-#include "geode/client.h"
-#include "geode/pool.h"
-#include "geode/pool/factory.h"
-#include "geode/pool/manager.h"
-#include "geode/region.h"
-#include "geode/region/factory.h"
-#include "geode/region/shortcut.h"
-
-/**
- * Example test using single server and waiting for async put and update
- * operations to synchronize using promises.
- */
-TEST(CCacheCreationTest, setPdxIgnoreUnreadFieldsAndCreateCache) {
-  auto client = apache_geode_ClientInitialize();
-  auto cache_factory = apache_geode_CreateCacheFactory();
-
-  apache_geode_CacheFactory_SetProperty(cache_factory,
-                                        "statistic-sampling-enabled", "false");
-
-  apache_geode_CacheFactory_SetPdxIgnoreUnreadFields(cache_factory, true);
-  auto cache = apache_geode_CacheFactory_CreateCache(cache_factory);
-  ASSERT_TRUE(apache_geode_Cache_GetPdxIgnoreUnreadFields(cache));
-
-  apache_geode_CacheFactory_SetPdxIgnoreUnreadFields(cache_factory, false);
-  auto cache2 = apache_geode_CacheFactory_CreateCache(cache_factory);
-  ASSERT_FALSE(apache_geode_Cache_GetPdxIgnoreUnreadFields(cache2));
-
-  apache_geode_DestroyCache(cache);
-  apache_geode_DestroyCache(cache2);
-
-  apache_geode_DestroyCacheFactory(cache_factory);
-  auto leaks = apache_geode_ClientUninitialize(client);
-
-  ASSERT_EQ(leaks, 0);
-}
diff --git a/c-bindings/integration/test/CMakeLists.txt b/c-bindings/integration/test/CMakeLists.txt
deleted file mode 100644
index af66bea..0000000
--- a/c-bindings/integration/test/CMakeLists.txt
+++ /dev/null
@@ -1,71 +0,0 @@
-# Licensed to the Apache Software Foundation (ASF) under one or more
-# contributor license agreements.  See the NOTICE file distributed with
-# this work for additional information regarding copyright ownership.
-# The ASF licenses this file to You under the Apache License, Version 2.0
-# (the "License"); you may not use this file except in compliance with
-# the License.  You may obtain a copy of the License at
-#
-#      http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-project(apache-geode-c-integration-test)
-
-add_executable(${PROJECT_NAME}
-  CAuthInitialize.cpp
-  CCacheCreationTest.cpp
-  ExampleTest.cpp
-)
-
-target_compile_features(${PROJECT_NAME} PRIVATE cxx_std_11)
-
-target_compile_definitions(${PROJECT_NAME}
-  PUBLIC
-    GTEST_ELLIPSIS_NEEDS_POD_
-)
-
-target_include_directories(${PROJECT_NAME}
-  PUBLIC
-   ${CMAKE_CURRENT_BINARY_DIR}
-)
-
-target_link_libraries(${PROJECT_NAME}
-  PUBLIC
-    apache-geode-c
-    integration-framework
-    testobject
-    ACE::ACE
-    GTest::gtest
-    GTest::gtest_main
-    Boost::boost
-    Boost::system
-    Boost::log
-    Boost::filesystem
-    Boost::chrono
-  PRIVATE
-    _WarningsAsError
-    internal
-)
-
-if(WIN32)
-  foreach (_target apache-geode-c apache-geode testobject)
-    add_custom_command(TARGET ${PROJECT_NAME} POST_BUILD COMMAND ${CMAKE_COMMAND} -E copy_if_different
-        "$<TARGET_FILE:${_target}>"
-        "$<$<CONFIG:Debug>:$<TARGET_PDB_FILE:${_target}>>"
-        "$<TARGET_FILE_DIR:${PROJECT_NAME}>")
-  endforeach()
-endif()
-
-set_target_properties(${PROJECT_NAME} PROPERTIES
-  FOLDER c_bindings/test/integration
-)
-
-add_clangformat(${PROJECT_NAME})
-
-enable_testing()
-include(GoogleTest)
-gtest_discover_tests(${PROJECT_NAME} DISCOVERY_TIMEOUT 60)
diff --git a/c-bindings/integration/test/ExampleTest.cpp b/c-bindings/integration/test/ExampleTest.cpp
deleted file mode 100644
index 9443374..0000000
--- a/c-bindings/integration/test/ExampleTest.cpp
+++ /dev/null
@@ -1,85 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include <framework/Cluster.h>
-#include <framework/Framework.h>
-#include <framework/Gfsh.h>
-
-#include <gtest/gtest.h>
-
-#include "geode/cache.h"
-#include "geode/cache/factory.h"
-#include "geode/client.h"
-#include "geode/pool.h"
-#include "geode/pool/factory.h"
-#include "geode/pool/manager.h"
-#include "geode/region.h"
-#include "geode/region/factory.h"
-#include "geode/region/shortcut.h"
-
-/**
- * Example test using single server and waiting for async put and update
- * operations to synchronize using promises.
- */
-TEST(ExampleTest, putGetAndUpdateWith1Server) {
-  Cluster cluster{LocatorCount{1}, ServerCount{1}};
-
-  cluster.start();
-
-  cluster.getGfsh()
-      .create()
-      .region()
-      .withName("region")
-      .withType("REPLICATE")
-      .execute();
-
-  auto client = apache_geode_ClientInitialize();
-  auto cache_factory = apache_geode_CreateCacheFactory();
-
-  apache_geode_CacheFactory_SetProperty(cache_factory, "log-level", "none");
-  apache_geode_CacheFactory_SetProperty(cache_factory,
-                                        "statistic-sampling-enabled", "false");
-
-  auto cache = apache_geode_CacheFactory_CreateCache(cache_factory);
-
-  auto pool_manager = apache_geode_Cache_GetPoolManager(cache);
-  auto pool_factory = apache_geode_PoolManager_CreateFactory(pool_manager);
-  apache_geode_PoolFactory_AddLocator(pool_factory, "localhost",
-                                      cluster.getLocatorPort());
-  auto pool = apache_geode_PoolFactory_CreatePool(pool_factory, "myPool");
-  auto region_factory = apache_geode_Cache_CreateRegionFactory(cache, PROXY);
-  apache_geode_RegionFactory_SetPoolName(region_factory, "myPool");
-  auto region =
-      apache_geode_RegionFactory_CreateRegion(region_factory, "region");
-
-  apache_geode_Region_PutString(region, "key", "value");
-
-  auto value = apache_geode_Region_GetString(region, "key");
-
-  ASSERT_STREQ(value, "value");
-
-  apache_geode_DestroyRegion(region);
-  apache_geode_DestroyRegionFactory(region_factory);
-  apache_geode_DestroyPool(pool);
-  apache_geode_DestroyPoolFactory(pool_factory);
-  apache_geode_DestroyPoolManager(pool_manager);
-  apache_geode_DestroyCache(cache);
-  apache_geode_DestroyCacheFactory(cache_factory);
-  auto leaks = apache_geode_ClientUninitialize(client);
-
-  ASSERT_EQ(leaks, 0);
-}
diff --git a/c-bindings/src/auth_initialize.cpp b/c-bindings/src/auth_initialize.cpp
deleted file mode 100644
index 35b97e2..0000000
--- a/c-bindings/src/auth_initialize.cpp
+++ /dev/null
@@ -1,73 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-// Standard headers
-#include <memory>
-#include <string>
-
-// C++ client public headers
-#include <geode/Properties.hpp>
-
-// C++ client private headers
-#include "util/Log.hpp"
-
-// C client public headers
-#include "geode/auth_initialize.h"
-
-// C client private headers
-#include "auth_initialize.hpp"
-
-void apache_geode_AuthInitialize_AddProperty(
-    apache_geode_properties_t* properties, const char* key, const char* value) {
-  auto securityProperties =
-      reinterpret_cast<apache::geode::client::Properties*>(properties);
-  securityProperties->insert(key, value);
-  LOGDEBUG("AuthInitializeWrapper::%s: added (k, v) = (\"%s\", \"%s\")",
-           __FUNCTION__, key, value);
-}
-
-std::shared_ptr<apache::geode::client::Properties>
-AuthInitializeWrapper::getCredentials(
-    const std::shared_ptr<apache::geode::client::Properties>& securityprops,
-    const std::string& /*server*/) {
-  LOGDEBUG("AuthInitializeWrapper::%s(%p): entry", __FUNCTION__, this);
-
-  if (getCredentials_) {
-    LOGDEBUG("AuthInitializeWrapper::%s(%p): calling getCredentials()",
-             __FUNCTION__, this);
-    getCredentials_(
-        reinterpret_cast<apache_geode_properties_t*>(securityprops.get()));
-  }
-
-  LOGDEBUG("AuthInitializeWrapper::%s(%p): exit", __FUNCTION__, this);
-  return securityprops;
-}
-
-void AuthInitializeWrapper::close() {
-  LOGDEBUG("AuthInitializeWrapper::%s(%p): entry", __FUNCTION__, this);
-
-  if (close_) {
-    LOGDEBUG("AuthInitializeWrapper::%s(%p): calling close()", __FUNCTION__,
-             this);
-    close_();
-  }
-  LOGDEBUG("AuthInitializeWrapper::%s(%p): exit", __FUNCTION__, this);
-}
-
-AuthInitializeWrapper::AuthInitializeWrapper(
-    void (*getCredentials)(apache_geode_properties_t*), void (*close)())
-    : AuthInitialize(), getCredentials_(getCredentials), close_(close) {}
diff --git a/c-bindings/src/auth_initialize.hpp b/c-bindings/src/auth_initialize.hpp
deleted file mode 100644
index e759959..0000000
--- a/c-bindings/src/auth_initialize.hpp
+++ /dev/null
@@ -1,49 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#pragma once
-
-#include <memory>
-#include <string>
-
-#include "geode/AuthInitialize.hpp"
-#include "geode/auth_initialize.h"
-
-namespace apache {
-  namespace geode {
-    namespace client {
-      class Properties;
-    }
-  }
-}
-
-class AuthInitializeWrapper : public apache::geode::client::AuthInitialize {
-  void (*getCredentials_)(apache_geode_properties_t*);
-  void (*close_)();
-
- public:
-  std::shared_ptr<apache::geode::client::Properties> getCredentials(
-      const std::shared_ptr<apache::geode::client::Properties>& securityprops,
-      const std::string& /*server*/) override;
-
-  void close() override;
-
-  AuthInitializeWrapper(void (*getCredentials)(apache_geode_properties_t*),
-                        void (*close)());
-
-  ~AuthInitializeWrapper() override = default;
-};
diff --git a/c-bindings/src/cache.cpp b/c-bindings/src/cache.cpp
deleted file mode 100644
index ad42cc2..0000000
--- a/c-bindings/src/cache.cpp
+++ /dev/null
@@ -1,119 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-// Standard headers
-#include <cstdint>
-
-// C++ client public headers
-#include "geode/RegionShortcut.hpp"
-
-// C++ client private headers
-#include "util/Log.hpp"
-
-// C client public headers
-#include "geode/cache.h"
-
-// C client private headers
-#include "cache.hpp"
-#include "cache/factory.hpp"
-#include "pool/manager.hpp"
-#include "region/factory.hpp"
-
-void apache_geode_DestroyCache(apache_geode_cache_t* cache) {
-  CacheWrapper* cacheWrapper = reinterpret_cast<CacheWrapper*>(cache);
-  LOGDEBUG("%s: destroying cache %p", __FUNCTION__, cache);
-  delete cacheWrapper;
-}
-
-bool apache_geode_Cache_GetPdxIgnoreUnreadFields(apache_geode_cache_t* cache) {
-  LOGDEBUG("%s: cache=%p", __FUNCTION__, cache);
-  CacheWrapper* cacheWrapper = reinterpret_cast<CacheWrapper*>(cache);
-  return cacheWrapper->getPdxIgnoreUnreadFields();
-}
-
-bool apache_geode_Cache_GetPdxReadSerialized(apache_geode_cache_t* cache) {
-  LOGDEBUG("%s: cache=%p", __FUNCTION__, cache);
-  CacheWrapper* cacheWrapper = reinterpret_cast<CacheWrapper*>(cache);
-  return cacheWrapper->getPdxReadSerialized();
-}
-
-apache_geode_pool_manager_t* apache_geode_Cache_GetPoolManager(
-    apache_geode_cache_t* cache) {
-  LOGDEBUG("%s: cache=%p", __FUNCTION__, cache);
-  CacheWrapper* cacheWrapper = reinterpret_cast<CacheWrapper*>(cache);
-  return reinterpret_cast<apache_geode_pool_manager_t*>(
-      cacheWrapper->getPoolManager());
-}
-
-apache_geode_region_factory_t* apache_geode_Cache_CreateRegionFactory(
-    apache_geode_cache_t* cache, std::int32_t regionType) {
-  LOGDEBUG("%s: cache=%p", __FUNCTION__, cache);
-  CacheWrapper* cacheWrapper = reinterpret_cast<CacheWrapper*>(cache);
-  apache::geode::client::RegionShortcut regionShortcut =
-      static_cast<apache::geode::client::RegionShortcut>(regionType);
-  return reinterpret_cast<apache_geode_region_factory_t*>(
-      cacheWrapper->createRegionFactory(regionShortcut));
-}
-
-const char* apache_geode_Cache_GetName(apache_geode_cache_t* cache) {
-  LOGDEBUG("%s: cache=%p", __FUNCTION__, cache);
-  CacheWrapper* cacheWrapper = reinterpret_cast<CacheWrapper*>(cache);
-  return cacheWrapper->getName();
-}
-
-void apache_geode_Cache_Close(apache_geode_cache_t* cache, bool keepalive) {
-  LOGDEBUG("%s: cache=%p", __FUNCTION__, cache);
-  CacheWrapper* cacheWrapper = reinterpret_cast<CacheWrapper*>(cache);
-  cacheWrapper->close(keepalive);
-}
-
-bool apache_geode_Cache_IsClosed(apache_geode_cache_t* cache) {
-  LOGDEBUG("%s: cache=%p", __FUNCTION__, cache);
-  CacheWrapper* cacheWrapper = reinterpret_cast<CacheWrapper*>(cache);
-  return cacheWrapper->isClosed();
-}
-
-CacheWrapper::CacheWrapper(apache::geode::client::Cache cache)
-    : cache_(std::move(cache)) {
-  AddRecord(this, "CacheWrapper");
-}
-
-CacheWrapper::~CacheWrapper() { RemoveRecord(this); }
-
-bool CacheWrapper::getPdxIgnoreUnreadFields() {
-  return cache_.getPdxIgnoreUnreadFields();
-}
-
-bool CacheWrapper::getPdxReadSerialized() {
-  return cache_.getPdxReadSerialized();
-}
-
-PoolManagerWrapper* CacheWrapper::getPoolManager() {
-  return new PoolManagerWrapper(this, cache_.getPoolManager());
-}
-
-RegionFactoryWrapper* CacheWrapper::createRegionFactory(
-    apache::geode::client::RegionShortcut regionShortcut) {
-  return new RegionFactoryWrapper(this,
-                                  cache_.createRegionFactory(regionShortcut));
-}
-
-const char* CacheWrapper::getName() { return cache_.getName().c_str(); }
-
-void CacheWrapper::close(bool keepalive) { cache_.close(keepalive); }
-
-bool CacheWrapper::isClosed() { return cache_.isClosed(); }
diff --git a/c-bindings/src/cache.hpp b/c-bindings/src/cache.hpp
deleted file mode 100644
index dc64517..0000000
--- a/c-bindings/src/cache.hpp
+++ /dev/null
@@ -1,57 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#pragma once
-
-#include "geode/Cache.hpp"
-#include "client.hpp"
-
-
-namespace apache {
-  namespace geode {
-    namespace client {
-      enum class RegionShortcut;
-    }
-  }
-}
-
-class PoolManagerWrapper;
-class RegionFactoryWrapper;
-class CacheFactoryWrapper;
-
-class CacheWrapper: public ClientKeeper {
-  apache::geode::client::Cache cache_;
-
- public:
-  explicit CacheWrapper(apache::geode::client::Cache);
-  ~CacheWrapper();
-
-  bool getPdxIgnoreUnreadFields();
-
-  bool getPdxReadSerialized();
-
-  PoolManagerWrapper* getPoolManager();
-
-  RegionFactoryWrapper* createRegionFactory(
-      apache::geode::client::RegionShortcut regionShortcut);
-
-  const char* getName();
-
-  void close(bool keepalive);
-
-  bool isClosed();
-};
diff --git a/c-bindings/src/cache/factory.cpp b/c-bindings/src/cache/factory.cpp
deleted file mode 100644
index e0b5bb4..0000000
--- a/c-bindings/src/cache/factory.cpp
+++ /dev/null
@@ -1,154 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-// Standard headers
-#include <iostream>
-#include <memory>
-#include <string>
-
-// C++ client public headers
-#include "geode/CacheFactory.hpp"
-
-// C++ client private headers
-#include "util/Log.hpp"
-
-// C client public headers
-#include "geode/cache.h"
-#include "geode/cache/factory.h"
-#include "geode/client.h"
-
-// C client private headers
-#include "auth_initialize.hpp"
-#include "cache.hpp"
-#include "client.hpp"
-#include "factory.hpp"
-
-CacheFactoryWrapper::CacheFactoryWrapper() {
-  AddRecord(this, "CacheFactoryWrapper");
-  cacheFactory_.set("log-level", "debug");
-  std::cout << __FUNCTION__ << " " << static_cast<void*>(this) << "\n";
-}
-
-CacheFactoryWrapper::~CacheFactoryWrapper() { RemoveRecord(this); }
-
-const char* CacheFactoryWrapper::getVersion() {
-  return cacheFactory_.getVersion().c_str();
-}
-
-const char* CacheFactoryWrapper::getProductDescription() {
-  return cacheFactory_.getProductDescription().c_str();
-}
-
-void CacheFactoryWrapper::setPdxIgnoreUnreadFields(bool pdxIgnoreUnreadFields) {
-  std::cout << __FUNCTION__ << " " << static_cast<void*>(this) << "\n";
-  cacheFactory_.setPdxIgnoreUnreadFields(pdxIgnoreUnreadFields);
-}
-
-void CacheFactoryWrapper::setAuthInitialize(
-    void (*getCredentials)(apache_geode_properties_t*), void (*close)()) {
-  authInit_ = std::make_shared<AuthInitializeWrapper>(getCredentials, close);
-  cacheFactory_.setAuthInitialize(authInit_);
-}
-
-void CacheFactoryWrapper::setPdxReadSerialized(bool pdxReadSerialized) {
-  cacheFactory_.setPdxReadSerialized(pdxReadSerialized);
-}
-
-void CacheFactoryWrapper::setProperty(const std::string& key,
-                                      const std::string& value) {
-  cacheFactory_.set(key, value);
-}
-
-CacheWrapper* CacheFactoryWrapper::createCache() {
-  std::cout << __FUNCTION__ << " " << static_cast<void*>(this) << "\n";
-  return new CacheWrapper(cacheFactory_.create());
-}
-
-apache_geode_cache_factory_t* apache_geode_CreateCacheFactory() {
-  auto factory = new CacheFactoryWrapper();
-  std::cout << __FUNCTION__ << " factory: " << static_cast<void*>(factory)
-            << "\n";
-  LOGDEBUG("%s: factory=%p", __FUNCTION__, factory);
-  return reinterpret_cast<apache_geode_cache_factory_t*>(factory);
-}
-
-apache_geode_cache_t* apache_geode_CacheFactory_CreateCache(
-    apache_geode_cache_factory_t* factory) {
-  auto cacheFactory = reinterpret_cast<CacheFactoryWrapper*>(factory);
-  CacheWrapper* cache = cacheFactory->createCache();
-  std::cout << __FUNCTION__ << " factory: " << static_cast<void*>(factory)
-            << "cache: " << static_cast<void*>(cache) << "\n";
-  LOGDEBUG("%s: factory=%p, cache=%p", __FUNCTION__, factory, cache);
-  return reinterpret_cast<apache_geode_cache_t*>(cache);
-}
-
-const char* apache_geode_CacheFactory_GetVersion(
-    apache_geode_cache_factory_t* factory) {
-  LOGDEBUG("%s: factory=%p", __FUNCTION__, factory);
-  auto cacheFactory = reinterpret_cast<CacheFactoryWrapper*>(factory);
-  return cacheFactory->getVersion();
-}
-
-const char* apache_geode_CacheFactory_GetProductDescription(
-    apache_geode_cache_factory_t* factory) {
-  LOGDEBUG("%s: factory=%p", __FUNCTION__, factory);
-  auto cacheFactory = reinterpret_cast<CacheFactoryWrapper*>(factory);
-  return cacheFactory->getProductDescription();
-}
-
-void apache_geode_CacheFactory_SetPdxIgnoreUnreadFields(
-    apache_geode_cache_factory_t* factory, bool pdxIgnoreUnreadFields) {
-  auto cacheFactory = reinterpret_cast<CacheFactoryWrapper*>(factory);
-  auto ignoreUnreadFields = pdxIgnoreUnreadFields ? "true" : "false";
-  std::cout << __FUNCTION__ << " factory: " << static_cast<void*>(factory)
-            << "\n";
-  LOGDEBUG("%s: factory=%p, ignoreUnreadFields=%s", __FUNCTION__, factory,
-           ignoreUnreadFields);
-  cacheFactory->setPdxIgnoreUnreadFields(pdxIgnoreUnreadFields);
-}
-
-void apache_geode_CacheFactory_SetAuthInitialize(
-    apache_geode_cache_factory_t* factory,
-    void (*getCredentials)(apache_geode_properties_t*), void (*close)()) {
-  auto cacheFactory = reinterpret_cast<CacheFactoryWrapper*>(factory);
-  LOGDEBUG("%s: factory=%p, getCredentials=%p, close=%p", __FUNCTION__, factory,
-           getCredentials, close);
-  cacheFactory->setAuthInitialize(getCredentials, close);
-}
-
-void apache_geode_CacheFactory_SetPdxReadSerialized(
-    apache_geode_cache_factory_t* factory, bool pdxReadSerialized) {
-  auto cacheFactory = reinterpret_cast<CacheFactoryWrapper*>(factory);
-  auto readSerialized = pdxReadSerialized ? "true" : "false";
-  LOGDEBUG("%s: factory=%p, readSerialized=%s", __FUNCTION__, factory,
-           readSerialized);
-  cacheFactory->setPdxReadSerialized(pdxReadSerialized);
-}
-
-void apache_geode_CacheFactory_SetProperty(
-    apache_geode_cache_factory_t* factory, const char* key, const char* value) {
-  LOGDEBUG("%s: factory=%p, (k, v)=(%s, %s)", __FUNCTION__, factory,
-           std::string(key).c_str(), std::string(value).c_str());
-  auto cacheFactory = reinterpret_cast<CacheFactoryWrapper*>(factory);
-  cacheFactory->setProperty(key, value);
-}
-
-void apache_geode_DestroyCacheFactory(apache_geode_cache_factory_t* factory) {
-  std::cout << __FUNCTION__ << " factory: " << static_cast<void*>(factory)
-            << "\n";
-  delete reinterpret_cast<CacheFactoryWrapper*>(factory);
-}
diff --git a/c-bindings/src/cache/factory.hpp b/c-bindings/src/cache/factory.hpp
deleted file mode 100644
index 301c4a8..0000000
--- a/c-bindings/src/cache/factory.hpp
+++ /dev/null
@@ -1,55 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-// Standard headers
-#include <memory>
-#include <string>
-
-// C++ client public headers
-#include "geode/CacheFactory.hpp"
-
-// C client public headers
-#include "geode/client.h"
-
-// C client private headers
-#include "auth_initialize.hpp"
-#include "client.hpp"
-
-class CacheFactoryWrapper : public ClientKeeper {
-  apache::geode::client::CacheFactory cacheFactory_;
-  std::shared_ptr<AuthInitializeWrapper> authInit_;
-
- public:
-  CacheFactoryWrapper();
-
-  ~CacheFactoryWrapper();
-
-  const char* getVersion();
-
-  const char* getProductDescription();
-
-  void setPdxIgnoreUnreadFields(bool pdxIgnoreUnreadFields);
-
-  void setAuthInitialize(void (*getCredentials)(apache_geode_properties_t*),
-                         void (*close)());
-
-  void setPdxReadSerialized(bool pdxReadSerialized);
-
-  void setProperty(const std::string& key, const std::string& value);
-
-  CacheWrapper* createCache();
-};
diff --git a/c-bindings/src/client.cpp b/c-bindings/src/client.cpp
deleted file mode 100644
index 59195cb..0000000
--- a/c-bindings/src/client.cpp
+++ /dev/null
@@ -1,93 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-// Standard headers
-#include <iostream>
-#include <string>
-#include <utility>
-
-// C++ client public headers
-#include "geode/Exception.hpp"
-
-// C++ client private headers
-#include "util/Log.hpp"
-
-// C client public headers
-#include "geode/client.h"
-
-// C client private headers
-#include "client.hpp"
-
-std::shared_ptr<ClientWrapper>& PermaClient::instance() {
-  static auto client_ = std::make_shared<ClientWrapper>();
-  return client_;
-}
-
-apache_geode_client_t* apache_geode_ClientInitialize() {
-  return reinterpret_cast<apache_geode_client_t*>(
-      PermaClient::instance().get());
-}
-
-int apache_geode_ClientUninitialize(apache_geode_client_t* client) {
-  try {
-    const int result = PermaClient::instance()->checkForLeaks();
-    return result;
-  } catch (...) {
-    return -1;
-  }
-  return 0;
-}
-
-void Client::AddRecord(void* value, const std::string& className) {
-  do_AddRecord(value, className);
-}
-
-void Client::RemoveRecord(void* value) { do_RemoveRecord(value); }
-
-void ClientKeeper::do_AddRecord(void* value, const std::string& className) {
-  PermaClient::instance()->AddRecord(value, className);
-}
-
-void ClientKeeper::do_RemoveRecord(void* value) {
-  PermaClient::instance()->RemoveRecord(value);
-}
-
-int ClientWrapper::checkForLeaks() {
-  int result = 0;
-  if (!registry_.empty()) {
-    for (auto recordPair : registry_) {
-      auto object = recordPair.first;
-      auto record = recordPair.second;
-
-      LOGERROR("Leaked object of type \"%s\" (pointer value %p), callstack %s",
-               record.className.c_str(), object,
-               record.allocationCallstack.c_str());
-      result = -1;
-    }
-  }
-  return result;
-}
-
-void ClientWrapper::do_AddRecord(void* value, const std::string& className) {
-  using apache::geode::client::Exception;
-
-  registry_.insert({value, {className, Exception("").getStackTrace()}});
-}
-
-void ClientWrapper::do_RemoveRecord(void* value) { registry_.erase(value); }
-
-ClientWrapper::~ClientWrapper() { std::cout << "Geode client shut down...\n"; }
diff --git a/c-bindings/src/client.hpp b/c-bindings/src/client.hpp
deleted file mode 100644
index 638e696..0000000
--- a/c-bindings/src/client.hpp
+++ /dev/null
@@ -1,73 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#pragma once
-
-#include <map>
-#include <string>
-#include <memory>
-
-#include "geode/internal/geode_base.h"
-
-// All wrappers are passed their creator object for retention.
-// The parent objects implement this interface.
-class Client {
-  virtual void do_AddRecord(void *, const std::string &) = 0;
-  virtual void do_RemoveRecord(void *) = 0;
-
- public:
-  // All wrappers call this in their constructors.
-  void AddRecord(void *, const std::string &);
-  // All wrappers call this in their destructors.
-  void RemoveRecord(void *);
-};
-
-// Anything that creates another wrapper derives from this.
-// Adding and removing from this defers to the parent retained within.
-class ClientKeeper : public Client {
-  void do_AddRecord(void *, const std::string &) final override;
-  void do_RemoveRecord(void *) final override;
-};
-
-// This is the top level parent. Adding and removing from any client will
-// ultimately add and remove from an instance of this. This is the client
-// object the user creates from the C interface. Because the wrappers form a
-// hierarchy, it's very important to destroy them in reverse order along that
-// hierarchy.
-class ClientWrapper : public Client {
-  struct ClientObjectRecord {
-    std::string className;
-    std::string allocationCallstack;
-  };
-
-  typedef std::map<void *, ClientObjectRecord> ClientObjectRegistry;
-
-  ClientObjectRegistry registry_;
-
-  void do_AddRecord(void *, const std::string &) final override;
-  void do_RemoveRecord(void *) final override;
-
- public:
-  int checkForLeaks();
-
-  virtual ~ClientWrapper();
-};
-
-class PermaClient {
- public:
-    static std::shared_ptr<ClientWrapper> &instance();
-};
\ No newline at end of file
diff --git a/c-bindings/src/pool.cpp b/c-bindings/src/pool.cpp
deleted file mode 100644
index c6fac7a..0000000
--- a/c-bindings/src/pool.cpp
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-// Standard headers
-#include <memory>
-
-// C++ public headers
-#include "geode/Pool.hpp"
-
-// C client public headers
-#include "geode/pool.h"
-
-// C client private headers
-#include "pool.hpp"
-#include "pool/factory.hpp"
-
-void apache_geode_DestroyPool(apache_geode_pool_t* pool) {
-  PoolWrapper* poolWrapper = reinterpret_cast<PoolWrapper*>(pool);
-  delete poolWrapper;
-}
-
-PoolWrapper::PoolWrapper(std::shared_ptr<apache::geode::client::Pool> pool)
-    : pool_(pool) {
-  AddRecord(this, "PoolWrapper");
-}
-
-PoolWrapper::~PoolWrapper() { RemoveRecord(this); }
\ No newline at end of file
diff --git a/c-bindings/src/pool.hpp b/c-bindings/src/pool.hpp
deleted file mode 100644
index 36b5f8b..0000000
--- a/c-bindings/src/pool.hpp
+++ /dev/null
@@ -1,32 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#pragma once
-
-#include <memory>
-
-#include "client.hpp"
-#include "geode/Pool.hpp"
-
-class PoolFactoryWrapper;
-class PoolWrapper : public ClientKeeper {
-  std::shared_ptr<apache::geode::client::Pool> pool_;
-
- public:
-  explicit PoolWrapper(std::shared_ptr<apache::geode::client::Pool> pool);
-  ~PoolWrapper();
-};
diff --git a/c-bindings/src/pool/factory.cpp b/c-bindings/src/pool/factory.cpp
deleted file mode 100644
index 8b4a8a7..0000000
--- a/c-bindings/src/pool/factory.cpp
+++ /dev/null
@@ -1,67 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-// Standard headers
-#include <cstdint>
-#include <string>
-
-// C client public headers
-#include "geode/pool/factory.h"
-
-// C client private headers
-#include "pool.hpp"
-#include "pool/factory.hpp"
-#include "pool/manager.hpp"
-
-apache_geode_pool_t* apache_geode_PoolFactory_CreatePool(
-    apache_geode_pool_factory_t* poolFactory, const char* name) {
-  PoolFactoryWrapper* poolFactoryWrapper =
-      reinterpret_cast<PoolFactoryWrapper*>(poolFactory);
-  return reinterpret_cast<apache_geode_pool_t*>(
-      poolFactoryWrapper->CreatePool(name));
-}
-
-void apache_geode_PoolFactory_AddLocator(
-    apache_geode_pool_factory_t* poolFactory, const char* hostname,
-    const std::uint16_t port) {
-  PoolFactoryWrapper* poolFactoryWrapper =
-      reinterpret_cast<PoolFactoryWrapper*>(poolFactory);
-  poolFactoryWrapper->AddLocator(hostname, port);
-}
-
-void apache_geode_DestroyPoolFactory(apache_geode_pool_factory_t* poolFactory) {
-  PoolFactoryWrapper* poolFactoryWrapper =
-      reinterpret_cast<PoolFactoryWrapper*>(poolFactory);
-  delete poolFactoryWrapper;
-}
-
-PoolFactoryWrapper::PoolFactoryWrapper(
-    apache::geode::client::PoolFactory poolFactory)
-    : poolFactory_(poolFactory) {
-  AddRecord(this, "PoolFactoryWrapper");
-}
-
-PoolFactoryWrapper::~PoolFactoryWrapper() { RemoveRecord(this); }
-
-PoolWrapper* PoolFactoryWrapper::CreatePool(const char* name) {
-  return new PoolWrapper(poolFactory_.create(name));
-}
-
-void PoolFactoryWrapper::AddLocator(const std::string& hostname,
-                                    const std::uint16_t port) {
-  poolFactory_.addLocator(hostname, port);
-}
diff --git a/c-bindings/src/pool/factory.hpp b/c-bindings/src/pool/factory.hpp
deleted file mode 100644
index 970af4d..0000000
--- a/c-bindings/src/pool/factory.hpp
+++ /dev/null
@@ -1,39 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#pragma once
-
-#include <cstdint>
-#include <string>
-
-#include "geode/PoolFactory.hpp"
-#include "client.hpp"
-
-class PoolWrapper;
-class PoolManagerWrapper;
-
-class PoolFactoryWrapper: public ClientKeeper {
-  apache::geode::client::PoolFactory poolFactory_;
-
- public:
-  explicit PoolFactoryWrapper(apache::geode::client::PoolFactory poolFactory);
-  ~PoolFactoryWrapper();
-
-  PoolWrapper* CreatePool(const char* name);
-
-  void AddLocator(const std::string& hostname, std::uint16_t port);
-};
diff --git a/c-bindings/src/pool/manager.cpp b/c-bindings/src/pool/manager.cpp
deleted file mode 100644
index ffe348d..0000000
--- a/c-bindings/src/pool/manager.cpp
+++ /dev/null
@@ -1,51 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-// C client public headers
-#include "geode/pool/manager.h"
-
-// C client private headers
-#include "cache.hpp"
-#include "client.hpp"
-#include "pool/factory.hpp"
-#include "pool/manager.hpp"
-
-apache_geode_pool_factory_t* apache_geode_PoolManager_CreateFactory(
-    apache_geode_pool_manager_t* poolManager) {
-  PoolManagerWrapper* poolManagerWrapper =
-      reinterpret_cast<PoolManagerWrapper*>(poolManager);
-  return reinterpret_cast<apache_geode_pool_factory_t*>(
-      poolManagerWrapper->CreatePoolFactory());
-}
-
-void apache_geode_DestroyPoolManager(apache_geode_pool_manager_t* poolManager) {
-  PoolManagerWrapper* poolManagerWrapper =
-      reinterpret_cast<PoolManagerWrapper*>(poolManager);
-  delete poolManagerWrapper;
-}
-
-PoolManagerWrapper::PoolManagerWrapper(
-    CacheWrapper* cache, apache::geode::client::PoolManager& poolManager)
-    : poolManager_(poolManager) {
-  AddRecord(this, "PoolManagerWrapper");
-}
-
-PoolManagerWrapper::~PoolManagerWrapper() { RemoveRecord(this); }
-
-PoolFactoryWrapper* PoolManagerWrapper::CreatePoolFactory() {
-  return new PoolFactoryWrapper(poolManager_.createFactory());
-}
diff --git a/c-bindings/src/pool/manager.hpp b/c-bindings/src/pool/manager.hpp
deleted file mode 100644
index 00a351d..0000000
--- a/c-bindings/src/pool/manager.hpp
+++ /dev/null
@@ -1,33 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#pragma once
-
-#include "geode/PoolManager.hpp"
-
-class PoolFactoryWrapper;
-class CacheWrapper;
-
-class PoolManagerWrapper: public ClientKeeper {
-  apache::geode::client::PoolManager& poolManager_;
-
- public:
-  PoolManagerWrapper(CacheWrapper *cache, apache::geode::client::PoolManager& poolManager);
-  ~PoolManagerWrapper();
-
-  PoolFactoryWrapper* CreatePoolFactory();
-};
diff --git a/c-bindings/src/region.cpp b/c-bindings/src/region.cpp
deleted file mode 100644
index 500506b..0000000
--- a/c-bindings/src/region.cpp
+++ /dev/null
@@ -1,134 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-// Standard headers
-#include <memory>
-#include <string>
-
-#ifdef _WIN32
-#include <objbase.h>
-#endif  // _WIN32
-
-// C++ client public headers
-#include "geode/CacheableString.hpp"
-#include "geode/Region.hpp"
-#include "geode/RegionShortcut.hpp"
-
-// C client public headers
-#include "geode/region.h"
-#include "geode/region/factory.h"
-
-// C client private headers
-#include "region.hpp"
-#include "region/factory.hpp"
-
-RegionWrapper::RegionWrapper(
-    std::shared_ptr<apache::geode::client::Region> region)
-    : region_(region) {
-  AddRecord(this, "RegionWrapper");
-}
-
-RegionWrapper::~RegionWrapper() { RemoveRecord(this); }
-
-void RegionWrapper::PutString(const std::string& key,
-                              const std::string& value) {
-  region_->put(key, value);
-}
-
-void RegionWrapper::PutByteArray(const std::string& key, const char* value,
-                                 size_t size) {
-  std::vector<int8_t> val(value, value + size);
-  region_->put(key, apache::geode::client::CacheableBytes::create(val));
-}
-
-const char* RegionWrapper::GetString(const std::string& key) {
-  auto value = region_->get(key);
-  lastValue_ =
-      std::dynamic_pointer_cast<apache::geode::client::CacheableString>(value)
-          ->value();
-  return lastValue_.c_str();
-}
-
-void RegionWrapper::GetByteArray(const std::string& key, char** value,
-                                 size_t* size) {
-  std::shared_ptr<apache::geode::client::Serializable> val = region_->get(key);
-
-  if (val.get() == nullptr) return;
-
-  auto bytes =
-      std::dynamic_pointer_cast<apache::geode::client::CacheableBytes>(val);
-  int valSize = val->objectSize();
-#if defined(_WIN32)
-  int8_t* byteArray = static_cast<int8_t*>(CoTaskMemAlloc(valSize));
-#else
-  int8_t* byteArray = static_cast<int8_t*>(malloc(valSize));
-#endif
-  if (bytes) {
-    memcpy(byteArray, bytes->value().data(), valSize);
-    *value = reinterpret_cast<char*>(byteArray);
-    *size = valSize;
-  }
-}
-
-void RegionWrapper::Remove(const std::string& key) { region_->remove(key); }
-
-bool RegionWrapper::ContainsValueForKey(const std::string& key) {
-  return region_->containsValueForKey(key);
-}
-
-void apache_geode_DestroyRegion(apache_geode_region_t* region) {
-  RegionWrapper* regionWrapper = reinterpret_cast<RegionWrapper*>(region);
-  delete regionWrapper;
-}
-
-void apache_geode_Region_PutString(apache_geode_region_t* region,
-                                   const char* key, const char* value) {
-  RegionWrapper* regionWrapper = reinterpret_cast<RegionWrapper*>(region);
-  regionWrapper->PutString(key, value);
-}
-
-void apache_geode_Region_PutByteArray(apache_geode_region_t* region,
-                                      const char* key, const char* value,
-                                      size_t size) {
-  RegionWrapper* regionWrapper = reinterpret_cast<RegionWrapper*>(region);
-  regionWrapper->PutByteArray(key, value, size);
-}
-
-const char* apache_geode_Region_GetString(apache_geode_region_t* region,
-                                          const char* key) {
-  RegionWrapper* regionWrapper = reinterpret_cast<RegionWrapper*>(region);
-  return regionWrapper->GetString(key);
-}
-
-void apache_geode_Region_GetByteArray(apache_geode_region_t* region,
-                                      const char* key, char** value,
-                                      size_t* size) {
-  RegionWrapper* regionWrapper = reinterpret_cast<RegionWrapper*>(region);
-  return regionWrapper->GetByteArray(key, value, size);
-}
-
-void apache_geode_Region_Remove(apache_geode_region_t* region,
-                                const char* key) {
-  RegionWrapper* regionWrapper = reinterpret_cast<RegionWrapper*>(region);
-  return regionWrapper->Remove(key);
-}
-
-bool apache_geode_Region_ContainsValueForKey(apache_geode_region_t* region,
-                                             const char* key) {
-  RegionWrapper* regionWrapper = reinterpret_cast<RegionWrapper*>(region);
-  return regionWrapper->ContainsValueForKey(key);
-}
diff --git a/c-bindings/src/region.hpp b/c-bindings/src/region.hpp
deleted file mode 100644
index 603a2c7..0000000
--- a/c-bindings/src/region.hpp
+++ /dev/null
@@ -1,47 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#pragma once
-
-#include <string>
-#include <memory>
-
-#include "client.hpp"
-#include "geode/Region.hpp"
-
-class RegionFactoryWrapper;
-
-class RegionWrapper : public ClientKeeper {
-  std::shared_ptr<apache::geode::client::Region> region_;
-  std::string lastValue_;
-
- public:
-  explicit RegionWrapper(std::shared_ptr<apache::geode::client::Region> region);
-  ~RegionWrapper();
-
-  void PutString(const std::string& key, const std::string& value);
-
-  void PutByteArray(const std::string& key, const char* value, size_t size);
-
-  const char* GetString(const std::string& key);
-
-  void GetByteArray(const std::string& key, char** value, size_t* size);
-
-  void Remove(const std::string& key);
-
-  bool ContainsValueForKey(const std::string& key);
-};
diff --git a/c-bindings/src/region/factory.cpp b/c-bindings/src/region/factory.cpp
deleted file mode 100644
index f5ff13f..0000000
--- a/c-bindings/src/region/factory.cpp
+++ /dev/null
@@ -1,68 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-// Standard headers
-#include <string>
-#include <utility>
-
-// C++ client public headers
-#include "geode/RegionFactory.hpp"
-
-// C client public headers
-#include "geode/region.h"
-#include "geode/region/factory.h"
-
-// C client private headers
-#include "cache.hpp"
-#include "region.hpp"
-#include "region/factory.hpp"
-
-RegionFactoryWrapper::RegionFactoryWrapper(
-    CacheWrapper* cache, apache::geode::client::RegionFactory regionFactory)
-    : regionFactory_(std::move(regionFactory)) {
-  AddRecord(this, "RegionFactoryWrapper");
-}
-
-RegionFactoryWrapper::~RegionFactoryWrapper() { RemoveRecord(this); }
-
-void RegionFactoryWrapper::setPoolName(const std::string& poolName) {
-  regionFactory_.setPoolName(poolName);
-}
-
-RegionWrapper* RegionFactoryWrapper::createRegion(
-    const std::string& regionName) {
-  return new RegionWrapper(regionFactory_.create(regionName));
-}
-
-void apache_geode_DestroyRegionFactory(
-    apache_geode_region_factory_t* regionFactory) {
-  delete reinterpret_cast<RegionFactoryWrapper*>(regionFactory);
-}
-
-void apache_geode_RegionFactory_SetPoolName(
-    apache_geode_region_factory_t* regionFactory, const char* poolName) {
-  RegionFactoryWrapper* regionFactoryWrapper =
-      reinterpret_cast<RegionFactoryWrapper*>(regionFactory);
-  regionFactoryWrapper->setPoolName(poolName);
-}
-apache_geode_region_t* apache_geode_RegionFactory_CreateRegion(
-    apache_geode_region_factory_t* regionFactory, const char* regionName) {
-  RegionFactoryWrapper* regionFactoryWrapper =
-      reinterpret_cast<RegionFactoryWrapper*>(regionFactory);
-  return reinterpret_cast<apache_geode_region_t*>(
-      regionFactoryWrapper->createRegion(regionName));
-}
diff --git a/c-bindings/src/region/factory.hpp b/c-bindings/src/region/factory.hpp
deleted file mode 100644
index ded2243..0000000
--- a/c-bindings/src/region/factory.hpp
+++ /dev/null
@@ -1,38 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#pragma once
-
-#include <string>
-
-#include "geode/RegionFactory.hpp"
-#include "client.hpp"
-
-class RegionWrapper;
-class CacheWrapper;
-
-class RegionFactoryWrapper: public ClientKeeper {
-  apache::geode::client::RegionFactory regionFactory_;
-
- public:
-  RegionFactoryWrapper(CacheWrapper *, apache::geode::client::RegionFactory regionFactory);
-  ~RegionFactoryWrapper();
-
-  void setPoolName(const std::string& poolName);
-
-  RegionWrapper* createRegion(const std::string& regionName);
-};
diff --git a/c-bindings/symbols b/c-bindings/symbols
deleted file mode 100644
index 0f15796..0000000
--- a/c-bindings/symbols
+++ /dev/null
@@ -1,17 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-apache_geode_*
\ No newline at end of file
diff --git a/c-bindings/symbols.version b/c-bindings/symbols.version
deleted file mode 100644
index 42ad881..0000000
--- a/c-bindings/symbols.version
+++ /dev/null
@@ -1,22 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-V0 {
-  global:
-    apache_geode_*;
-  local:
-    *;
-};
\ No newline at end of file
diff --git a/ci/lib/templates.lib.yml b/ci/lib/templates.lib.yml
index b38e580..f372806 100644
--- a/ci/lib/templates.lib.yml
+++ b/ci/lib/templates.lib.yml
@@ -221,8 +221,6 @@
     - #@ remote_task("net-integration-tests", config.config, ctest_bash_task("build/clicache/integration-test2"), "1h", build.params)
     - #@ remote_task("net-legacy-integration-tests", config.config, ctest_bash_task("build/clicache/integration-test", timeout=500, parallel=4), "2h", build.params)
     #@ end
-    - #@ remote_task("netcore-integration-test", config.config, ctest_bash_task("build/netcore/netcore-integration-test", config.config, parallel=1), "10m", build.params)
-    - #@ remote_task("netcore-session-integration-test", config.config, ctest_bash_task("build/netcore/netcore-session-integration-test", parallel=1), "10m", build.params)
     on_failure:
       in_parallel:
         steps:
diff --git a/netcore/.clang-format b/netcore/.clang-format
deleted file mode 100644
index 750c3c7..0000000
--- a/netcore/.clang-format
+++ /dev/null
@@ -1,3 +0,0 @@
----
-Language:        CSharp
-BasedOnStyle:  Google
diff --git a/netcore/.gitignore b/netcore/.gitignore
deleted file mode 100644
index e89c87b..0000000
--- a/netcore/.gitignore
+++ /dev/null
@@ -1,4 +0,0 @@
-/*/bin/
-/*/obj/
-/*/build/
-
diff --git a/netcore/CMakeLists.txt b/netcore/CMakeLists.txt
deleted file mode 100644
index 0caa268..0000000
--- a/netcore/CMakeLists.txt
+++ /dev/null
@@ -1,29 +0,0 @@
-# Licensed to the Apache Software Foundation (ASF) under one or more
-# contributor license agreements.  See the NOTICE file distributed with
-# this work for additional information regarding copyright ownership.
-# The ASF licenses this file to You under the Apache License, Version 2.0
-# (the "License"); you may not use this file except in compliance with
-# the License.  You may obtain a copy of the License at
-#
-#      http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-project(netcore LANGUAGES NONE)
-
-option(INCLUDE_DOTNET_CORE "Build .NET Core client." ON)
-
-find_program(DOTNET dotnet)
-
-if(DOTNET AND INCLUDE_DOTNET_CORE)
-  add_subdirectory(netcore-lib)
-  add_subdirectory(netcore-session)
-  add_subdirectory(netcore-integration-test)
-  add_subdirectory(netcore-session-integration-test)
-  add_subdirectory(utility)
-  add_subdirectory(shared)
-endif()
-
diff --git a/netcore/asp-netcore-session-sample/AspNetCore GeodeSession Sample.csproj.user b/netcore/asp-netcore-session-sample/AspNetCore GeodeSession Sample.csproj.user
deleted file mode 100644
index 9dd7dfa..0000000
--- a/netcore/asp-netcore-session-sample/AspNetCore GeodeSession Sample.csproj.user
+++ /dev/null
@@ -1,6 +0,0 @@
-﻿<?xml version="1.0" encoding="utf-8"?>
-<Project ToolsVersion="Current" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
-  <PropertyGroup>
-    <ActiveDebugProfile>IIS Express</ActiveDebugProfile>
-  </PropertyGroup>
-</Project>
diff --git a/netcore/asp-netcore-session-sample/Extensions/SessionExtensions.cs b/netcore/asp-netcore-session-sample/Extensions/SessionExtensions.cs
deleted file mode 100644
index 367ee56..0000000
--- a/netcore/asp-netcore-session-sample/Extensions/SessionExtensions.cs
+++ /dev/null
@@ -1,53 +0,0 @@
-﻿/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-using System.Text.Json;
-using Microsoft.AspNetCore.Http;
-
-namespace Web.Extensions {
-#region snippet1
-  public static class SessionExtensions {
-    public static void Set<T>(this ISession session, string key, T value) {
-      session.SetString(key, JsonSerializer.Serialize(value));
-    }
-
-    public static T Get<T>(this ISession session, string key) {
-      var value = session.GetString(key);
-      return value == null ? default : JsonSerializer.Deserialize<T>(value);
-    }
-  }
-#endregion
-}
-
-namespace Web.Extensions2 {
-  // Alternate approach
-
-  public static class SessionExtensions {
-    public static void Set<T>(this ISession session, string key, T value) {
-      session.SetString(key, JsonSerializer.Serialize(value));
-    }
-
-    public static bool TryGet<T>(this ISession session, string key, out T value) {
-      var state = session.GetString(key);
-      value = default;
-      if (state == null) {
-        return false;
-      }
-      value = JsonSerializer.Deserialize<T>(state);
-      return true;
-    }
-  }
-}
diff --git a/netcore/asp-netcore-session-sample/Middleware/HttpContextItemsMiddleware.cs b/netcore/asp-netcore-session-sample/Middleware/HttpContextItemsMiddleware.cs
deleted file mode 100644
index 8b7ca4b..0000000
--- a/netcore/asp-netcore-session-sample/Middleware/HttpContextItemsMiddleware.cs
+++ /dev/null
@@ -1,45 +0,0 @@
-﻿/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-using System;
-using System.Threading.Tasks;
-using Microsoft.AspNetCore.Builder;
-using Microsoft.AspNetCore.Http;
-
-namespace SessionSample.Middleware {
-#region snippet1
-  public class HttpContextItemsMiddleware {
-    private readonly RequestDelegate _next;
-    public static readonly object HttpContextItemsMiddlewareKey = new Object();
-
-    public HttpContextItemsMiddleware(RequestDelegate next) {
-      _next = next;
-    }
-
-    public async Task Invoke(HttpContext httpContext) {
-      httpContext.Items[HttpContextItemsMiddlewareKey] = "K-9";
-
-      await _next(httpContext);
-    }
-  }
-
-  public static class HttpContextItemsMiddlewareExtensions {
-    public static IApplicationBuilder UseHttpContextItemsMiddleware(this IApplicationBuilder app) {
-      return app.UseMiddleware<HttpContextItemsMiddleware>();
-    }
-  }
-#endregion
-}
diff --git a/netcore/asp-netcore-session-sample/Models/BasicAuthInitialize.cs b/netcore/asp-netcore-session-sample/Models/BasicAuthInitialize.cs
deleted file mode 100644
index 067d41d..0000000
--- a/netcore/asp-netcore-session-sample/Models/BasicAuthInitialize.cs
+++ /dev/null
@@ -1,47 +0,0 @@
-﻿/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-using Apache.Geode.Client;
-using System;
-using System.Collections.Generic;
-
-namespace GemFireSessionState.Models
-{
-  public class BasicAuthInitialize : IAuthInitialize
-  {
-    private string _username;
-    private string _password;
-
-    public BasicAuthInitialize(string username, string password)
-    {
-      _username = username;
-      _password = password;
-    }
-
-    public void Close()
-    {
-    }
-
-    public Dictionary<string, string> GetCredentials()
-    {
-      Console.WriteLine("SimpleAuthInitialize::GetCredentials called");
-      var credentials = new Dictionary<string, string>();
-      credentials.Add("security-username", "root");
-      credentials.Add("security-password", "root-password");
-      return credentials;
-    }
-  }
-}
diff --git a/netcore/asp-netcore-session-sample/Models/ErrorViewModel.cs b/netcore/asp-netcore-session-sample/Models/ErrorViewModel.cs
deleted file mode 100644
index 49f70ef..0000000
--- a/netcore/asp-netcore-session-sample/Models/ErrorViewModel.cs
+++ /dev/null
@@ -1,27 +0,0 @@
-﻿/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Threading.Tasks;
-
-namespace SessionSample.Models
-{
-  public class ErrorViewModel
-  {
-  }
-}
diff --git a/netcore/asp-netcore-session-sample/Pages/Error.cshtml b/netcore/asp-netcore-session-sample/Pages/Error.cshtml
deleted file mode 100644
index 7e0919b..0000000
--- a/netcore/asp-netcore-session-sample/Pages/Error.cshtml
+++ /dev/null
@@ -1,42 +0,0 @@
-﻿@*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *@
-@page
-@model ErrorModel
-@{
-  ViewData["Title"] = "Error";
-}
-
-<h1 class="text-danger">Error.</h1>
-<h2 class="text-danger">An error occurred while processing your request.</h2>
-
-@if (Model.ShowRequestId)
-{
-  <p>
-    <strong>Request ID:</strong> <code>@Model.RequestId</code>
-  </p>
-}
-
-<h3>Development Mode</h3>
-<p>
-  Swapping to the <strong>Development</strong> environment displays detailed information about the error that occurred.
-</p>
-<p>
-  <strong>The Development environment shouldn't be enabled for deployed applications.</strong>
-  It can result in displaying sensitive information from exceptions to end users.
-  For local debugging, enable the <strong>Development</strong> environment by setting the <strong>ASPNETCORE_ENVIRONMENT</strong> environment variable to <strong>Development</strong>
-  and restarting the app.
-</p>
diff --git a/netcore/asp-netcore-session-sample/Pages/Error.cshtml.cs b/netcore/asp-netcore-session-sample/Pages/Error.cshtml.cs
deleted file mode 100644
index b6245b6..0000000
--- a/netcore/asp-netcore-session-sample/Pages/Error.cshtml.cs
+++ /dev/null
@@ -1,36 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-using System;
-using System.Collections.Generic;
-using System.Diagnostics;
-using System.Linq;
-using System.Threading.Tasks;
-using Microsoft.AspNetCore.Mvc;
-using Microsoft.AspNetCore.Mvc.RazorPages;
-
-namespace SessionSample.Pages {
-  [ResponseCache(Duration = 0, Location = ResponseCacheLocation.None, NoStore = true)]
-  public class ErrorModel : PageModel {
-    public string RequestId { get; set; }
-
-    public bool ShowRequestId => !string.IsNullOrEmpty(RequestId);
-
-    public void OnGet() {
-      RequestId = Activity.Current?.Id ?? HttpContext.TraceIdentifier;
-    }
-  }
-}
diff --git a/netcore/asp-netcore-session-sample/Pages/Index.cshtml b/netcore/asp-netcore-session-sample/Pages/Index.cshtml
deleted file mode 100644
index 47bcf75..0000000
--- a/netcore/asp-netcore-session-sample/Pages/Index.cshtml
+++ /dev/null
@@ -1,99 +0,0 @@
-﻿@*
-  * Licensed to the Apache Software Foundation (ASF) under one or more
-  * contributor license agreements.  See the NOTICE file distributed with
-  * this work for additional information regarding copyright ownership.
-  * The ASF licenses this file to You under the Apache License, Version 2.0
-  * (the "License"); you may not use this file except in compliance with
-  * the License.  You may obtain a copy of the License at
-  *
-  *      http://www.apache.org/licenses/LICENSE-2.0
-  *
-  * Unless required by applicable law or agreed to in writing, software
-  * distributed under the License is distributed on an "AS IS" BASIS,
-  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  * See the License for the specific language governing permissions and
-  * limitations under the License.
-*@
-@page
-@using Microsoft.AspNetCore.Http
-@model IndexModel
-@{
-  ViewData["Title"] = "Asp.Net Core Session Sample";
-}
-
-<h1>@ViewData["Title"]</h1>
-
-<h2>State management</h2>
-
-<div class="row">
-  <div class="col-md-8">
-    <form method="post">
-      <div class="panel panel-default">
-        <div class="panel-heading">
-          <button type="submit" asp-page-handler="ChangeAge" class="pull-right btn btn-danger">Change Age</button>
-          <h3 class="panel-title" style="line-height:2.1">Name and Age</h3>
-        </div>
-        <div class="panel-body">
-          <p>
-            The name and age are stored in session. Select the <span style="font-weight:bold">Change Age</span>
-            button to update the session to a new random age value.
-          </p>
-          <p>
-            Session values by the model with
-            <code>@@Model.&lt;PropertyName&gt;</code>:
-          </p>
-          <p><b>Name:</b> @Model.SessionInfo_Name <b>Age:</b> @Model.SessionInfo_Age</p>
-          <hr>
-          <p>Session values direct </p>
-          <p>
-            <b>Name:</b> @HttpContext.Session.GetString(IndexModel.SessionKeyName)
-            <b>Age:</b>
-            @HttpContext.Session.GetInt32(IndexModel.SessionKeyAge).ToString()
-          </p>
-        </div>
-      </div>
-    </form>
-  </div>
-</div>
-
-<div class="row">
-  <div class="col-md-8">
-    <div class="panel panel-default">
-      <div class="panel-heading">
-        <h3 class="panel-title">HttpContext.Items Middleware Value</h3>
-      </div>
-      <div class="panel-body">
-        <p>
-          The middleware value is set into the <code>HttpContext.Items</code> collection by
-          the <code>HttpContextItemsMiddleware</code> before Razor Pages processes the request.
-          The value is retreived by the page and displayed.
-        </p>
-        <p>Value: @Model.SessionInfo_MiddlewareValue</p>
-      </div>
-    </div>
-  </div>
-</div>
-
-<div class="row">
-  <div class="col-md-8">
-    <form method="post">
-      <div class="panel panel-default">
-        <div class="panel-heading clearfix">
-          <button type="submit" asp-page-handler="UpdateSessionDate" class="pull-right btn btn-danger">Update Session Time</button>
-          <a href="/" class="pull-right btn btn-danger" style="margin-right:5px">Reload Page (No Update)</a>
-          <h3 class="panel-title" style="line-height:2.1">Session Time</h3>
-        </div>
-        <div class="panel-body">
-          <p>
-            The session time is stored in session. Select the <span style="font-weight:bold">
-              Reload Page (No Update)
-            </span> button to display the current time and the time stored in session.
-            Select the <span style="font-weight:bold">Update Session Time</span> button to store the current time in session.
-          </p>
-          <p>Current Time: @Model.SessionInfo_CurrentTime</p>
-          <p>Session Time: @Model.SessionInfo_SessionTime</p>
-        </div>
-      </div>
-    </form>
-  </div>
-</div>
diff --git a/netcore/asp-netcore-session-sample/Pages/Index.cshtml.cs b/netcore/asp-netcore-session-sample/Pages/Index.cshtml.cs
deleted file mode 100644
index 723979e..0000000
--- a/netcore/asp-netcore-session-sample/Pages/Index.cshtml.cs
+++ /dev/null
@@ -1,62 +0,0 @@
-﻿using System;
-using Microsoft.AspNetCore.Http;
-using Microsoft.AspNetCore.Mvc;
-using Microsoft.AspNetCore.Mvc.RazorPages;
-using SessionSample.Middleware;
-using Web.Extensions;
-
-namespace SessionSample.Pages {
-  public class IndexModel : PageModel {
-    public const string SessionKeyName = "_Name";
-    public const string SessionKeyAge = "_Age";
-    const string SessionKeyTime = "_Time";
-
-    public string SessionInfo_Name { get; private set; }
-    public string SessionInfo_Age { get; private set; }
-    public string SessionInfo_CurrentTime { get; private set; }
-    public string SessionInfo_SessionTime { get; private set; }
-    public string SessionInfo_MiddlewareValue { get; private set; }
-
-    public void OnGet() {
-      // Requires: using Microsoft.AspNetCore.Http;
-      if (string.IsNullOrEmpty(HttpContext.Session.GetString(SessionKeyName))) {
-        HttpContext.Session.SetString(SessionKeyName, "The Doctor");
-        HttpContext.Session.SetInt32(SessionKeyAge, 35);
-      }
-
-      var name = HttpContext.Session.GetString(SessionKeyName);
-      var age = HttpContext.Session.GetInt32(SessionKeyAge);
-      SessionInfo_Name = name;
-      SessionInfo_Age = age.ToString();
-
-      var currentTime = DateTime.Now;
-
-      // Requires SessionExtensions from sample download.
-      if (HttpContext.Session.Get<DateTime>(SessionKeyTime) == default) {
-        HttpContext.Session.Set<DateTime>(SessionKeyTime, currentTime);
-      }
-
-      SessionInfo_CurrentTime = currentTime.ToString("H:mm:ss tt");
-      SessionInfo_SessionTime =
-          HttpContext.Session.Get<DateTime>(SessionKeyTime).ToString("H:mm:ss tt");
-
-      HttpContext.Items.TryGetValue(HttpContextItemsMiddleware.HttpContextItemsMiddlewareKey,
-                                    out var middlewareSetValue);
-      SessionInfo_MiddlewareValue = middlewareSetValue?.ToString() ?? "Middleware value not set!";
-    }
-
-    public IActionResult OnPostUpdateSessionDate() {
-      HttpContext.Session.Set<DateTime>(SessionKeyTime, DateTime.Now);
-
-      return RedirectToPage();
-    }
-
-    public IActionResult OnPostChangeAge() {
-      var r = new Random();
-
-      HttpContext.Session.SetInt32(SessionKeyAge, r.Next(35, 65));
-
-      return RedirectToPage();
-    }
-  }
-}
diff --git a/netcore/asp-netcore-session-sample/Pages/Shared/_Layout.cshtml b/netcore/asp-netcore-session-sample/Pages/Shared/_Layout.cshtml
deleted file mode 100644
index 4465c65..0000000
--- a/netcore/asp-netcore-session-sample/Pages/Shared/_Layout.cshtml
+++ /dev/null
@@ -1,237 +0,0 @@
-@*
-  * Licensed to the Apache Software Foundation (ASF) under one or more
-  * contributor license agreements.  See the NOTICE file distributed with
-  * this work for additional information regarding copyright ownership.
-  * The ASF licenses this file to You under the Apache License, Version 2.0
-  * (the "License"); you may not use this file except in compliance with
-  * the License.  You may obtain a copy of the License at
-  *
-  *      http://www.apache.org/licenses/LICENSE-2.0
-  *
-  * Unless required by applicable law or agreed to in writing, software
-  * distributed under the License is distributed on an "AS IS" BASIS,
-  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  * See the License for the specific language governing permissions and
-  * limitations under the License.
-*@
-<!DOCTYPE html>
-<html lang="en">
-<head>
-  <meta charset="utf-8">
-  <meta name="viewport" content="width=device-width, initial-scale=1.0">
-  <title>@ViewData["Title"]</title>
-  <style>
-	body {
-	margin: 0;
-	padding-bottom: 20px;
-	font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
-	font-size: 14px;
-	line-height: 1.42857143;
-	color: #333;
-	background-color: #fff;
-	}
-
-	h1 {
-	font-size: 24px;
-	margin: .67em 0;
-	}
-
-	pre {
-	overflow: auto;
-	}
-
-	code, pre {
-	font-family: monospace, monospace;
-	font-size: 1em;
-	}
-
-	button, input {
-	margin: 0;
-	font: inherit;
-	color: inherit;
-	}
-
-	button {
-	overflow: visible;
-	}
-
-	button {
-	text-transform: none;
-	}
-
-	input {
-	line-height: normal;
-	}
-
-	{
-	box-sizing: border-box;
-	}
-
-	:before, *:after {
-	box-sizing: border-box;
-	}
-
-	input, button {
-	font-family: inherit;
-	font-size: inherit;
-	line-height: inherit;
-	}
-
-	a {
-	color: #337ab7;
-	text-decoration: none;
-	}
-
-	h1, h2, h3, h4 {
-	font-family: inherit;
-	font-weight: 500;
-	line-height: 1.1;
-	color: inherit;
-	margin-top: 20px;
-	margin-bottom: 10px;
-	}
-
-	h3 {
-	font-size: 16px;
-	}
-
-	h4 {
-	font-size: 18px;
-	}
-
-	p {
-	margin: 0 0 10px;
-	}
-
-	ol {
-	margin-top: 0;
-	margin-bottom: 10px;
-	}
-
-	code, pre {
-	font-family: Menlo, Monaco, Consolas, "Courier New", monospace;
-	}
-
-	code {
-	padding: 2px 4px;
-	font-size: 90%;
-	color: #c7254e;
-	background-color: #f9f2f4;
-	border-radius: 4px;
-	}
-
-	pre {
-	display: block;
-	padding: 9.5px;
-	margin: 0 0 10px;
-	font-size: 13px;
-	line-height: 1.42857143;
-	color: #333;
-	word-break: break-all;
-	word-wrap: break-word;
-	background-color: #f5f5f5;
-	border: 1px solid #ccc;
-	-radius: 4px;
-	}
-
-	pre code {
-	padding: 0;
-	font-size: inherit;
-	color: inherit;
-	white-space: pre-wrap;
-	background-color: transparent;
-	border-radius: 0;
-	}
-
-	.container {
-	padding-right: 15px;
-	padding-left: 15px;
-	margin-right: auto;
-	margin-left: auto;
-	}
-
-	.container {
-	width: 800px;
-	}
-
-	.btn {
-	display: inline-block;
-	padding: 6px 12px;
-	margin-bottom: 0;
-	font-size: 14px;
-	font-weight: normal;
-	line-height: 1.42857143;
-	text-align: center;
-	white-space: nowrap;
-	vertical-align: middle;
-	background-image: none;
-	border: 1px solid transparent;
-	border-radius: 4px;
-	;
-	color: #fff;
-	background-color: green;
-	border-color: gray;
-	float: right
-	}
-
-	.panel {
-	margin-bottom: 20px;
-	background-color: #fff;
-	border: 1px solid transparent;
-	border-radius: 4px;
-	box-shadow: 0 1px 1px rgba(0, 0, 0, .05);
-	}
-
-	.panel-body {
-	padding: 15px;
-	}
-
-	.panel-heading {
-	padding: 10px 15px;
-	border-bottom: 1px solid transparent;
-	border-top-left-radius: 3px;
-	border-top-right-radius: 3px;
-	}
-
-	.panel-title {
-	margin-top: 0;
-	margin-bottom: 0;
-	font-size: 16px;
-	color: inherit;
-	}
-
-	.panel-default {
-	border-color: #ddd;
-	}
-
-	.panel-default > .panel-heading {
-	color: #333;
-	background-color: #f5f5f5;
-	border-color: #ddd;
-	}
-
-	.clearfix:before, .clearfix:after, .container:before, .container:after, .panel-body:before, .panel-body:after {
-	display: table;
-	content: " ";
-	}
-
-	.clearfix:after, .container:after, .panel-body:after {
-	clear: both;
-	}
-
-	.body-content {
-	padding-left: 15px;
-	padding-right: 15px;
-	}
-
-	.panel-body {
-	font-size: 16px;
-	}
-  </style>
-</head>
-<body>
-  <div class="container body-content">
-    @RenderBody()
-  </div>
-</body>
-</html>
diff --git a/netcore/asp-netcore-session-sample/Pages/_ViewImports.cshtml b/netcore/asp-netcore-session-sample/Pages/_ViewImports.cshtml
deleted file mode 100644
index 7bf76d4..0000000
--- a/netcore/asp-netcore-session-sample/Pages/_ViewImports.cshtml
+++ /dev/null
@@ -1,19 +0,0 @@
-@*
-  * Licensed to the Apache Software Foundation (ASF) under one or more
-  * contributor license agreements.  See the NOTICE file distributed with
-  * this work for additional information regarding copyright ownership.
-  * The ASF licenses this file to You under the Apache License, Version 2.0
-  * (the "License"); you may not use this file except in compliance with
-  * the License.  You may obtain a copy of the License at
-  *
-  *      http://www.apache.org/licenses/LICENSE-2.0
-  *
-  * Unless required by applicable law or agreed to in writing, software
-  * distributed under the License is distributed on an "AS IS" BASIS,
-  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  * See the License for the specific language governing permissions and
-  * limitations under the License.
-*@
-@using SessionSample
-@namespace SessionSample.Pages
-@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers
diff --git a/netcore/asp-netcore-session-sample/Pages/_ViewStart.cshtml b/netcore/asp-netcore-session-sample/Pages/_ViewStart.cshtml
deleted file mode 100644
index 7e03e6d..0000000
--- a/netcore/asp-netcore-session-sample/Pages/_ViewStart.cshtml
+++ /dev/null
@@ -1,19 +0,0 @@
-﻿@*
-  * Licensed to the Apache Software Foundation (ASF) under one or more
-  * contributor license agreements.  See the NOTICE file distributed with
-  * this work for additional information regarding copyright ownership.
-  * The ASF licenses this file to You under the Apache License, Version 2.0
-  * (the "License"); you may not use this file except in compliance with
-  * the License.  You may obtain a copy of the License at
-  *
-  *      http://www.apache.org/licenses/LICENSE-2.0
-  *
-  * Unless required by applicable law or agreed to in writing, software
-  * distributed under the License is distributed on an "AS IS" BASIS,
-  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  * See the License for the specific language governing permissions and
-  * limitations under the License.
-*@
-@{
-  Layout = "_Layout";
-}
diff --git a/netcore/asp-netcore-session-sample/Program.cs b/netcore/asp-netcore-session-sample/Program.cs
deleted file mode 100644
index 4495aab..0000000
--- a/netcore/asp-netcore-session-sample/Program.cs
+++ /dev/null
@@ -1,29 +0,0 @@
-﻿/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-using Microsoft.AspNetCore;
-using Microsoft.AspNetCore.Hosting;
-
-namespace SessionSample {
-  public class Program {
-    public static void Main(string[] args) {
-      CreateWebHostBuilder(args).Build().Run();
-    }
-
-    public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
-        WebHost.CreateDefaultBuilder(args).UseStartup<Startup>();
-  }
-}
diff --git a/netcore/asp-netcore-session-sample/Properties/launchSettings.json b/netcore/asp-netcore-session-sample/Properties/launchSettings.json
deleted file mode 100644
index 5fdcaca..0000000
--- a/netcore/asp-netcore-session-sample/Properties/launchSettings.json
+++ /dev/null
@@ -1,28 +0,0 @@
-{
-  "iisSettings": {
-	"windowsAuthentication": false,
-	"anonymousAuthentication": true,
-	"iisExpress": {
-	  "applicationUrl": "http://localhost:50795/",
-	  "sslPort": 44315
-	}
-  },
-  "profiles": {
-	"IIS Express": {
-	  "commandName": "IISExpress",
-	  "launchBrowser": true,
-	  "environmentVariables": {
-		"ASPNETCORE_ENVIRONMENT": "Development"
-	  },
-	  "nativeDebugging": true
-	},
-	"SessionSample": {
-	  "commandName": "Project",
-	  "launchBrowser": true,
-	  "environmentVariables": {
-		"ASPNETCORE_ENVIRONMENT": "Development"
-	  },
-	  "applicationUrl": "https://localhost:5001;http://localhost:5000"
-	}
-  }
-}
diff --git a/netcore/asp-netcore-session-sample/README.md b/netcore/asp-netcore-session-sample/README.md
deleted file mode 100644
index 38b0a9b..0000000
--- a/netcore/asp-netcore-session-sample/README.md
+++ /dev/null
@@ -1,58 +0,0 @@
-You can configure GeodeDistributedCache as a distributed cache for your ASP.NET Core application using either of the options described below.
-
----
-NetCore-Session provides the AddGeodeDistributedCache() extension method on IServiceCollection, which requires just an Apache Geode region name and any optional configurations to store the sessions. 
-
-There are two methods to specify configurations:
-1. Through your application in Startup.cs or
-2. In JSON format in Appsettings.json of your application.
-   
-## Method 1: Specifying Configurations In Startup.cs
-
-The AddGeodeSessionStateCache() method is an extension of the AddDistributedCache() method provided by ASP.NET Core. This method takes configuration settings in Startup.cs of your application, or reads them from the specified JSON file.
-
-Add the following method and options in Startup.cs of your application:
-
-```c#
-public void ConfigureServices(IServiceCollection services)
-{
-    //Add framework services
-    services.AddMvc();
-
-    services.AddGeodeSessionStateCache(configuration =>
-    {
-        configuration.RegionName = "geodeSessionState";
-    });
-}
-```
-
-## Method 2: Specifying Configurations In appsettings.json
-You can also specify the configuration in JSON format using the appsettings.json file for your application. Using this method, you can refer to the configurations by providing the name of the section containing JSON format configurations in Startup.cs.
-
-appsettings.json:
-
-```json
-{
-  "AppSettings": {
-    "SiteTitle": "ASP.NET Core SessionState Sample App"
-  },
-
-  "GeodeSessionStateCache": {
-    "RegionName": "geodeSessionState",
-    "Host": "localhost",
-    "Port": 10334
-  }
-}
-```
-
-The ConfigureServices member of the Startup class can be used as follows to retrieve the GeodeSessionStateCache settings from the JSON file:
-
-```c#
-public void ConfigureServices(IServiceCollection services)
-{
-  ...
-  services.Configure<GeodeSessionStateCacheOptions>(
-    Configuration.GetSection("GeodeSessionStateCache"));
-  ...
-}
-```
diff --git a/netcore/asp-netcore-session-sample/Startup.cs b/netcore/asp-netcore-session-sample/Startup.cs
deleted file mode 100644
index cb9ada2..0000000
--- a/netcore/asp-netcore-session-sample/Startup.cs
+++ /dev/null
@@ -1,79 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-using Apache.Geode.Session;
-using Microsoft.AspNetCore.Builder;
-using Microsoft.AspNetCore.Hosting;
-using Microsoft.Extensions.Configuration;
-using Microsoft.Extensions.DependencyInjection;
-using Microsoft.Extensions.Logging;
-using Microsoft.Extensions.Hosting;
-using SessionSample.Middleware;
-using Microsoft.Extensions.Caching.Distributed;
-using System;
-
-namespace SessionSample {
-  public class Startup {
-    public Startup(IConfiguration configuration) {
-      Configuration = configuration;
-    }
-
-    public IConfiguration Configuration { get; }
-    public ILoggerFactory LoggerFactory { get; }
-
-    public void ConfigureServices(IServiceCollection services) {
-      services.Add(ServiceDescriptor.Singleton<IDistributedCache, GeodeSessionStateCache>());
-
-      services.AddSession(options => {
-        options.IdleTimeout = TimeSpan.FromSeconds(5);
-        options.Cookie.HttpOnly = true;
-        options.Cookie.IsEssential = true;
-      });
-
-      // Configure Method 1: Using extension method:
-      services.AddGeodeSessionStateCache(configuration => {
-        configuration.Host = "localhost";
-        configuration.Port = 10334;
-        configuration.RegionName = "geodeSessionState";
-      });
-
-      // Configure Method 2: Using appsettings.json:
-      // services.Configure<GeodeSessionStateCacheOptions>(
-      //    Configuration.GetSection("GeodeSessionStateCache"));
-
-      services.AddControllersWithViews();
-      services.AddRazorPages();
-    }
-
-    public void Configure(IApplicationBuilder app, IWebHostEnvironment env) {
-      if (env.IsDevelopment()) {
-        app.UseDeveloperExceptionPage();
-      } else {
-        app.UseExceptionHandler("/Home/Error");
-        app.UseHsts();
-      }
-
-      app.UseStaticFiles();
-      app.UseRouting();
-      app.UseHttpContextItemsMiddleware();
-      app.UseSession();
-      app.UseEndpoints(endpoints => {
-        endpoints.MapDefaultControllerRoute();
-        endpoints.MapRazorPages();
-      });
-    }
-  }
-}
diff --git a/netcore/asp-netcore-session-sample/appsettings.Development.json b/netcore/asp-netcore-session-sample/appsettings.Development.json
deleted file mode 100644
index 0623a3f..0000000
--- a/netcore/asp-netcore-session-sample/appsettings.Development.json
+++ /dev/null
@@ -1,9 +0,0 @@
-﻿{
-  "Logging": {
-    "LogLevel": {
-      "Default": "Debug",
-      "System": "Information",
-      "Microsoft": "Information"
-    }
-  }
-}
diff --git a/netcore/asp-netcore-session-sample/appsettings.Production.json b/netcore/asp-netcore-session-sample/appsettings.Production.json
deleted file mode 100644
index 8af1e1f..0000000
--- a/netcore/asp-netcore-session-sample/appsettings.Production.json
+++ /dev/null
@@ -1,9 +0,0 @@
-﻿{
-  "Logging": {
-    "LogLevel": {
-      "Default": "Error",
-      "System": "Information",
-      "Microsoft": "Information"
-    }
-  }
-}
diff --git a/netcore/asp-netcore-session-sample/appsettings.json b/netcore/asp-netcore-session-sample/appsettings.json
deleted file mode 100644
index 8205b26..0000000
--- a/netcore/asp-netcore-session-sample/appsettings.json
+++ /dev/null
@@ -1,17 +0,0 @@
-﻿{
-  "Logging": {
-	"LogLevel": {
-	  "Default": "Warning"
-	}
-  },
-  "AllowedHosts": "*",
-  "AppSettings": {
-	"SiteTitle": "ASP.NET Core Geode SessionState Sample App"
-  },
-
-  "GeodeSessionStateCache": {
-	"RegionName": "geodeSessionState",
-	"Host": "localhost",
-	"Port": 10334
-  }
-}
diff --git a/netcore/asp-netcore-session-sample/asp-netcore-session-sample.csproj b/netcore/asp-netcore-session-sample/asp-netcore-session-sample.csproj
deleted file mode 100644
index 347da91..0000000
--- a/netcore/asp-netcore-session-sample/asp-netcore-session-sample.csproj
+++ /dev/null
@@ -1,28 +0,0 @@
-﻿<Project Sdk="Microsoft.NET.Sdk.Web">
-
-  <PropertyGroup>
-    <TargetFramework>netcoreapp3.1</TargetFramework>
-    <Platforms>x64</Platforms>
-	<Configurations>Debug;RelWithDebInfo</Configurations>
-  </PropertyGroup>
-
-  <ItemGroup>
-    <ProjectReference Include="..\netcore-session\netcore-session.csproj" />
-  </ItemGroup>
-
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
-	<TreatWarningsAsErrors>true</TreatWarningsAsErrors>
-	<WarningsAsErrors />
-	<DebugType>pdbonly</DebugType>
-	<DebugSymbols>true</DebugSymbols>
-  </PropertyGroup>
-
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='RelWithDebInfo|x64'">
-	<TreatWarningsAsErrors>true</TreatWarningsAsErrors>
-	<WarningsAsErrors />
-	<Optimize>true</Optimize>
-	<DebugType>pdbonly</DebugType>
-	<DebugSymbols>true</DebugSymbols>
-  </PropertyGroup>
-
-</Project>
diff --git a/netcore/cmake/remove_dirs.cmake b/netcore/cmake/remove_dirs.cmake
deleted file mode 100644
index e63d3dd..0000000
--- a/netcore/cmake/remove_dirs.cmake
+++ /dev/null
@@ -1,18 +0,0 @@
-# Licensed to the Apache Software Foundation (ASF) under one or more
-# contributor license agreements.  See the NOTICE file distributed with
-# this work for additional information regarding copyright ownership.
-# The ASF licenses this file to You under the Apache License, Version 2.0
-# (the "License"); you may not use this file except in compliance with
-# the License.  You may obtain a copy of the License at
-# 
-#      http://www.apache.org/licenses/LICENSE-2.0
-# 
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-##
-# FindGeode CMake find module.
-##
-file(REMOVE_RECURSE locator server auth_locator auth_server)
diff --git a/netcore/netcore-integration-test/CMakeLists.txt b/netcore/netcore-integration-test/CMakeLists.txt
deleted file mode 100644
index 6a01fe7..0000000
--- a/netcore/netcore-integration-test/CMakeLists.txt
+++ /dev/null
@@ -1,30 +0,0 @@
-# Licensed to the Apache Software Foundation (ASF) under one or more
-# contributor license agreements.  See the NOTICE file distributed with
-# this work for additional information regarding copyright ownership.
-# The ASF licenses this file to You under the Apache License, Version 2.0
-# (the "License"); you may not use this file except in compliance with
-# the License.  You may obtain a copy of the License at
-#
-#      http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-project(netcore-test LANGUAGES NONE)
-
-add_custom_target(netcore-integration-test ALL 
-  COMMAND ${DOTNET} build netcore-integration-test.csproj -p:platform=x64 --configuration $<CONFIG>
-  COMMAND ${CMAKE_COMMAND} -E copy $<TARGET_FILE:apache-geode-c> ${CMAKE_CURRENT_SOURCE_DIR}/bin/x64/$<CONFIG>/netcoreapp3.1/
-  WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} DEPENDS apache-geode-c netcore-lib netcore-utility VERBATIM)
-
-enable_testing()
-
-set(AUTH_OPTS "--J=-Dgemfire.security-username=server --J=-Dgemfire.security-password=server --classpath=$<SHELL_PATH:${CMAKE_CURRENT_BINARY_DIR}/../utility/netcore-utility.jar>")
-set(AUTH_LOCATOR_OPTS "${AUTH_OPTS} --J=-Dgemfire.security-manager=javaobject.SimpleSecurityManager")
-
-add_test(NAME netcore-test 
-  COMMAND dotnet test -c $<CONFIG> -p:platform=x64
-  WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR})
-
diff --git a/netcore/netcore-integration-test/CacheFactoryTest.cs b/netcore/netcore-integration-test/CacheFactoryTest.cs
deleted file mode 100644
index 18ae8d4..0000000
--- a/netcore/netcore-integration-test/CacheFactoryTest.cs
+++ /dev/null
@@ -1,83 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-using System;
-using Xunit;
-using Xunit.Abstractions;
-
-namespace Apache.Geode.Client.IntegrationTests
-{
-  [Collection("Geode .Net Core Collection")]
-  public class CacheFactoryTest : TestBase {
-    public CacheFactoryTest(ITestOutputHelper testOutputHelper) : base(testOutputHelper)
-    {
-    }
-
-    [Fact]
-    public void CreateFactoryNotNull() {
-      using (var cacheFactory = CacheFactory.Create()) {
-        Assert.NotNull(cacheFactory);
-      }
-    }
-
-    [Fact]
-    public void CacheFactoryGetVersion() {
-      using (var cacheFactory = CacheFactory.Create()) {
-        var version = cacheFactory.Version;
-        Assert.NotEqual(version, String.Empty);
-      }
-    }
-
-    [Fact]
-    public void CacheFactoryGetProductDescription() {
-      using (var cacheFactory = CacheFactory.Create()) {
-        var description = cacheFactory.ProductDescription;
-        Assert.NotEqual(description, String.Empty);
-      }
-    }
-
-    [Fact]
-    public void CacheFactorySetPdxIgnoreUnreadFields() {
-      using (var cacheFactory = CacheFactory.Create()) {
-        cacheFactory.PdxIgnoreUnreadFields = true;
-        cacheFactory.PdxIgnoreUnreadFields = false;
-      }
-    }
-
-    [Fact]
-    public void CacheFactorySetPdxReadSerialized() {
-      using (var cacheFactory = CacheFactory.Create()) {
-        cacheFactory.PdxReadSerialized = true;
-        cacheFactory.PdxReadSerialized = false;
-      }
-    }
-
-    [Fact]
-    public void CacheFactoryCreateCacheNotNull() {
-      using var cacheFactory = CacheFactory.Create();
-      Assert.NotNull(cacheFactory);
-      using var cache = cacheFactory.CreateCache();  // lgtm[cs / useless - assignment - to - local]
-      Assert.NotNull(cache);
-    }
-
-    [Fact]
-    public void CacheFactorySetProperty() {
-      using var cacheFactory = CacheFactory.Create();
-      Assert.NotNull(cacheFactory);
-      cacheFactory.SetProperty("log-level", "none").SetProperty("log-file", "geode_native.log");
-    }
-  }
-}
diff --git a/netcore/netcore-integration-test/CacheTest.cs b/netcore/netcore-integration-test/CacheTest.cs
deleted file mode 100644
index f35d181..0000000
--- a/netcore/netcore-integration-test/CacheTest.cs
+++ /dev/null
@@ -1,130 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-using System;
-using System.Net.Cache;
-using Xunit;
-
-namespace Apache.Geode.Client.IntegrationTests {
-  [Collection("Geode .Net Core Collection")]
-  public class CacheTest {
-    [Fact]
-    public void ClientCacheGetPdxReadSerialized() {
-      using var cacheFactory =
-          CacheFactory.Create()
-              .SetProperty("log-level", "debug")
-              .SetProperty("log-file", "TestClientCacheGetPdxReadSerialized.log");
-      try {
-        cacheFactory.PdxReadSerialized = true;
-        using var cache = cacheFactory.CreateCache();
-
-        Assert.True(cache.GetPdxReadSerialized());
-
-        cacheFactory.PdxReadSerialized = false;
-        using var otherCache = cacheFactory.CreateCache();
-
-        Assert.False(otherCache.GetPdxReadSerialized());
-      } catch (Exception e) {
-        Console.WriteLine(e);
-        throw;
-      }
-    }
-
-    [Fact]
-    public void ClientCacheGetPdxIgnoreUnreadFields() {
-      using var cacheFactory = CacheFactory.Create()
-                                   .SetProperty("log-level", "none")
-                                   .SetProperty("log-file", "geode_native.log");
-      cacheFactory.PdxIgnoreUnreadFields = true;
-      using var cache = cacheFactory.CreateCache();
-
-      Assert.True(cache.GetPdxIgnoreUnreadFields());
-
-      cacheFactory.PdxIgnoreUnreadFields = false;
-      using var otherCache = cacheFactory.CreateCache();
-      Assert.False(otherCache.GetPdxIgnoreUnreadFields());
-    }
-
-    [Fact]
-    public void ClientCacheGetPoolManagerObjectsNotNull() {
-      using var cacheFactory = CacheFactory.Create()
-                                   .SetProperty("log-level", "none")
-                                   .SetProperty("log-file", "geode_native.log");
-
-      cacheFactory.PdxIgnoreUnreadFields = true;
-      using var cache = cacheFactory.CreateCache();  // lgtm [cs/useless-assignment-to-local]
-      Assert.NotNull(cache);
-      using var poolManager = cache.PoolManager;
-      Assert.NotNull(poolManager);
-    }
-
-    [Fact]
-    public void ClientCacheCreateRegionFactoryObjectsNotNull() {
-      using var cacheFactory = CacheFactory.Create()
-                                   .SetProperty("log-level", "none")
-                                   .SetProperty("log-file", "geode_native.log");
-      Assert.NotNull(cacheFactory);
-      cacheFactory.PdxIgnoreUnreadFields = true;
-      using var cache = cacheFactory.CreateCache();
-      Assert.NotNull(cache);
-      using var regionFactory = cache.CreateRegionFactory(
-          RegionShortcut.Proxy);  // lgtm[cs / useless - assignment - to - local]
-      Assert.NotNull(regionFactory);
-    }
-
-    [Fact]
-    public void ClientCacheGetName() {
-      using var cacheFactory = CacheFactory.Create().SetProperty("log-level", "none");
-      cacheFactory.PdxIgnoreUnreadFields = true;
-      using var cache = cacheFactory.CreateCache();
-      Assert.NotNull(cache);
-
-      var cacheName = cache.Name;
-      Assert.NotEqual(cacheName, String.Empty);
-    }
-
-    [Fact]
-    public void ClientCacheClose() {
-      using var cacheFactory = CacheFactory.Create().SetProperty("log-level", "none");
-      cacheFactory.PdxIgnoreUnreadFields = true;
-      using var cache = cacheFactory.CreateCache();
-      Assert.NotNull(cache);
-
-      Assert.False(cache.Closed);
-      cache.Close();
-      Assert.True(cache.Closed);
-    }
-
-    [Fact]
-    public void ClientCacheCloseWithKeepalive() {
-      using var cacheFactory = CacheFactory.Create().SetProperty("log-level", "none");
-      cacheFactory.PdxIgnoreUnreadFields = true;
-      using var cache = cacheFactory.CreateCache();
-      Assert.NotNull(cache);
-
-      Assert.False(cache.Closed);
-      cache.Close(true);
-      Assert.True(cache.Closed);
-
-      using var otherCache = cacheFactory.CreateCache();
-      Assert.NotNull(otherCache);
-
-      Assert.False(otherCache.Closed);
-      otherCache.Close(false);
-      Assert.True(otherCache.Closed);
-    }
-  }
-}
diff --git a/netcore/netcore-integration-test/NetCoreCollectionFixture.cs b/netcore/netcore-integration-test/NetCoreCollectionFixture.cs
deleted file mode 100644
index f2cf3ee..0000000
--- a/netcore/netcore-integration-test/NetCoreCollectionFixture.cs
+++ /dev/null
@@ -1,33 +0,0 @@
-﻿/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-using System;
-using Apache.Geode.Client;
-using Xunit;
-
-public class NetCoreCollectionFixture : IDisposable {
-  public NetCoreCollectionFixture() {
-    client_ = new Client();
-  }
-  public void Dispose() {
-    client_.Dispose();
-  }
-
-  Client client_;
-}
-
-[CollectionDefinition("Geode .Net Core Collection")]
-public class NetCoreCollection : ICollectionFixture<NetCoreCollectionFixture> {}
diff --git a/netcore/netcore-integration-test/NetCoreTestFixture.cs b/netcore/netcore-integration-test/NetCoreTestFixture.cs
deleted file mode 100644
index 992a7b3..0000000
--- a/netcore/netcore-integration-test/NetCoreTestFixture.cs
+++ /dev/null
@@ -1,68 +0,0 @@
-﻿/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-using System;
-using Xunit;
-using Xunit.Abstractions;
-using Apache.Geode.Client.IntegrationTests;
-
-namespace Apache.Geode.Client.IntegrationTests
-{
-  public class NetCoreTestFixture : IDisposable
-  {
-    internal Cluster cluster;
-    public ITestOutputHelper Output { get; set; }
-
-    public NetCoreTestFixture SetOutPut(ITestOutputHelper output)
-    {
-      Output = output;
-      return this;
-    }
-
-    public void CreateCluster()
-    {
-      if (cluster == null)
-      {
-        cluster = new Cluster(Output, "NetCoreTests", 1, 1);
-
-        Assert.True(cluster.Start());
-        Assert.Equal(0, cluster.Gfsh
-            .create()
-            .region()
-            .withName("exampleRegion")
-            .withType("PARTITION")
-            .execute());
-
-        Assert.Equal(0, cluster.Gfsh
-            .create()
-            .region()
-            .withName("authExampleRegion")
-            .withType("PARTITION")
-            .execute());
-      }
-    }
-
-    public void Dispose()
-    {
-      // At this point, the last test has executed and the ITestOutputHelper is
-      // no longer available. Hence set the output to null in the cluster.
-      cluster.Gfsh.Output = null;
-      cluster.Dispose();
-      Output = null;
-    }
-  }
-}
diff --git a/netcore/netcore-integration-test/ObjectLeakTest.cs b/netcore/netcore-integration-test/ObjectLeakTest.cs
deleted file mode 100644
index c87daee..0000000
--- a/netcore/netcore-integration-test/ObjectLeakTest.cs
+++ /dev/null
@@ -1,34 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-using System;
-using Xunit;
-
-namespace Apache.Geode.Client.IntegrationTests {
-  [Collection("Geode .Net Core Collection")]
-  public class ObjectLeakTest {
-    [Fact]
-    public void LeakCacheFactoryVerifyThrows() {
-      var client = new Client();
-
-      using (var cacheFactory =
-                 CacheFactory.Create())  // lgtm[cs / useless - assignment - to - local]
-      {
-        Assert.Throws<InvalidOperationException>(() => client.Dispose());
-      }
-    }
-  }
-}
diff --git a/netcore/netcore-integration-test/PoolFactoryTest.cs b/netcore/netcore-integration-test/PoolFactoryTest.cs
deleted file mode 100644
index 1bbc02b..0000000
--- a/netcore/netcore-integration-test/PoolFactoryTest.cs
+++ /dev/null
@@ -1,71 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-using System.Net.Cache;
-using Xunit;
-
-namespace Apache.Geode.Client.IntegrationTests {
-  [Collection("Geode .Net Core Collection")]
-  public class PoolFactoryTest {
-    [Fact]
-    public void PoolFactoryAddLocatorAllObjectsNotNull() {
-      using var cacheFactory = CacheFactory.Create()
-                                   .SetProperty("log-level", "none")
-                                   .SetProperty("log-file", "geode_native.log");
-      using var cache = cacheFactory.CreateCache();
-      Assert.NotNull(cache);
-      using var poolManager = cache.PoolManager;
-      Assert.NotNull(poolManager);
-      using var poolFactory = poolManager.CreatePoolFactory();
-      Assert.NotNull(poolFactory);
-
-      poolFactory.AddLocator("localhost", 10334);
-    }
-
-    [Fact]
-    public void PoolFactoryCreatePoolAllObjectsNotNull() {
-      using var cacheFactory = CacheFactory.Create()
-                                   .SetProperty("log-level", "none")
-                                   .SetProperty("log-file", "geode_native.log");
-      using var cache = cacheFactory.CreateCache();
-      Assert.NotNull(cache);
-      using var poolManager = cache.PoolManager;
-      Assert.NotNull(poolManager);
-      using var poolFactory = poolManager.CreatePoolFactory();
-      Assert.NotNull(poolFactory);
-
-      poolFactory.AddLocator("localhost", 10334);
-      using var pool =
-          poolFactory.CreatePool("myPool");  // lgtm[cs / useless - assignment - to - local]
-      Assert.NotNull(pool);
-    }
-
-    [Fact]
-    public void CreatePoolWithoutPoolManagerAllObjectsNotNull() {
-      using var cacheFactory = CacheFactory.Create();
-      Assert.NotNull(cacheFactory);
-      using var cache = cacheFactory.CreateCache();
-      Assert.NotNull(cache);
-      using var poolFactory = cache.PoolFactory;
-      Assert.NotNull(poolFactory);
-
-      poolFactory.AddLocator("localhost", 10334);
-      using var pool =
-          poolFactory.CreatePool("myPool");  // lgtm[cs / useless - assignment - to - local]
-      Assert.NotNull(pool);
-    }
-  }
-}
diff --git a/netcore/netcore-integration-test/PoolManagerTest.cs b/netcore/netcore-integration-test/PoolManagerTest.cs
deleted file mode 100644
index 19e3ddd..0000000
--- a/netcore/netcore-integration-test/PoolManagerTest.cs
+++ /dev/null
@@ -1,36 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-using System.Net.Cache;
-using Xunit;
-
-namespace Apache.Geode.Client.IntegrationTests {
-  [Collection("Geode .Net Core Collection")]
-  public class PoolManagerTest {
-    [Fact]
-    public void PoolManagerCreatePoolFactoryAllObjectsNotNull() {
-      using var cacheFactory = CacheFactory.Create();
-      Assert.NotNull(cacheFactory);
-      using var cache = cacheFactory.CreateCache();
-      Assert.NotNull(cache);
-      using var poolManager = cache.PoolManager;
-      Assert.NotNull(poolManager);
-      using var poolFactory =
-          poolManager.CreatePoolFactory();  // lgtm[cs / useless - assignment - to - local]
-      Assert.NotNull(poolFactory);
-    }
-  }
-}
diff --git a/netcore/netcore-integration-test/Properties/launchSettings.json b/netcore/netcore-integration-test/Properties/launchSettings.json
deleted file mode 100644
index 525b032..0000000
--- a/netcore/netcore-integration-test/Properties/launchSettings.json
+++ /dev/null
@@ -1,8 +0,0 @@
-{
-  "profiles": {
-    "GemfireDotNetTest": {
-      "commandName": "Project",
-      "nativeDebugging": true
-    }
-  }
-}
diff --git a/netcore/netcore-integration-test/RegionFactoryTest.cs b/netcore/netcore-integration-test/RegionFactoryTest.cs
deleted file mode 100644
index edac8ad..0000000
--- a/netcore/netcore-integration-test/RegionFactoryTest.cs
+++ /dev/null
@@ -1,122 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-using System;
-using System.Collections.Generic;
-using System.Net.Cache;
-using Xunit;
-using Xunit.Abstractions;
-
-namespace Apache.Geode.Client.IntegrationTests {
-  public class SimpleAuthInitialize : IAuthInitialize {
-    public Dictionary<string, string> GetCredentials() {
-      Console.WriteLine("SimpleAuthInitialize::GetCredentials called");
-      var credentials = new Dictionary<string, string>();
-      credentials.Add("security-username", "server");
-      credentials.Add("security-password", "server");
-      return credentials;
-    }
-
-    public void Close() {
-      Console.WriteLine("SimpleAuthInitialize::Close called");
-    }
-  }
-
-  [Collection("Geode .Net Core Collection")]
-  public class RegionFactoryTest : TestBase, IClassFixture<NetCoreTestFixture>
-  {
-    NetCoreTestFixture fixture;
-
-    public RegionFactoryTest(NetCoreTestFixture fixture, ITestOutputHelper testOutputHelper) : base(testOutputHelper)
-    {
-      this.fixture = fixture;
-      this.fixture.Output = testOutputHelper;
-      this.fixture.CreateCluster();
-    }
-
-    private const string Username1 = "rtimmons";
-    private const string Username2 = "scharles";
-
-    private void createPool(IGeodeCache cache, int port) {
-      using var poolManager = cache.PoolManager;
-      using var poolFactory = poolManager.CreatePoolFactory().AddLocator("localhost", port);
-      using var pool =
-          poolFactory.CreatePool("myPool");  // lgtm[cs / useless - assignment - to - local]
-    }
-
-    private void doPutsAndGets(Region region) {
-      var fullname1 = "Robert Timmons";
-      var fullname2 = "Sylvia Charles";
-
-      region.PutString(Username1, fullname1);
-      region.PutString(Username2, fullname2);
-
-      var user1 = region.GetString(Username1);
-      var user2 = region.GetString(Username2);
-
-      Assert.Equal(user1, fullname1);
-      Assert.Equal(user2, fullname2);
-    }
-
-    private void DoRemoves(Region region) {
-      region.Remove(Username1);
-      region.Remove(Username2);
-
-      var hasUser1 = region.ContainsValueForKey(Username1);
-      var hasUser2 = region.ContainsValueForKey(Username2);
-
-      Assert.False(hasUser1);
-      Assert.False(hasUser2);
-    }
-
-    private void CreateRegionAndDoWork(IGeodeCache cache, string regionName,
-                                       RegionShortcut regionType) {
-      using var regionFactory = cache.CreateRegionFactory(regionType);
-      using var region = regionFactory.CreateRegion(regionName);
-
-      doPutsAndGets(region);
-      DoRemoves(region);
-    }
-
-    [Fact]
-    public void RegionFactoryCreateProxyRegionStringPutGet() {
-        using var cacheFactory = CacheFactory.Create()
-                                     .SetProperty("log-level", "debug")
-                                     .SetProperty("log-file", "geode_native.log");
-        using var cache = cacheFactory.CreateCache();
-
-        using var pool = fixture.cluster.ApplyLocators(cache.PoolFactory)
-                    .CreatePool("myPool");
-
-        CreateRegionAndDoWork(cache, "exampleRegion", RegionShortcut.Proxy);
-    }
-
-    [Fact]
-    public void RegionFactoryCreateRegionStringPutGetWithAuthentication() {
-
-        using var cacheFactory = CacheFactory.Create()
-                                   .SetProperty("log-level", "debug")
-                                   .SetProperty("log-file", "geode_native_with_auth.log");
-      cacheFactory.AuthInitialize = new SimpleAuthInitialize();
-      using var cache = cacheFactory.CreateCache();
-
-      using var pool = fixture.cluster.ApplyLocators(cache.PoolFactory)
-                    .CreatePool("myPool");
-
-        CreateRegionAndDoWork(cache, "authExampleRegion", RegionShortcut.CachingProxy);
-    }
-  }
-}
diff --git a/netcore/netcore-integration-test/netcore-integration-test.csproj b/netcore/netcore-integration-test/netcore-integration-test.csproj
deleted file mode 100644
index ac8be9a..0000000
--- a/netcore/netcore-integration-test/netcore-integration-test.csproj
+++ /dev/null
@@ -1,53 +0,0 @@
-﻿<Project Sdk="Microsoft.NET.Sdk">
-
-  <PropertyGroup>
-      <TargetFramework>netcoreapp3.1</TargetFramework>
-      <IsPackable>false</IsPackable>
-      <Platforms>x64</Platforms>
-      <Configurations>Debug;RelWithDebInfo</Configurations>
-  </PropertyGroup>
-
-  <ItemGroup>
-	<Compile Include="..\shared\Config.cs" Link="Config.cs" />
-	<Compile Include="..\shared\Cluster.cs" Link="Cluster.cs" />
-	<Compile Include="..\shared\Gfsh.cs" Link="Gfsh.cs" />
-	<Compile Include="..\shared\Framework.cs" Link="Framework.cs" />
-	<Compile Include="..\shared\GfshExecute.cs" Link="GfshExecute.cs" />
-	<Compile Include="..\shared\TestBase.cs" Link="TestBase.cs" />
-  </ItemGroup>
-
-  <ItemGroup>
-      <PackageReference Include="Microsoft.NET.Test.Sdk" Version="16.6.1" />
-      <PackageReference Include="xunit" Version="2.4.1" />
-      <PackageReference Include="xunit.runner.visualstudio" Version="2.4.3">
-        <PrivateAssets>all</PrivateAssets>
-        <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
-      </PackageReference>
-  </ItemGroup>
-
-  <ItemGroup>
-    <ProjectReference Include="..\netcore-lib\netcore-lib.csproj" />
-  </ItemGroup>
-
-  <ItemGroup>
-    <None Update="xunit.runner.json">
-      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
-    </None>
-  </ItemGroup>
-
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
-	<TreatWarningsAsErrors>true</TreatWarningsAsErrors>
-	<WarningsAsErrors />
-	<DebugType>pdbonly</DebugType>
-	<DebugSymbols>true</DebugSymbols>
-  </PropertyGroup>
-
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='RelWithDebInfo|x64'">
-	<TreatWarningsAsErrors>true</TreatWarningsAsErrors>
-	<WarningsAsErrors />
-	<Optimize>true</Optimize>
-	<DebugType>pdbonly</DebugType>
-	<DebugSymbols>true</DebugSymbols>
-  </PropertyGroup>
-
-</Project>
diff --git a/netcore/netcore-integration-test/xunit.runner.json b/netcore/netcore-integration-test/xunit.runner.json
deleted file mode 100644
index f8b2eef..0000000
--- a/netcore/netcore-integration-test/xunit.runner.json
+++ /dev/null
@@ -1,5 +0,0 @@
-{
-  "methodDisplay": "classAndMethod",
-  "parallelizeAssembly": true,
-  "parallelizeTestCollections": true
-}
diff --git a/netcore/netcore-lib/AuthInitialize.cs b/netcore/netcore-lib/AuthInitialize.cs
deleted file mode 100644
index d1e6024..0000000
--- a/netcore/netcore-lib/AuthInitialize.cs
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-using System.Collections.Generic;
-
-namespace Apache.Geode.Client {
-  public interface IAuthInitialize {
-    Dictionary<string, string> GetCredentials();
-    void Close();
-  }
-}
diff --git a/netcore/netcore-lib/CMakeLists.txt b/netcore/netcore-lib/CMakeLists.txt
deleted file mode 100644
index ea13083..0000000
--- a/netcore/netcore-lib/CMakeLists.txt
+++ /dev/null
@@ -1,25 +0,0 @@
-# Licensed to the Apache Software Foundation (ASF) under one or more
-# contributor license agreements.  See the NOTICE file distributed with
-# this work for additional information regarding copyright ownership.
-# The ASF licenses this file to You under the Apache License, Version 2.0
-# (the "License"); you may not use this file except in compliance with
-# the License.  You may obtain a copy of the License at
-#
-#      http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-project(netcore-lib LANGUAGES NONE)
-
-add_custom_target(netcore-lib ALL COMMAND ${DOTNET} build netcore-lib.csproj -p:platform=x64 --configuration $<CONFIG>
-  WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} DEPENDS apache-geode-c VERBATIM)
-
-if (WIN32)
-  install(FILES ${CMAKE_CURRENT_SOURCE_DIR}/bin/x64/$<CONFIG>/netcoreapp3.1/Apache.Geode.NetCore.dll DESTINATION ./bin)
-else ()
-  install(FILES ${CMAKE_CURRENT_SOURCE_DIR}/bin/x64/$<CONFIG>/netcoreapp3.1/Apache.Geode.NetCore.dll DESTINATION ./lib)
-endif()
-
diff --git a/netcore/netcore-lib/Cache.cs b/netcore/netcore-lib/Cache.cs
deleted file mode 100644
index 200e740..0000000
--- a/netcore/netcore-lib/Cache.cs
+++ /dev/null
@@ -1,166 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-using System;
-using System.Collections.Generic;
-using System.Runtime.CompilerServices;
-using System.Runtime.InteropServices;
-
-namespace Apache.Geode.Client {
-  public class Cache : GeodeNativeObject, IGeodeCache {
-    private static string _name = String.Empty;
-    private PoolManager _poolManager = null;
-    private PoolFactory _poolFactory = null;
-    private IAuthInitialize _authInitialize;
-    private GetCredentialsDelegateInternal _getCredentialsDelegate;
-    private CloseDelegateInternal _closeDelegate;
-
-    internal delegate void GetCredentialsDelegateInternal(IntPtr cache);
-
-    internal delegate void CloseDelegateInternal();
-
-    [DllImport(Constants.libPath, CallingConvention = CallingConvention.Cdecl)]
-    private static extern void apache_geode_CacheFactory_SetAuthInitialize(
-        IntPtr factory, GetCredentialsDelegateInternal getCredentials,
-        CloseDelegateInternal close);
-
-    [DllImport(Constants.libPath, CharSet = CharSet.Auto)]
-    private static extern IntPtr apache_geode_CacheFactory_CreateCache(IntPtr factory);
-
-    [DllImport(Constants.libPath, CharSet = CharSet.Auto)]
-    private static extern bool apache_geode_Cache_GetPdxIgnoreUnreadFields(IntPtr cache);
-
-    [DllImport(Constants.libPath, CharSet = CharSet.Auto)]
-    private static extern bool apache_geode_Cache_GetPdxReadSerialized(IntPtr cache);
-
-    [DllImport(Constants.libPath, CharSet = CharSet.Auto)]
-    private static extern IntPtr apache_geode_Cache_GetName(IntPtr cache);
-
-    [DllImport(Constants.libPath, CharSet = CharSet.Auto)]
-    private static extern void apache_geode_Cache_Close(IntPtr cache, bool keepalive);
-
-    [DllImport(Constants.libPath, CharSet = CharSet.Auto)]
-    private static extern bool apache_geode_Cache_IsClosed(IntPtr cache);
-
-    [DllImport(Constants.libPath, CharSet = CharSet.Auto)]
-    private static extern bool apache_geode_AuthInitialize_AddProperty(IntPtr properties,
-                                                                       IntPtr key,
-                                                                       IntPtr value);
-
-    [DllImport(Constants.libPath, CharSet = CharSet.Auto)]
-    private static extern void apache_geode_DestroyCache(IntPtr cache);
-
-    internal Cache(IntPtr cacheFactory, IAuthInitialize authInitialize) {
-      _authInitialize = authInitialize;
-      if (_authInitialize != null) {
-        _getCredentialsDelegate = new GetCredentialsDelegateInternal(AuthGetCredentials);
-        _closeDelegate = new CloseDelegateInternal(AuthClose);
-
-        apache_geode_CacheFactory_SetAuthInitialize(cacheFactory, _getCredentialsDelegate,
-                                                    _closeDelegate);
-      }
-      _containedObject = apache_geode_CacheFactory_CreateCache(cacheFactory);
-    }
-
-    internal void AuthGetCredentials(IntPtr properties) {
-      Console.WriteLine("In AuthInitialize::GetCredentials callback");
-      if (_authInitialize == null) {
-        throw new InvalidOperationException(
-            "AuthInitialize callback received for cache without authentication!");
-      }
-
-      var credentials = _authInitialize.GetCredentials();
-      foreach (KeyValuePair<string, string> entry in credentials) {
-        Console.WriteLine("Found credential: (k, v) = ({0}, {1})", entry.Key, entry.Value);
-        var keyPtr = Marshal.StringToCoTaskMemUTF8(entry.Key);
-        var valuePtr = Marshal.StringToCoTaskMemUTF8(entry.Value);
-        apache_geode_AuthInitialize_AddProperty(properties, keyPtr, valuePtr);
-        Marshal.FreeCoTaskMem(keyPtr);
-        Marshal.FreeCoTaskMem(valuePtr);
-      }
-    }
-
-    public void AuthClose() {
-      Console.WriteLine("In AuthInitialize::Close callback");
-    }
-
-    public void Close() {
-      apache_geode_Cache_Close(_containedObject, false);
-    }
-
-    public void Close(bool keepalive) {
-      apache_geode_Cache_Close(_containedObject, keepalive);
-    }
-
-    public bool GetPdxIgnoreUnreadFields() {
-      return apache_geode_Cache_GetPdxIgnoreUnreadFields(_containedObject);
-    }
-
-    public bool GetPdxReadSerialized() {
-      return apache_geode_Cache_GetPdxReadSerialized(_containedObject);
-    }
-
-    public string Name {
-      get {
-        if (_name == String.Empty) {
-          _name = Marshal.PtrToStringUTF8(apache_geode_Cache_GetName(_containedObject));
-        }
-
-        return _name;
-      }
-    }
-
-    public PoolManager PoolManager {
-      get {
-        if (_poolManager == null) {
-          _poolManager = new PoolManager(_containedObject);
-        }
-
-        return _poolManager;
-      }
-    }
-
-    public PoolFactory PoolFactory {
-      get {
-        if (_poolFactory == null) {
-          _poolFactory = PoolManager.CreatePoolFactory();
-        }
-
-        return _poolFactory;
-      }
-    }
-
-    public RegionFactory CreateRegionFactory(RegionShortcut regionType) {
-      return new RegionFactory(_containedObject, regionType);
-    }
-
-    public bool Closed => apache_geode_Cache_IsClosed(_containedObject);
-
-    protected override void DestroyContainedObject() {
-      // It turns out, C# "wrapper" objects need to get rid of
-      // *all* contained objects, due to vagaries of Geode
-      // Native object graph, in order to ensure a leak-free
-      // shutdown.  We get rid of our non-cache objects first
-      // here, in case it makes a difference.
-      _poolManager?.Dispose();
-      _poolManager = null;
-      _poolFactory?.Dispose();
-      _poolFactory = null;
-      apache_geode_DestroyCache(_containedObject);
-      _containedObject = IntPtr.Zero;
-    }
-  }
-}
diff --git a/netcore/netcore-lib/CacheFactory.cs b/netcore/netcore-lib/CacheFactory.cs
deleted file mode 100644
index 5588e3c..0000000
--- a/netcore/netcore-lib/CacheFactory.cs
+++ /dev/null
@@ -1,109 +0,0 @@
-﻿/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-using System;
-using System.Runtime.InteropServices;
-
-namespace Apache.Geode.Client {
-  public class CacheFactory : GeodeNativeObject, ICacheFactory {
-    private string _version = String.Empty;
-    private string _productDescription = String.Empty;
-    private IAuthInitialize _authInitialize;
-
-    [DllImport(Constants.libPath, CharSet = CharSet.Auto)]
-    private static extern IntPtr apache_geode_CreateCacheFactory();
-
-    [DllImport(Constants.libPath, CharSet = CharSet.Auto)]
-    private static extern void apache_geode_DestroyCacheFactory(IntPtr factory);
-
-    [DllImport(Constants.libPath, CharSet = CharSet.Auto)]
-    private static extern IntPtr apache_geode_CacheFactory_GetVersion(IntPtr factory);
-
-    [DllImport(Constants.libPath, CharSet = CharSet.Auto)]
-    private static extern IntPtr apache_geode_CacheFactory_GetProductDescription(
-        IntPtr factory);
-
-    [DllImport(Constants.libPath, CharSet = CharSet.Auto)]
-    private static extern void apache_geode_CacheFactory_SetPdxIgnoreUnreadFields(
-        IntPtr factory, bool pdxIgnoreUnreadFields);
-
-    [DllImport(Constants.libPath, CharSet = CharSet.Auto)]
-    private static extern void apache_geode_CacheFactory_SetPdxReadSerialized(
-        IntPtr factory, bool pdxReadSerialized);
-
-    [DllImport(Constants.libPath, CharSet = CharSet.Auto)]
-    private static extern void apache_geode_CacheFactory_SetProperty(IntPtr factory, IntPtr key,
-                                                                     IntPtr value);
-
-    public static ICacheFactory Create() {
-      return new CacheFactory();
-    }
-
-    public CacheFactory() {
-      _containedObject = apache_geode_CreateCacheFactory();
-    }
-
-    public string Version {
-      get {
-        if (_version == String.Empty) {
-          _version =
-              Marshal.PtrToStringUTF8(apache_geode_CacheFactory_GetVersion(_containedObject));
-        }
-
-        return _version;
-      }
-    }
-
-    public string ProductDescription {
-      get {
-        if (_productDescription == String.Empty) {
-          _productDescription = Marshal.PtrToStringUTF8(
-              apache_geode_CacheFactory_GetProductDescription(_containedObject));
-        }
-
-        return _productDescription;
-      }
-    }
-
-    public bool PdxIgnoreUnreadFields {
-      set => apache_geode_CacheFactory_SetPdxIgnoreUnreadFields(_containedObject, value);
-    }
-
-    public bool PdxReadSerialized {
-      set => apache_geode_CacheFactory_SetPdxReadSerialized(_containedObject, value);
-    }
-
-    public IGeodeCache CreateCache() {
-      return new Cache(_containedObject, _authInitialize);
-    }
-
-    public ICacheFactory SetProperty(string key, string value) {
-      var utf8Key = Marshal.StringToCoTaskMemUTF8(key);
-      var utf8Value = Marshal.StringToCoTaskMemUTF8(value);
-      apache_geode_CacheFactory_SetProperty(_containedObject, utf8Key, utf8Value);
-      Marshal.FreeCoTaskMem(utf8Key);
-      Marshal.FreeCoTaskMem(utf8Value);
-      return this;
-    }
-
-    public IAuthInitialize AuthInitialize { set => _authInitialize = value; }
-
-    protected override void DestroyContainedObject() {
-      apache_geode_DestroyCacheFactory(_containedObject);
-      _containedObject = IntPtr.Zero;
-    }
-  }
-}
diff --git a/netcore/netcore-lib/Client.cs b/netcore/netcore-lib/Client.cs
deleted file mode 100644
index b62fe34..0000000
--- a/netcore/netcore-lib/Client.cs
+++ /dev/null
@@ -1,41 +0,0 @@
-﻿/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-using System;
-using System.Runtime.InteropServices;
-
-namespace Apache.Geode.Client {
-  public class Client : GeodeNativeObject {
-    [DllImport(Constants.libPath, CharSet = CharSet.Auto)]
-    private static extern IntPtr apache_geode_ClientInitialize();
-
-    [DllImport(Constants.libPath, CharSet = CharSet.Auto)]
-    private static extern int apache_geode_ClientUninitialize(IntPtr client);
-
-    public Client() {
-      _containedObject = apache_geode_ClientInitialize();
-    }
-
-    protected override void DestroyContainedObject() {
-      var err = apache_geode_ClientUninitialize(_containedObject);
-      _containedObject = IntPtr.Zero;
-      if (err != 0) {
-        throw new InvalidOperationException(
-            "One or more native objects was leaked!  See Geode Native log for debugging info.");
-      }
-    }
-  }
-}
diff --git a/netcore/netcore-lib/Constants.cs b/netcore/netcore-lib/Constants.cs
deleted file mode 100644
index e27dbe2..0000000
--- a/netcore/netcore-lib/Constants.cs
+++ /dev/null
@@ -1,21 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-namespace Apache.Geode.Client {
-  public class Constants {
-    public const string libPath = "apache-geode-c";
-  }
-}
diff --git a/netcore/netcore-lib/GeodeNativeObject.cs b/netcore/netcore-lib/GeodeNativeObject.cs
deleted file mode 100644
index 541fa31..0000000
--- a/netcore/netcore-lib/GeodeNativeObject.cs
+++ /dev/null
@@ -1,48 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-using System;
-
-namespace Apache.Geode.Client {
-  public abstract class GeodeNativeObject : IDisposable {
-    private bool _disposed = false;
-    protected IntPtr _containedObject;
-
-    public void Dispose() {
-      Dispose(true);
-      GC.SuppressFinalize(this);
-    }
-
-    public IntPtr ContainedObject {
-      get { return _containedObject; }
-    }
-
-    protected virtual void Dispose(bool disposing) {
-      if (_disposed) {
-        return;
-      }
-
-      if (disposing) {
-        DestroyContainedObject();
-        _containedObject = IntPtr.Zero;
-      }
-
-      _disposed = true;
-    }
-
-    protected abstract void DestroyContainedObject();
-  }
-}
diff --git a/netcore/netcore-lib/ICacheFactory.cs b/netcore/netcore-lib/ICacheFactory.cs
deleted file mode 100644
index 5bb2ba7..0000000
--- a/netcore/netcore-lib/ICacheFactory.cs
+++ /dev/null
@@ -1,29 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-using System;
-
-namespace Apache.Geode.Client {
-  public interface ICacheFactory : IDisposable {
-    IGeodeCache CreateCache();
-    ICacheFactory SetProperty(String name, String value);
-    IAuthInitialize AuthInitialize { set; }
-    bool PdxIgnoreUnreadFields { set; }
-    bool PdxReadSerialized { set; }
-    String Version { get; }
-    String ProductDescription { get; }
-  }
-}
diff --git a/netcore/netcore-lib/IGeodeCache.cs b/netcore/netcore-lib/IGeodeCache.cs
deleted file mode 100644
index 8591db6..0000000
--- a/netcore/netcore-lib/IGeodeCache.cs
+++ /dev/null
@@ -1,34 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-using System;
-
-namespace Apache.Geode.Client {
-  public interface IGeodeCache : IRegionService, IDisposable {
-    bool GetPdxIgnoreUnreadFields();
-    bool GetPdxReadSerialized();
-    //                void InitializeDeclarativeCache(String cacheXml);
-
-    //                CacheTransactionManager CacheTransactionManager { get; }
-    //                DistributedSystem DistributedSystem { get; }
-    String Name { get; }
-    PoolManager PoolManager { get; }
-    PoolFactory PoolFactory { get; }
-    void Close();
-    void Close(bool keepalive);
-    bool Closed { get; }
-  }
-}
diff --git a/netcore/netcore-lib/IRegionService.cs b/netcore/netcore-lib/IRegionService.cs
deleted file mode 100644
index d635d71..0000000
--- a/netcore/netcore-lib/IRegionService.cs
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-using System;
-
-namespace Apache.Geode.Client {
-  public interface IRegionService {
-    RegionFactory CreateRegionFactory(RegionShortcut regionType);
-  }
-}
diff --git a/netcore/netcore-lib/Pool.cs b/netcore/netcore-lib/Pool.cs
deleted file mode 100644
index c3e9b81..0000000
--- a/netcore/netcore-lib/Pool.cs
+++ /dev/null
@@ -1,43 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-using System;
-using System.Runtime.InteropServices;
-
-namespace Apache.Geode.Client {
-  public class Pool : GeodeNativeObject {
-    [DllImport(Constants.libPath, CharSet = CharSet.Auto)]
-    private static extern IntPtr apache_geode_Cache_GetPoolManager(IntPtr cache);
-
-    [DllImport(Constants.libPath, CharSet = CharSet.Auto)]
-    private static extern IntPtr apache_geode_PoolFactory_CreatePool(IntPtr poolFactory,
-                                                                     IntPtr poolName);
-
-    [DllImport(Constants.libPath, CharSet = CharSet.Auto)]
-    private static extern void apache_geode_DestroyPool(IntPtr pool);
-
-    internal Pool(IntPtr poolFactory, string poolName) {
-      var poolNamePtr = Marshal.StringToCoTaskMemUTF8(poolName);
-      _containedObject = apache_geode_PoolFactory_CreatePool(poolFactory, poolNamePtr);
-      Marshal.FreeCoTaskMem(poolNamePtr);
-    }
-
-    protected override void DestroyContainedObject() {
-      apache_geode_DestroyPool(_containedObject);
-      _containedObject = IntPtr.Zero;
-    }
-  }
-}
diff --git a/netcore/netcore-lib/PoolFactory.cs b/netcore/netcore-lib/PoolFactory.cs
deleted file mode 100644
index c00e8c8..0000000
--- a/netcore/netcore-lib/PoolFactory.cs
+++ /dev/null
@@ -1,55 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-using System;
-using System.Runtime.InteropServices;
-
-namespace Apache.Geode.Client {
-  public class PoolFactory : GeodeNativeObject {
-    [DllImport(Constants.libPath, CharSet = CharSet.Auto)]
-    private static extern IntPtr apache_geode_Cache_GetPoolManager(IntPtr cache);
-
-    [DllImport(Constants.libPath, CharSet = CharSet.Auto)]
-    private static extern IntPtr apache_geode_PoolManager_CreateFactory(IntPtr poolManager);
-
-    [DllImport(Constants.libPath, CharSet = CharSet.Auto)]
-    private static extern IntPtr apache_geode_PoolFactory_AddLocator(IntPtr poolManager,
-                                                                     IntPtr hostname, int port);
-
-    [DllImport(Constants.libPath, CharSet = CharSet.Auto)]
-    private static extern IntPtr apache_geode_DestroyPoolFactory(IntPtr poolManager);
-
-    internal PoolFactory(IntPtr poolManager) {
-      _containedObject = apache_geode_PoolManager_CreateFactory(poolManager);
-    }
-
-    public PoolFactory AddLocator(string hostname, int port) {
-      var hostnamePtr = Marshal.StringToCoTaskMemUTF8(hostname);
-      apache_geode_PoolFactory_AddLocator(_containedObject, hostnamePtr, port);
-      Marshal.FreeCoTaskMem(hostnamePtr);
-      return this;
-    }
-
-    public Pool CreatePool(string poolName) {
-      return new Pool(_containedObject, poolName);
-    }
-
-    protected override void DestroyContainedObject() {
-      apache_geode_DestroyPoolFactory(_containedObject);
-      _containedObject = IntPtr.Zero;
-    }
-  }
-}
diff --git a/netcore/netcore-lib/PoolManager.cs b/netcore/netcore-lib/PoolManager.cs
deleted file mode 100644
index 5a06436..0000000
--- a/netcore/netcore-lib/PoolManager.cs
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-using System;
-using System.Runtime.InteropServices;
-
-namespace Apache.Geode.Client {
-  public class PoolManager : GeodeNativeObject {
-    [DllImport(Constants.libPath, CharSet = CharSet.Auto)]
-    private static extern IntPtr apache_geode_Cache_GetPoolManager(IntPtr cache);
-
-    [DllImport(Constants.libPath, CharSet = CharSet.Auto)]
-    private static extern IntPtr apache_geode_DestroyPoolManager(IntPtr poolManager);
-
-    internal PoolManager(IntPtr cache) {
-      _containedObject = apache_geode_Cache_GetPoolManager(cache);
-    }
-
-    public PoolFactory CreatePoolFactory() {
-      return new PoolFactory(_containedObject);
-    }
-
-    protected override void DestroyContainedObject() {
-      apache_geode_DestroyPoolManager(_containedObject);
-      _containedObject = IntPtr.Zero;
-    }
-  }
-}
diff --git a/netcore/netcore-lib/Region.cs b/netcore/netcore-lib/Region.cs
deleted file mode 100644
index 68d49a5..0000000
--- a/netcore/netcore-lib/Region.cs
+++ /dev/null
@@ -1,114 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-using System;
-using System.Runtime.InteropServices;
-
-namespace Apache.Geode.Client {
-  public class Region : GeodeNativeObject {
-    [DllImport(Constants.libPath, CharSet = CharSet.Auto)]
-    private static extern IntPtr apache_geode_RegionFactory_CreateRegion(IntPtr cache,
-                                                                         IntPtr regionName);
-
-    [DllImport(Constants.libPath, CharSet = CharSet.Auto)]
-    private static extern bool apache_geode_Region_PutString(IntPtr region, IntPtr key,
-                                                             IntPtr value);
-
-    [DllImport(Constants.libPath, CharSet = CharSet.Auto)]
-    private static extern bool apache_geode_Region_PutByteArray(IntPtr region, IntPtr key,
-                                                                IntPtr value, int length);
-
-    [DllImport(Constants.libPath, CharSet = CharSet.Auto)]
-    private static extern IntPtr apache_geode_Region_GetString(IntPtr region, IntPtr key);
-
-    [DllImport(Constants.libPath, CharSet = CharSet.Auto)]
-    private static extern void apache_geode_Region_GetByteArray(IntPtr region, IntPtr key,
-                                                                ref IntPtr value, ref int size);
-
-    [DllImport(Constants.libPath, CharSet = CharSet.Auto)]
-    private static extern void apache_geode_Region_Remove(IntPtr region, IntPtr key);
-
-    [DllImport(Constants.libPath, CharSet = CharSet.Auto)]
-    private static extern bool apache_geode_Region_ContainsValueForKey(IntPtr region,
-                                                                       IntPtr key);
-
-    [DllImport(Constants.libPath, CharSet = CharSet.Auto)]
-    private static extern IntPtr apache_geode_DestroyRegion(IntPtr region);
-
-    internal Region(IntPtr regionFactory, string regionName) {
-      var regionNamePtr = Marshal.StringToCoTaskMemUTF8(regionName);
-      _containedObject = apache_geode_RegionFactory_CreateRegion(regionFactory, regionNamePtr);
-      Marshal.FreeCoTaskMem(regionNamePtr);
-    }
-
-    public void PutString(string key, string value) {
-      var keyPtr = Marshal.StringToCoTaskMemUTF8(key);
-      var valuePtr = Marshal.StringToCoTaskMemUTF8(value);
-      apache_geode_Region_PutString(_containedObject, keyPtr, valuePtr);
-      Marshal.FreeCoTaskMem(keyPtr);
-      Marshal.FreeCoTaskMem(valuePtr);
-    }
-
-    public void PutByteArray(string key, byte[] value) {
-      var keyPtr = Marshal.StringToCoTaskMemUTF8(key);
-      var valuePtr = Marshal.AllocCoTaskMem(value.Length);
-      Marshal.Copy(value, 0, valuePtr, value.Length);
-      apache_geode_Region_PutByteArray(_containedObject, keyPtr, valuePtr, value.Length);
-      Marshal.FreeCoTaskMem(keyPtr);
-      Marshal.FreeCoTaskMem(valuePtr);
-    }
-
-    public string GetString(string key) {
-      var keyPtr = Marshal.StringToCoTaskMemUTF8(key);
-      var result =
-          Marshal.PtrToStringUTF8(apache_geode_Region_GetString(_containedObject, keyPtr));
-      Marshal.FreeCoTaskMem(keyPtr);
-      return result;
-    }
-
-    public byte[] GetByteArray(string key) {
-      var keyPtr = Marshal.StringToCoTaskMemUTF8(key);
-      var valPtr = (IntPtr)0;
-      int size = 0;
-      apache_geode_Region_GetByteArray(_containedObject, keyPtr, ref valPtr, ref size);
-      if (size > 0) {
-        Byte[] byteArray = new Byte[size];
-        Marshal.Copy(valPtr, byteArray, 0, size);
-        Marshal.FreeCoTaskMem(valPtr);
-        return byteArray;
-      } else
-        return null;
-    }
-
-    public void Remove(string key) {
-      var keyPtr = Marshal.StringToCoTaskMemUTF8(key);
-      apache_geode_Region_Remove(_containedObject, keyPtr);
-      Marshal.FreeCoTaskMem(keyPtr);
-    }
-
-    public bool ContainsValueForKey(string key) {
-      var keyPtr = Marshal.StringToCoTaskMemUTF8(key);
-      bool result = apache_geode_Region_ContainsValueForKey(_containedObject, keyPtr);
-      Marshal.FreeCoTaskMem(keyPtr);
-      return result;
-    }
-
-    protected override void DestroyContainedObject() {
-      apache_geode_DestroyRegion(_containedObject);
-      _containedObject = IntPtr.Zero;
-    }
-  }
-}
diff --git a/netcore/netcore-lib/RegionFactory.cs b/netcore/netcore-lib/RegionFactory.cs
deleted file mode 100644
index 0cf2fd9..0000000
--- a/netcore/netcore-lib/RegionFactory.cs
+++ /dev/null
@@ -1,42 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-using System;
-using System.Runtime.InteropServices;
-
-namespace Apache.Geode.Client {
-  public class RegionFactory : GeodeNativeObject {
-    [DllImport(Constants.libPath, CharSet = CharSet.Auto)]
-    private static extern IntPtr apache_geode_Cache_CreateRegionFactory(IntPtr cache,
-                                                                        int regionType);
-
-    [DllImport(Constants.libPath, CharSet = CharSet.Auto)]
-    private static extern IntPtr apache_geode_DestroyRegionFactory(IntPtr regionFactory);
-
-    internal RegionFactory(IntPtr cache, RegionShortcut regionType) {
-      _containedObject = apache_geode_Cache_CreateRegionFactory(cache, (int)regionType);
-    }
-
-    public Region CreateRegion(string regionName) {
-      return new Region(_containedObject, regionName);
-    }
-
-    protected override void DestroyContainedObject() {
-      apache_geode_DestroyRegionFactory(_containedObject);
-      _containedObject = IntPtr.Zero;
-    }
-  }
-}
diff --git a/netcore/netcore-lib/RegionShortcut.cs b/netcore/netcore-lib/RegionShortcut.cs
deleted file mode 100644
index 6e1738a..0000000
--- a/netcore/netcore-lib/RegionShortcut.cs
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-namespace Apache.Geode.Client {
-  public enum RegionShortcut {
-    Proxy = 0,
-    CachingProxy = 1,
-    CachingProxyEntryLru = 2,
-    Local = 3,
-    LocalEntryLru = 4
-  }
-}
diff --git a/netcore/netcore-lib/netcore-lib.csproj b/netcore/netcore-lib/netcore-lib.csproj
deleted file mode 100644
index 35ae18e..0000000
--- a/netcore/netcore-lib/netcore-lib.csproj
+++ /dev/null
@@ -1,26 +0,0 @@
-﻿<Project Sdk="Microsoft.NET.Sdk">
-
-    <PropertyGroup>
-        <TargetFramework>netcoreapp3.1</TargetFramework>
-        <RootNamespace>Apache.Geode.NetCore</RootNamespace>
-        <AssemblyName>Apache.Geode.NetCore</AssemblyName>
-        <Platforms>x64</Platforms>
-        <Configurations>Debug;RelWithDebInfo</Configurations>
-    </PropertyGroup>
-
-    <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
-      <TreatWarningsAsErrors>true</TreatWarningsAsErrors>
-      <WarningsAsErrors />
-      <DebugType>pdbonly</DebugType>
-      <DebugSymbols>true</DebugSymbols>
-    </PropertyGroup>
-	
-    <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='RelWithDebInfo|x64'">
-      <TreatWarningsAsErrors>true</TreatWarningsAsErrors>
-      <WarningsAsErrors />
-      <Optimize>true</Optimize>
-      <DebugType>pdbonly</DebugType>
-      <DebugSymbols>true</DebugSymbols>
-    </PropertyGroup>	
-
-</Project>
diff --git a/netcore/netcore-session-integration-test/CMakeLists.txt b/netcore/netcore-session-integration-test/CMakeLists.txt
deleted file mode 100644
index 9aa4d4e..0000000
--- a/netcore/netcore-session-integration-test/CMakeLists.txt
+++ /dev/null
@@ -1,26 +0,0 @@
-# Licensed to the Apache Software Foundation (ASF) under one or more
-# contributor license agreements.  See the NOTICE file distributed with
-# this work for additional information regarding copyright ownership.
-# The ASF licenses this file to You under the Apache License, Version 2.0
-# (the "License"); you may not use this file except in compliance with
-# the License.  You may obtain a copy of the License at
-#
-#      http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-project(netcore-session-integrationtest LANGUAGES NONE)
-
-add_custom_target(netcore-session-integration-test ALL 
-  COMMAND ${DOTNET} build netcore-session-integration-test.csproj -p:platform=x64 --configuration $<CONFIG>
-  COMMAND ${CMAKE_COMMAND} -E copy $<TARGET_FILE:apache-geode-c> ${CMAKE_CURRENT_SOURCE_DIR}/bin/x64/$<CONFIG>/netcoreapp3.1/
-  WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} DEPENDS apache-geode-c netcore-session VERBATIM)
-
-enable_testing()
-
-add_test(NAME netcore-session-test 
-  COMMAND dotnet test -c $<CONFIG> -p:platform=x64
-  WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR})
diff --git a/netcore/netcore-session-integration-test/Properties/launchSettings.json b/netcore/netcore-session-integration-test/Properties/launchSettings.json
deleted file mode 100644
index 5d4ca80..0000000
--- a/netcore/netcore-session-integration-test/Properties/launchSettings.json
+++ /dev/null
@@ -1,8 +0,0 @@
-{
-  "profiles": {
-	"Apache.Geode.Session.IntegrationTests": {
-	  "commandName": "Project",
-	  "nativeDebugging": true
-	}
-  }
-}
diff --git a/netcore/netcore-session-integration-test/SessionStateIntegrationTests.cs b/netcore/netcore-session-integration-test/SessionStateIntegrationTests.cs
deleted file mode 100644
index ad2d867..0000000
--- a/netcore/netcore-session-integration-test/SessionStateIntegrationTests.cs
+++ /dev/null
@@ -1,230 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-using System;
-using System.Text;
-using System.Linq;
-using Microsoft.Extensions.Caching.Distributed;
-using System.Threading.Tasks;
-using Xunit;
-using Xunit.Abstractions;
-using Apache.Geode.Client.IntegrationTests;
-using Xunit.Sdk;
-using System.Reflection;
-
-namespace Apache.Geode.Session.IntegrationTests {
-  public class NetCoreSessionTestFixture : IDisposable
-  {
-    internal Cluster cluster;
-    public ITestOutputHelper Output { get; set; }
-
-    public NetCoreSessionTestFixture SetOutPut(ITestOutputHelper output)
-    {
-      Output = output;
-      return this;
-    }
-
-    public void CreateCluster()
-    {
-      if (cluster == null)
-      {
-        cluster = new Cluster(Output, "GeodeSessionStateTests", 1, 1);
-
-        Assert.True(cluster.Start());
-        Assert.Equal(0, cluster.Gfsh
-            .create()
-            .region()
-            .withName("exampleRegion")
-            .withType("PARTITION")
-            .execute());
-      }
-    }
-
-    public void Dispose()
-    {
-      // At this point, the last test has executed and the ITestOutputHelper is
-      // no longer available. Hence set the output to null in the cluster.
-      cluster.Gfsh.Output = null;
-      cluster.Dispose();
-      Output = null;
-    }
-  }
-
-  [Collection("Geode .Net Core Collection")]
-  public class SessionStateIntegrationTests : TestBase,  IClassFixture<NetCoreSessionTestFixture>
-  {
-    NetCoreSessionTestFixture fixture;
-
-    public SessionStateIntegrationTests(NetCoreSessionTestFixture fixture, ITestOutputHelper testOutputHelper) : base(testOutputHelper)
-    {
-      this.fixture = fixture;
-      this.fixture.Output = testOutputHelper;
-      this.fixture.CreateCluster();
-    }
-
-    [Fact]
-    public void SetGet()
-    {
-        var ssCacheOptions = new GeodeSessionStateCacheOptions();
-        ssCacheOptions.Host = "localhost";
-        ssCacheOptions.Port = fixture.cluster.Locators[0].Address.port;
-        ssCacheOptions.RegionName = "exampleRegion";
-
-        using var ssCache = new GeodeSessionStateCache(ssCacheOptions);
-
-        var options = new DistributedCacheEntryOptions();
-        var localTime = DateTime.Now.AddDays(1);
-        var dateAndOffset =
-            new DateTimeOffset(localTime, TimeZoneInfo.Local.GetUtcOffset(localTime));
-        options.AbsoluteExpiration = dateAndOffset;
-        var testValue = new byte[] { 1, 2, 3, 4, 5 };
-        ssCache.Set("testKey", testValue, options);
-        var value = ssCache.Get("testKey");
-        Assert.True(testValue.SequenceEqual(value));
-      }
-
-    [Fact]
-    public void Refresh()
-    {
-        var ssCacheOptions = new GeodeSessionStateCacheOptions();
-        ssCacheOptions.Host = "localhost";
-        ssCacheOptions.Port = fixture.cluster.Locators[0].Address.port;
-        ssCacheOptions.RegionName = "exampleRegion";
-
-        using var ssCache = new GeodeSessionStateCache(ssCacheOptions);
-
-        var options = new DistributedCacheEntryOptions();
-        var numSeconds = 20;
-        options.SlidingExpiration = new TimeSpan(0, 0, numSeconds);
-        var testValue = new byte[] { 1, 2, 3, 4, 5 };
-
-        // Set a value
-        ssCache.Set("testKey", testValue, options);
-
-        // Wait half a timeout then refresh
-        System.Threading.Thread.Sleep(numSeconds / 2 * 1000);
-        ssCache.Refresh("testKey");
-
-        // Wait beyond the original expiration
-        System.Threading.Thread.Sleep(numSeconds / 2 * 1000 + 1);
-
-        // Ensure it's not expired
-        var value = ssCache.Get("testKey");
-        Assert.True(testValue.SequenceEqual(value));
-    }
-
-    [Fact]
-    public void SetWithAbsoluteExpiration()
-    {
-        var ssCacheOptions = new GeodeSessionStateCacheOptions();
-        ssCacheOptions.Host = "localhost";
-        ssCacheOptions.Port = fixture.cluster.Locators[0].Address.port;
-        ssCacheOptions.RegionName = "exampleRegion";
-
-        using var ssCache = new GeodeSessionStateCache(ssCacheOptions);
-
-        var options = new DistributedCacheEntryOptions();
-        options.AbsoluteExpiration = DateTime.Now.AddSeconds(5);
-        ssCache.Set("testKey", Encoding.UTF8.GetBytes("testValue"), options);
-        System.Threading.Thread.Sleep(6000);
-        var value = ssCache.Get("testKey");
-        Assert.Null(value);
-    }
-
-    [Fact]
-    public void Remove()
-    {
-        var ssCacheOptions = new GeodeSessionStateCacheOptions();
-        ssCacheOptions.Host = "localhost";
-        ssCacheOptions.Port = fixture.cluster.Locators[0].Address.port;
-        ssCacheOptions.RegionName = "exampleRegion";
-
-        using var ssCache = new GeodeSessionStateCache(ssCacheOptions);
-
-        var options = new DistributedCacheEntryOptions();
-        var localTime = DateTime.Now.AddDays(1);
-        var dateAndOffset =
-            new DateTimeOffset(localTime, TimeZoneInfo.Local.GetUtcOffset(localTime));
-        options.AbsoluteExpiration = dateAndOffset;
-        var testValue = new byte[] { 1, 2, 3, 4, 5 };
-        ssCache.Set("testKey", testValue, options);
-        var value = ssCache.Get("testKey");
-
-        ssCache.Remove("testKey");
-        value = ssCache.Get("testKey");
-        Assert.Null(value);
-    }
-
-    [Fact]
-    public void SetGetRemoveAsync()
-    {
-        var ssCacheOptions = new GeodeSessionStateCacheOptions();
-        ssCacheOptions.Host = "localhost";
-        ssCacheOptions.Port = fixture.cluster.Locators[0].Address.port;
-        ssCacheOptions.RegionName = "exampleRegion";
-
-        using var ssCache = new GeodeSessionStateCache(ssCacheOptions);
-
-        var options = new DistributedCacheEntryOptions();
-        var localTime = DateTime.Now.AddDays(1);
-        var dateAndOffset =
-            new DateTimeOffset(localTime, TimeZoneInfo.Local.GetUtcOffset(localTime));
-        options.AbsoluteExpiration = dateAndOffset;
-
-        var testValue1 = new byte[] { 1, 2, 3, 4, 5 };
-        var testValue2 = new byte[] { 11, 12, 13, 14, 15 };
-        var testValue3 = new byte[] { 21, 22, 23, 24, 25 };
-        var testValue4 = new byte[] { 31, 32, 33, 34, 35 };
-        var testValue5 = new byte[] { 41, 42, 43, 44, 45 };
-
-        var set1 = ssCache.SetAsync("testKey1", testValue1, options);
-        var set2 = ssCache.SetAsync("testKey2", testValue2, options);
-        var set3 = ssCache.SetAsync("testKey3", testValue3, options);
-        var set4 = ssCache.SetAsync("testKey4", testValue4, options);
-        var set5 = ssCache.SetAsync("testKey5", testValue5, options);
-
-        Task.WaitAll(set1, set2, set3, set4, set5);
-
-        var value1 = ssCache.GetAsync("testKey1");
-        var value2 = ssCache.GetAsync("testKey2");
-        var value3 = ssCache.GetAsync("testKey3");
-        var value4 = ssCache.GetAsync("testKey4");
-        var value5 = ssCache.GetAsync("testKey5");
-
-        Task.WaitAll(value1, value2, value3, value4, value5);
-
-        Assert.True(testValue1.SequenceEqual(value1.Result));
-        Assert.True(testValue2.SequenceEqual(value2.Result));
-        Assert.True(testValue3.SequenceEqual(value3.Result));
-        Assert.True(testValue4.SequenceEqual(value4.Result));
-        Assert.True(testValue5.SequenceEqual(value5.Result));
-
-        var rm1 = ssCache.RemoveAsync("testKey1");
-        var rm2 = ssCache.RemoveAsync("testKey2");
-        var rm3 = ssCache.RemoveAsync("testKey3");
-        var rm4 = ssCache.RemoveAsync("testKey4");
-        var rm5 = ssCache.RemoveAsync("testKey5");
-
-        Task.WaitAll(rm1, rm2, rm3, rm4, rm5);
-
-        Assert.Null(ssCache.Get("testKey1"));
-        Assert.Null(ssCache.Get("testKey2"));
-        Assert.Null(ssCache.Get("testKey3"));
-        Assert.Null(ssCache.Get("testKey4"));
-        Assert.Null(ssCache.Get("testKey5"));
-      }
-    }
-}
diff --git a/netcore/netcore-session-integration-test/netcore-session-integration-test.csproj b/netcore/netcore-session-integration-test/netcore-session-integration-test.csproj
deleted file mode 100644
index 301d1b9..0000000
--- a/netcore/netcore-session-integration-test/netcore-session-integration-test.csproj
+++ /dev/null
@@ -1,46 +0,0 @@
-﻿<Project Sdk="Microsoft.NET.Sdk">
-
-  <PropertyGroup>
-    <TargetFramework>netcoreapp3.1</TargetFramework>
-    <IsPackable>false</IsPackable>
-    <Platforms>x64</Platforms>
-	<Configurations>Debug;RelWithDebInfo</Configurations>
-  </PropertyGroup>
-
-  <ItemGroup>
-	<Compile Include="..\shared\Config.cs" Link="Config.cs" />
-	<Compile Include="..\shared\Cluster.cs" Link="Cluster.cs" />
-	<Compile Include="..\shared\Gfsh.cs" Link="Gfsh.cs" />
-	<Compile Include="..\shared\Framework.cs" Link="Framework.cs" />
-	<Compile Include="..\shared\GfshExecute.cs" Link="GfshExecute.cs" />
-	<Compile Include="..\shared\TestBase.cs" Link="TestBase.cs" />
-  </ItemGroup>
-
-  <ItemGroup>
-	<PackageReference Include="Microsoft.NET.Test.Sdk" Version="16.6.1" />
-	<PackageReference Include="xunit" Version="2.4.1" />
-    <PackageReference Include="xunit.runner.visualstudio" Version="2.4.3" />
-    <PackageReference Include="coverlet.collector" Version="1.2.0" />
-  </ItemGroup>
-
-  <ItemGroup>
-    <ProjectReference Include="..\netcore-session\netcore-session.csproj" />
-    <ProjectReference Include="..\netcore-lib\netcore-lib.csproj" />
-  </ItemGroup>
-
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
-	<TreatWarningsAsErrors>true</TreatWarningsAsErrors>
-	<WarningsAsErrors />
-	<DebugType>pdbonly</DebugType>
-	<DebugSymbols>true</DebugSymbols>
-  </PropertyGroup>
-
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='RelWithDebInfo|x64'">
-	<TreatWarningsAsErrors>true</TreatWarningsAsErrors>
-	<WarningsAsErrors />
-	<Optimize>true</Optimize>
-	<DebugType>pdbonly</DebugType>
-	<DebugSymbols>true</DebugSymbols>
-  </PropertyGroup>
-
-</Project>
diff --git a/netcore/netcore-session/CMakeLists.txt b/netcore/netcore-session/CMakeLists.txt
deleted file mode 100644
index 37c122e..0000000
--- a/netcore/netcore-session/CMakeLists.txt
+++ /dev/null
@@ -1,18 +0,0 @@
-# Licensed to the Apache Software Foundation (ASF) under one or more
-# contributor license agreements.  See the NOTICE file distributed with
-# this work for additional information regarding copyright ownership.
-# The ASF licenses this file to You under the Apache License, Version 2.0
-# (the "License"); you may not use this file except in compliance with
-# the License.  You may obtain a copy of the License at
-#
-#      http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-project(netcore-session LANGUAGES NONE)
-
-add_custom_target(netcore-session ALL COMMAND ${DOTNET} build netcore-session.csproj -p:platform=x64 --configuration $<CONFIG>
-  WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} DEPENDS apache-geode-c netcore-integration-test VERBATIM)
diff --git a/netcore/netcore-session/GeodeCacheServiceCollectionExtensions.cs b/netcore/netcore-session/GeodeCacheServiceCollectionExtensions.cs
deleted file mode 100644
index 113d079..0000000
--- a/netcore/netcore-session/GeodeCacheServiceCollectionExtensions.cs
+++ /dev/null
@@ -1,40 +0,0 @@
-﻿/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-using System;
-using Microsoft.Extensions.Caching.Distributed;
-using Microsoft.Extensions.DependencyInjection;
-
-namespace Apache.Geode.Session {
-  public static class GeodeCacheServiceCollectionExtensions {
-    public static IServiceCollection AddGeodeSessionStateCache(
-        this IServiceCollection services, Action<GeodeSessionStateCacheOptions> setupAction) {
-      if (services == null) {
-        throw new ArgumentNullException(nameof(services));
-      }
-
-      if (setupAction == null) {
-        throw new ArgumentNullException(nameof(setupAction));
-      }
-
-      services.AddOptions();
-      services.Add(ServiceDescriptor.Singleton<IDistributedCache, GeodeSessionStateCache>());
-      services.Configure(setupAction);
-
-      return services;
-    }
-  }
-}
diff --git a/netcore/netcore-session/GeodeSessionStateCacheOptions.cs b/netcore/netcore-session/GeodeSessionStateCacheOptions.cs
deleted file mode 100644
index d07e068..0000000
--- a/netcore/netcore-session/GeodeSessionStateCacheOptions.cs
+++ /dev/null
@@ -1,31 +0,0 @@
-﻿/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-using Microsoft.Extensions.Options;
-
-namespace Apache.Geode.Session {
-  public class GeodeSessionStateCacheOptions : IOptions<GeodeSessionStateCacheOptions> {
-    public string RegionName { get; set; }
-    public string Host { get; set; }
-    public int Port { get; set; }
-    public string LogLevel { get; set; } = "none";
-    public string LogFile { get; set; } = "GeodeSessionStateCache.log";
-
-    GeodeSessionStateCacheOptions IOptions<GeodeSessionStateCacheOptions>.Value {
-      get { return this; }
-    }
-  }
-}
diff --git a/netcore/netcore-session/NetCoreSessionState.cs b/netcore/netcore-session/NetCoreSessionState.cs
deleted file mode 100644
index 4bf0b88..0000000
--- a/netcore/netcore-session/NetCoreSessionState.cs
+++ /dev/null
@@ -1,288 +0,0 @@
-﻿/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-using Apache.Geode.Client;
-using Microsoft.Extensions.Caching.Distributed;
-using Microsoft.Extensions.Logging;
-using Microsoft.Extensions.Options;
-using System;
-using System.Threading;
-using System.Threading.Tasks;
-
-namespace Apache.Geode.Session {
-  public class GeodeSessionStateValue {
-    public GeodeSessionStateValue() {}
-    public GeodeSessionStateValue(byte[] value) {
-      FromByteArray(value);
-    }
-
-    public byte[] Value { get; set; }
-    public DateTime LastAccessTimeUtc { get; set; }
-    public DateTime ExpirationTimeUtc { get; set; } = DateTime.MinValue;
-    public TimeSpan SpanUntilStale { get; set; } = TimeSpan.Zero;
-
-    public byte[] ToByteArray() {
-      var neededBytes = 3 * sizeof(long) + Value.Length;
-      var byteArray = new byte[neededBytes];
-      var byteIndex = 0;
-
-      Array.Copy(BitConverter.GetBytes(LastAccessTimeUtc.Ticks), 0, byteArray, byteIndex,
-                 sizeof(long));
-      byteIndex += sizeof(long);
-
-      Array.Copy(BitConverter.GetBytes(ExpirationTimeUtc.Ticks), 0, byteArray, byteIndex,
-                 sizeof(long));
-      byteIndex += sizeof(long);
-
-      Array.Copy(BitConverter.GetBytes(SpanUntilStale.Ticks), 0, byteArray, byteIndex,
-                 sizeof(long));
-      byteIndex += sizeof(long);
-
-      Array.Copy(Value, 0, byteArray, byteIndex, Value.Length);
-      return byteArray;
-    }
-
-    public void FromByteArray(byte[] data) {
-      var byteIndex = 0;
-
-      LastAccessTimeUtc = DateTime.FromBinary(BitConverter.ToInt64(data, byteIndex));
-      byteIndex += sizeof(long);
-
-      ExpirationTimeUtc = DateTime.FromBinary(BitConverter.ToInt64(data, byteIndex));
-      byteIndex += sizeof(long);
-
-      SpanUntilStale = TimeSpan.FromTicks(BitConverter.ToInt64(data, byteIndex));
-      byteIndex += sizeof(long);
-
-      Value = new byte[data.Length - byteIndex];
-      Array.Copy(data, byteIndex, Value, 0, data.Length - byteIndex);
-    }
-  }
-
-  public class GeodeSessionStateCache : GeodeNativeObject, IDistributedCache {
-    private readonly IGeodeCache _cache;
-    private static Region _region;
-    private string _logLevel;
-    private string _logFile;
-    private string _regionName;
-    private readonly SemaphoreSlim _connectLock = new SemaphoreSlim(initialCount: 1, maxCount: 1);
-
-    public GeodeSessionStateCache(IOptions<GeodeSessionStateCacheOptions> optionsAccessor) {
-      var host = optionsAccessor.Value.Host;
-      var port = optionsAccessor.Value.Port;
-      _regionName = optionsAccessor.Value.RegionName;
-      _logLevel = optionsAccessor.Value.LogLevel;
-      _logFile = optionsAccessor.Value.LogFile;
-
-      _cache = CacheFactory.Create()
-                   .SetProperty("log-level", _logLevel)
-                   .SetProperty("log-file", _logFile)
-                   .CreateCache();
-
-      _cache.PoolManager.CreatePoolFactory().AddLocator(host, port).CreatePool("pool");
-
-      var regionFactory = _cache.CreateRegionFactory(RegionShortcut.Proxy);
-      _region = regionFactory.CreateRegion(_regionName);
-    }
-
-    // Returns the SessionStateValue for key, or null if key doesn't exist
-    public GeodeSessionStateValue GetValueForKey(string key) {
-      var cacheValue = _region.GetByteArray(key);
-
-      if (cacheValue != null) {
-        return new GeodeSessionStateValue(cacheValue);
-      } else
-        return null;
-    }
-
-    public byte[] Get(string key) {
-      if (key == null) {
-        throw new ArgumentNullException(nameof(key));
-      }
-
-      Connect();
-
-      // Check for nonexistent key
-      var ssValue = GetValueForKey(key);
-      if (ssValue == null) {
-        return null;
-      }
-
-      // Check for expired key
-      var nowUtc = DateTime.UtcNow;
-      if (ssValue.ExpirationTimeUtc != DateTime.MinValue && ssValue.ExpirationTimeUtc < nowUtc) {
-        return null;
-      }
-
-      // Check for stale key
-      if (ssValue.SpanUntilStale != TimeSpan.Zero &&
-          nowUtc > (ssValue.LastAccessTimeUtc + ssValue.SpanUntilStale)) {
-        return null;
-      }
-
-      // Update the times for sliding expirations
-      if (ssValue.SpanUntilStale != TimeSpan.Zero) {
-        ssValue.LastAccessTimeUtc = nowUtc;
-        _region.PutByteArray(key, ssValue.ToByteArray());
-      }
-
-      return ssValue.Value;
-    }
-
-    public Task<byte[]> GetAsync(string key, CancellationToken token = default(CancellationToken)) {
-      if (key == null) {
-        throw new ArgumentNullException(nameof(key));
-      }
-
-      token.ThrowIfCancellationRequested();
-
-      return Task.Factory.StartNew(() => Get(key), token);
-    }
-
-    public void Refresh(string key) {
-      if (key == null) {
-        throw new ArgumentNullException(nameof(key));
-      }
-
-      Connect();
-
-      // Check for nonexistent key
-      var ssValue = GetValueForKey(key);
-      if (ssValue == null) {
-        return;
-      }
-
-      // Check for expired key
-      var nowUtc = DateTime.UtcNow;
-      if (ssValue.ExpirationTimeUtc != DateTime.MinValue && ssValue.ExpirationTimeUtc < nowUtc) {
-        return;
-      }
-
-      // Check for stale key
-      if (ssValue.SpanUntilStale != TimeSpan.Zero &&
-          nowUtc > (ssValue.LastAccessTimeUtc + ssValue.SpanUntilStale)) {
-        return;
-      }
-
-      // Update the times for sliding expirations
-      if (ssValue.SpanUntilStale != TimeSpan.Zero) {
-        ssValue.LastAccessTimeUtc = nowUtc;
-        _region.PutByteArray(key, ssValue.ToByteArray());
-      }
-    }
-
-    public Task RefreshAsync(string key, CancellationToken token = default(CancellationToken)) {
-      if (key == null) {
-        throw new ArgumentNullException(nameof(key));
-      }
-
-      token.ThrowIfCancellationRequested();
-
-      return Task.Factory.StartNew(() => Refresh(key), token);
-    }
-
-    public void Remove(string key) {
-      if (key == null) {
-        throw new ArgumentNullException(nameof(key));
-      }
-
-      Connect();
-
-      _region.Remove(key);
-    }
-
-    public Task RemoveAsync(string key, CancellationToken token = default(CancellationToken)) {
-      if (key == null) {
-        throw new ArgumentNullException(nameof(key));
-      }
-
-      token.ThrowIfCancellationRequested();
-
-      return Task.Factory.StartNew(() => Remove(key), token);
-    }
-
-    public void Set(string key, byte[] value, DistributedCacheEntryOptions options) {
-      if (key == null) {
-        throw new ArgumentNullException(nameof(key));
-      }
-
-      if (value == null) {
-        throw new ArgumentNullException(nameof(value));
-      }
-
-      if (options == null) {
-        throw new ArgumentNullException(nameof(options));
-      }
-
-      Connect();
-
-      var ssValue = new GeodeSessionStateValue();
-      ssValue.Value = value;
-
-      var nowUtc = DateTime.UtcNow;
-      ssValue.LastAccessTimeUtc = nowUtc;
-
-      // No need to check stale or expired data when setting an absolute expiration.
-      // Think of if as setting a new key/value pair. Expired data will always be cleaned up
-      // when the CleanupExpiredData job runs.
-
-      if (options.AbsoluteExpiration != null) {
-        var dto = options.AbsoluteExpiration.Value;
-        ssValue.ExpirationTimeUtc = dto.DateTime + dto.Offset;
-      }
-
-      // If AbsoluteExpiration and AbsoluteExpirationRelativeToNow are set, use the latter.
-      if (options.AbsoluteExpirationRelativeToNow != null) {
-        var ts = options.AbsoluteExpirationRelativeToNow.Value;
-        ssValue.ExpirationTimeUtc = nowUtc + ts;
-      }
-
-      if (options.SlidingExpiration != null) {
-        ssValue.SpanUntilStale = options.SlidingExpiration.Value;
-      }
-
-      _region.PutByteArray(key, ssValue.ToByteArray());
-      return;
-    }
-
-    public Task SetAsync(string key, byte[] value, DistributedCacheEntryOptions options,
-                         CancellationToken token = default(CancellationToken)) {
-      if (key == null) {
-        throw new ArgumentNullException(nameof(key));
-      }
-
-      token.ThrowIfCancellationRequested();
-
-      return Task.Factory.StartNew(() => Set(key, value, options), token);
-    }
-
-    private void Connect() {
-      if (_region != null) {
-        return;
-      }
-
-      _connectLock.Wait();
-      using var regionFactory = _cache.CreateRegionFactory(RegionShortcut.Proxy);
-      _region = regionFactory.CreateRegion(_regionName);
-      _connectLock.Release();
-    }
-
-    protected override void DestroyContainedObject() {
-      _region?.Dispose();
-      _region = null;
-    }
-  }
-}
diff --git a/netcore/netcore-session/netcore-session.csproj b/netcore/netcore-session/netcore-session.csproj
deleted file mode 100644
index 3621586..0000000
--- a/netcore/netcore-session/netcore-session.csproj
+++ /dev/null
@@ -1,33 +0,0 @@
-﻿<Project Sdk="Microsoft.NET.Sdk">
-
-  <PropertyGroup>
-    <TargetFramework>netcoreapp3.1</TargetFramework>
-    <Platforms>x64</Platforms>
-	<Configurations>Debug;RelWithDebInfo</Configurations>
-  </PropertyGroup>
-
-  <ItemGroup>
-    <PackageReference Include="Microsoft.Extensions.Caching.Abstractions" Version="3.1.3" />
-    <PackageReference Include="Microsoft.Extensions.Logging" Version="3.1.3" />
-  </ItemGroup>
-
-  <ItemGroup>
-    <ProjectReference Include="..\netcore-lib\netcore-lib.csproj" />
-  </ItemGroup>
-
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
-	<TreatWarningsAsErrors>true</TreatWarningsAsErrors>
-	<WarningsAsErrors />
-	<DebugType>pdbonly</DebugType>
-	<DebugSymbols>true</DebugSymbols>
-  </PropertyGroup>
-
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='RelWithDebInfo|x64'">
-	<TreatWarningsAsErrors>true</TreatWarningsAsErrors>
-	<WarningsAsErrors />
-	<Optimize>true</Optimize>
-	<DebugType>pdbonly</DebugType>
-	<DebugSymbols>true</DebugSymbols>
-  </PropertyGroup>
-
-</Project>
diff --git a/netcore/netcore.sln b/netcore/netcore.sln
deleted file mode 100644
index f4249d3..0000000
--- a/netcore/netcore.sln
+++ /dev/null
@@ -1,49 +0,0 @@
-﻿
-Microsoft Visual Studio Solution File, Format Version 12.00
-# Visual Studio Version 16
-VisualStudioVersion = 16.0.31702.278
-MinimumVisualStudioVersion = 10.0.40219.1
-Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "netcore-lib", "netcore-lib\netcore-lib.csproj", "{27274EF5-E606-4D98-98C0-8214B80FC267}"
-EndProject
-Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "netcore-integration-test", "netcore-integration-test\netcore-integration-test.csproj", "{1FB30EB0-1121-4E9D-AAB9-6ABF88378219}"
-EndProject
-Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "asp-netcore-session-sample", "asp-netcore-session-sample\asp-netcore-session-sample.csproj", "{94BC7C9E-1967-4E87-983A-FECD32F7DDE2}"
-EndProject
-Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "netcore-session", "netcore-session\netcore-session.csproj", "{72C7BDE7-F933-464A-A5E7-F024D73CD8F1}"
-EndProject
-Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "netcore-session-integration-test", "netcore-session-integration-test\netcore-session-integration-test.csproj", "{8C06FA0E-A460-442B-978D-C0195259893F}"
-EndProject
-Global
-	GlobalSection(SolutionConfigurationPlatforms) = preSolution
-		Debug|x64 = Debug|x64
-		RelWithDebInfo|x64 = RelWithDebInfo|x64
-	EndGlobalSection
-	GlobalSection(ProjectConfigurationPlatforms) = postSolution
-		{27274EF5-E606-4D98-98C0-8214B80FC267}.Debug|x64.ActiveCfg = Debug|x64
-		{27274EF5-E606-4D98-98C0-8214B80FC267}.Debug|x64.Build.0 = Debug|x64
-		{27274EF5-E606-4D98-98C0-8214B80FC267}.RelWithDebInfo|x64.ActiveCfg = RelWithDebInfo|x64
-		{27274EF5-E606-4D98-98C0-8214B80FC267}.RelWithDebInfo|x64.Build.0 = RelWithDebInfo|x64
-		{1FB30EB0-1121-4E9D-AAB9-6ABF88378219}.Debug|x64.ActiveCfg = Debug|x64
-		{1FB30EB0-1121-4E9D-AAB9-6ABF88378219}.Debug|x64.Build.0 = Debug|x64
-		{1FB30EB0-1121-4E9D-AAB9-6ABF88378219}.RelWithDebInfo|x64.ActiveCfg = RelWithDebInfo|x64
-		{1FB30EB0-1121-4E9D-AAB9-6ABF88378219}.RelWithDebInfo|x64.Build.0 = RelWithDebInfo|x64
-		{94BC7C9E-1967-4E87-983A-FECD32F7DDE2}.Debug|x64.ActiveCfg = Debug|x64
-		{94BC7C9E-1967-4E87-983A-FECD32F7DDE2}.Debug|x64.Build.0 = Debug|x64
-		{94BC7C9E-1967-4E87-983A-FECD32F7DDE2}.RelWithDebInfo|x64.ActiveCfg = RelWithDebInfo|x64
-		{94BC7C9E-1967-4E87-983A-FECD32F7DDE2}.RelWithDebInfo|x64.Build.0 = RelWithDebInfo|x64
-		{72C7BDE7-F933-464A-A5E7-F024D73CD8F1}.Debug|x64.ActiveCfg = Debug|x64
-		{72C7BDE7-F933-464A-A5E7-F024D73CD8F1}.Debug|x64.Build.0 = Debug|x64
-		{72C7BDE7-F933-464A-A5E7-F024D73CD8F1}.RelWithDebInfo|x64.ActiveCfg = RelWithDebInfo|x64
-		{72C7BDE7-F933-464A-A5E7-F024D73CD8F1}.RelWithDebInfo|x64.Build.0 = RelWithDebInfo|x64
-		{8C06FA0E-A460-442B-978D-C0195259893F}.Debug|x64.ActiveCfg = Debug|x64
-		{8C06FA0E-A460-442B-978D-C0195259893F}.Debug|x64.Build.0 = Debug|x64
-		{8C06FA0E-A460-442B-978D-C0195259893F}.RelWithDebInfo|x64.ActiveCfg = RelWithDebInfo|x64
-		{8C06FA0E-A460-442B-978D-C0195259893F}.RelWithDebInfo|x64.Build.0 = RelWithDebInfo|x64
-	EndGlobalSection
-	GlobalSection(SolutionProperties) = preSolution
-		HideSolutionNode = FALSE
-	EndGlobalSection
-	GlobalSection(ExtensibilityGlobals) = postSolution
-		SolutionGuid = {1C2B71F0-E68A-43D1-9AA1-6A1CEE82C993}
-	EndGlobalSection
-EndGlobal
diff --git a/netcore/shared/CMakeLists.txt b/netcore/shared/CMakeLists.txt
deleted file mode 100644
index c9e0ed5..0000000
--- a/netcore/shared/CMakeLists.txt
+++ /dev/null
@@ -1,17 +0,0 @@
-# Licensed to the Apache Software Foundation (ASF) under one or more
-# contributor license agreements.  See the NOTICE file distributed with
-# this work for additional information regarding copyright ownership.
-# The ASF licenses this file to You under the Apache License, Version 2.0
-# (the "License"); you may not use this file except in compliance with
-# the License.  You may obtain a copy of the License at
-#
-#      http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-project(netcore-shared LANGUAGES NONE)
-
-configure_file(${CMAKE_CURRENT_SOURCE_DIR}/Config.cs.in ${CMAKE_CURRENT_SOURCE_DIR}/Config.cs)
diff --git a/netcore/shared/Cluster.cs b/netcore/shared/Cluster.cs
deleted file mode 100644
index cd0e2be..0000000
--- a/netcore/shared/Cluster.cs
+++ /dev/null
@@ -1,300 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-using System;
-using System.Collections.Generic;
-using System.IO;
-using Xunit.Abstractions;
-
-namespace Apache.Geode.Client.IntegrationTests
-{
-    public class Cluster : IDisposable
-    {
-        private int locatorCount_;
-        private int serverCount_;
-        private bool started_;
-        private List<Locator> locators_;
-        private string name_;
-        internal int jmxManagerPort = Framework.FreeTcpPort();
-        internal string keyStore_ = Config.SslServerKeyPath + "/server_keystore_chained.jks";
-        internal string keyStorePassword_ = "apachegeode";
-        internal string trustStore_ = Config.SslServerKeyPath + "/server_truststore_chained_root.jks";
-        internal string trustStorePassword_ = "apachegeode";
-
-        public GfshExecute Gfsh { get; private set; }
-
-        public bool UseSSL { get; set; }
-
-        public List<Locator> Locators
-        {
-          get { return locators_; }
-        }
-
-    internal PoolFactory ApplyLocators(PoolFactory poolFactory)
-        {
-            foreach (var locator in locators_)
-            {
-                poolFactory.AddLocator(locator.Address.address, locator.Address.port);
-            }
-            return poolFactory;
-        }
-
-        public Cluster(ITestOutputHelper output, string name, int locatorCount, int serverCount)
-        {
-            started_ = false;
-            Gfsh = new GfshExecute(output);
-            UseSSL = false;
-            name_ = name;
-            locatorCount_ = locatorCount;
-            serverCount_ = serverCount;
-            locators_ = new List<Locator>();
-        }
-
-        private bool StartLocators()
-        {
-            var success = true;
-
-            for (var i = 0; i < locatorCount_; i++)
-            {
-                var locator = new Locator(this, new List<Locator>(),
-                    name_ + "/locator/" + i.ToString());
-                locators_.Add(locator);
-                success = (locator.Start() == 0);
-            }
-            return success;
-        }
-
-        private bool StartServers()
-        {
-            var success = true;
-
-            for (var i = 0; i < serverCount_; i++)
-            {
-                var server = new Server(this, locators_,
-                    name_ + "/server/" + i.ToString());
-                var localResult = server.Start();
-                if (localResult != 0)
-                {
-                    success = false;
-                }
-            }
-            return success;
-        }
-
-        private void RemoveClusterDirectory()
-        {
-            if (Directory.Exists(name_))
-            {
-                Directory.Delete(name_, true);
-            }
-        }
-
-        public bool Start()
-        {
-            if (!started_)
-            {
-                RemoveClusterDirectory();
-                var locatorSuccess = StartLocators();
-                var serverSuccess = StartServers();
-                started_ = (locatorSuccess && serverSuccess);
-            }
-            return (started_);
-        }
-
-        public void Dispose()
-        {
-            if (started_)
-            {
-                this.Gfsh
-                    .shutdown()
-                    .withIncludeLocators(true)
-                    .execute();
-            }
-        }
-
-        public IGeodeCache CreateCache(IDictionary<string, string> properties)
-        {
-            var cacheFactory = new CacheFactory();
-
-            cacheFactory
-                .SetProperty("log-level", "none")
-                .SetProperty("statistic-sampling-enabled", "false");
-
-            foreach (var pair in properties)
-            {
-                cacheFactory.SetProperty(pair.Key, pair.Value);
-            }
-
-            var cache = cacheFactory.CreateCache();
-
-            ApplyLocators(cache.PoolFactory).CreatePool("default");
-
-            return cache;
-        }
-
-        public IGeodeCache CreateCache()
-        {
-            return CreateCache(new Dictionary<string, string>());
-        }
-
-    }
-
-    public struct Address
-    {
-        public string address;
-        public int port;
-    }
-
-    public class Locator
-    {
-        private Cluster cluster_;
-        private string name_;
-        private List<Locator> locators_;
-        private bool started_;
-
-        public Locator(Cluster cluster, List<Locator> locators, string name)
-        {
-            cluster_ = cluster;
-            locators_ = locators;
-            name_ = name;
-            var address = new Address();
-            address.address = "localhost";
-            address.port = Framework.FreeTcpPort();
-            Address = address;
-        }
-
-        public Address Address { get; private set; }
-
-        public int Start()
-        {
-            var result = -1;
-            if (!started_)
-            {
-                var locator = cluster_.Gfsh
-                    .start()
-                    .locator()
-                    .withDir(name_)
-                    .withName(name_.Replace('/', '_'))
-                    .withBindAddress(Address.address)
-                    .withPort(Address.port)
-                    .withMaxHeap("256m")
-                    .withJmxManagerPort(cluster_.jmxManagerPort)
-                    .withJmxManagerStart(true)
-                    .withHttpServicePort(0);
-                if (cluster_.UseSSL)
-                {
-                   locator
-                        .withConnect(false)
-                        .withSslEnableComponents("all")
-                        .withSslKeyStore(cluster_.keyStore_)
-                        .withSslKeyStorePassword(cluster_.keyStorePassword_)
-                        .withSslTrustStore(cluster_.trustStore_)
-                        .withSslTrustStorePassword(cluster_.trustStorePassword_);
-                }
-                result = locator.execute();
-
-                if (cluster_.UseSSL)
-                {
-                    cluster_.Gfsh.connect()
-                        .withJmxManager(Address.address, cluster_.jmxManagerPort)
-                        .withUseSsl(true)
-                        .withKeyStore(cluster_.keyStore_)
-                        .withKeyStorePassword(cluster_.keyStorePassword_)
-                        .withTrustStore(cluster_.trustStore_)
-                        .withTrustStorePassword(cluster_.trustStorePassword_)
-                        .execute();
-                }
-
-                started_ = true;
-
-            }
-            return result;
-        }
-
-        public int Stop()
-        {
-            var result = cluster_.Gfsh
-                .stop()
-                .locator()
-                .withDir(name_)
-                .execute();
-            started_ = false;
-            return result;
-        }
-    }
-
-    public class Server
-    {
-        private Cluster cluster_;
-        private string name_;
-        private List<Locator> locators_;
-        private bool started_;
-
-        public Server(Cluster cluster, List<Locator> locators, string name)
-        {
-            cluster_ = cluster;
-            locators_ = locators;
-            name_ = name;
-            var address = new Address();
-            address.address = "localhost";
-            address.port = 0;
-            Address = address;
-        }
-
-        public Address Address { get; private set; }
-
-        public int Start()
-        {
-            var result = -1;
-            if (!started_)
-            {
-                var server = cluster_.Gfsh
-                    .start()
-                    .server()
-                    .withDir(name_)
-                    .withName(name_.Replace('/', '_'))
-                    .withBindAddress(Address.address)
-                    .withPort(Address.port)
-                    .withMaxHeap("1g");
-                if (cluster_.UseSSL)
-                {
-                    server
-                        .withSslEnableComponents("all")
-                        .withSslKeyStore(cluster_.keyStore_)
-                        .withSslKeyStorePassword(cluster_.keyStorePassword_)
-                        .withSslTrustStore(cluster_.trustStore_)
-                        .withSslTrustStorePassword(cluster_.trustStorePassword_);
-
-                }
-                result = server.execute();
-                started_ = true;
-            }
-            return result;
-        }
-
-        public int Stop()
-        {
-            var result = cluster_.Gfsh
-                .stop()
-                .server()
-                .withDir(name_)
-                .execute();
-            started_ = false;
-            return result;
-        }
-    }
-}
diff --git a/netcore/shared/Config.cs.in b/netcore/shared/Config.cs.in
deleted file mode 100644
index 4111ec2..0000000
--- a/netcore/shared/Config.cs.in
+++ /dev/null
@@ -1,46 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-// GENERATED FROM Config.cs.in DO NOT EDIT Config.cs
-
-public class Config
-{
-  public static string GeodeGfsh
-  {
-    get { return @"@Geode_gfsh_EXECUTABLE@"; }
-  }
-
-  public static string JavaobjectJarPath
-  {
-    get { return @"@JAVAOBJECT_JAR_PATH@"; }
-  }
-
-  public static string SslServerKeyPath
-  {
-	get { return @"@CMAKE_CURRENT_SOURCE_DIR@/../../ssl_keys/server_keys"; }
-  }
-
-  public static string SslClientKeyPath
-  {
-	get { return @"@CMAKE_CURRENT_SOURCE_DIR@/../../ssl_keys/client_keys"; }
-  }
-
-  public static string SniConfigPath
-  {
-	get { return @"@CMAKE_CURRENT_SOURCE_DIR@/../../sni-test-config"; }
-  }
-}
diff --git a/netcore/shared/Framework.cs b/netcore/shared/Framework.cs
deleted file mode 100644
index d005c07..0000000
--- a/netcore/shared/Framework.cs
+++ /dev/null
@@ -1,34 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-using System.Net;
-using System.Net.Sockets;
-
-namespace Apache.Geode.Client.IntegrationTests
-{
-    public abstract class Framework
-    {
-        public static int FreeTcpPort()
-        {
-            var tcpListner = new TcpListener(IPAddress.Loopback, 0);
-            tcpListner.Start();
-            var port = ((IPEndPoint)tcpListner.LocalEndpoint).Port;
-            tcpListner.Stop();
-            return port;
-        }
-    }
-}
\ No newline at end of file
diff --git a/netcore/shared/Gfsh.cs b/netcore/shared/Gfsh.cs
deleted file mode 100644
index 14ba81b..0000000
--- a/netcore/shared/Gfsh.cs
+++ /dev/null
@@ -1,493 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-using System.Net;
-using System.Net.Sockets;
-
-namespace Apache.Geode.Client.IntegrationTests
-{
-    public abstract class Gfsh 
-    {
-
-        //TODO: Understand what C++ Command class is doing.  Why is it a template,
-        //when the only <T> class we're passing is void?  How can you call a ctor
-        //or a (non-existent?) 'parse' function on void?  So many questions...
-        public class Command
-        {
-            public Command(Gfsh gfsh, string command)
-            {
-                gfsh_ = gfsh;
-                command_ = command;
-            }
-
-            public int execute()
-            {
-                return gfsh_.execute(command_);
-            }
-
-            public override string ToString()
-            {
-                return command_;
-            }
-
-            protected Gfsh gfsh_;
-            protected string command_;
-        }
-
-        public class Start
-        {
-            public Start(Gfsh gfsh)
-            {
-                gfsh_ = gfsh;
-            }
-
-            public class Server : Command
-            {
-                public Server(Gfsh gfsh) : base(gfsh, "start server")
-                {
-                    gfsh_ = gfsh;
-                }
-
-                public Server withName(string name)
-                {
-                    command_ += " --name=" + name;
-                    return this;
-                }
-
-                public Server withDir(string dir)
-                {
-                    command_ += " --dir=" + dir;
-                    return this;
-                }
-
-                public Server withBindAddress(string bindAddress)
-                {
-                    command_ += " --bind-address=" + bindAddress;
-                    return this;
-                }
-
-                public Server withPort(int port)
-                {
-                    command_ += " --server-port=" + port.ToString();
-                    return this;
-                }
-
-                public Server withLocators(string locators)
-                {
-                    command_ += " --locators=" + locators;
-                    return this;
-                }
-
-                public Server withLogLevel(string logLevel)
-                {
-                    command_ += " --log-level=" + logLevel;
-                    return this;
-                }
-
-                public Server withMaxHeap(string maxHeap)
-                {
-                    command_ += " --max-heap=" + maxHeap;
-                    return this;
-                }
-
-               public Server withSslKeyStore(string keyStore)
-                {
-                    command_ += " --J=-Dgemfire.ssl-keystore=" + keyStore;
-                    return this;
-                }
-
-                public Server withSslKeyStorePassword(string keyStorePassword)
-                {
-                    command_ += " --J=-Dgemfire.ssl-keystore-password=" + keyStorePassword;
-                    return this;
-                }
-
-                public Server withSslTrustStore(string trustStore)
-                {
-                    command_ += " --J=-Dgemfire.ssl-truststore=" + trustStore;
-                    return this;
-                }
-
-                public Server withSslTrustStorePassword(string trustStorePassword)
-                {
-                    command_ += " --J=-Dgemfire.ssl-truststore-password=" + trustStorePassword;
-                    return this;
-                }
-
-                public Server withSslEnableComponents(string components)
-                {
-                    command_ += " --J=-Dgemfire.ssl-enabled-components=" + components;
-                    return this;
-                }
-            }
-
-            public Server server()
-            {
-                return new Server(gfsh_);
-            }
-
-            public class Locator : Command
-            {
-                public Locator(Gfsh gfsh) : base(gfsh, "start locator")
-                {
-                }
-
-                public Locator withName(string name)
-                {
-                    command_ += " --name=" + name;
-                    return this;
-                }
-
-                public Locator withDir(string dir)
-                {
-                    command_ += " --dir=" + dir;
-                    return this;
-                }
-
-                public Locator withBindAddress(string bindAddress)
-                {
-                    command_ += " --bind-address=" + bindAddress;
-                    return this;
-                }
-
-                public Locator withPort(int port)
-                {
-                    command_ += " --port=" + port;
-                    return this;
-                }
-
-                public Locator withJmxManagerPort(int jmxManagerPort)
-                {
-                    command_ += " --J=-Dgemfire.jmx-manager-port=" + jmxManagerPort;
-                    return this;
-                }
-
-                public Locator withJmxManagerStart(bool start)
-                {
-                    command_ += " --J=-Dgemfire.jmx-manager-start=" + (start ? "true" : "false");
-                    return this;
-                }
-                
-                public Locator withHttpServicePort(int httpServicePort)
-                {
-                    command_ += " --http-service-port=" + httpServicePort;
-                    return this;
-                }
-
-                public Locator withLogLevel(string logLevel)
-                {
-                    command_ += " --log-level=" + logLevel;
-                    return this;
-                }
-
-                public Locator withMaxHeap(string maxHeap)
-                {
-                    command_ += " --max-heap=" + maxHeap;
-                    return this;
-                }
-
-                public Locator withConnect(bool connect)
-                {
-                    command_ += " --connect=";
-                    command_ += connect ? "true" : "false";
-                    return this;
-                }
-
-                public Locator withSslKeyStore(string keyStore)
-                {
-                    command_ += " --J=-Dgemfire.ssl-keystore=" + keyStore;
-                    return this;
-                }
-
-                public Locator withSslKeyStorePassword(string keyStorePassword)
-                {
-                    command_ += " --J=-Dgemfire.ssl-keystore-password=" + keyStorePassword;
-                    return this;
-                }
-
-                public Locator withSslTrustStore(string trustStore)
-                {
-                    command_ += " --J=-Dgemfire.ssl-truststore=" + trustStore;
-                    return this;
-                }
-
-                public Locator withSslTrustStorePassword(string trustStorePassword)
-                {
-                    command_ += " --J=-Dgemfire.ssl-truststore-password=" + trustStorePassword;
-                    return this;
-                }
-
-                public Locator withSslEnableComponents(string components)
-                {
-                    command_ += " --J=-Dgemfire.ssl-enabled-components=" + components;
-                    return this;
-                }
-            }
-
-            public Locator locator()
-            {
-                return new Locator(gfsh_);
-            }
-
-            private Gfsh gfsh_;
-        }
-
-        public Start start()
-        {
-            return new Start(this);
-        }
-
-        public class Stop
-        {
-            public Stop(Gfsh gfsh)
-            {
-                gfsh_ = gfsh;
-            }
-
-            public class Locator : Command
-            {
-                public Locator(Gfsh gfsh) : base(gfsh, "stop locator")
-                {
-                }
-
-                public Locator withName(string name)
-                {
-                    command_ += " --name=" + name;
-                    return this;
-                }
-
-                public Locator withDir(string dir)
-                {
-                    command_ += " --dir=" + dir;
-                    return this;
-                }
-            }
-
-            public Locator locator()
-            {
-                return new Locator(gfsh_);
-            }
-
-            public class Server : Command
-            {
-                public Server(Gfsh gfsh) : base(gfsh, "stop server")
-                {
-                }
-
-                public Server withName(string name)
-                {
-                    command_ += " --name=" + name;
-                    return this;
-                }
-
-                public Server withDir(string dir)
-                {
-                    command_ += " --dir=" + dir;
-                    return this;
-                }
-            }
-            public Server server()
-            {
-                return new Server(gfsh_);
-            }
-
-            private Gfsh gfsh_;
-        }
-
-        public Stop stop()
-        {
-            return new Stop(this);
-        }
-
-        public class Create
-        {
-            public Create(Gfsh gfsh)
-            {
-                gfsh_ = gfsh;
-            }
-
-            public class Region : Command
-            {
-                public Region(Gfsh gfsh) : base(gfsh, "create region") { }
-
-                public Region withName(string name)
-                {
-                    command_ += " --name=" + name;
-                    return this;
-                }
-
-                public Region withType(string type)
-                {
-                    command_ += " --type=" + type;
-                    return this;
-                }
-            }
-
-            public Region region()
-            {
-                return new Region(gfsh_);
-            }
-
-            private Gfsh gfsh_;
-        }
-        public Create create()
-        {
-            return new Create(this);
-        }
-
-        public class Shutdown : Command
-        {
-            public Shutdown(Gfsh gfsh) : base(gfsh, "shutdown") { }
-
-            public Shutdown withIncludeLocators(bool includeLocators)
-            {
-                command_ += " --include-locators=";
-                command_ += includeLocators ? "true" : "false";
-                return this;
-            }
-        }
-
-        public Shutdown shutdown()
-        {
-            return new Shutdown(this);
-        }
-
-        public class Connect : Command
-        {
-            public Connect(Gfsh gfsh) : base(gfsh, "connect") { }
-
-            public Connect withJmxManager(string jmxManagerAddress, int jmxManagerPort)
-            {
-                command_ += " --jmx-manager=" + jmxManagerAddress + "[" + jmxManagerPort.ToString() + "]";
-                return this;
-            }
-
-            public Connect withUseSsl(bool enable)
-            {
-                command_ += " --use-ssl=" + (enable ? "true" : "false");
-                return this;
-            }
-
-            public Connect withKeyStore(string keyStore)
-            {
-                command_ += " --key-store=" + keyStore;
-                return this;
-            }
-
-            public Connect withKeyStorePassword(string keyStorePassword)
-            {
-                command_ += " --key-store-password=" + keyStorePassword;
-                return this;
-            }
-
-            public Connect withTrustStore(string trustStore)
-            {
-                command_ += " --trust-store=" + trustStore;
-                return this;
-            }
-
-            public Connect withTrustStorePassword(string trustStorePassword)
-            {
-                command_ += " --trust-store-password=" + trustStorePassword;
-                return this;
-            }
-        }
-
-        public Connect connect()
-        {
-            return new Connect(this);
-        }
-
-        public class ConfigurePdx : Command
-        {
-            public ConfigurePdx(Gfsh gfsh) : base(gfsh, "configure pdx") { }
-
-            public ConfigurePdx withReadSerialized(bool readSerialized)
-            {
-                command_ += " --read-serialized=";
-                command_ += readSerialized ? "true" : "false";
-                return this;
-            }
-        }
-
-        public ConfigurePdx configurePdx()
-        {
-            return new ConfigurePdx(this);
-        }
-
-        public class Deploy : Command
-        {
-            public Deploy(Gfsh gfsh) : base(gfsh, "deploy") { }
-
-            public Deploy withJar(string fullPathToJar)
-            {
-                command_ += " --jar=" + fullPathToJar;
-                return this;
-            }
-
-            public Deploy withDir(string fullPathToDir)
-            {
-                command_ += " --dir=" + fullPathToDir;
-                return this;
-            }
-
-            public Deploy withGroup(string groupName)
-            {
-                command_ += " --group=" + groupName;
-                return this;
-            }
-        }
-
-        public Deploy deploy()
-        {
-            return new Deploy(this);
-        }
-
-        public class ExecuteFunction : Command
-        {
-            public ExecuteFunction(Gfsh gfsh) : base(gfsh, "execute function") { }
-
-            public ExecuteFunction withId(string functionId)
-            {
-                command_ += " --id=" + functionId;
-                return this;
-            }
-
-            public ExecuteFunction withMember(string memberName)
-            {
-                command_ += " --member=" + memberName;
-                return this;
-            }
-        }
-
-        public ExecuteFunction executeFunction()
-        {
-            return new ExecuteFunction(this);
-        }
-
-        private static int FreeTcpPort()
-        {
-            var tcpListner = new TcpListener(IPAddress.Loopback, 0);
-            tcpListner.Start();
-            var port = ((IPEndPoint)tcpListner.LocalEndpoint).Port;
-            tcpListner.Stop();
-            return port;
-        }
-
-        public abstract int execute(string cmd);
-    }
-}
diff --git a/netcore/shared/GfshExecute.cs b/netcore/shared/GfshExecute.cs
deleted file mode 100644
index 99603d0..0000000
--- a/netcore/shared/GfshExecute.cs
+++ /dev/null
@@ -1,208 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-using System;
-using System.Diagnostics;
-using System.Text.RegularExpressions;
-using System.Collections.Generic;
-using Xunit.Abstractions;
-
-namespace Apache.Geode.Client.IntegrationTests
-{
-    public class GfshExecute : Gfsh
-    {
-        private String connectionCommand_ = null;
-        private ITestOutputHelper output;
-
-        public ITestOutputHelper Output
-        {
-          get { return output; }
-          set { output = value; }
-        }
-
-
-        public GfshExecute(ITestOutputHelper output)
-        {
-            this.output = output;
-        }
-
-        private void ExtractConnectionCommand(String command)
-        {
-            if (command.StartsWith("connect"))
-            {
-                connectionCommand_ = command;
-            }
-            else if (command.StartsWith("start locator"))
-            {
-                if (command.Contains("--connect=false"))
-                {
-                    return;
-                }
-
-                var jmxManagerHost = "localhost";
-                var jmxManagerPort = "1099";
-
-                var jmxManagerHostRegex = new Regex(@"\bbind-address=([^\s])\b");
-                var jmxManagerHostMatch = jmxManagerHostRegex.Match(command);
-
-                if (jmxManagerHostMatch.Success)
-                {
-                    jmxManagerHost = jmxManagerHostMatch.Groups[1].Value;
-                }
-
-                var jmxManagerPortRegex = new Regex(@"\bjmx-manager-port=(\d+)\b");
-                var jmxManagerPortMatch = jmxManagerPortRegex.Match(command);
-                if (jmxManagerPortMatch.Success)
-                {
-                    jmxManagerPort = jmxManagerPortMatch.Groups[1].Value;
-                }
-
-                connectionCommand_ = new Connect(this).withJmxManager(jmxManagerHost, int.Parse(jmxManagerPort)).ToString();
-            }
-
-        }
-
-        public override int execute(string cmd)
-        {
-
-            var commands = new List<string>();
-
-            if (null != connectionCommand_)
-            {
-                commands.Add("-e");
-                commands.Add(connectionCommand_);
-            }
-
-            commands.Add("-e");
-            commands.Add(cmd);
-
-            // TODO escape commands
-            var fullCmd = "\"" + string.Join("\" \"", commands) + "\"";
-
-            using var gfsh = new Process
-            {
-                StartInfo =
-                {
-                    FileName = Config.GeodeGfsh,
-                    Arguments = fullCmd,
-                    WindowStyle = ProcessWindowStyle.Hidden,
-                    UseShellExecute = false,
-                    RedirectStandardOutput = true,
-                    RedirectStandardError = true,
-                    CreateNoWindow = false
-                }
-            };
-
-            gfsh.OutputDataReceived += (sender, args) =>
-            {
-                if (args.Data != null)
-                {
-                    WriteLine("GfshExecute: " + args.Data);
-                }
-            };
-
-            gfsh.ErrorDataReceived += (sender, args) =>
-            {
-                if (args.Data != null)
-                {
-                    WriteLine("GfshExecute: ERROR: " + args.Data);
-                }
-            };
-
-            gfsh.Start();
-            gfsh.BeginOutputReadLine();
-            gfsh.BeginErrorReadLine();
-            if (gfsh.WaitForExit(60000))
-            {
-                WriteLine("GeodeServer Start: gfsh.HasExited = {0}, gfsh.ExitCode = {1}",
-                    gfsh.HasExited,
-                    gfsh.ExitCode);
-            }
-            else
-            {
-                WriteLine("GeodeServer Start: gfsh failed to exit, force killing.");
-                KillAndIgnore(gfsh);
-            }
-            CancelErrorReadAndIgnore(gfsh);
-            CancelOutputReadAndIgnore(gfsh);
-
-            ExtractConnectionCommand(cmd);
-
-            return gfsh.ExitCode;
-        }
-
-        private static void CancelOutputReadAndIgnore(Process gfsh)
-        {
-            try
-            {
-                gfsh.CancelOutputRead();
-            }
-            catch
-            {
-                // ignored
-            }
-        }
-
-        private static void CancelErrorReadAndIgnore(Process gfsh)
-        {
-            try
-            {
-                gfsh.CancelErrorRead();
-            }
-            catch
-            {
-                // ignored
-            }
-        }
-
-        private static void KillAndIgnore(Process gfsh)
-        {
-            try
-            {
-                gfsh.Kill();
-            }
-            catch
-            {
-                // ignored
-            }
-        }
-
-        private void WriteLine(string format, params object[] args)
-        {
-            if (null == output)
-            {
-                Debug.WriteLine(format, args);
-            }
-            else
-            {
-                output.WriteLine(format, args);
-            }
-        }
-
-        private void WriteLine(string message)
-        {
-            if (null == output)
-            {
-                Debug.WriteLine(message);
-            }
-            else
-            {
-                output.WriteLine(message);
-            }
-        }
-    }
-}
diff --git a/netcore/shared/TestBase.cs b/netcore/shared/TestBase.cs
deleted file mode 100644
index 20c8875..0000000
--- a/netcore/shared/TestBase.cs
+++ /dev/null
@@ -1,55 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-using System.IO;
-using System.Reflection;
-using Xunit;
-using Xunit.Abstractions;
-using Xunit.Sdk;
-
-namespace Apache.Geode.Client.IntegrationTests {
-    [Trait("Category", "Integration")]
-    public class TestBase
-    {
-        protected ITest currentTest;
-        protected ITestOutputHelper output;
-
-        public TestBase(ITestOutputHelper testOutputHelper)
-        {
-            var helper = (TestOutputHelper)testOutputHelper;
-
-            ITest test = (ITest)helper.GetType().GetField("test", BindingFlags.NonPublic | BindingFlags.Instance)
-                                      .GetValue(helper);
-
-            currentTest = test;
-            output = testOutputHelper;
-        }
-
-        public void CleanTestCaseDirectory(string directory)
-        {
-            if (Directory.Exists(directory))
-            {
-                Directory.Delete(directory, true);
-            }
-        }
-
-        public string CreateTestCaseDirectoryName()
-        {
-            return currentTest.TestCase.TestMethod.Method.Name;
-        }
-    }
-}
diff --git a/netcore/utility/CMakeLists.txt b/netcore/utility/CMakeLists.txt
deleted file mode 100644
index cf224d1..0000000
--- a/netcore/utility/CMakeLists.txt
+++ /dev/null
@@ -1,34 +0,0 @@
-# Licensed to the Apache Software Foundation (ASF) under one or more
-# contributor license agreements.  See the NOTICE file distributed with
-# this work for additional information regarding copyright ownership.
-# The ASF licenses this file to You under the Apache License, Version 2.0
-# (the "License"); you may not use this file except in compliance with
-# the License.  You may obtain a copy of the License at
-# 
-#      http://www.apache.org/licenses/LICENSE-2.0
-# 
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-cmake_minimum_required (VERSION 3.10)
-project (netcore-utility)
-
-set (CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/../../cmake)
-
-find_package(Geode REQUIRED)
-find_package(Java REQUIRED)
-
-include(UseJava)
-
-file(GLOB_RECURSE SOURCES "*.java")
-
-add_jar(netcore-utility ${SOURCES}
-  INCLUDE_JARS ${Geode_CLASSPATH}
-)
-
-file(GLOB SSL_CERTIFICATES 
-  "${CMAKE_CURRENT_SOURCE_DIR}/*Keys"
-)
-	
diff --git a/netcore/utility/SimpleSecurityManager.java b/netcore/utility/SimpleSecurityManager.java
deleted file mode 100644
index 7dc8bd7..0000000
--- a/netcore/utility/SimpleSecurityManager.java
+++ /dev/null
@@ -1,79 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- * 
- *      http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package javaobject;
-
-import org.apache.geode.security.AuthenticationFailedException;
-import org.apache.geode.security.SecurityManager;
-
-import java.util.Properties;
-
-import javaobject.UserPasswordAuthInit;
-import javaobject.UsernamePrincipal;
-
-/**
- * This Security manager only Authenticates - and allows any operations.
- */
-public class SimpleSecurityManager implements SecurityManager {
-
-
-    /**
-     * Verify the credentials provided in the properties
-     * <p>
-     * Your security manager needs to validate credentials coming from all communication channels.
-     * If you use AuthInitialize to generate your client/peer credentials, then the input of this
-     * method is the output of your AuthInitialize.getCredentials method. But remember that this
-     * method will also need to validate credentials coming from gfsh/jmx/rest client, the framework
-     * is putting the username/password under security-username and security-password keys in the
-     * property, so your securityManager implementation needs to validate these kind of properties
-     * as well.
-     *
-     * @param credentials it contains the security-username and security-password as keys of the
-     *                    properties, also the properties generated by your AuthInitialize interface
-     * @return a serializable principal object
-     */
-    @Override
-    public Object authenticate(Properties props) throws AuthenticationFailedException {
-        String userName = props.getProperty(UserPasswordAuthInit.USER_NAME);
-        if (userName == null) {
-            throw new AuthenticationFailedException(
-                    "SimpleSecurityManager: user name property ["
-                            + UserPasswordAuthInit.USER_NAME + "] not provided");
-        }
-        String password = props.getProperty(UserPasswordAuthInit.PASSWORD);
-        if (password == null) {
-            throw new AuthenticationFailedException(
-                    "SimpleSecurityManager: password property ["
-                            + UserPasswordAuthInit.PASSWORD + "] not provided");
-        }
-
-        if (userName.equals(password) && testValidName(userName)) {
-            return new UsernamePrincipal(userName);
-        } else {
-            throw new AuthenticationFailedException(
-                    "SimpleSecurityManager: Invalid user name [" + userName
-                            + "], password supplied.");
-        }
-    }
-
-    private boolean testValidName(String userName) {
-
-        return (userName.startsWith("server") || userName.startsWith("user")
-                || userName.startsWith("reader") || userName.startsWith("writer")
-                || userName.equals("admin")  || userName.equals("root")
-                || userName.equals("administrator"));
-    }
-}
diff --git a/netcore/utility/UserPasswordAuthInit.java b/netcore/utility/UserPasswordAuthInit.java
deleted file mode 100644
index d40ba67..0000000
--- a/netcore/utility/UserPasswordAuthInit.java
+++ /dev/null
@@ -1,81 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- * 
- *      http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package javaobject;
-
-import java.util.Properties;
-
-import org.apache.geode.LogWriter;
-import org.apache.geode.distributed.DistributedMember;
-import org.apache.geode.security.AuthInitialize;
-import org.apache.geode.security.AuthenticationFailedException;
-
-/**
- * An {@link AuthInitialize} implementation that obtains the user name and
- * password as the credentials from the given set of properties.
- * 
- * To use this class the <c>security-client-auth-init</c> property should be
- * set to the fully qualified name the static <code>create</code> function
- * viz. <code>templates.security.UserPasswordAuthInit.create</code>
- *
- */
-public class UserPasswordAuthInit implements AuthInitialize {
-
-  public static final String USER_NAME = "security-username";
-
-  public static final String PASSWORD = "security-password";
-
-  protected LogWriter securitylog;
-
-  protected LogWriter systemlog;
-
-  public static AuthInitialize create() {
-    return new UserPasswordAuthInit();
-  }
-
-  public void init(LogWriter systemLogger, LogWriter securityLogger)
-      throws AuthenticationFailedException {
-    this.systemlog = systemLogger;
-    this.securitylog = securityLogger;
-  }
-
-  public UserPasswordAuthInit() {
-  }
-
-  public Properties getCredentials(Properties props, DistributedMember server,
-      boolean isPeer) throws AuthenticationFailedException {
-
-    Properties newProps = new Properties();
-    String userName = props.getProperty(USER_NAME);
-    if (userName == null) {
-      throw new AuthenticationFailedException(
-          "UserPasswordAuthInit: user name property [" + USER_NAME
-              + "] not set.");
-    }
-    newProps.setProperty(USER_NAME, userName);
-    String passwd = props.getProperty(PASSWORD);
-    // If password is not provided then use empty string as the password.
-    if (passwd == null) {
-      passwd = "";
-    }
-    newProps.setProperty(PASSWORD, passwd);
-    return newProps;
-  }
-
-  public void close() {
-  }
-
-}
diff --git a/netcore/utility/UsernamePrincipal.java b/netcore/utility/UsernamePrincipal.java
deleted file mode 100644
index faeb770..0000000
--- a/netcore/utility/UsernamePrincipal.java
+++ /dev/null
@@ -1,43 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- * 
- *      http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package javaobject;
-
-import java.io.Serializable;
-import java.security.Principal;
-
-/**
- * An implementation of {@link Principal} class for a simple user name.
- * 
- */
-public class UsernamePrincipal implements Principal, Serializable {
-
-  private final String userName;
-
-  public UsernamePrincipal(String userName) {
-    this.userName = userName;
-  }
-
-  public String getName() {
-    return this.userName;
-  }
-
-  @Override
-  public String toString() {
-    return this.userName;
-  }
-
-}
diff --git a/packer/build-rhel-7.json b/packer/build-rhel-7.json
index 67465d2..186740c 100644
--- a/packer/build-rhel-7.json
+++ b/packer/build-rhel-7.json
@@ -122,8 +122,7 @@
         "rhel/disable-selinux.sh",
         "rhel/7/install-devtoolset.sh",
         "rhel/install-jdk-11.sh",
-        "linux/install-cmake.sh",
-        "linux/install-dotnet.sh"
+        "linux/install-cmake.sh"
       ]
     },
     {
diff --git a/packer/build-rhel-8.json b/packer/build-rhel-8.json
index c2acb6f..7874ce7 100644
--- a/packer/build-rhel-8.json
+++ b/packer/build-rhel-8.json
@@ -121,8 +121,7 @@
       "scripts": [
         "rhel/disable-selinux.sh",
         "rhel/install-jdk-11.sh",
-        "linux/install-cmake.sh",
-        "linux/install-dotnet.sh"
+        "linux/install-cmake.sh"
       ]
     },
     {
diff --git a/packer/build-ubuntu-16-04.json b/packer/build-ubuntu-16-04.json
index a5a45ca..3121907 100644
--- a/packer/build-ubuntu-16-04.json
+++ b/packer/build-ubuntu-16-04.json
@@ -101,8 +101,7 @@
       "scripts": [
         "linux/install-cmake.sh",
         "ubuntu/install-clang-format.sh",
-        "ubuntu/install-jdk-11.sh",
-        "linux/install-dotnet.sh"
+        "ubuntu/install-jdk-11.sh"
       ]
     },
     {
diff --git a/packer/build-ubuntu-18-04.json b/packer/build-ubuntu-18-04.json
index 34ea8b5..66acfa6 100644
--- a/packer/build-ubuntu-18-04.json
+++ b/packer/build-ubuntu-18-04.json
@@ -101,8 +101,7 @@
       "scripts": [
         "linux/install-cmake.sh",
         "ubuntu/install-clang-format.sh",
-        "ubuntu/install-jdk-11.sh",
-        "linux/install-dotnet.sh"
+        "ubuntu/install-jdk-11.sh"
       ]
     },
     {
diff --git a/packer/build-ubuntu-20-04.json b/packer/build-ubuntu-20-04.json
index add5702..47de7f5 100644
--- a/packer/build-ubuntu-20-04.json
+++ b/packer/build-ubuntu-20-04.json
@@ -101,8 +101,7 @@
       "scripts": [
         "ubuntu/install-clang-format.sh",
         "linux/install-cmake.sh",
-        "ubuntu/install-jdk-11.sh",
-        "linux/install-dotnet.sh"
+        "ubuntu/install-jdk-11.sh"
       ]
     },
     {
diff --git a/packer/build-windows-2016-vs-2017.json b/packer/build-windows-2016-vs-2017.json
index 7f1a4bf..0c7bb1d 100644
--- a/packer/build-windows-2016-vs-2017.json
+++ b/packer/build-windows-2016-vs-2017.json
@@ -93,7 +93,6 @@
         "choco install openssl -confirm",
         "choco install strawberryperl -confirm",
         "choco install nuget.commandline -confirm",
-        "choco install dotnetcore-sdk -confirm"
       ]
     },
     {
diff --git a/packer/build-windows-2019-vs-2017.json b/packer/build-windows-2019-vs-2017.json
index e5fc4cb..ff108d2 100644
--- a/packer/build-windows-2019-vs-2017.json
+++ b/packer/build-windows-2019-vs-2017.json
@@ -93,7 +93,6 @@
         "choco install openssl -confirm",
         "choco install strawberryperl -confirm",
         "choco install nuget.commandline -confirm",
-        "choco install dotnetcore-sdk -confirm"
       ]
     },
     {
diff --git a/packer/build-windows-2019-vs-2019.json b/packer/build-windows-2019-vs-2019.json
index 72718b6..3d8f117 100644
--- a/packer/build-windows-2019-vs-2019.json
+++ b/packer/build-windows-2019-vs-2019.json
@@ -93,7 +93,6 @@
         "choco install openssl -confirm",
         "choco install strawberryperl -confirm",
         "choco install nuget.commandline -confirm",
-        "choco install dotnetcore-sdk -confirm"
       ]
     },
     {
