GEODE-6642: Remove CacheAttributes (#475)

* GEODE-6642: Remove CacheAttributes

CacheAttributes based Cache creation was removed but the header was
accidently left in the public header location. Removal does not effect
public API or ABI. All methods to construct or use it on the public API
had already been removed.

Removes code dependent on CacheAttributes
Cleans up ownership of heap objects
diff --git a/clicache/src/geode_defs.hpp b/clicache/src/geode_defs.hpp
index 103650a..9333c88 100644
--- a/clicache/src/geode_defs.hpp
+++ b/clicache/src/geode_defs.hpp
@@ -61,12 +61,6 @@
 /// @file AttributesMutator.hpp
 /// Declares the AttributesMutator class.
 
-/// @file CacheAttributes.hpp
-/// Declares the CacheAttributes class.
-
-/// @file CacheAttributesFactory.hpp
-/// Declares the CacheAttributesFactory class.
-
 /// @file CacheableBuiltins.hpp
 /// Declares the CacheableBuiltinKey and CacheableBuiltinArray
 /// template classes and their instantiations for CacheableBoolean,
diff --git a/cppcache/include/geode/CacheAttributes.hpp b/cppcache/include/geode/CacheAttributes.hpp
deleted file mode 100644
index 90f87aa..0000000
--- a/cppcache/include/geode/CacheAttributes.hpp
+++ /dev/null
@@ -1,106 +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 GEODE_CACHEATTRIBUTES_H_
-#define GEODE_CACHEATTRIBUTES_H_
-
-/**
- * @file
- */
-
-#include <string>
-
-#include "internal/geode_globals.hpp"
-
-namespace apache {
-namespace geode {
-namespace client {
-
-/**
- * @class CacheAttributes CacheAttributes.hpp
- * Defines attributes for configuring a cache.
- * Currently the following attributes are defined:
- * redundancyLevel: Redundancy for HA client queues.
- * endpoints: Cache level endpoints list.
- *
- * To create an instance of this interface, use {@link
- * CacheAttributesFactory::createCacheAttributes}.
- *
- * For compatibility rules and default values, see {@link
- * CacheAttributesFactory}.
- *
- * <p>Note that the <code>CacheAttributes</code> are not distributed with the
- * region.
- *
- * @see CacheAttributesFactory
- */
-class CacheAttributesFactory;
-
-class APACHE_GEODE_EXPORT CacheAttributes {
-  /**
-   * @brief public static methods
-   */
- public:
-  /**
-   * Gets redundancy level for regions in the cache.
-   */
-  int getRedundancyLevel();
-
-  /**
-   * Gets cache level endpoints list.
-   */
-  const std::string& getEndpoints();
-
-  ~CacheAttributes() = delete;
-
-  bool operator==(const CacheAttributes& other) const;
-
-  bool operator!=(const CacheAttributes& other) const;
-
- private:
-  /** Sets redundancy level.
-   *
-   */
-  void setRedundancyLevel(int redundancyLevel);
-
-  /** Sets cache level endpoints list.
-   *
-   */
-  void setEndpoints(const std::string& endpoints);
-  void setEndpoints(std::string&& endpoints);
-
-  // will be created by the factory
-
-  CacheAttributes(const CacheAttributes& rhs) = default;
-  CacheAttributes();
-
-  int m_redundancyLevel;
-  std::string m_endpoints;
-  bool m_cacheMode;
-
-  friend class CacheAttributesFactory;
-  friend class CacheImpl;
-
-  const CacheAttributes& operator=(const CacheAttributes&);
-};
-}  // namespace client
-}  // namespace geode
-}  // namespace apache
-
-#endif  // GEODE_CACHEATTRIBUTES_H_
diff --git a/cppcache/include/geode/CacheFactory.hpp b/cppcache/include/geode/CacheFactory.hpp
index 87358fe..813df0c 100644
--- a/cppcache/include/geode/CacheFactory.hpp
+++ b/cppcache/include/geode/CacheFactory.hpp
@@ -23,7 +23,6 @@
 #include <string>
 
 #include "Cache.hpp"
-#include "CacheAttributes.hpp"
 #include "PoolFactory.hpp"
 #include "internal/geode_globals.hpp"
 
@@ -144,8 +143,6 @@
   bool pdxReadSerialized;
   std::shared_ptr<AuthInitialize> authInitialize;
 
-  Cache create(const std::shared_ptr<CacheAttributes>& attrs) const;
-
   friend class CppCacheLibrary;
   friend class RegionFactory;
   friend class RegionXmlCreation;
diff --git a/cppcache/include/geode/Region.hpp b/cppcache/include/geode/Region.hpp
index f2c9519..afde4da 100644
--- a/cppcache/include/geode/Region.hpp
+++ b/cppcache/include/geode/Region.hpp
@@ -1477,7 +1477,7 @@
 
  protected:
   explicit Region(CacheImpl* cacheImpl);
-  virtual ~Region();
+  virtual ~Region() noexcept;
 
   CacheImpl* m_cacheImpl;
 };
diff --git a/cppcache/src/CacheAttributes.cpp b/cppcache/src/CacheAttributes.cpp
deleted file mode 100644
index d3136ce..0000000
--- a/cppcache/src/CacheAttributes.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.
- */
-
-#include <cstdlib>
-#include <string>
-
-#include <geode/CacheAttributes.hpp>
-
-#include "Utils.hpp"
-
-namespace apache {
-namespace geode {
-namespace client {
-
-CacheAttributes::CacheAttributes()
-    : m_redundancyLevel(0), m_endpoints(nullptr), m_cacheMode(false) {}
-
-int CacheAttributes::getRedundancyLevel() { return m_redundancyLevel; }
-
-const std::string& CacheAttributes::getEndpoints() { return m_endpoints; }
-
-/** Return true if all the attributes are equal to those of other. */
-bool CacheAttributes::operator==(const CacheAttributes& other) const {
-  if (m_redundancyLevel != other.m_redundancyLevel) return false;
-  if (m_endpoints != other.m_endpoints) return false;
-
-  return true;
-}
-
-/** Return true if any of the attributes are not equal to those of other. */
-bool CacheAttributes::operator!=(const CacheAttributes& other) const {
-  return !(*this == other);
-}
-
-}  // namespace client
-}  // namespace geode
-}  // namespace apache
diff --git a/cppcache/src/CacheFactory.cpp b/cppcache/src/CacheFactory.cpp
index 72e63dd..dd43d1e 100644
--- a/cppcache/src/CacheFactory.cpp
+++ b/cppcache/src/CacheFactory.cpp
@@ -121,38 +121,6 @@
   return cache;
 }
 
-Cache CacheFactory::create(
-    const std::shared_ptr<CacheAttributes>& attrs) const {
-  auto cache =
-      Cache(dsProp, ignorePdxUnreadFields, pdxReadSerialized, authInitialize);
-  cache.m_cacheImpl->setAttributes(attrs);
-
-  try {
-    auto&& cacheXml = cache.m_cacheImpl->getDistributedSystem()
-                          .getSystemProperties()
-                          .cacheXMLFile();
-    if (!cacheXml.empty()) {
-      cache.initializeDeclarativeCache(cacheXml);
-    } else {
-      cache.m_cacheImpl->initServices();
-    }
-  } catch (const RegionExistsException&) {
-    LOGWARN("Attempt to create existing regions declaratively");
-  } catch (const Exception&) {
-    if (!cache.isClosed()) {
-      cache.close();
-    }
-    throw;
-  } catch (...) {
-    if (!cache.isClosed()) {
-      cache.close();
-    }
-    throw UnknownException("Exception thrown in CacheFactory::create");
-  }
-
-  return cache;
-}
-
 CacheFactory& CacheFactory::set(std::string name, std::string value) {
   if (this->dsProp == nullptr) {
     this->dsProp = Properties::create();
diff --git a/cppcache/src/CacheImpl.cpp b/cppcache/src/CacheImpl.cpp
index 87e0c61..4ba2b12 100644
--- a/cppcache/src/CacheImpl.cpp
+++ b/cppcache/src/CacheImpl.cpp
@@ -66,7 +66,6 @@
       m_distributedSystem(DistributedSystem::create(DEFAULT_DS_NAME, dsProps)),
       m_clientProxyMembershipIDFactory(m_distributedSystem.getName()),
       m_cache(c),
-      m_attributes(nullptr),
       m_tcrConnectionManager(nullptr),
       m_remoteQueryServicePtr(nullptr),
       m_destroyPending(false),
@@ -116,22 +115,6 @@
 
 void CacheImpl::initServices() {
   m_tcrConnectionManager = new TcrConnectionManager(this);
-  if (!m_initDone && m_attributes != nullptr &&
-      !m_attributes->getEndpoints().empty()) {
-    if (getPoolManager().getAll().size() > 0 && getCacheMode()) {
-      LOGWARN(
-          "At least one pool has been created so ignoring cache level "
-          "redundancy setting");
-    }
-    m_tcrConnectionManager->init();
-    m_remoteQueryServicePtr = std::make_shared<RemoteQueryService>(this);
-    // StartAdminRegion
-    auto& prop = m_distributedSystem.getSystemProperties();
-    if (prop.statisticsEnabled()) {
-      m_adminRegion = AdminRegion::create(this);
-    }
-    m_initDone = true;
-  }
 }
 
 void CacheImpl::netDown() {
@@ -153,12 +136,7 @@
   RegionKind regionKind = CPP_REGION;
   std::string endpoints;
 
-  if (m_attributes != nullptr &&
-      !(endpoints = m_attributes->getEndpoints()).empty() &&
-      (m_attributes->getRedundancyLevel() > 0 ||
-       m_tcrConnectionManager->isDurable())) {
-    regionKind = THINCLIENT_HA_REGION;
-  } else if (!endpoints.empty() && regionAttributes.getEndpoints().empty()) {
+  if (!endpoints.empty() && regionAttributes.getEndpoints().empty()) {
     regionAttributes.setEndpoints(endpoints);
   }
 
@@ -173,8 +151,8 @@
     if ((pPtr != nullptr && (pPtr->getSubscriptionRedundancy() > 0 ||
                              pPtr->getSubscriptionEnabled())) ||
         m_tcrConnectionManager->isDurable()) {
-      regionKind = THINCLIENT_HA_REGION;  // As of now ThinClinetHARegion deals
-      // with Pool as well.
+      // As of now ThinClinetHARegion deals with Pool as well.
+      regionKind = THINCLIENT_HA_REGION;
     } else {
       regionKind = THINCLIENT_POOL_REGION;
     }
@@ -238,13 +216,6 @@
 
 bool CacheImpl::isClosed() const { return m_closed; }
 
-void CacheImpl::setAttributes(
-    const std::shared_ptr<CacheAttributes>& attributes) {
-  if (m_attributes == nullptr && attributes != nullptr) {
-    m_attributes = attributes;
-  }
-}
-
 DistributedSystem& CacheImpl::getDistributedSystem() {
   return m_distributedSystem;
 }
@@ -529,8 +500,6 @@
   RegionKind regionKind = getRegionKind(attrs);
   const auto& poolName = attrs.getPoolName();
   const auto& regionEndpoints = attrs.getEndpoints();
-  const std::string cacheEndpoints =
-      m_attributes ? m_attributes->getEndpoints() : "";
 
   if (!poolName.empty()) {
     auto pool = getPoolManager().find(poolName);
@@ -548,8 +517,7 @@
     }
   }
 
-  if (!poolName.empty() &&
-      (!regionEndpoints.empty() || !cacheEndpoints.empty())) {
+  if (!poolName.empty() && !regionEndpoints.empty()) {
     LOGERROR(
         "Cache or region endpoints cannot be specified when pool name is "
         "specified for region %s",
diff --git a/cppcache/src/CacheImpl.hpp b/cppcache/src/CacheImpl.hpp
index 3ab93ad..f9ca86f 100644
--- a/cppcache/src/CacheImpl.hpp
+++ b/cppcache/src/CacheImpl.hpp
@@ -27,7 +27,6 @@
 #include <ace/RW_Thread_Mutex.h>
 
 #include <geode/Cache.hpp>
-#include <geode/CacheAttributes.hpp>
 #include <geode/PoolManager.hpp>
 #include <geode/TypeRegistry.hpp>
 #include <geode/internal/geode_globals.hpp>
@@ -131,14 +130,6 @@
    */
   bool isClosed() const;
 
-  /** Get the <code>CacheAttributes</code> for this cache. */
-  inline std::shared_ptr<CacheAttributes> getAttributes() const {
-    return m_attributes;
-  }
-
-  /** Set the <code>CacheAttributes</code> for this cache. */
-  void setAttributes(const std::shared_ptr<CacheAttributes>& attributes);
-
   /**
    * Returns the distributed system that this cache was
    * {@link CacheFactory::create created} with.
@@ -264,10 +255,6 @@
   // Pool helpers for unit tests
   int getPoolSize(const char* poolName);
 
-  bool getCacheMode() {
-    return m_attributes == nullptr ? false : m_attributes->m_cacheMode;
-  }
-
   bool getPdxIgnoreUnreadFields() {
     this->throwIfClosed();
 
@@ -384,7 +371,6 @@
                    std::recursive_mutex>
       m_regions;
   Cache* m_cache;
-  std::shared_ptr<CacheAttributes> m_attributes;
   std::unique_ptr<EvictionController> m_evictionController;
   TcrConnectionManager* m_tcrConnectionManager;
   std::shared_ptr<RemoteQueryService> m_remoteQueryServicePtr;
diff --git a/cppcache/src/CacheXmlParser.hpp b/cppcache/src/CacheXmlParser.hpp
index ed1c83e..09d349b 100644
--- a/cppcache/src/CacheXmlParser.hpp
+++ b/cppcache/src/CacheXmlParser.hpp
@@ -26,7 +26,6 @@
 #include <stack>
 
 #include <geode/Cache.hpp>
-#include <geode/CacheAttributes.hpp>
 #include <geode/CacheListener.hpp>
 #include <geode/CacheLoader.hpp>
 #include <geode/ExceptionTypes.hpp>
diff --git a/cppcache/src/LocalRegion.cpp b/cppcache/src/LocalRegion.cpp
index f3b28dd..79e469d 100644
--- a/cppcache/src/LocalRegion.cpp
+++ b/cppcache/src/LocalRegion.cpp
@@ -726,7 +726,7 @@
   expProps.setExpiryTaskId(id);
 }
 
-LocalRegion::~LocalRegion() {
+LocalRegion::~LocalRegion() noexcept {
   TryWriteGuard guard(m_rwLock, m_destroyPending);
   if (!m_destroyPending) {
     release(false);
diff --git a/cppcache/src/LocalRegion.hpp b/cppcache/src/LocalRegion.hpp
index 698f544..c1806b7 100644
--- a/cppcache/src/LocalRegion.hpp
+++ b/cppcache/src/LocalRegion.hpp
@@ -124,7 +124,11 @@
               RegionAttributes attributes,
               const std::shared_ptr<CacheStatistics>& stats,
               bool enableTimeStatistics = true);
-  virtual ~LocalRegion() override;
+
+  LocalRegion(const LocalRegion&) = delete;
+  LocalRegion& operator=(const LocalRegion&) = delete;
+
+  ~LocalRegion() noexcept override;
 
   const std::string& getName() const override;
   const std::string& getFullPath() const override;
@@ -139,10 +143,10 @@
   }
   void updateAccessAndModifiedTime(bool modified) override;
   std::shared_ptr<CacheStatistics> getStatistics() const override;
-  virtual void clear(const std::shared_ptr<Serializable>& aCallbackArgument =
-                         nullptr) override;
-  virtual void localClear(const std::shared_ptr<Serializable>&
-                              aCallbackArgument = nullptr) override;
+  void clear(const std::shared_ptr<Serializable>& aCallbackArgument =
+                 nullptr) override;
+  void localClear(const std::shared_ptr<Serializable>& aCallbackArgument =
+                      nullptr) override;
   GfErrType localClearNoThrow(
       const std::shared_ptr<Serializable>& aCallbackArgument = nullptr,
       const CacheEventFlags eventFlags = CacheEventFlags::NORMAL);
@@ -241,9 +245,8 @@
   bool containsKey(const std::shared_ptr<CacheableKey>& keyPtr) const override;
   virtual bool containsKeyOnServer(
       const std::shared_ptr<CacheableKey>& keyPtr) const override;
-  virtual std::vector<std::shared_ptr<CacheableKey>> getInterestList()
-      const override;
-  virtual std::vector<std::shared_ptr<CacheableString>> getInterestListRegex()
+  std::vector<std::shared_ptr<CacheableKey>> getInterestList() const override;
+  std::vector<std::shared_ptr<CacheableString>> getInterestListRegex()
       const override;
 
   /** @brief Public Methods from RegionInternal
@@ -255,39 +258,40 @@
   void setPersistenceManager(
       std::shared_ptr<PersistenceManager>& pmPtr) override;
 
-  virtual GfErrType getNoThrow(
+  GfErrType getNoThrow(
       const std::shared_ptr<CacheableKey>& key,
       std::shared_ptr<Cacheable>& value,
       const std::shared_ptr<Serializable>& aCallbackArgument) override;
-  virtual GfErrType getAllNoThrow(
+  GfErrType getAllNoThrow(
       const std::vector<std::shared_ptr<CacheableKey>>& keys,
       const std::shared_ptr<HashMapOfCacheable>& values,
       const std::shared_ptr<HashMapOfException>& exceptions,
       const bool addToLocalCache,
       const std::shared_ptr<Serializable>& aCallbackArgument =
           nullptr) override;
-  virtual GfErrType putNoThrow(
-      const std::shared_ptr<CacheableKey>& key,
-      const std::shared_ptr<Cacheable>& value,
-      const std::shared_ptr<Serializable>& aCallbackArgument,
-      std::shared_ptr<Cacheable>& oldValue, int updateCount,
-      const CacheEventFlags eventFlags, std::shared_ptr<VersionTag> versionTag,
-      DataInput* delta = nullptr,
-      std::shared_ptr<EventId> eventId = nullptr) override;
-  virtual GfErrType putNoThrowTX(
-      const std::shared_ptr<CacheableKey>& key,
-      const std::shared_ptr<Cacheable>& value,
-      const std::shared_ptr<Serializable>& aCallbackArgument,
-      std::shared_ptr<Cacheable>& oldValue, int updateCount,
-      const CacheEventFlags eventFlags, std::shared_ptr<VersionTag> versionTag,
-      DataInput* delta = nullptr, std::shared_ptr<EventId> eventId = nullptr);
-  virtual GfErrType createNoThrow(
+  GfErrType putNoThrow(const std::shared_ptr<CacheableKey>& key,
+                       const std::shared_ptr<Cacheable>& value,
+                       const std::shared_ptr<Serializable>& aCallbackArgument,
+                       std::shared_ptr<Cacheable>& oldValue, int updateCount,
+                       const CacheEventFlags eventFlags,
+                       std::shared_ptr<VersionTag> versionTag,
+                       DataInput* delta = nullptr,
+                       std::shared_ptr<EventId> eventId = nullptr) override;
+  GfErrType putNoThrowTX(const std::shared_ptr<CacheableKey>& key,
+                         const std::shared_ptr<Cacheable>& value,
+                         const std::shared_ptr<Serializable>& aCallbackArgument,
+                         std::shared_ptr<Cacheable>& oldValue, int updateCount,
+                         const CacheEventFlags eventFlags,
+                         std::shared_ptr<VersionTag> versionTag,
+                         DataInput* delta = nullptr,
+                         std::shared_ptr<EventId> eventId = nullptr);
+  GfErrType createNoThrow(
       const std::shared_ptr<CacheableKey>& key,
       const std::shared_ptr<Cacheable>& value,
       const std::shared_ptr<Serializable>& aCallbackArgument, int updateCount,
       const CacheEventFlags eventFlags,
       std::shared_ptr<VersionTag> versionTag) override;
-  virtual GfErrType destroyNoThrow(
+  GfErrType destroyNoThrow(
       const std::shared_ptr<CacheableKey>& key,
       const std::shared_ptr<Serializable>& aCallbackArgument, int updateCount,
       const CacheEventFlags eventFlags,
@@ -296,7 +300,7 @@
       const std::shared_ptr<CacheableKey>& key,
       const std::shared_ptr<Serializable>& aCallbackArgument, int updateCount,
       const CacheEventFlags eventFlags, std::shared_ptr<VersionTag> versionTag);
-  virtual GfErrType removeNoThrow(
+  GfErrType removeNoThrow(
       const std::shared_ptr<CacheableKey>& key,
       const std::shared_ptr<Cacheable>& value,
       const std::shared_ptr<Serializable>& aCallbackArgument, int updateCount,
@@ -313,7 +317,7 @@
   virtual GfErrType removeAllNoThrow(
       const std::vector<std::shared_ptr<CacheableKey>>& keys,
       const std::shared_ptr<Serializable>& aCallbackArgument = nullptr);
-  virtual GfErrType invalidateNoThrow(
+  GfErrType invalidateNoThrow(
       const std::shared_ptr<CacheableKey>& keyPtr,
       const std::shared_ptr<Serializable>& aCallbackArgument, int updateCount,
       const CacheEventFlags eventFlags,
@@ -460,7 +464,7 @@
   virtual GfErrType destroyRegionNoThrow_remote(
       const std::shared_ptr<Serializable>& aCallbackArgument);
   virtual GfErrType unregisterKeysBeforeDestroyRegion();
-  virtual const std::shared_ptr<Pool>& getPool() const override {
+  const std::shared_ptr<Pool>& getPool() const override {
     return m_attachedPool;
   }
 
@@ -563,9 +567,6 @@
   std::chrono::seconds getRegionExpiryDuration() const;
   std::chrono::seconds getEntryExpiryDuration() const;
   void invokeAfterAllEndPointDisconnected();
-  // Disallow copy constructor and assignment operator.
-  LocalRegion(const LocalRegion&);
-  LocalRegion& operator=(const LocalRegion&);
 
   virtual GfErrType getNoThrow_FullObject(
       std::shared_ptr<EventId> eventId, std::shared_ptr<Cacheable>& fullObject,
diff --git a/cppcache/src/PoolFactory.cpp b/cppcache/src/PoolFactory.cpp
index deaed13..c9f82d7 100644
--- a/cppcache/src/PoolFactory.cpp
+++ b/cppcache/src/PoolFactory.cpp
@@ -249,11 +249,7 @@
   if (m_cache.isClosed()) {
     throw CacheClosedException("Cache is closed");
   }
-  if (cacheImpl->getCacheMode() && m_isSubscriptionRedundancy) {
-    LOGWARN(
-        "At least one pool has been created so ignoring cache level "
-        "redundancy setting");
-  }
+
   auto&& tccm = cacheImpl->tcrConnectionManager();
 
   LOGDEBUG("PoolFactory::create mulitusermode = %d ",
diff --git a/cppcache/src/Region.cpp b/cppcache/src/Region.cpp
index 6d1a150..da166b4 100644
--- a/cppcache/src/Region.cpp
+++ b/cppcache/src/Region.cpp
@@ -25,7 +25,7 @@
 
 Region::Region(CacheImpl* cacheImpl) : m_cacheImpl(cacheImpl) {}
 
-Region::~Region() {}
+Region::~Region() noexcept = default;
 
 Cache& Region::getCache() { return *m_cacheImpl->getCache(); }
 
diff --git a/cppcache/src/RegionInternal.cpp b/cppcache/src/RegionInternal.cpp
index 2f7e72f..ea01843 100644
--- a/cppcache/src/RegionInternal.cpp
+++ b/cppcache/src/RegionInternal.cpp
@@ -44,7 +44,7 @@
                                RegionAttributes attributes)
     : Region(cacheImpl), m_regionAttributes(attributes) {}
 
-RegionInternal::~RegionInternal() {}
+RegionInternal::~RegionInternal() noexcept = default;
 
 void RegionInternal::registerKeys(
     const std::vector<std::shared_ptr<CacheableKey>>&, bool, bool, bool) {
diff --git a/cppcache/src/RegionInternal.hpp b/cppcache/src/RegionInternal.hpp
index 4a984c3..ce29887 100644
--- a/cppcache/src/RegionInternal.hpp
+++ b/cppcache/src/RegionInternal.hpp
@@ -55,13 +55,8 @@
   static const uint8_t GF_CACHE_CLOSE = 0x40;
   static const uint8_t GF_NOCACHEWRITER = 0x80;
 
-  // private constructor
   inline explicit CacheEventFlags(const uint8_t flags) : m_flags(flags) {}
 
-  // disable constructors and assignment
-  CacheEventFlags();
-  CacheEventFlags& operator=(const CacheEventFlags&);
-
  public:
   static const CacheEventFlags NORMAL;
   static const CacheEventFlags LOCAL;
@@ -72,8 +67,10 @@
   static const CacheEventFlags CACHE_CLOSE;
   static const CacheEventFlags NOCACHEWRITER;
 
-  inline CacheEventFlags(const CacheEventFlags& flags)
-      : m_flags(flags.m_flags) {}
+  inline CacheEventFlags(const CacheEventFlags& flags) = default;
+
+  CacheEventFlags() = delete;
+  CacheEventFlags& operator=(const CacheEventFlags&) = delete;
 
   inline CacheEventFlags operator|(const CacheEventFlags& flags) const {
     return CacheEventFlags(m_flags | flags.m_flags);
@@ -141,26 +138,25 @@
  */
 class RegionInternal : public Region {
  public:
-  /**
-   * @brief destructor
-   */
-  virtual ~RegionInternal() override;
-  /** @brief Default implementation of Public Methods from Region
-   */
-  virtual void registerKeys(
-      const std::vector<std::shared_ptr<CacheableKey>>& keys,
-      bool isDurable = false, bool getInitialValues = false,
-      bool receiveValues = true) override;
-  virtual void unregisterKeys(
-      const std::vector<std::shared_ptr<CacheableKey>>& keys) override;
-  virtual void registerAllKeys(bool isDurable = false,
-                               bool getInitialValues = false,
-                               bool receiveValues = true) override;
-  virtual void unregisterAllKeys() override;
+  RegionInternal(const RegionInternal&) = delete;
+  RegionInternal& operator=(const RegionInternal&) = delete;
 
-  virtual void registerRegex(const std::string& regex, bool isDurable = false,
-                             bool getInitialValues = false,
-                             bool receiveValues = true) override;
+  ~RegionInternal() noexcept override;
+
+  void registerKeys(const std::vector<std::shared_ptr<CacheableKey>>& keys,
+                    bool isDurable = false, bool getInitialValues = false,
+                    bool receiveValues = true) override;
+
+  void unregisterKeys(
+      const std::vector<std::shared_ptr<CacheableKey>>& keys) override;
+
+  void registerAllKeys(bool isDurable = false, bool getInitialValues = false,
+                       bool receiveValues = true) override;
+  void unregisterAllKeys() override;
+
+  void registerRegex(const std::string& regex, bool isDurable = false,
+                     bool getInitialValues = false,
+                     bool receiveValues = true) override;
   virtual void unregisterRegex(const std::string& regex) override;
 
   virtual std::shared_ptr<SelectResults> query(
@@ -168,11 +164,11 @@
       std::chrono::milliseconds timeout =
           DEFAULT_QUERY_RESPONSE_TIMEOUT) override;
 
-  virtual bool existsValue(const std::string& predicate,
-                           std::chrono::milliseconds timeout =
-                               DEFAULT_QUERY_RESPONSE_TIMEOUT) override;
+  bool existsValue(const std::string& predicate,
+                   std::chrono::milliseconds timeout =
+                       DEFAULT_QUERY_RESPONSE_TIMEOUT) override;
 
-  virtual std::shared_ptr<Serializable> selectValue(
+  std::shared_ptr<Serializable> selectValue(
       const std::string& predicate,
       std::chrono::milliseconds timeout =
           DEFAULT_QUERY_RESPONSE_TIMEOUT) override;
@@ -263,7 +259,7 @@
 
   virtual RegionStats* getRegionStats() = 0;
   virtual bool cacheEnabled() = 0;
-  virtual bool isDestroyed() const override = 0;
+  bool isDestroyed() const override = 0;
   virtual void evict(int32_t percentage) = 0;
   virtual CacheImpl* getCacheImpl() const = 0;
   virtual std::shared_ptr<TombstoneList> getTombstoneList();
@@ -290,12 +286,9 @@
   inline bool isConcurrencyCheckEnabled() const {
     return m_regionAttributes.getConcurrencyChecksEnabled();
   }
-  virtual const std::shared_ptr<Pool>& getPool() const override = 0;
+  const std::shared_ptr<Pool>& getPool() const override = 0;
 
  protected:
-  /**
-   * @brief constructor
-   */
   RegionInternal(CacheImpl* cache, RegionAttributes attributes);
 
   void setLruEntriesLimit(uint32_t limit);
@@ -332,9 +325,6 @@
   inline bool regionExpiryEnabled() const {
     return m_regionAttributes.getRegionExpiryEnabled();
   }
-
-  RegionInternal(const RegionInternal&) = delete;
-  RegionInternal& operator=(const RegionInternal&) = delete;
 };
 
 }  // namespace client
diff --git a/cppcache/src/TcrConnectionManager.cpp b/cppcache/src/TcrConnectionManager.cpp
index cb6dcae..0a862ff 100644
--- a/cppcache/src/TcrConnectionManager.cpp
+++ b/cppcache/src/TcrConnectionManager.cpp
@@ -94,47 +94,8 @@
         m_pingTaskId, pingInterval.count());
   }
 
-  auto cacheAttributes = m_cache->getAttributes();
-  const auto &endpoints = cacheAttributes->getEndpoints();
   m_redundancyManager->m_HAenabled = false;
 
-  if (cacheAttributes != nullptr &&
-      (cacheAttributes->getRedundancyLevel() > 0 || m_isDurable) &&
-      !endpoints.empty() && endpoints != "none") {
-    // no distributaion manager at this point
-    initializeHAEndpoints(endpoints.c_str());
-    m_redundancyManager->initialize(cacheAttributes->getRedundancyLevel());
-    //  Call maintain redundancy level, so primary is available for notification
-    //  operations.
-    GfErrType err = m_redundancyManager->maintainRedundancyLevel(true);
-    m_redundancyManager->m_HAenabled =
-        m_redundancyManager->m_HAenabled ||
-        ThinClientBaseDM::isDeltaEnabledOnServer();
-
-    const auto redundancyChecker = new ExpiryHandler_T<TcrConnectionManager>(
-        this, &TcrConnectionManager::checkRedundancy);
-    const auto redundancyMonitorInterval = props.redundancyMonitorInterval();
-
-    m_servermonitorTaskId = m_cache->getExpiryTaskManager().scheduleExpiryTask(
-        redundancyChecker, std::chrono::seconds(1), redundancyMonitorInterval,
-        false);
-    LOGFINE(
-        "TcrConnectionManager::TcrConnectionManager Registered server "
-        "monitor task with id = %ld, interval = %ld",
-        m_servermonitorTaskId, redundancyMonitorInterval.count());
-
-    if (ThinClientBaseDM::isFatalError(err)) {
-      GfErrTypeToException("TcrConnectionManager::init", err);
-    }
-
-    m_redundancyTask = std::unique_ptr<Task<TcrConnectionManager>>(
-        new Task<TcrConnectionManager>(this, &TcrConnectionManager::redundancy,
-                                       NC_Redundancy));
-    m_redundancyTask->start();
-
-    m_redundancyManager->m_HAenabled = true;
-  }
-
   startFailoverAndCleanupThreads(isPool);
 }
 
@@ -161,6 +122,7 @@
 
 void TcrConnectionManager::close() {
   LOGFINE("TcrConnectionManager is closing");
+
   if (m_pingTaskId > 0) {
     m_cache->getExpiryTaskManager().cancelTask(m_pingTaskId);
   }
@@ -172,27 +134,6 @@
     m_failoverTask = nullptr;
   }
 
-  auto cacheAttributes = m_cache->getAttributes();
-  if (cacheAttributes != nullptr &&
-      (cacheAttributes->getRedundancyLevel() > 0 || m_isDurable)) {
-    if (m_servermonitorTaskId > 0) {
-      m_cache->getExpiryTaskManager().cancelTask(m_servermonitorTaskId);
-    }
-    if (m_redundancyTask != nullptr) {
-      m_redundancyTask->stopNoblock();
-      m_redundancySema.release();
-      m_redundancyTask->wait();
-      // now stop cleanup task
-      // stopCleanupTask();
-      m_redundancyTask = nullptr;
-    }
-
-    m_redundancyManager->close();
-    delete m_redundancyManager;
-    m_redundancyManager = nullptr;
-
-    removeHAEndpoints();
-  }
   LOGFINE("TcrConnectionManager is closed");
 }
 
diff --git a/cppcache/src/TcrHADistributionManager.cpp b/cppcache/src/TcrHADistributionManager.cpp
index 91dfa06..af0529e 100644
--- a/cppcache/src/TcrHADistributionManager.cpp
+++ b/cppcache/src/TcrHADistributionManager.cpp
@@ -33,10 +33,8 @@
 namespace client {
 
 TcrHADistributionManager::TcrHADistributionManager(
-    ThinClientRegion* theRegion, TcrConnectionManager& connManager,
-    std::shared_ptr<CacheAttributes> cacheAttributes)
+    ThinClientRegion* theRegion, TcrConnectionManager& connManager)
     : ThinClientDistributionManager(connManager, theRegion),
-      m_cacheAttributes(cacheAttributes),
       m_theTcrConnManager(connManager) {
   GF_R_ASSERT(theRegion != nullptr);
 }
@@ -62,10 +60,8 @@
 }
 
 void TcrHADistributionManager::getEndpointNames(
-    std::unordered_set<std::string>& endpointNames) {
-  Utils::parseEndpointNamesString(m_cacheAttributes->getEndpoints(),
-                                  endpointNames);
-}
+    std::unordered_set<std::string>&) {}
+
 GfErrType TcrHADistributionManager::sendRequestToEP(const TcrMessage& request,
                                                     TcrMessageReply& reply,
                                                     TcrEndpoint* endpoint) {
diff --git a/cppcache/src/TcrHADistributionManager.hpp b/cppcache/src/TcrHADistributionManager.hpp
index fb293ae..ce90c3d 100644
--- a/cppcache/src/TcrHADistributionManager.hpp
+++ b/cppcache/src/TcrHADistributionManager.hpp
@@ -20,7 +20,6 @@
 #ifndef GEODE_TCRHADISTRIBUTIONMANAGER_H_
 #define GEODE_TCRHADISTRIBUTIONMANAGER_H_
 
-#include <geode/CacheAttributes.hpp>
 #include <geode/internal/geode_base.hpp>
 
 #include "TcrConnectionManager.hpp"
@@ -41,8 +40,7 @@
     : public ThinClientDistributionManager {
  public:
   TcrHADistributionManager(ThinClientRegion* theRegion,
-                           TcrConnectionManager& connManager,
-                           std::shared_ptr<CacheAttributes> cacheAttributes);
+                           TcrConnectionManager& connManager);
   ~TcrHADistributionManager() override = default;
   TcrHADistributionManager(const TcrHADistributionManager&) = delete;
   TcrHADistributionManager& operator=(const TcrHADistributionManager&) = delete;
@@ -88,7 +86,6 @@
   bool postFailoverAction(TcrEndpoint* endpoint) override;
 
  private:
-  std::shared_ptr<CacheAttributes> m_cacheAttributes;
   TcrConnectionManager& m_theTcrConnManager;
 
   GfErrType sendRequestToPrimary(TcrMessage& request, TcrMessageReply& reply) {
diff --git a/cppcache/src/ThinClientCacheDistributionManager.cpp b/cppcache/src/ThinClientCacheDistributionManager.cpp
index 7a67a10..e33e0d7 100644
--- a/cppcache/src/ThinClientCacheDistributionManager.cpp
+++ b/cppcache/src/ThinClientCacheDistributionManager.cpp
@@ -19,7 +19,6 @@
 
 #include <algorithm>
 
-#include <geode/CacheAttributes.hpp>
 #include <geode/ExceptionTypes.hpp>
 #include <geode/internal/geode_globals.hpp>
 
diff --git a/cppcache/src/ThinClientHARegion.cpp b/cppcache/src/ThinClientHARegion.cpp
index 3d11082..1910919 100644
--- a/cppcache/src/ThinClientHARegion.cpp
+++ b/cppcache/src/ThinClientHARegion.cpp
@@ -35,42 +35,26 @@
     bool enableNotification)
     : ThinClientRegion(name, cache, rPtr, attributes, stats, shared),
       m_attributes(attributes),
-      m_processedMarker(false),
-      m_poolDM(false) {
+      m_processedMarker(false) {
   setClientNotificationEnabled(enableNotification);
 }
 
 void ThinClientHARegion::initTCR() {
   try {
-    const bool isPool = !m_attributes.getPoolName().empty();
-
-    if (isPool) {
-      m_tcrdm = dynamic_cast<ThinClientPoolHADM*>(
-          m_cacheImpl->getCache()
-              ->getPoolManager()
-              .find(m_attributes.getPoolName())
-              .get());
-      if (m_tcrdm) {
-        m_poolDM = true;
-        // Pool DM should only be inited once and it
-        // is already done in PoolFactory::create();
-        // m_tcrdm->init();
-        ThinClientPoolHADM* poolDM = dynamic_cast<ThinClientPoolHADM*>(m_tcrdm);
-        poolDM->addRegion(this);
-        poolDM->incRegionCount();
-
-      } else {
-        throw IllegalStateException("pool not found");
-      }
+    m_tcrdm = std::dynamic_pointer_cast<ThinClientBaseDM>(
+        m_cacheImpl->getCache()->getPoolManager().find(
+            m_attributes.getPoolName()));
+    if (m_tcrdm) {
+      // Pool DM should only be inited once and it
+      // is already done in PoolFactory::create();
+      // m_tcrdm->init();
+      auto poolDM = std::dynamic_pointer_cast<ThinClientPoolHADM>(m_tcrdm);
+      poolDM->addRegion(this);
+      poolDM->incRegionCount();
     } else {
-      m_poolDM = false;
-      m_tcrdm = new TcrHADistributionManager(
-          this, m_cacheImpl->tcrConnectionManager(),
-          m_cacheImpl->getAttributes());
-      m_tcrdm->init();
+      throw IllegalStateException("pool not found");
     }
   } catch (const Exception& ex) {
-    _GEODE_SAFE_DELETE(m_tcrdm);
     LOGERROR(
         "ThinClientHARegion: failed to create a DistributionManager "
         "object due to: %s: %s",
@@ -124,30 +108,24 @@
   return m_processedMarker || !isDurableClient();
 }
 
-void ThinClientHARegion::destroyDM(bool keepEndpoints) {
-  if (m_poolDM) {
-    LOGDEBUG(
-        "ThinClientHARegion::destroyDM( ): removing region from "
-        "ThinClientPoolHADM list.");
-    ThinClientPoolHADM* poolDM = dynamic_cast<ThinClientPoolHADM*>(m_tcrdm);
-    poolDM->removeRegion(this);
-    poolDM->decRegionCount();
-  } else {
-    ThinClientRegion::destroyDM(keepEndpoints);
-  }
+void ThinClientHARegion::destroyDM(bool) {
+  LOGDEBUG(
+      "ThinClientHARegion::destroyDM( ): removing region from "
+      "ThinClientPoolHADM list.");
+  auto poolDM = std::dynamic_pointer_cast<ThinClientPoolHADM>(m_tcrdm);
+  poolDM->removeRegion(this);
+  poolDM->decRegionCount();
 }
 
 void ThinClientHARegion::addDisMessToQueue() {
-  if (m_poolDM) {
-    ThinClientPoolHADM* poolDM = dynamic_cast<ThinClientPoolHADM*>(m_tcrdm);
-    poolDM->addDisMessToQueue(this);
+  auto poolDM = std::dynamic_pointer_cast<ThinClientPoolHADM>(m_tcrdm);
+  poolDM->addDisMessToQueue(this);
 
-    if (poolDM->m_redundancyManager->m_globalProcessedMarker &&
-        !m_processedMarker) {
-      TcrMessage* regionMsg = new TcrMessageClientMarker(
-          new DataOutput(m_cacheImpl->createDataOutput()), true);
-      receiveNotification(regionMsg);
-    }
+  if (poolDM->m_redundancyManager->m_globalProcessedMarker &&
+      !m_processedMarker) {
+    TcrMessage* regionMsg = new TcrMessageClientMarker(
+        new DataOutput(m_cacheImpl->createDataOutput()), true);
+    receiveNotification(regionMsg);
   }
 }
 
@@ -158,13 +136,13 @@
       new DataOutput(m_cacheImpl->createDataOutput()), eventId);
   TcrMessageReply reply(true, nullptr);
 
-  ThinClientPoolHADM* poolHADM = dynamic_cast<ThinClientPoolHADM*>(m_tcrdm);
+  auto poolHADM = std::dynamic_pointer_cast<ThinClientPoolHADM>(m_tcrdm);
   GfErrType err = GF_NOTCON;
   if (poolHADM) {
     err = poolHADM->sendRequestToPrimary(fullObjectMsg, reply);
   } else {
-    err = static_cast<TcrHADistributionManager*>(m_tcrdm)->sendRequestToPrimary(
-        fullObjectMsg, reply);
+    err = std::static_pointer_cast<TcrHADistributionManager>(m_tcrdm)
+              ->sendRequestToPrimary(fullObjectMsg, reply);
   }
   if (err == GF_NOERR) {
     fullObject = reply.getValue();
diff --git a/cppcache/src/ThinClientHARegion.hpp b/cppcache/src/ThinClientHARegion.hpp
index ae11962..d6fe7a5 100644
--- a/cppcache/src/ThinClientHARegion.hpp
+++ b/cppcache/src/ThinClientHARegion.hpp
@@ -1,8 +1,3 @@
-#pragma once
-
-#ifndef GEODE_THINCLIENTHAREGION_H_
-#define GEODE_THINCLIENTHAREGION_H_
-
 /*
  * Licensed to the Apache Software Foundation (ASF) under one or more
  * contributor license agreements.  See the NOTICE file distributed with
@@ -19,15 +14,15 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
+#pragma once
+
+#ifndef GEODE_THINCLIENTHAREGION_H_
+#define GEODE_THINCLIENTHAREGION_H_
 
 #include <geode/Pool.hpp>
 
 #include "ThinClientRegion.hpp"
 
-/**
- * @file
- */
-
 namespace apache {
 namespace geode {
 namespace client {
@@ -44,47 +39,42 @@
  */
 class APACHE_GEODE_EXPORT ThinClientHARegion : public ThinClientRegion {
  public:
-  /**
-   * @brief constructor/destructor
-   */
   ThinClientHARegion(const std::string& name, CacheImpl* cache,
                      const std::shared_ptr<RegionInternal>& rPtr,
                      RegionAttributes attributes,
                      const std::shared_ptr<CacheStatistics>& stats,
                      bool shared = false, bool enableNotification = true);
 
-  virtual ~ThinClientHARegion() {
-    if (m_poolDM) m_tcrdm = nullptr;
-  };
+  ThinClientHARegion(const ThinClientHARegion&) = delete;
+  ThinClientHARegion& operator=(const ThinClientHARegion&) = delete;
 
-  virtual void initTCR();
+  ~ThinClientHARegion() noexcept override = default;
 
-  bool getProcessedMarker();
+  void initTCR() override;
 
-  void setProcessedMarker(bool mark = true) { m_processedMarker = mark; }
-  void addDisMessToQueue();
+  bool getProcessedMarker() override;
+
+  void setProcessedMarker(bool mark = true) override {
+    m_processedMarker = mark;
+  }
+  void addDisMessToQueue() override;
 
  protected:
-  virtual GfErrType getNoThrow_FullObject(
+  GfErrType getNoThrow_FullObject(
       std::shared_ptr<EventId> eventId, std::shared_ptr<Cacheable>& fullObject,
-      std::shared_ptr<VersionTag>& versionTag);
+      std::shared_ptr<VersionTag>& versionTag) override;
 
  private:
   RegionAttributes m_attributes;
   volatile bool m_processedMarker;
-  void handleMarker();
+  void handleMarker() override;
 
-  bool m_poolDM;
+  void acquireGlobals(bool isFailover) override;
+  void releaseGlobals(bool isFailover) override;
 
-  // Disallow copy constructor and assignment operator.
-  ThinClientHARegion(const ThinClientHARegion&);
-  ThinClientHARegion& operator=(const ThinClientHARegion&);
-
-  void acquireGlobals(bool isFailover);
-  void releaseGlobals(bool isFailover);
-
-  void destroyDM(bool keepEndpoints);
+  void destroyDM(bool keepEndpoints) override;
 };
+
 }  // namespace client
 }  // namespace geode
 }  // namespace apache
diff --git a/cppcache/src/ThinClientPoolRegion.cpp b/cppcache/src/ThinClientPoolRegion.cpp
index 9d82f3a..e58db8b 100644
--- a/cppcache/src/ThinClientPoolRegion.cpp
+++ b/cppcache/src/ThinClientPoolRegion.cpp
@@ -39,18 +39,12 @@
     const std::shared_ptr<CacheStatistics>& stats, bool shared)
     : ThinClientRegion(name, cache, rPtr, attributes, stats, shared) {}
 
-ThinClientPoolRegion::~ThinClientPoolRegion() { m_tcrdm = nullptr; }
-
 void ThinClientPoolRegion::initTCR() {
   try {
-    ThinClientPoolDM* poolDM = dynamic_cast<ThinClientPoolDM*>(
-        getCache()
-            .getPoolManager()
-            .find(m_regionAttributes.getPoolName())
-            .get());
-    m_tcrdm = dynamic_cast<ThinClientBaseDM*>(poolDM);
+    auto poolDM = std::dynamic_pointer_cast<ThinClientPoolDM>(
+        getCache().getPoolManager().find(m_regionAttributes.getPoolName()));
+    m_tcrdm = poolDM;
     if (!m_tcrdm) {
-      //  TODO: create a PoolNotFound exception.
       throw IllegalStateException("pool not found");
     }
     poolDM->incRegionCount();
@@ -62,7 +56,7 @@
 }
 
 void ThinClientPoolRegion::destroyDM(bool) {
-  dynamic_cast<ThinClientPoolDM*>(m_tcrdm)->decRegionCount();
+  std::dynamic_pointer_cast<ThinClientPoolDM>(m_tcrdm)->decRegionCount();
 }
 
 }  // namespace client
diff --git a/cppcache/src/ThinClientPoolRegion.hpp b/cppcache/src/ThinClientPoolRegion.hpp
index 9e79255..cccd3d1 100644
--- a/cppcache/src/ThinClientPoolRegion.hpp
+++ b/cppcache/src/ThinClientPoolRegion.hpp
@@ -1,8 +1,3 @@
-#pragma once
-
-#ifndef GEODE_THINCLIENTPOOLREGION_H_
-#define GEODE_THINCLIENTPOOLREGION_H_
-
 /*
  * Licensed to the Apache Software Foundation (ASF) under one or more
  * contributor license agreements.  See the NOTICE file distributed with
@@ -19,12 +14,11 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-/*
- * ThinClientPoolRegion.hpp
- *
- *  Created on: Nov 20, 2008
- *      Author: abhaware
- */
+
+#pragma once
+
+#ifndef GEODE_THINCLIENTPOOLREGION_H_
+#define GEODE_THINCLIENTPOOLREGION_H_
 
 #include "ThinClientHARegion.hpp"
 
@@ -33,25 +27,22 @@
 namespace client {
 class ThinClientPoolRegion : public ThinClientRegion {
  public:
-  /**
-   * @brief constructor/initializer/destructor
-   */
   ThinClientPoolRegion(const std::string& name, CacheImpl* cache,
                        const std::shared_ptr<RegionInternal>& rPtr,
                        RegionAttributes attributes,
                        const std::shared_ptr<CacheStatistics>& stats,
                        bool shared = false);
 
-  virtual void initTCR();
-  virtual ~ThinClientPoolRegion();
+  ThinClientPoolRegion(const ThinClientPoolRegion&) = delete;
+  ThinClientPoolRegion& operator=(const ThinClientPoolRegion&) = delete;
+
+  void initTCR() override;
+  ~ThinClientPoolRegion() noexcept override = default;
 
  private:
-  virtual void destroyDM(bool keepEndpoints);
-
-  // Disallow copy constructor and assignment operator.
-  ThinClientPoolRegion(const ThinClientPoolRegion&);
-  ThinClientPoolRegion& operator=(const ThinClientPoolRegion&);
+  void destroyDM(bool keepEndpoints) override;
 };
+
 }  // namespace client
 }  // namespace geode
 }  // namespace apache
diff --git a/cppcache/src/ThinClientRegion.cpp b/cppcache/src/ThinClientRegion.cpp
index 21eb0f4..d812d32 100644
--- a/cppcache/src/ThinClientRegion.cpp
+++ b/cppcache/src/ThinClientRegion.cpp
@@ -358,11 +358,10 @@
 
 void ThinClientRegion::initTCR() {
   try {
-    m_tcrdm =
-        new TcrDistributionManager(this, m_cacheImpl->tcrConnectionManager());
+    m_tcrdm = std::make_shared<TcrDistributionManager>(
+        this, m_cacheImpl->tcrConnectionManager());
     m_tcrdm->init();
   } catch (const Exception& ex) {
-    _GEODE_SAFE_DELETE(m_tcrdm);
     LOGERROR("Exception while initializing region: %s: %s",
              ex.getName().c_str(), ex.what());
     throw;
@@ -628,10 +627,7 @@
 
   std::shared_ptr<RemoteQuery> queryPtr;
 
-  // TODO:
-  ThinClientPoolDM* poolDM = dynamic_cast<ThinClientPoolDM*>(m_tcrdm);
-
-  if (poolDM) {
+  if (auto poolDM = std::dynamic_pointer_cast<ThinClientPoolDM>(m_tcrdm)) {
     queryPtr = std::dynamic_pointer_cast<RemoteQuery>(
         poolDM->getQueryServiceWithoutCheck()->newQuery(squery.c_str()));
   } else {
@@ -639,7 +635,7 @@
         m_cacheImpl->getQueryService()->newQuery(squery.c_str()));
   }
 
-  return queryPtr->execute(timeout, "Region::query", m_tcrdm, nullptr);
+  return queryPtr->execute(timeout, "Region::query", m_tcrdm.get(), nullptr);
 }
 
 bool ThinClientRegion::existsValue(const std::string& predicate,
@@ -723,9 +719,9 @@
 std::vector<std::shared_ptr<CacheableKey>> ThinClientRegion::serverKeys() {
   CHECK_DESTROY_PENDING(TryReadGuard, Region::serverKeys);
 
-  TcrMessageReply reply(true, m_tcrdm);
+  TcrMessageReply reply(true, m_tcrdm.get());
   TcrMessageKeySet request(new DataOutput(m_cacheImpl->createDataOutput()),
-                           m_fullPath, m_tcrdm);
+                           m_fullPath, m_tcrdm.get());
   reply.setMessageTypeRequest(TcrMessage::KEY_SET);
   std::vector<std::shared_ptr<CacheableKey>> serverKeys;
   ChunkedKeySetResponse resultCollector(request, serverKeys, reply);
@@ -772,11 +768,10 @@
 
   TcrMessageContainsKey request(
       new DataOutput(m_cacheImpl->createDataOutput()), this, keyPtr,
-      static_cast<std::shared_ptr<Serializable>>(nullptr), true, m_tcrdm);
-  TcrMessageReply reply(true, m_tcrdm);
+      static_cast<std::shared_ptr<Serializable>>(nullptr), true, m_tcrdm.get());
+  TcrMessageReply reply(true, m_tcrdm.get());
   reply.setMessageTypeRequest(TcrMessage::CONTAINS_KEY);
   err = m_tcrdm->sendSyncRequest(request, reply);
-  // if ( err != GF_NOERR ) return ret;
 
   switch (reply.getMessageType()) {
     case TcrMessage::RESPONSE:
@@ -818,8 +813,9 @@
 
   TcrMessageContainsKey request(
       new DataOutput(m_cacheImpl->createDataOutput()), this, keyPtr,
-      static_cast<std::shared_ptr<Serializable>>(nullptr), false, m_tcrdm);
-  TcrMessageReply reply(true, m_tcrdm);
+      static_cast<std::shared_ptr<Serializable>>(nullptr), false,
+      m_tcrdm.get());
+  TcrMessageReply reply(true, m_tcrdm.get());
   reply.setMessageTypeRequest(TcrMessage::CONTAINS_KEY);
   err = m_tcrdm->sendSyncRequest(request, reply);
   // if ( err != GF_NOERR ) return ret;
@@ -866,8 +862,8 @@
 
   TcrMessageClearRegion request(new DataOutput(m_cacheImpl->createDataOutput()),
                                 this, aCallbackArgument,
-                                std::chrono::milliseconds(-1), m_tcrdm);
-  TcrMessageReply reply(true, m_tcrdm);
+                                std::chrono::milliseconds(-1), m_tcrdm.get());
+  TcrMessageReply reply(true, m_tcrdm.get());
   err = m_tcrdm->sendSyncRequest(request, reply);
   if (err != GF_NOERR) GfErrTypeToException("Region::clear", err);
 
@@ -909,8 +905,8 @@
   /** @brief Create message and send to bridge server */
 
   TcrMessageRequest request(new DataOutput(m_cacheImpl->createDataOutput()),
-                            this, keyPtr, aCallbackArgument, m_tcrdm);
-  TcrMessageReply reply(true, m_tcrdm);
+                            this, keyPtr, aCallbackArgument, m_tcrdm.get());
+  TcrMessageReply reply(true, m_tcrdm.get());
   err = m_tcrdm->sendSyncRequest(request, reply);
   if (err != GF_NOERR) return err;
 
@@ -947,11 +943,9 @@
     std::shared_ptr<VersionTag>& versionTag) {
   GfErrType err = GF_NOERR;
 
-  /** @brief Create message and send to bridge server */
-
   TcrMessageInvalidate request(new DataOutput(m_cacheImpl->createDataOutput()),
-                               this, keyPtr, aCallbackArgument, m_tcrdm);
-  TcrMessageReply reply(true, m_tcrdm);
+                               this, keyPtr, aCallbackArgument, m_tcrdm.get());
+  TcrMessageReply reply(true, m_tcrdm.get());
   err = m_tcrdm->sendSyncRequest(request, reply);
   if (err != GF_NOERR) return err;
 
@@ -966,8 +960,6 @@
       break;
     }
     case TcrMessage::INVALIDATE_ERROR: {
-      // LOGERROR("A read error occurred on the endpoint %s",
-      //    m_tcrdm->getActiveEndpoint()->name().c_str());
       err = GF_CACHESERVER_EXCEPTION;
       break;
     }
@@ -1000,19 +992,20 @@
     delta = temp && temp->hasDelta();
   }
   TcrMessagePut request(new DataOutput(m_cacheImpl->createDataOutput()), this,
-                        keyPtr, valuePtr, aCallbackArgument, delta, m_tcrdm);
-  TcrMessageReply* reply = new TcrMessageReply(true, m_tcrdm);
+                        keyPtr, valuePtr, aCallbackArgument, delta,
+                        m_tcrdm.get());
+  TcrMessageReply* reply = new TcrMessageReply(true, m_tcrdm.get());
   err = m_tcrdm->sendSyncRequest(request, *reply);
   if (delta) {
-    m_cacheImpl->getCachePerfStats()
-        .incDeltaPut();  // Does not chcek whether success of failure..
-    if (reply->getMessageType() ==
-        TcrMessage::PUT_DELTA_ERROR) {  // Try without delta
+    // Does not check whether success of failure..
+    m_cacheImpl->getCachePerfStats().incDeltaPut();
+    if (reply->getMessageType() == TcrMessage::PUT_DELTA_ERROR) {
+      // Try without delta
       TcrMessagePut request(new DataOutput(m_cacheImpl->createDataOutput()),
                             this, keyPtr, valuePtr, aCallbackArgument, false,
-                            m_tcrdm, false, true);
+                            m_tcrdm.get(), false, true);
       delete reply;
-      reply = new TcrMessageReply(true, m_tcrdm);
+      reply = new TcrMessageReply(true, m_tcrdm.get());
       err = m_tcrdm->sendSyncRequest(request, *reply);
     }
   }
@@ -1029,8 +1022,6 @@
       break;
     }
     case TcrMessage::PUT_DATA_ERROR: {
-      // LOGERROR("A write error occurred on the endpoint %s",
-      //    m_tcrdm->getActiveEndpoint()->name().c_str());
       err = GF_CACHESERVER_EXCEPTION;
       break;
     }
@@ -1062,8 +1053,9 @@
 
   // do TCR destroy
   TcrMessageDestroy request(new DataOutput(m_cacheImpl->createDataOutput()),
-                            this, keyPtr, nullptr, aCallbackArgument, m_tcrdm);
-  TcrMessageReply reply(true, m_tcrdm);
+                            this, keyPtr, nullptr, aCallbackArgument,
+                            m_tcrdm.get());
+  TcrMessageReply reply(true, m_tcrdm.get());
   err = m_tcrdm->sendSyncRequest(request, reply);
   if (err != GF_NOERR) return err;
 
@@ -1105,8 +1097,9 @@
 
   // do TCR remove
   TcrMessageDestroy request(new DataOutput(m_cacheImpl->createDataOutput()),
-                            this, keyPtr, cvalue, aCallbackArgument, m_tcrdm);
-  TcrMessageReply reply(true, m_tcrdm);
+                            this, keyPtr, cvalue, aCallbackArgument,
+                            m_tcrdm.get());
+  TcrMessageReply reply(true, m_tcrdm.get());
   err = m_tcrdm->sendSyncRequest(request, reply);
   if (err != GF_NOERR) {
     return err;
@@ -1147,8 +1140,9 @@
 
   // do TCR remove
   TcrMessageDestroy request(new DataOutput(m_cacheImpl->createDataOutput()),
-                            this, keyPtr, nullptr, aCallbackArgument, m_tcrdm);
-  TcrMessageReply reply(true, m_tcrdm);
+                            this, keyPtr, nullptr, aCallbackArgument,
+                            m_tcrdm.get());
+  TcrMessageReply reply(true, m_tcrdm.get());
   err = m_tcrdm->sendSyncRequest(request, reply);
   if (err != GF_NOERR) {
     return err;
@@ -1208,11 +1202,10 @@
     }
   }
   // create the GET_ALL request
-  TcrMessageGetAll request(
-      new DataOutput(m_cacheImpl->createDataOutput()), this, keys, m_tcrdm,
-      aCallbackArgument);  // now we need to initialize later
+  TcrMessageGetAll request(new DataOutput(m_cacheImpl->createDataOutput()),
+                           this, keys, m_tcrdm.get(), aCallbackArgument);
 
-  TcrMessageReply reply(true, m_tcrdm);
+  TcrMessageReply reply(true, m_tcrdm.get());
   std::recursive_mutex responseLock;
   // need to check
   TcrChunkedResult* resultCollector(new ChunkedGetAllResponse(
@@ -1580,8 +1573,9 @@
 
   // Construct request/reply for putAll
   TcrMessagePutAll request(new DataOutput(m_cacheImpl->createDataOutput()),
-                           this, map, timeout, m_tcrdm, aCallbackArgument);
-  TcrMessageReply reply(true, m_tcrdm);
+                           this, map, timeout, m_tcrdm.get(),
+                           aCallbackArgument);
+  TcrMessageReply reply(true, m_tcrdm.get());
   request.setTimeout(timeout);
   reply.setTimeout(timeout);
 
@@ -1641,15 +1635,11 @@
     const std::shared_ptr<Serializable>& aCallbackArgument) {
   LOGDEBUG("ThinClientRegion::putAllNoThrow_remote");
 
-  auto poolDM = dynamic_cast<ThinClientPoolDM*>(m_tcrdm);
-  auto txState = TSSTXStateWrapper::get().getTXState();
-
-  if (poolDM != nullptr) {
-    if (poolDM->getPRSingleHopEnabled() &&
-        poolDM->getClientMetaDataService() != nullptr &&
-        txState == nullptr /*For Tx use multi-hop*/) {
-      return singleHopPutAllNoThrow_remote(poolDM, map, versionedObjPartList,
-                                           timeout, aCallbackArgument);
+  if (auto poolDM = std::dynamic_pointer_cast<ThinClientPoolDM>(m_tcrdm)) {
+    if (poolDM->getPRSingleHopEnabled() && poolDM->getClientMetaDataService() &&
+        !TSSTXStateWrapper::get().getTXState()) {
+      return singleHopPutAllNoThrow_remote(
+          poolDM.get(), map, versionedObjPartList, timeout, aCallbackArgument);
     } else {
       return multiHopPutAllNoThrow_remote(map, versionedObjPartList, timeout,
                                           aCallbackArgument);
@@ -1915,8 +1905,8 @@
 
   // Construct request/reply for putAll
   TcrMessageRemoveAll request(new DataOutput(m_cacheImpl->createDataOutput()),
-                              this, keys, aCallbackArgument, m_tcrdm);
-  TcrMessageReply reply(true, m_tcrdm);
+                              this, keys, aCallbackArgument, m_tcrdm.get());
+  TcrMessageReply reply(true, m_tcrdm.get());
 
   std::recursive_mutex responseLock;
   versionedObjPartList =
@@ -1966,15 +1956,11 @@
     const std::shared_ptr<Serializable>& aCallbackArgument) {
   LOGDEBUG("ThinClientRegion::removeAllNoThrow_remote");
 
-  ThinClientPoolDM* poolDM = dynamic_cast<ThinClientPoolDM*>(m_tcrdm);
-  auto txState = TSSTXStateWrapper::get().getTXState();
-
-  if (poolDM != nullptr) {
-    if (poolDM->getPRSingleHopEnabled() &&
-        poolDM->getClientMetaDataService() != nullptr &&
-        txState == nullptr /*For Tx use multi-hop*/) {
+  if (auto poolDM = std::dynamic_pointer_cast<ThinClientPoolDM>(m_tcrdm)) {
+    if (poolDM->getPRSingleHopEnabled() && poolDM->getClientMetaDataService() &&
+        !TSSTXStateWrapper::get().getTXState()) {
       return singleHopRemoveAllNoThrow_remote(
-          poolDM, keys, versionedObjPartList, aCallbackArgument);
+          poolDM.get(), keys, versionedObjPartList, aCallbackArgument);
     } else {
       return multiHopRemoveAllNoThrow_remote(keys, versionedObjPartList,
                                              aCallbackArgument);
@@ -1993,7 +1979,7 @@
   // do TCR size
   TcrMessageSize request(new DataOutput(m_cacheImpl->createDataOutput()),
                          m_fullPath.c_str());
-  TcrMessageReply reply(true, m_tcrdm);
+  TcrMessageReply reply(true, m_tcrdm.get());
   err = m_tcrdm->sendSyncRequest(request, reply);
 
   if (err != GF_NOERR) {
@@ -2197,8 +2183,8 @@
   // do TCR destroyRegion
   TcrMessageDestroyRegion request(
       new DataOutput(m_cacheImpl->createDataOutput()), this, aCallbackArgument,
-      std::chrono::milliseconds(-1), m_tcrdm);
-  TcrMessageReply reply(true, m_tcrdm);
+      std::chrono::milliseconds(-1), m_tcrdm.get());
+  TcrMessageReply reply(true, m_tcrdm.get());
   err = m_tcrdm->sendSyncRequest(request, reply);
   if (err != GF_NOERR) return err;
 
@@ -2241,7 +2227,7 @@
     return err;
   }
 
-  TcrMessageReply replyLocal(true, m_tcrdm);
+  TcrMessageReply replyLocal(true, m_tcrdm.get());
   bool needToCreateRC = true;
   if (reply == nullptr) {
     reply = &replyLocal;
@@ -2255,7 +2241,7 @@
   TcrMessageRegisterInterestList request(
       new DataOutput(m_cacheImpl->createDataOutput()), this, keys, isDurable,
       getAttributes().getCachingEnabled(), receiveValues, interestPolicy,
-      m_tcrdm);
+      m_tcrdm.get());
   std::recursive_mutex responseLock;
   TcrChunkedResult* resultCollector = nullptr;
   if (interestPolicy.ordinal == InterestResultPolicy::KEYS_VALUES.ordinal) {
@@ -2308,7 +2294,7 @@
   CHECK_DESTROY_PENDING_NOTHROW(TryReadGuard);
   GfErrType err = GF_NOERR;
   std::lock_guard<decltype(m_keysLock)> keysGuard(m_keysLock);
-  TcrMessageReply reply(true, m_tcrdm);
+  TcrMessageReply reply(true, m_tcrdm.get());
   if (keys.empty()) {
     return err;
   }
@@ -2322,7 +2308,7 @@
 
   TcrMessageUnregisterInterestList request(
       new DataOutput(m_cacheImpl->createDataOutput()), this, keys, false, true,
-      InterestResultPolicy::NONE, m_tcrdm);
+      InterestResultPolicy::NONE, m_tcrdm.get());
   err = m_tcrdm->sendSyncRequestRegisterInterest(request, reply);
   if (err == GF_NOERR /*|| err == GF_CACHE_REDUNDANCY_FAILURE*/) {
     if (attemptFailover) {
@@ -2344,7 +2330,7 @@
   RegionGlobalLocks acquireLocksFailover(this);
   GfErrType err = GF_NOERR;
   std::lock_guard<decltype(m_keysLock)> keysGuard(m_keysLock);
-  TcrMessageReply reply(true, m_tcrdm);
+  TcrMessageReply reply(true, m_tcrdm.get());
   if (keys.empty()) {
     return err;
   }
@@ -2358,7 +2344,7 @@
 
   TcrMessageUnregisterInterestList request(
       new DataOutput(m_cacheImpl->createDataOutput()), this, keys, false, true,
-      InterestResultPolicy::NONE, m_tcrdm);
+      InterestResultPolicy::NONE, m_tcrdm.get());
   err = m_tcrdm->sendSyncRequestRegisterInterest(request, reply);
   if (err == GF_NOERR) {
     if (attemptFailover) {
@@ -2433,10 +2419,10 @@
   TcrMessageRegisterInterest request(
       new DataOutput(m_cacheImpl->createDataOutput()), m_fullPath,
       regex.c_str(), interestPolicy, isDurable,
-      getAttributes().getCachingEnabled(), receiveValues, m_tcrdm);
+      getAttributes().getCachingEnabled(), receiveValues, m_tcrdm.get());
   std::recursive_mutex responseLock;
   if (reply == nullptr) {
-    TcrMessageReply replyLocal(true, m_tcrdm);
+    TcrMessageReply replyLocal(true, m_tcrdm.get());
     auto values = std::make_shared<HashMapOfCacheable>();
     auto exceptions = std::make_shared<HashMapOfException>();
 
@@ -2510,10 +2496,10 @@
   err = findRegex(regex);
 
   if (err == GF_NOERR) {
-    TcrMessageReply reply(false, m_tcrdm);
+    TcrMessageReply reply(false, m_tcrdm.get());
     TcrMessageUnregisterInterest request(
         new DataOutput(m_cacheImpl->createDataOutput()), m_fullPath, regex,
-        InterestResultPolicy::NONE, false, true, m_tcrdm);
+        InterestResultPolicy::NONE, false, true, m_tcrdm.get());
     err = m_tcrdm->sendSyncRequestRegisterInterest(request, reply);
     if (err == GF_NOERR /*|| err == GF_CACHE_REDUNDANCY_FAILURE*/) {
       if (attemptFailover) {
@@ -2556,10 +2542,10 @@
   err = findRegex(regex);
 
   if (err == GF_NOERR) {
-    TcrMessageReply reply(false, m_tcrdm);
+    TcrMessageReply reply(false, m_tcrdm.get());
     TcrMessageUnregisterInterest request(
         new DataOutput(m_cacheImpl->createDataOutput()), m_fullPath, regex,
-        InterestResultPolicy::NONE, false, true, m_tcrdm);
+        InterestResultPolicy::NONE, false, true, m_tcrdm.get());
     err = m_tcrdm->sendSyncRequestRegisterInterest(request, reply);
     if (err == GF_NOERR) {
       if (attemptFailover) {
@@ -2935,12 +2921,11 @@
   LocalRegion::release(invokeCallbacks);
 }
 
-ThinClientRegion::~ThinClientRegion() {
+ThinClientRegion::~ThinClientRegion() noexcept {
   TryWriteGuard guard(m_rwLock, m_destroyPending);
   if (!m_destroyPending) {
     release(false);
   }
-  _GEODE_SAFE_DELETE(m_tcrdm);
 }
 
 void ThinClientRegion::acquireGlobals(bool isFailover) {
@@ -2976,15 +2961,15 @@
     if (reExecuteForServ) {
       msg = new TcrMessageExecuteRegionFunction(
           new DataOutput(m_cacheImpl->createDataOutput()), func, this, args,
-          routingObj, getResult, failedNodes, timeout, m_tcrdm,
+          routingObj, getResult, failedNodes, timeout, m_tcrdm.get(),
           static_cast<int8_t>(1));
     } else {
       msg = new TcrMessageExecuteRegionFunction(
           new DataOutput(m_cacheImpl->createDataOutput()), func, this, args,
-          routingObj, getResult, failedNodes, timeout, m_tcrdm,
+          routingObj, getResult, failedNodes, timeout, m_tcrdm.get(),
           static_cast<int8_t>(0));
     }
-    TcrMessageReply reply(true, m_tcrdm);
+    TcrMessageReply reply(true, m_tcrdm.get());
     // need to check
     ChunkedFunctionExecutionResponse* resultCollector(
         new ChunkedFunctionExecutionResponse(reply, (getResult & 2) == 2, rc));
@@ -3076,9 +3061,9 @@
     reExecute = false;
     TcrMessageExecuteRegionFunction msg(
         new DataOutput(m_cacheImpl->createDataOutput()), func, this, args,
-        routingObj, getResult, failedNodes, timeout, m_tcrdm,
+        routingObj, getResult, failedNodes, timeout, m_tcrdm.get(),
         static_cast<int8_t>(1));
-    TcrMessageReply reply(true, m_tcrdm);
+    TcrMessageReply reply(true, m_tcrdm.get());
     // need to check
     ChunkedFunctionExecutionResponse* resultCollector(
         new ChunkedFunctionExecutionResponse(reply, (getResult & 2) == 2, rc));
@@ -3154,7 +3139,7 @@
     const auto& routingObj = locationIter.second;
     auto worker = std::make_shared<OnRegionFunctionExecution>(
         func, this, args, routingObj, getResult, timeout,
-        dynamic_cast<ThinClientPoolDM*>(m_tcrdm), resultCollectorLock, rc,
+        dynamic_cast<ThinClientPoolDM*>(m_tcrdm.get()), resultCollectorLock, rc,
         userAttr, false, serverLocation, allBuckets);
     threadPool.perform(worker);
     feWorkers.push_back(worker);
@@ -3177,7 +3162,8 @@
     if (err != GF_NOERR) {
       if (err == GF_FUNCTION_EXCEPTION) {
         reExecute = true;
-        if (auto poolDM = dynamic_cast<ThinClientPoolDM*>(m_tcrdm)) {
+        if (auto poolDM =
+                std::dynamic_pointer_cast<ThinClientPoolDM>(m_tcrdm)) {
           if (poolDM->getClientMetaDataService()) {
             poolDM->getClientMetaDataService()->enqueueForMetadataRefresh(
                 this->getFullPath(), 0);
@@ -3204,7 +3190,8 @@
         LOGINFO(
             "ThinClientRegion::executeFunctionSH with GF_NOTCON or "
             "GF_CLIENT_WAIT_TIMEOUT ");
-        if (auto poolDM = dynamic_cast<ThinClientPoolDM*>(m_tcrdm)) {
+        if (auto poolDM =
+                std::dynamic_pointer_cast<ThinClientPoolDM>(m_tcrdm)) {
           if (poolDM->getClientMetaDataService()) {
             poolDM->getClientMetaDataService()->enqueueForMetadataRefresh(
                 this->getFullPath(), 0);
@@ -3243,8 +3230,8 @@
   // do TCR GET_FUNCTION_ATTRIBUTES
   LOGDEBUG("Tcrmessage request GET_FUNCTION_ATTRIBUTES ");
   TcrMessageGetFunctionAttributes request(
-      new DataOutput(m_cacheImpl->createDataOutput()), func, m_tcrdm);
-  TcrMessageReply reply(true, m_tcrdm);
+      new DataOutput(m_cacheImpl->createDataOutput()), func, m_tcrdm.get());
+  TcrMessageReply reply(true, m_tcrdm.get());
   err = m_tcrdm->sendSyncRequest(request, reply);
   if (err != GF_NOERR) {
     return err;
diff --git a/cppcache/src/ThinClientRegion.hpp b/cppcache/src/ThinClientRegion.hpp
index a7ec893..1da5bce 100644
--- a/cppcache/src/ThinClientRegion.hpp
+++ b/cppcache/src/ThinClientRegion.hpp
@@ -61,41 +61,43 @@
                    RegionAttributes attributes,
                    const std::shared_ptr<CacheStatistics>& stats,
                    bool shared = false);
+
+  ThinClientRegion(const ThinClientRegion&) = delete;
+  ThinClientRegion& operator=(const ThinClientRegion&) = delete;
+
   virtual void initTCR();
-  virtual ~ThinClientRegion() override;
+  ~ThinClientRegion() noexcept override;
 
   /** @brief Public Methods from Region
    */
   // Unhide function to prevent SunPro Warnings
   using RegionInternal::registerKeys;
-  virtual void registerKeys(
-      const std::vector<std::shared_ptr<CacheableKey>>& keys,
-      bool isDurable = false, bool getInitialValues = false,
-      bool receiveValues = true) override;
-  virtual void unregisterKeys(
+  void registerKeys(const std::vector<std::shared_ptr<CacheableKey>>& keys,
+                    bool isDurable = false, bool getInitialValues = false,
+                    bool receiveValues = true) override;
+  void unregisterKeys(
       const std::vector<std::shared_ptr<CacheableKey>>& keys) override;
-  virtual void registerAllKeys(bool isDurable = false,
-                               bool getInitialValues = false,
-                               bool receiveValues = true) override;
-  virtual void unregisterAllKeys() override;
-  virtual void registerRegex(const std::string& regex, bool isDurable = false,
-                             bool getInitialValues = false,
-                             bool receiveValues = true) override;
-  virtual void unregisterRegex(const std::string& regex) override;
-  virtual std::vector<std::shared_ptr<CacheableKey>> serverKeys() override;
-  virtual void clear(const std::shared_ptr<Serializable>& aCallbackArgument =
-                         nullptr) override;
+  void registerAllKeys(bool isDurable = false, bool getInitialValues = false,
+                       bool receiveValues = true) override;
+  void unregisterAllKeys() override;
+  void registerRegex(const std::string& regex, bool isDurable = false,
+                     bool getInitialValues = false,
+                     bool receiveValues = true) override;
+  void unregisterRegex(const std::string& regex) override;
+  std::vector<std::shared_ptr<CacheableKey>> serverKeys() override;
+  void clear(const std::shared_ptr<Serializable>& aCallbackArgument =
+                 nullptr) override;
 
-  virtual std::shared_ptr<SelectResults> query(
+  std::shared_ptr<SelectResults> query(
       const std::string& predicate,
       std::chrono::milliseconds timeout =
           DEFAULT_QUERY_RESPONSE_TIMEOUT) override;
 
-  virtual bool existsValue(const std::string& predicate,
-                           std::chrono::milliseconds timeout =
-                               DEFAULT_QUERY_RESPONSE_TIMEOUT) override;
+  bool existsValue(const std::string& predicate,
+                   std::chrono::milliseconds timeout =
+                       DEFAULT_QUERY_RESPONSE_TIMEOUT) override;
 
-  virtual std::shared_ptr<Serializable> selectValue(
+  std::shared_ptr<Serializable> selectValue(
       const std::string& predicate,
       std::chrono::milliseconds timeout =
           DEFAULT_QUERY_RESPONSE_TIMEOUT) override;
@@ -128,28 +130,23 @@
 
   bool containsKeyOnServer(
       const std::shared_ptr<CacheableKey>& keyPtr) const override;
-  virtual bool containsValueForKey_remote(
+  bool containsValueForKey_remote(
       const std::shared_ptr<CacheableKey>& keyPtr) const override;
-  virtual std::vector<std::shared_ptr<CacheableKey>> getInterestList()
-      const override;
-  virtual std::vector<std::shared_ptr<CacheableString>> getInterestListRegex()
+  std::vector<std::shared_ptr<CacheableKey>> getInterestList() const override;
+  std::vector<std::shared_ptr<CacheableString>> getInterestListRegex()
       const override;
 
-  /** @brief Public Methods from RegionInternal
-   *  These are all virtual methods
-   */
   void receiveNotification(TcrMessage* msg);
 
-  /** @brief Misc utility methods. */
   static GfErrType handleServerException(const char* func,
                                          const char* exceptionMsg);
 
-  virtual void acquireGlobals(bool failover) override;
-  virtual void releaseGlobals(bool failover) override;
+  void acquireGlobals(bool failover) override;
+  void releaseGlobals(bool failover) override;
 
   void localInvalidateFailover();
 
-  inline ThinClientBaseDM* getDistMgr() const { return m_tcrdm; }
+  inline ThinClientBaseDM* getDistMgr() const { return m_tcrdm.get(); }
 
   std::shared_ptr<CacheableVector> reExecuteFunction(
       const std::string& func, const std::shared_ptr<Cacheable>& args,
@@ -186,20 +183,18 @@
 
   uint32_t size_remote() override;
 
-  virtual void txDestroy(const std::shared_ptr<CacheableKey>& key,
-                         const std::shared_ptr<Serializable>& callBack,
-                         std::shared_ptr<VersionTag> versionTag) override;
-  virtual void txInvalidate(const std::shared_ptr<CacheableKey>& key,
-                            const std::shared_ptr<Serializable>& callBack,
-                            std::shared_ptr<VersionTag> versionTag) override;
-  virtual void txPut(const std::shared_ptr<CacheableKey>& key,
-                     const std::shared_ptr<Cacheable>& value,
-                     const std::shared_ptr<Serializable>& callBack,
-                     std::shared_ptr<VersionTag> versionTag) override;
+  void txDestroy(const std::shared_ptr<CacheableKey>& key,
+                 const std::shared_ptr<Serializable>& callBack,
+                 std::shared_ptr<VersionTag> versionTag) override;
+  void txInvalidate(const std::shared_ptr<CacheableKey>& key,
+                    const std::shared_ptr<Serializable>& callBack,
+                    std::shared_ptr<VersionTag> versionTag) override;
+  void txPut(const std::shared_ptr<CacheableKey>& key,
+             const std::shared_ptr<Cacheable>& value,
+             const std::shared_ptr<Serializable>& callBack,
+             std::shared_ptr<VersionTag> versionTag) override;
 
  protected:
-  /** @brief the methods need to be overloaded in TCR
-   */
   GfErrType getNoThrow_remote(
       const std::shared_ptr<CacheableKey>& keyPtr,
       std::shared_ptr<Cacheable>& valPtr,
@@ -276,13 +271,12 @@
       std::vector<std::shared_ptr<CacheableKey>>& keysVector,
       std::unordered_map<std::shared_ptr<CacheableKey>, InterestResultPolicy>&
           interestList) const;
-  virtual void release(bool invokeCallbacks = true) override;
+  void release(bool invokeCallbacks = true) override;
 
   GfErrType unregisterKeysBeforeDestroyRegion() override;
 
   bool isDurableClient() { return m_isDurableClnt; }
-  /** @brief Protected fields. */
-  ThinClientBaseDM* m_tcrdm;
+  std::shared_ptr<ThinClientBaseDM> m_tcrdm;
   std::recursive_mutex m_keysLock;
   mutable ACE_RW_Thread_Mutex m_rwDestroyLock;
   std::unordered_map<std::shared_ptr<CacheableKey>, InterestResultPolicy>
@@ -340,9 +334,6 @@
       std::shared_ptr<EventId> eventId, std::shared_ptr<Cacheable>& fullObject,
       std::shared_ptr<VersionTag>& versionTag) override;
 
-  // Disallow copy constructor and assignment operator.
-  ThinClientRegion(const ThinClientRegion&);
-  ThinClientRegion& operator=(const ThinClientRegion&);
   GfErrType singleHopPutAllNoThrow_remote(
       ThinClientPoolDM* tcrdm, const HashMapOfCacheable& map,
       std::shared_ptr<VersionedCacheableObjectPartList>& versionedObjPartList,