You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@geode.apache.org by bs...@apache.org on 2020/03/03 16:36:07 UTC

[geode] branch feature/GEODE-7808c created (now 3ace639)

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

bschuchardt pushed a change to branch feature/GEODE-7808c
in repository https://gitbox.apache.org/repos/asf/geode.git.


      at 3ace639  Revert "GEODE-7808: standardize on use of HostAndPort to form client-side connections (#4743)"

This branch includes the following new commits:

     new 3ace639  Revert "GEODE-7808: standardize on use of HostAndPort to form client-side connections (#4743)"

The 1 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.



[geode] 01/01: Revert "GEODE-7808: standardize on use of HostAndPort to form client-side connections (#4743)"

Posted by bs...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

bschuchardt pushed a commit to branch feature/GEODE-7808c
in repository https://gitbox.apache.org/repos/asf/geode.git

commit 3ace639daa243efd28f4ca8bb7b275666d514fce
Author: Bruce Schuchardt <bs...@pivotal.io>
AuthorDate: Tue Mar 3 08:31:01 2020 -0800

    Revert "GEODE-7808: standardize on use of HostAndPort to form client-side connections (#4743)"
    
    This reverts commit 0af626462642c6352840cd6e81a5265c74045c7f.
    That commit seems to have caused a severe performance drop in several
    Benchmark tests:
    
    org.apache.geode.benchmark.tests.PartitionedGetBenchmark
                  average ops/second  Baseline:    981794.46  Test:     41239.82  Difference:  -95.8%
    org.apache.geode.benchmark.tests.ReplicatedGetBenchmark
                  average ops/second  Baseline:    972769.18  Test:     41299.96  Difference:  -95.8%
    org.apache.geode.benchmark.tests.PartitionedNonIndexedQueryBenchmark
                  average ops/second  Baseline:        90.05  Test:        70.52  Difference:  -21.7%
---
 .../apache/geode/metrics/CacheCommonTagsTest.java  |   3 +-
 .../internal/LocatorLoadBalancingDUnitTest.java    |   6 +-
 .../geode/cache30/ClientMembershipDUnitTest.java   |   3 +
 .../AutoConnectionSourceImplJUnitTest.java         |  28 +-
 .../distributed/LauncherIntegrationTestCase.java   |   3 +-
 .../geode/distributed/LocatorIntegrationTest.java  |   4 +-
 .../tcpserver/TCPClientSSLIntegrationTest.java     |  12 +-
 .../internal/tcpserver/TCPServerSSLJUnitTest.java  |   5 +-
 .../net/ClientSocketFactoryIntegrationTest.java    |   4 +-
 .../internal/net/SSLSocketIntegrationTest.java     |  13 +-
 .../GemFireStatSamplerIntegrationTest.java         |   3 +-
 .../SimpleStatSamplerIntegrationTest.java          |   3 +-
 ...SSLSocketParameterExtensionIntegrationTest.java |  11 +-
 .../internal/DistributionLocatorConfigImpl.java    |   8 +-
 .../admin/internal/DistributionLocatorImpl.java    |   3 +-
 .../admin/internal/ManagedEntityConfigImpl.java    |   3 +-
 .../jmx/internal/MX4JServerSocketFactory.java      |  10 +-
 .../client/internal/AutoConnectionSourceImpl.java  |  47 +--
 .../cache/client/internal/ConnectionImpl.java      |   7 +-
 .../geode/cache/client/internal/PoolImpl.java      |  24 +-
 .../java/org/apache/geode/distributed/Locator.java |   3 +-
 .../apache/geode/distributed/LocatorLauncher.java  |   4 +-
 .../internal/DistributionConfigImpl.java           |   3 +-
 .../membership/InternalDistributedMember.java      |  30 +-
 .../org/apache/geode/internal/AbstractConfig.java  |   2 +-
 .../org/apache/geode/internal/DSFIDFactory.java    |   2 -
 .../apache/geode/internal/DistributionLocator.java |   6 +-
 .../org/apache/geode/internal/SystemAdmin.java     |   9 +-
 .../admin/remote/DistributionLocatorId.java        |  29 +-
 .../geode/internal/cache/GemFireCacheImpl.java     |   8 +-
 .../geode/internal/cache/PoolFactoryImpl.java      |  79 ++---
 .../cache/persistence/PersistentMemberPattern.java |   3 +-
 .../internal/cache/tier/sockets/AcceptorImpl.java  |   5 +-
 .../cache/tier/sockets/CacheClientUpdater.java     |   4 +-
 .../internal/cache/wan/AbstractGatewaySender.java  |   2 +-
 .../internal/net/SCAdvancedSocketCreator.java      | 119 -------
 .../geode/internal/net/SCServerSocketCreator.java  | 109 ------
 .../apache/geode/internal/net/SocketCreator.java   | 367 ++++++++++++++++-----
 .../geode/internal/statistics/HostStatSampler.java |   3 +-
 .../internal/statistics/StatArchiveWriter.java     |   3 +-
 .../org/apache/geode/internal/tcp/TCPConduit.java  |   7 +-
 .../ContextAwareSSLRMIClientSocketFactory.java     |   5 +-
 .../internal/JmxManagerLocatorRequest.java         |   8 +-
 .../geode/management/internal/ManagementAgent.java |   8 +-
 .../internal/api/GeodeConnectionConfig.java        |   4 +-
 .../utils/ClusterConfigurationStatusRetriever.java |  11 +-
 .../sanctioned-geode-core-serializables.txt        |   8 +-
 .../geode/cache/client/internal/PoolImplTest.java  |   4 +-
 .../geode/internal/cache/CacheServerImplTest.java  |   5 -
 .../tier/sockets/CacheClientUpdaterJUnitTest.java  |   6 +-
 .../geode/internal/net/SocketCreatorJUnitTest.java |   8 +-
 .../apache/geode/internal/tcp/TCPConduitTest.java  |   3 +-
 .../cache/tier/sockets/DurableClientTestBase.java  |   3 +-
 .../cache/tier/sockets/DurableClientTestCase.java  |  11 +-
 .../cache/client/internal/LocatorTestBase.java     |  10 +-
 .../geode/test/dunit/rules/DistributedRule.java    |   1 +
 .../internal/membership/gms/GMSUtilTest.java       |  36 +-
 .../gms/membership/GMSJoinLeaveJUnitTest.java      |  12 +-
 .../internal/membership/gms/GMSUtil.java           |  14 +-
 .../membership/gms/MemberDataBuilderImpl.java      |   4 +-
 .../membership/gms/MemberIdentifierImpl.java       |   4 +-
 .../membership/gms/fd/GMSHealthMonitor.java        |   7 +-
 .../membership/gms/locator/GMSLocator.java         |  13 +-
 .../gms/locator/MembershipLocatorImpl.java         |   4 +-
 .../membership/gms/membership/GMSJoinLeave.java    |   9 +-
 .../membership/gms/membership/HostAddress.java     |  20 +-
 .../acceptance/CacheConnectionIntegrationTest.java |   4 +-
 .../v1/acceptance/CacheOperationsJUnitTest.java    |   4 +-
 .../serialization/DataSerializableFixedID.java     |   1 -
 .../serialization/StaticSerialization.java         |   1 -
 .../tcpserver/TcpServerGossipVersionDUnitTest.java |   3 +-
 .../internal/tcpserver/TcpServerJUnitTest.java     |  30 +-
 .../TcpServerProductVersionDUnitTest.java          |  17 +-
 .../internal/tcpserver/AdvancedSocketCreator.java  |  61 ----
 .../tcpserver/AdvancedSocketCreatorImpl.java       | 180 ----------
 .../internal/tcpserver/ClientSocketCreator.java    |  48 ---
 .../tcpserver/ClientSocketCreatorImpl.java         |  54 ---
 .../internal/tcpserver/ClusterSocketCreator.java   |  66 ----
 .../internal/tcpserver/HostAndPort.java            | 154 ---------
 .../internal/tcpserver/LocatorAddress.java         |  91 +++++
 .../tcpserver/ServerSocketCreatorImpl.java         |  96 ------
 .../distributed/internal/tcpserver/TcpClient.java  |  64 ++--
 .../distributed/internal/tcpserver/TcpServer.java  |   6 +-
 .../internal/tcpserver/TcpSocketCreator.java       |  38 ++-
 .../internal/tcpserver/TcpSocketCreatorImpl.java   | 191 +++++++++--
 ...ostAndPortTest.java => LocatorAddressTest.java} |  40 ++-
 .../WANHostNameVerificationDistributedTest.java    |  31 +-
 .../internal/locator/wan/LocatorDiscovery.java     |  11 +-
 .../locator/wan/LocatorMembershipListenerImpl.java |   6 +-
 .../locator/wan/LocatorMembershipListenerTest.java |   4 +-
 ...SenderEventRemoteDispatcherIntegrationTest.java |  17 +
 91 files changed, 1002 insertions(+), 1431 deletions(-)

diff --git a/geode-assembly/src/acceptanceTest/java/org/apache/geode/metrics/CacheCommonTagsTest.java b/geode-assembly/src/acceptanceTest/java/org/apache/geode/metrics/CacheCommonTagsTest.java
index 58a1cfd..1ca677c 100644
--- a/geode-assembly/src/acceptanceTest/java/org/apache/geode/metrics/CacheCommonTagsTest.java
+++ b/geode-assembly/src/acceptanceTest/java/org/apache/geode/metrics/CacheCommonTagsTest.java
@@ -30,6 +30,7 @@ import org.junit.Test;
 import org.apache.geode.cache.CacheFactory;
 import org.apache.geode.internal.cache.InternalCache;
 import org.apache.geode.internal.inet.LocalHostUtil;
+import org.apache.geode.internal.net.SocketCreator;
 
 public class CacheCommonTagsTest {
 
@@ -56,7 +57,7 @@ public class CacheCommonTagsTest {
 
       assertThat(meter.getId().getTags())
           .as("Tags for meter with name " + meterId.getName())
-          .contains(Tag.of("host", LocalHostUtil.getLocalHost().getHostName()));
+          .contains(Tag.of("host", SocketCreator.getHostName(LocalHostUtil.getLocalHost())));
     }
   }
 
diff --git a/geode-core/src/distributedTest/java/org/apache/geode/cache/client/internal/LocatorLoadBalancingDUnitTest.java b/geode-core/src/distributedTest/java/org/apache/geode/cache/client/internal/LocatorLoadBalancingDUnitTest.java
index f88ba3c..54f552f 100644
--- a/geode-core/src/distributedTest/java/org/apache/geode/cache/client/internal/LocatorLoadBalancingDUnitTest.java
+++ b/geode-core/src/distributedTest/java/org/apache/geode/cache/client/internal/LocatorLoadBalancingDUnitTest.java
@@ -18,6 +18,7 @@ import static org.apache.geode.test.awaitility.GeodeAwaitility.await;
 
 import java.io.IOException;
 import java.io.Serializable;
+import java.net.InetAddress;
 import java.util.Collections;
 import java.util.HashMap;
 import java.util.List;
@@ -44,7 +45,6 @@ import org.apache.geode.distributed.internal.DistributionConfigImpl;
 import org.apache.geode.distributed.internal.InternalLocator;
 import org.apache.geode.distributed.internal.ServerLocation;
 import org.apache.geode.distributed.internal.ServerLocator;
-import org.apache.geode.distributed.internal.tcpserver.HostAndPort;
 import org.apache.geode.distributed.internal.tcpserver.TcpClient;
 import org.apache.geode.internal.InternalDataSerializer;
 import org.apache.geode.internal.cache.CacheServerImpl;
@@ -181,8 +181,8 @@ public class LocatorLoadBalancingDUnitTest extends LocatorTestBase {
         .getSocketCreatorForComponent(SecurableCommunicationChannel.LOCATOR),
         InternalDataSerializer.getDSFIDSerializer().getObjectSerializer(),
         InternalDataSerializer.getDSFIDSerializer().getObjectDeserializer())
-            .requestToServer(new HostAndPort(hostName,
-                locatorPort),
+            .requestToServer(InetAddress.getByName(hostName),
+                locatorPort,
                 request,
                 10000, replyExpected);
   }
diff --git a/geode-core/src/distributedTest/java/org/apache/geode/cache30/ClientMembershipDUnitTest.java b/geode-core/src/distributedTest/java/org/apache/geode/cache30/ClientMembershipDUnitTest.java
index bd33935..e69cbbe 100644
--- a/geode-core/src/distributedTest/java/org/apache/geode/cache30/ClientMembershipDUnitTest.java
+++ b/geode-core/src/distributedTest/java/org/apache/geode/cache30/ClientMembershipDUnitTest.java
@@ -838,6 +838,9 @@ public class ClientMembershipDUnitTest extends ClientServerTestCase {
     ClientCache clientCache = (ClientCache) getCache();
     Set<InetSocketAddress> servers = clientCache.getCurrentServers();
     assertTrue(!servers.isEmpty());
+    InetSocketAddress serverAddr = servers.iterator().next();
+    InetSocketAddress expectedAddr = new InetSocketAddress(serverMember.getHost(), ports[0]);
+    assertEquals(expectedAddr, serverAddr);
 
     // now check listener results
     assertTrue(fired[JOINED]);
diff --git a/geode-core/src/integrationTest/java/org/apache/geode/cache/client/internal/AutoConnectionSourceImplJUnitTest.java b/geode-core/src/integrationTest/java/org/apache/geode/cache/client/internal/AutoConnectionSourceImplJUnitTest.java
index 7534ecd..7399f0e 100644
--- a/geode-core/src/integrationTest/java/org/apache/geode/cache/client/internal/AutoConnectionSourceImplJUnitTest.java
+++ b/geode-core/src/integrationTest/java/org/apache/geode/cache/client/internal/AutoConnectionSourceImplJUnitTest.java
@@ -68,7 +68,7 @@ import org.apache.geode.distributed.internal.DistributionStats;
 import org.apache.geode.distributed.internal.InternalDistributedSystem;
 import org.apache.geode.distributed.internal.ProtocolCheckerImpl;
 import org.apache.geode.distributed.internal.ServerLocation;
-import org.apache.geode.distributed.internal.tcpserver.HostAndPort;
+import org.apache.geode.distributed.internal.tcpserver.LocatorAddress;
 import org.apache.geode.distributed.internal.tcpserver.TcpClient;
 import org.apache.geode.distributed.internal.tcpserver.TcpHandler;
 import org.apache.geode.distributed.internal.tcpserver.TcpServer;
@@ -81,6 +81,7 @@ import org.apache.geode.internal.net.SocketCreatorFactory;
 import org.apache.geode.internal.security.SecurableCommunicationChannel;
 import org.apache.geode.management.membership.ClientMembershipEvent;
 import org.apache.geode.management.membership.ClientMembershipListener;
+import org.apache.geode.test.dunit.NetworkUtils;
 import org.apache.geode.test.junit.categories.ClientServerTest;
 import org.apache.geode.util.internal.GeodeGlossary;
 
@@ -122,8 +123,8 @@ public class AutoConnectionSourceImplJUnitTest {
     InetAddress ia = InetAddress.getLocalHost();
     InetSocketAddress isa = new InetSocketAddress(ia, port);
     locators.add(isa);
-    List<HostAndPort> la = new ArrayList<>();
-    la.add(new HostAndPort(ia.getHostName(), port));
+    List<LocatorAddress> la = new ArrayList<>();
+    la.add(new LocatorAddress(isa, ia.getHostName()));
     source = new AutoConnectionSourceImpl(la, "", 60 * 1000);
     source.start(pool);
   }
@@ -162,7 +163,7 @@ public class AutoConnectionSourceImplJUnitTest {
         .getSocketCreatorForComponent(SecurableCommunicationChannel.LOCATOR),
         InternalDataSerializer.getDSFIDSerializer().getObjectSerializer(),
         InternalDataSerializer.getDSFIDSerializer().getObjectDeserializer())
-            .stop(new HostAndPort(InetAddress.getLocalHost().getHostName(), port));
+            .stop(InetAddress.getLocalHost(), port);
   }
 
   /**
@@ -178,18 +179,18 @@ public class AutoConnectionSourceImplJUnitTest {
     InetSocketAddress floc2 = new InetSocketAddress("fakeLocalHost2", port);
     locators.add(floc1);
     locators.add(floc2);
-    List<HostAndPort> la = new ArrayList<>();
-    la.add(new HostAndPort(floc1.getHostName(), floc1.getPort()));
-    la.add(new HostAndPort(floc2.getHostName(), floc2.getPort()));
+    List<LocatorAddress> la = new ArrayList<>();
+    la.add(new LocatorAddress(floc1, floc1.getHostName()));
+    la.add(new LocatorAddress(floc2, floc2.getHostName()));
     AutoConnectionSourceImpl src = new AutoConnectionSourceImpl(la, "", 60 * 1000);
 
 
     InetSocketAddress b1 = new InetSocketAddress("fakeLocalHost1", port);
     InetSocketAddress b2 = new InetSocketAddress("fakeLocalHost3", port);
 
-    Set<HostAndPort> bla = new HashSet<>();
-    bla.add(new HostAndPort(b1.getHostName(), b1.getPort()));
-    bla.add(new HostAndPort(b2.getHostName(), b2.getPort()));
+    Set<LocatorAddress> bla = new HashSet<>();
+    bla.add(new LocatorAddress(b1, b1.getHostName()));
+    bla.add(new LocatorAddress(b2, b2.getHostName()));
 
 
     src.addbadLocators(la, bla);
@@ -211,12 +212,13 @@ public class AutoConnectionSourceImplJUnitTest {
   @Test
   public void testSourceHandlesToDataException() throws IOException, ClassNotFoundException {
     TcpClient mockConnection = mock(TcpClient.class);
-    when(mockConnection.requestToServer(isA(HostAndPort.class), any(Object.class),
+    when(mockConnection.requestToServer(isA(InetSocketAddress.class), any(Object.class),
         isA(Integer.class), isA(Boolean.class))).thenThrow(new ToDataException("testing"));
     try {
-      source.queryOneLocatorUsingConnection(new HostAndPort("locator[1234]", 1234), mock(
+      InetSocketAddress address = new InetSocketAddress(NetworkUtils.getServerHostName(), 1234);
+      source.queryOneLocatorUsingConnection(new LocatorAddress(address, "locator[1234]"), mock(
           ServerLocationRequest.class), mockConnection);
-      verify(mockConnection).requestToServer(isA(HostAndPort.class),
+      verify(mockConnection).requestToServer(isA(InetSocketAddress.class),
           isA(ServerLocationRequest.class), isA(Integer.class), isA(Boolean.class));
     } catch (NoAvailableLocatorsException expected) {
       // do nothing
diff --git a/geode-core/src/integrationTest/java/org/apache/geode/distributed/LauncherIntegrationTestCase.java b/geode-core/src/integrationTest/java/org/apache/geode/distributed/LauncherIntegrationTestCase.java
index 6787ac7..99d28f3 100755
--- a/geode-core/src/integrationTest/java/org/apache/geode/distributed/LauncherIntegrationTestCase.java
+++ b/geode-core/src/integrationTest/java/org/apache/geode/distributed/LauncherIntegrationTestCase.java
@@ -293,8 +293,7 @@ public abstract class LauncherIntegrationTestCase {
     try {
       socket = SocketCreatorFactory
           .createNonDefaultInstance(false, false, null, null, System.getProperties())
-          .forCluster()
-          .createServerSocket(port, 50, bindAddress);
+          .createServerSocket(port, 50, bindAddress, -1);
       assertThat(socket.isBound()).isTrue();
       assertThat(socket.isClosed()).isFalse();
       assertThat(isPortAvailable(port, SOCKET)).isFalse();
diff --git a/geode-core/src/integrationTest/java/org/apache/geode/distributed/LocatorIntegrationTest.java b/geode-core/src/integrationTest/java/org/apache/geode/distributed/LocatorIntegrationTest.java
index 8f1c3a1..e38223e 100644
--- a/geode-core/src/integrationTest/java/org/apache/geode/distributed/LocatorIntegrationTest.java
+++ b/geode-core/src/integrationTest/java/org/apache/geode/distributed/LocatorIntegrationTest.java
@@ -29,6 +29,7 @@ import static org.assertj.core.api.Assertions.catchThrowable;
 
 import java.io.File;
 import java.io.IOException;
+import java.net.InetAddress;
 import java.util.Arrays;
 import java.util.Collection;
 import java.util.List;
@@ -50,7 +51,6 @@ import org.junit.runners.Parameterized.UseParametersRunnerFactory;
 
 import org.apache.geode.distributed.internal.InternalLocator;
 import org.apache.geode.distributed.internal.ServerLocation;
-import org.apache.geode.distributed.internal.tcpserver.HostAndPort;
 import org.apache.geode.distributed.internal.tcpserver.TcpClient;
 import org.apache.geode.internal.AvailablePortHelper;
 import org.apache.geode.internal.InternalDataSerializer;
@@ -174,7 +174,7 @@ public class LocatorIntegrationTest {
         .getSocketCreatorForComponent(SecurableCommunicationChannel.LOCATOR),
         InternalDataSerializer.getDSFIDSerializer().getObjectSerializer(),
         InternalDataSerializer.getDSFIDSerializer().getObjectDeserializer());
-    String[] info = client.getInfo(new HostAndPort("localhost", boundPort));
+    String[] info = client.getInfo(InetAddress.getLocalHost(), boundPort);
 
     assertThat(info).isNotNull();
     assertThat(info.length).isGreaterThanOrEqualTo(1);
diff --git a/geode-core/src/integrationTest/java/org/apache/geode/distributed/internal/tcpserver/TCPClientSSLIntegrationTest.java b/geode-core/src/integrationTest/java/org/apache/geode/distributed/internal/tcpserver/TCPClientSSLIntegrationTest.java
index 2ea1eb7..ef05022 100644
--- a/geode-core/src/integrationTest/java/org/apache/geode/distributed/internal/tcpserver/TCPClientSSLIntegrationTest.java
+++ b/geode-core/src/integrationTest/java/org/apache/geode/distributed/internal/tcpserver/TCPClientSSLIntegrationTest.java
@@ -146,8 +146,7 @@ public class TCPClientSSLIntegrationTest {
 
     startServerAndClient(serverCertificate, clientCertificate, true);
     String response =
-        (String) client.requestToServer(new HostAndPort(localhost.getHostName(), port),
-            Boolean.valueOf(false), 5 * 1000);
+        (String) client.requestToServer(localhost, port, Boolean.valueOf(false), 5 * 1000);
     assertThat(response).isEqualTo("Running!");
   }
 
@@ -166,8 +165,7 @@ public class TCPClientSSLIntegrationTest {
 
     startServerAndClient(serverCertificate, clientCertificate, false);
     String response =
-        (String) client.requestToServer(new HostAndPort(localhost.getHostName(), port),
-            Boolean.valueOf(false), 5 * 1000);
+        (String) client.requestToServer(localhost, port, Boolean.valueOf(false), 5 * 1000);
     assertThat(response).isEqualTo("Running!");
   }
 
@@ -186,8 +184,7 @@ public class TCPClientSSLIntegrationTest {
     startServerAndClient(serverCertificate, clientCertificate, true);
 
     assertThatExceptionOfType(IllegalStateException.class)
-        .isThrownBy(() -> client.requestToServer(new HostAndPort(localhost.getHostName(), port),
-            Boolean.valueOf(false), 5 * 1000))
+        .isThrownBy(() -> client.requestToServer(localhost, port, Boolean.valueOf(false), 5 * 1000))
         .withCauseInstanceOf(SSLHandshakeException.class)
         .withStackTraceContaining("No name matching " + localhost.getHostName() + " found");
   }
@@ -208,8 +205,7 @@ public class TCPClientSSLIntegrationTest {
     startServerAndClient(serverCertificate, clientCertificate, true);
 
     assertThatExceptionOfType(IllegalStateException.class)
-        .isThrownBy(() -> client.requestToServer(new HostAndPort(localhost.getHostName(), port),
-            Boolean.valueOf(false), 5 * 1000))
+        .isThrownBy(() -> client.requestToServer(localhost, port, Boolean.valueOf(false), 5 * 1000))
         .withCauseInstanceOf(SSLHandshakeException.class)
         .withStackTraceContaining("No subject alternative DNS name matching "
             + localhost.getHostName() + " found.");
diff --git a/geode-core/src/integrationTest/java/org/apache/geode/distributed/internal/tcpserver/TCPServerSSLJUnitTest.java b/geode-core/src/integrationTest/java/org/apache/geode/distributed/internal/tcpserver/TCPServerSSLJUnitTest.java
index 1a5eac5..515321f 100644
--- a/geode-core/src/integrationTest/java/org/apache/geode/distributed/internal/tcpserver/TCPServerSSLJUnitTest.java
+++ b/geode-core/src/integrationTest/java/org/apache/geode/distributed/internal/tcpserver/TCPServerSSLJUnitTest.java
@@ -109,7 +109,7 @@ public class TCPServerSSLJUnitTest {
      */
     socketCreator.setFailTLSHandshake(false);
 
-    getTcpClient().stop(new HostAndPort(localhost.getHostAddress(), port));
+    getTcpClient().stop(localhost, port);
 
     server.join(60 * 1000);
 
@@ -121,8 +121,7 @@ public class TCPServerSSLJUnitTest {
 
     try {
 
-      getTcpClient().requestToServer(new HostAndPort(localhost.getHostAddress(), port),
-          Boolean.valueOf(false), 5 * 1000);
+      getTcpClient().requestToServer(localhost, port, Boolean.valueOf(false), 5 * 1000);
       throw new AssertionError("expected to get an exception but didn't");
 
     } catch (final IllegalStateException | IOException t) {
diff --git a/geode-core/src/integrationTest/java/org/apache/geode/internal/net/ClientSocketFactoryIntegrationTest.java b/geode-core/src/integrationTest/java/org/apache/geode/internal/net/ClientSocketFactoryIntegrationTest.java
index c35a59b..7276dc4 100644
--- a/geode-core/src/integrationTest/java/org/apache/geode/internal/net/ClientSocketFactoryIntegrationTest.java
+++ b/geode-core/src/integrationTest/java/org/apache/geode/internal/net/ClientSocketFactoryIntegrationTest.java
@@ -35,7 +35,6 @@ import org.junit.experimental.categories.Category;
 import org.apache.geode.distributed.ClientSocketFactory;
 import org.apache.geode.distributed.internal.DistributionConfig;
 import org.apache.geode.distributed.internal.DistributionConfigImpl;
-import org.apache.geode.distributed.internal.tcpserver.HostAndPort;
 import org.apache.geode.test.junit.categories.ClientServerTest;
 
 /**
@@ -83,8 +82,7 @@ public class ClientSocketFactoryIntegrationTest {
   @Test
   public void testClientSocketFactory() throws Exception {
     assertThatThrownBy(() -> this.socket = SocketCreatorFactory
-        .getSocketCreatorForComponent(CLUSTER).forClient()
-        .connect(new HostAndPort("localhost", 12345), 0))
+        .getSocketCreatorForComponent(CLUSTER).connectForClient("localhost", 12345, 0))
             .isExactlyInstanceOf(IOException.class).hasMessage(EXCEPTION_MESSAGE);
 
     assertThat(invokedCreateSocket).isTrue();
diff --git a/geode-core/src/integrationTest/java/org/apache/geode/internal/net/SSLSocketIntegrationTest.java b/geode-core/src/integrationTest/java/org/apache/geode/internal/net/SSLSocketIntegrationTest.java
index 7f9f3f2..481313e 100755
--- a/geode-core/src/integrationTest/java/org/apache/geode/internal/net/SSLSocketIntegrationTest.java
+++ b/geode-core/src/integrationTest/java/org/apache/geode/internal/net/SSLSocketIntegrationTest.java
@@ -72,7 +72,6 @@ import org.junit.rules.TestName;
 import org.apache.geode.distributed.internal.DMStats;
 import org.apache.geode.distributed.internal.DistributionConfig;
 import org.apache.geode.distributed.internal.DistributionConfigImpl;
-import org.apache.geode.distributed.internal.tcpserver.HostAndPort;
 import org.apache.geode.internal.ByteBufferOutputStream;
 import org.apache.geode.internal.inet.LocalHostUtil;
 import org.apache.geode.internal.security.SecurableCommunicationChannel;
@@ -177,12 +176,11 @@ public class SSLSocketIntegrationTest {
 
   @Test
   public void securedSocketTransmissionShouldWork() throws Exception {
-    this.serverSocket = this.socketCreator.forCluster().createServerSocket(0, 0, this.localHost);
+    this.serverSocket = this.socketCreator.createServerSocket(0, 0, this.localHost);
     this.serverThread = startServer(this.serverSocket, 15000);
 
     int serverPort = this.serverSocket.getLocalPort();
-    this.clientSocket = this.socketCreator.forCluster()
-        .connect(new HostAndPort(this.localHost.getHostAddress(), serverPort), 0, null);
+    this.clientSocket = this.socketCreator.connectForServer(this.localHost, serverPort);
 
     // transmit expected string from Client to Server
     ObjectOutputStream output = new ObjectOutputStream(this.clientSocket.getOutputStream());
@@ -326,7 +324,7 @@ public class SSLSocketIntegrationTest {
 
   @Test(expected = SocketTimeoutException.class)
   public void handshakeCanTimeoutOnServer() throws Throwable {
-    this.serverSocket = this.socketCreator.forCluster().createServerSocket(0, 0, this.localHost);
+    this.serverSocket = this.socketCreator.createServerSocket(0, 0, this.localHost);
     this.serverThread = startServer(this.serverSocket, 1000);
 
     int serverPort = this.serverSocket.getLocalPort();
@@ -409,9 +407,8 @@ public class SSLSocketIntegrationTest {
     try {
       await("connect to server socket").until(() -> {
         try {
-          Socket clientSocket = socketCreator.forClient().connect(
-              new HostAndPort(LocalHostUtil.getLocalHost().getHostAddress(), serverSocketPort),
-              500);
+          Socket clientSocket = socketCreator.connectForClient(
+              LocalHostUtil.getLocalHost().getHostAddress(), serverSocketPort, 500);
           clientSocket.close();
           System.err.println(
               "client successfully connected to server but should not have been able to do so");
diff --git a/geode-core/src/integrationTest/java/org/apache/geode/internal/statistics/GemFireStatSamplerIntegrationTest.java b/geode-core/src/integrationTest/java/org/apache/geode/internal/statistics/GemFireStatSamplerIntegrationTest.java
index 8128567..ffe275a 100644
--- a/geode-core/src/integrationTest/java/org/apache/geode/internal/statistics/GemFireStatSamplerIntegrationTest.java
+++ b/geode-core/src/integrationTest/java/org/apache/geode/internal/statistics/GemFireStatSamplerIntegrationTest.java
@@ -34,6 +34,7 @@ import static org.apache.geode.internal.GemFireVersion.getSourceDate;
 import static org.apache.geode.internal.cache.control.HeapMemoryMonitor.getTenuredMemoryPoolMXBean;
 import static org.apache.geode.internal.cache.control.HeapMemoryMonitor.getTenuredPoolStatistics;
 import static org.apache.geode.internal.inet.LocalHostUtil.getLocalHost;
+import static org.apache.geode.internal.net.SocketCreator.getHostName;
 import static org.apache.geode.internal.statistics.HostStatSampler.TEST_FILE_SIZE_LIMIT_IN_KB_PROPERTY;
 import static org.apache.geode.test.awaitility.GeodeAwaitility.await;
 import static org.assertj.core.api.Assertions.assertThat;
@@ -135,7 +136,7 @@ public class GemFireStatSamplerIntegrationTest extends StatSamplerTestCase {
         .isLessThanOrEqualTo(currentTimeMillis());
     assertThat(statSampler.getSystemDirectoryPath())
         .as("system directory path")
-        .isEqualTo(getLocalHost().getHostName());
+        .isEqualTo(getHostName(getLocalHost()));
 
     assertThat(statSampler.getVMStats())
         .as("vm stats")
diff --git a/geode-core/src/integrationTest/java/org/apache/geode/internal/statistics/SimpleStatSamplerIntegrationTest.java b/geode-core/src/integrationTest/java/org/apache/geode/internal/statistics/SimpleStatSamplerIntegrationTest.java
index ecfb5f3..c8b7040 100755
--- a/geode-core/src/integrationTest/java/org/apache/geode/internal/statistics/SimpleStatSamplerIntegrationTest.java
+++ b/geode-core/src/integrationTest/java/org/apache/geode/internal/statistics/SimpleStatSamplerIntegrationTest.java
@@ -36,6 +36,7 @@ import org.apache.geode.CancelCriterion;
 import org.apache.geode.Statistics;
 import org.apache.geode.StatisticsType;
 import org.apache.geode.internal.inet.LocalHostUtil;
+import org.apache.geode.internal.net.SocketCreator;
 import org.apache.geode.internal.stats50.VMStats50;
 import org.apache.geode.test.junit.categories.StatisticsTest;
 
@@ -99,7 +100,7 @@ public class SimpleStatSamplerIntegrationTest extends StatSamplerTestCase {
     assertTrue(statsCount > 0);
 
     assertTrue(statSampler.getSystemStartTime() <= System.currentTimeMillis());
-    assertEquals(LocalHostUtil.getLocalHost().getHostName(),
+    assertEquals(SocketCreator.getHostName(LocalHostUtil.getLocalHost()),
         statSampler.getSystemDirectoryPath());
 
     VMStatsContract vmStats = statSampler.getVMStats();
diff --git a/geode-core/src/integrationTest/java/org/apache/geode/net/SSLSocketParameterExtensionIntegrationTest.java b/geode-core/src/integrationTest/java/org/apache/geode/net/SSLSocketParameterExtensionIntegrationTest.java
index 6f84f51..18c67d4 100644
--- a/geode-core/src/integrationTest/java/org/apache/geode/net/SSLSocketParameterExtensionIntegrationTest.java
+++ b/geode-core/src/integrationTest/java/org/apache/geode/net/SSLSocketParameterExtensionIntegrationTest.java
@@ -58,7 +58,6 @@ import org.junit.rules.TestName;
 import org.apache.geode.cache.CacheFactory;
 import org.apache.geode.distributed.internal.DistributionConfig;
 import org.apache.geode.distributed.internal.DistributionConfigImpl;
-import org.apache.geode.distributed.internal.tcpserver.HostAndPort;
 import org.apache.geode.internal.cache.InternalCache;
 import org.apache.geode.internal.net.SocketCreator;
 import org.apache.geode.internal.net.SocketCreatorFactory;
@@ -142,12 +141,11 @@ public class SSLSocketParameterExtensionIntegrationTest {
 
   @Test
   public void securedSocketCheckExtensions() throws Exception {
-    this.serverSocket = this.socketCreator.forCluster().createServerSocket(0, 0, this.localHost);
+    this.serverSocket = this.socketCreator.createServerSocket(0, 0, this.localHost);
     this.serverThread = startServer(this.serverSocket, 15000);
 
     int serverPort = this.serverSocket.getLocalPort();
-    this.clientSocket = this.socketCreator.forCluster()
-        .connect(new HostAndPort(this.localHost.getHostAddress(), serverPort));
+    this.clientSocket = this.socketCreator.connectForServer(this.localHost, serverPort);
 
     SSLSocket sslSocket = (SSLSocket) this.clientSocket;
 
@@ -187,9 +185,8 @@ public class SSLSocketParameterExtensionIntegrationTest {
     Thread serverThread = new Thread(new MyThreadGroup(this.testName.getMethodName()), () -> {
       try {
         Socket socket = serverSocket.accept();
-        SocketCreatorFactory.getSocketCreatorForComponent(CLUSTER).forCluster()
-            .handshakeIfSocketIsSSL(socket,
-                timeoutMillis);
+        SocketCreatorFactory.getSocketCreatorForComponent(CLUSTER).handshakeIfSocketIsSSL(socket,
+            timeoutMillis);
         assertThat(socket.getSoTimeout()).isEqualTo(0);
 
         ObjectInputStream ois = new ObjectInputStream(socket.getInputStream());
diff --git a/geode-core/src/main/java/org/apache/geode/admin/internal/DistributionLocatorConfigImpl.java b/geode-core/src/main/java/org/apache/geode/admin/internal/DistributionLocatorConfigImpl.java
index b735ca6..60dacb1 100644
--- a/geode-core/src/main/java/org/apache/geode/admin/internal/DistributionLocatorConfigImpl.java
+++ b/geode-core/src/main/java/org/apache/geode/admin/internal/DistributionLocatorConfigImpl.java
@@ -15,6 +15,7 @@
 package org.apache.geode.admin.internal;
 
 import static org.apache.geode.distributed.ConfigurationProperties.MCAST_PORT;
+import static org.apache.geode.internal.net.InetAddressUtilsWithLogging.toInetAddress;
 import static org.apache.geode.internal.net.InetAddressUtilsWithLogging.validateHost;
 
 import java.net.InetAddress;
@@ -23,7 +24,6 @@ import java.util.Properties;
 import org.apache.geode.GemFireConfigException;
 import org.apache.geode.admin.DistributionLocator;
 import org.apache.geode.admin.DistributionLocatorConfig;
-import org.apache.geode.distributed.internal.tcpserver.HostAndPort;
 import org.apache.geode.distributed.internal.tcpserver.TcpClient;
 import org.apache.geode.internal.InternalDataSerializer;
 import org.apache.geode.internal.net.SocketCreatorFactory;
@@ -65,6 +65,8 @@ public class DistributionLocatorConfigImpl extends ManagedEntityConfigImpl
    * Contacts a distribution locator on the given host and port and creates a
    * <code>DistributionLocatorConfig</code> for it.
    *
+   * @see TcpClient#getLocatorInfo
+   *
    * @return <code>null</code> if the locator cannot be contacted
    */
   static DistributionLocatorConfig createConfigFor(String host, int port, InetAddress bindAddress) {
@@ -76,9 +78,9 @@ public class DistributionLocatorConfigImpl extends ManagedEntityConfigImpl
           InternalDataSerializer.getDSFIDSerializer().getObjectSerializer(),
           InternalDataSerializer.getDSFIDSerializer().getObjectDeserializer());
       if (bindAddress != null) {
-        info = client.getInfo(new HostAndPort(bindAddress.getHostAddress(), port));
+        info = client.getInfo(bindAddress, port);
       } else {
-        info = client.getInfo(new HostAndPort(host, port));
+        info = client.getInfo(toInetAddress(host), port);
       }
       if (info == null) {
         return null;
diff --git a/geode-core/src/main/java/org/apache/geode/admin/internal/DistributionLocatorImpl.java b/geode-core/src/main/java/org/apache/geode/admin/internal/DistributionLocatorImpl.java
index 8866975..419cf60 100755
--- a/geode-core/src/main/java/org/apache/geode/admin/internal/DistributionLocatorImpl.java
+++ b/geode-core/src/main/java/org/apache/geode/admin/internal/DistributionLocatorImpl.java
@@ -212,8 +212,7 @@ public class DistributionLocatorImpl implements DistributionLocator, InternalMan
             found = locator.getHost().getHostName().equals(inetAddr.getHostName());
             if (!found) {
               found =
-                  locator.getHost().getSocketInetAddress().getAddress()
-                      .getHostAddress().equals(inetAddr.getHostAddress());
+                  locator.getHost().getAddress().getHostAddress().equals(inetAddr.getHostAddress());
             }
           } catch (UnknownHostException e) {
             // try config host as if it is an IP address instead of host name
diff --git a/geode-core/src/main/java/org/apache/geode/admin/internal/ManagedEntityConfigImpl.java b/geode-core/src/main/java/org/apache/geode/admin/internal/ManagedEntityConfigImpl.java
index 37ed0fb..540981a 100644
--- a/geode-core/src/main/java/org/apache/geode/admin/internal/ManagedEntityConfigImpl.java
+++ b/geode-core/src/main/java/org/apache/geode/admin/internal/ManagedEntityConfigImpl.java
@@ -25,6 +25,7 @@ import org.apache.geode.admin.ManagedEntityConfig;
 import org.apache.geode.internal.GemFireVersion;
 import org.apache.geode.internal.admin.GemFireVM;
 import org.apache.geode.internal.inet.LocalHostUtil;
+import org.apache.geode.internal.net.SocketCreator;
 
 /**
  * The abstract superclass of objects that configure a managed entity such as a GemFire cache server
@@ -114,7 +115,7 @@ public abstract class ManagedEntityConfigImpl implements ManagedEntityConfig {
    * <code>GemFireVM</code>
    */
   protected ManagedEntityConfigImpl(GemFireVM vm) {
-    this.host = vm.getHost().getHostName();
+    this.host = SocketCreator.getHostName(vm.getHost());
     this.workingDirectory = vm.getWorkingDirectory().getAbsolutePath();
     this.productDirectory = vm.getGeodeHomeDir().getAbsolutePath();
     this.remoteCommand = null;
diff --git a/geode-core/src/main/java/org/apache/geode/admin/jmx/internal/MX4JServerSocketFactory.java b/geode-core/src/main/java/org/apache/geode/admin/jmx/internal/MX4JServerSocketFactory.java
index 33f6eb8..ff7c282 100644
--- a/geode-core/src/main/java/org/apache/geode/admin/jmx/internal/MX4JServerSocketFactory.java
+++ b/geode-core/src/main/java/org/apache/geode/admin/jmx/internal/MX4JServerSocketFactory.java
@@ -105,11 +105,10 @@ public class MX4JServerSocketFactory implements mx4j.tools.adaptor.AdaptorServer
   public ServerSocket createServerSocket(int port, int backlog, String bindAddress)
       throws IOException {
     if ("".equals(bindAddress)) {
-      return socketCreator.forCluster().createServerSocket(port, backlog);
+      return socketCreator.createServerSocket(port, backlog);
 
     } else {
-      return socketCreator.forCluster().createServerSocket(port, backlog,
-          toInetAddress(bindAddress));
+      return socketCreator.createServerSocket(port, backlog, toInetAddress(bindAddress));
     }
   }
 
@@ -121,10 +120,9 @@ public class MX4JServerSocketFactory implements mx4j.tools.adaptor.AdaptorServer
   public ServerSocket createServerSocket(int port) throws IOException {
     ServerSocket sock = null;
     if ("".equals(bindAddress)) {
-      sock = socketCreator.forCluster().createServerSocket(port, this.backlog);
+      sock = socketCreator.createServerSocket(port, this.backlog);
     } else {
-      sock = socketCreator.forCluster().createServerSocket(port, this.backlog,
-          toInetAddress(this.bindAddress));
+      sock = socketCreator.createServerSocket(port, this.backlog, toInetAddress(this.bindAddress));
     }
 
     if (logger.isDebugEnabled()) {
diff --git a/geode-core/src/main/java/org/apache/geode/cache/client/internal/AutoConnectionSourceImpl.java b/geode-core/src/main/java/org/apache/geode/cache/client/internal/AutoConnectionSourceImpl.java
index 94336f3..1714af3 100644
--- a/geode-core/src/main/java/org/apache/geode/cache/client/internal/AutoConnectionSourceImpl.java
+++ b/geode-core/src/main/java/org/apache/geode/cache/client/internal/AutoConnectionSourceImpl.java
@@ -49,7 +49,7 @@ import org.apache.geode.cache.client.internal.locator.QueueConnectionResponse;
 import org.apache.geode.cache.client.internal.locator.ServerLocationRequest;
 import org.apache.geode.cache.client.internal.locator.ServerLocationResponse;
 import org.apache.geode.distributed.internal.ServerLocation;
-import org.apache.geode.distributed.internal.tcpserver.HostAndPort;
+import org.apache.geode.distributed.internal.tcpserver.LocatorAddress;
 import org.apache.geode.distributed.internal.tcpserver.TcpClient;
 import org.apache.geode.internal.InternalDataSerializer;
 import org.apache.geode.internal.cache.tier.sockets.ClientProxyMembershipID;
@@ -74,7 +74,7 @@ public class AutoConnectionSourceImpl implements ConnectionSource {
   private static final LocatorListRequest LOCATOR_LIST_REQUEST = new LocatorListRequest();
 
   @Immutable
-  private static final Comparator<HostAndPort> SOCKET_ADDRESS_COMPARATOR =
+  private static final Comparator<LocatorAddress> SOCKET_ADDRESS_COMPARATOR =
       (address, otherAddress) -> {
         InetSocketAddress inetSocketAddress = address.getSocketInetAddress();
         InetSocketAddress otherInetSocketAddress = otherAddress.getSocketInetAddress();
@@ -92,7 +92,7 @@ public class AutoConnectionSourceImpl implements ConnectionSource {
           return inetSocketAddress.getPort() - otherInetSocketAddress.getPort();
         }
       };
-  private final List<HostAndPort> initialLocators;
+  private final List<LocatorAddress> initialLocators;
 
   private final String serverGroup;
   private AtomicReference<LocatorList> locators = new AtomicReference<>();
@@ -108,7 +108,7 @@ public class AutoConnectionSourceImpl implements ConnectionSource {
    */
   private final Map<InetSocketAddress, Exception> locatorState = new HashMap<>();
 
-  public AutoConnectionSourceImpl(List<HostAndPort> contacts, String serverGroup,
+  public AutoConnectionSourceImpl(List<LocatorAddress> contacts, String serverGroup,
       int handshakeTimeout) {
     this.locators.set(new LocatorList(new ArrayList<>(contacts)));
     this.onlineLocators.set(new LocatorList(Collections.emptyList()));
@@ -195,19 +195,19 @@ public class AutoConnectionSourceImpl implements ConnectionSource {
   }
 
 
-  private ServerLocationResponse queryOneLocator(HostAndPort locator,
+  private ServerLocationResponse queryOneLocator(LocatorAddress locator,
       ServerLocationRequest request) {
     return queryOneLocatorUsingConnection(locator, request, tcpClient);
   }
 
 
-  ServerLocationResponse queryOneLocatorUsingConnection(HostAndPort locator,
+  ServerLocationResponse queryOneLocatorUsingConnection(LocatorAddress locator,
       ServerLocationRequest request,
       TcpClient locatorConnection) {
     Object returnObj = null;
     try {
       pool.getStats().incLocatorRequests();
-      returnObj = locatorConnection.requestToServer(locator, request,
+      returnObj = locatorConnection.requestToServer(locator.getSocketInetAddress(), request,
           connectionTimeout, true);
       ServerLocationResponse response = (ServerLocationResponse) returnObj;
       pool.getStats().incLocatorResponses();
@@ -240,7 +240,7 @@ public class AutoConnectionSourceImpl implements ConnectionSource {
 
     final boolean isDebugEnabled = logger.isDebugEnabled();
     do {
-      HostAndPort hostAddress = (HostAndPort) controllerItr.next();
+      LocatorAddress hostAddress = (LocatorAddress) controllerItr.next();
       if (isDebugEnabled) {
         logger.debug("Sending query to locator {}: {}", hostAddress, request);
       }
@@ -259,13 +259,14 @@ public class AutoConnectionSourceImpl implements ConnectionSource {
     isBalanced = response.isBalanced();
     List<ServerLocation> locatorResponse = response.getLocators();
 
-    List<HostAndPort> newLocatorAddresses = new ArrayList<>(locatorResponse.size());
-    List<HostAndPort> newOnlineLocators = new ArrayList<>(locatorResponse.size());
+    List<LocatorAddress> newLocatorAddresses = new ArrayList<>(locatorResponse.size());
+    List<LocatorAddress> newOnlineLocators = new ArrayList<>(locatorResponse.size());
 
-    Set<HostAndPort> badLocators = new HashSet<>(initialLocators);
+    Set<LocatorAddress> badLocators = new HashSet<>(initialLocators);
 
     for (ServerLocation locator : locatorResponse) {
-      HostAndPort hostAddress = new HostAndPort(locator.getHostName(), locator.getPort());
+      InetSocketAddress address = new InetSocketAddress(locator.getHostName(), locator.getPort());
+      LocatorAddress hostAddress = new LocatorAddress(address, locator.getHostName());
       newLocatorAddresses.add(hostAddress);
       newOnlineLocators.add(hostAddress);
       badLocators.remove(hostAddress);
@@ -304,10 +305,10 @@ public class AutoConnectionSourceImpl implements ConnectionSource {
    * This method will add bad locator only when locator with hostname and port is not already in
    * list.
    */
-  protected void addbadLocators(List<HostAndPort> newLocators, Set<HostAndPort> badLocators) {
-    for (HostAndPort badloc : badLocators) {
+  protected void addbadLocators(List<LocatorAddress> newLocators, Set<LocatorAddress> badLocators) {
+    for (LocatorAddress badloc : badLocators) {
       boolean addIt = true;
-      for (HostAndPort goodloc : newLocators) {
+      for (LocatorAddress goodloc : newLocators) {
         boolean isSameHost = badloc.getHostName().equals(goodloc.getHostName());
         if (isSameHost && badloc.getPort() == goodloc.getPort()) {
           // ip has been changed so don't add this in current
@@ -373,23 +374,23 @@ public class AutoConnectionSourceImpl implements ConnectionSource {
    * A list of locators, which remembers the last known good locator.
    */
   private static class LocatorList {
-    protected final List<HostAndPort> locators;
+    protected final List<LocatorAddress> locators;
     AtomicInteger currentLocatorIndex = new AtomicInteger();
 
-    LocatorList(List<HostAndPort> locators) {
+    LocatorList(List<LocatorAddress> locators) {
       locators.sort(SOCKET_ADDRESS_COMPARATOR);
       this.locators = Collections.unmodifiableList(locators);
     }
 
     public List<InetSocketAddress> getLocators() {
       List<InetSocketAddress> locs = new ArrayList<>();
-      for (HostAndPort la : locators) {
+      for (LocatorAddress la : locators) {
         locs.add(la.getSocketInetAddress());
       }
       return locs;
     }
 
-    List<HostAndPort> getLocatorAddresses() {
+    List<LocatorAddress> getLocatorAddresses() {
       return locators;
     }
 
@@ -397,7 +398,7 @@ public class AutoConnectionSourceImpl implements ConnectionSource {
       return locators.size();
     }
 
-    public Iterator<HostAndPort> iterator() {
+    public Iterator<LocatorAddress> iterator() {
       return new LocatorIterator();
     }
 
@@ -412,7 +413,7 @@ public class AutoConnectionSourceImpl implements ConnectionSource {
      * controller.
      *
      */
-    protected class LocatorIterator implements Iterator<HostAndPort> {
+    protected class LocatorIterator implements Iterator<LocatorAddress> {
       private int startLocator = currentLocatorIndex.get();
       private int locatorNum = 0;
 
@@ -422,12 +423,12 @@ public class AutoConnectionSourceImpl implements ConnectionSource {
       }
 
       @Override
-      public HostAndPort next() {
+      public LocatorAddress next() {
         if (!hasNext()) {
           return null;
         } else {
           int index = (locatorNum + startLocator) % locators.size();
-          HostAndPort nextLocator = locators.get(index);
+          LocatorAddress nextLocator = locators.get(index);
           currentLocatorIndex.set(index);
           locatorNum++;
           return nextLocator;
diff --git a/geode-core/src/main/java/org/apache/geode/cache/client/internal/ConnectionImpl.java b/geode-core/src/main/java/org/apache/geode/cache/client/internal/ConnectionImpl.java
index 6409cdd..c149a72 100644
--- a/geode-core/src/main/java/org/apache/geode/cache/client/internal/ConnectionImpl.java
+++ b/geode-core/src/main/java/org/apache/geode/cache/client/internal/ConnectionImpl.java
@@ -32,7 +32,6 @@ import org.apache.geode.annotations.internal.MutableForTesting;
 import org.apache.geode.cache.wan.GatewaySender;
 import org.apache.geode.distributed.internal.InternalDistributedSystem;
 import org.apache.geode.distributed.internal.ServerLocation;
-import org.apache.geode.distributed.internal.tcpserver.HostAndPort;
 import org.apache.geode.internal.cache.tier.ClientSideHandshake;
 import org.apache.geode.internal.cache.tier.CommunicationMode;
 import org.apache.geode.internal.cache.tier.sockets.ServerConnection;
@@ -88,10 +87,8 @@ public class ConnectionImpl implements Connection {
       ClientSideHandshake handshake, int socketBufferSize, int handshakeTimeout, int readTimeout,
       CommunicationMode communicationMode, GatewaySender sender, SocketCreator sc)
       throws IOException {
-    theSocket =
-        sc.forClient().connect(new HostAndPort(location.getHostName(), location.getPort()),
-            handshakeTimeout,
-            socketBufferSize);
+    theSocket = sc.connectForClient(location.getHostName(), location.getPort(), handshakeTimeout,
+        socketBufferSize);
     theSocket.setTcpNoDelay(true);
     theSocket.setSendBufferSize(socketBufferSize);
 
diff --git a/geode-core/src/main/java/org/apache/geode/cache/client/internal/PoolImpl.java b/geode-core/src/main/java/org/apache/geode/cache/client/internal/PoolImpl.java
index 9f2abca..4e94a8d 100644
--- a/geode-core/src/main/java/org/apache/geode/cache/client/internal/PoolImpl.java
+++ b/geode-core/src/main/java/org/apache/geode/cache/client/internal/PoolImpl.java
@@ -28,7 +28,6 @@ import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.ScheduledExecutorService;
 import java.util.concurrent.TimeUnit;
 import java.util.concurrent.atomic.AtomicInteger;
-import java.util.stream.Collectors;
 
 import org.apache.logging.log4j.Logger;
 
@@ -55,7 +54,7 @@ import org.apache.geode.distributed.PoolCancelledException;
 import org.apache.geode.distributed.internal.DistributionConfig;
 import org.apache.geode.distributed.internal.InternalDistributedSystem;
 import org.apache.geode.distributed.internal.ServerLocation;
-import org.apache.geode.distributed.internal.tcpserver.HostAndPort;
+import org.apache.geode.distributed.internal.tcpserver.LocatorAddress;
 import org.apache.geode.internal.admin.ClientStatsManager;
 import org.apache.geode.internal.cache.EventID;
 import org.apache.geode.internal.cache.InternalCache;
@@ -113,9 +112,9 @@ public class PoolImpl implements InternalPool {
   private final int subscriptionAckInterval;
   private final int subscriptionTimeoutMultiplier;
   private final String serverGroup;
-  private final List<HostAndPort> locatorAddresses;
-  private final List<HostAndPort> locators;
-  private final List<HostAndPort> servers;
+  private final List<LocatorAddress> locatorAddresses;
+  private final List<InetSocketAddress> locators;
+  private final List<InetSocketAddress> servers;
   private final boolean startDisabled;
   private final boolean usedByGateway;
   private final int maxConnections;
@@ -158,7 +157,7 @@ public class PoolImpl implements InternalPool {
   private final ThreadsMonitoring threadMonitoring;
 
   public static PoolImpl create(PoolManagerImpl pm, String name, Pool attributes,
-      List<HostAndPort> locatorAddresses, InternalDistributedSystem distributedSystem,
+      List<LocatorAddress> locatorAddresses, InternalDistributedSystem distributedSystem,
       InternalCache cache, ThreadsMonitoring tMonitoring) {
     PoolImpl pool =
         new PoolImpl(pm, name, attributes, locatorAddresses, distributedSystem, cache, tMonitoring);
@@ -188,7 +187,7 @@ public class PoolImpl implements InternalPool {
   }
 
   protected PoolImpl(PoolManagerImpl pm, String name, Pool attributes,
-      List<HostAndPort> locatorAddresses, InternalDistributedSystem distributedSystem,
+      List<LocatorAddress> locatorAddresses, InternalDistributedSystem distributedSystem,
       InternalCache cache, ThreadsMonitoring threadMonitoring) {
     this.pm = pm;
     this.name = name;
@@ -225,11 +224,8 @@ public class PoolImpl implements InternalPool {
     }
     serverGroup = attributes.getServerGroup();
     multiuserSecureModeEnabled = attributes.getMultiuserAuthentication();
-    locators = attributes.getLocators().stream()
-        .map(x -> new HostAndPort(x.getHostName(), x.getPort())).collect(Collectors.toList());
-    servers = attributes.getServers().stream()
-        .map(x -> new HostAndPort(x.getHostName(), x.getPort())).collect(
-            Collectors.toList());
+    locators = attributes.getLocators();
+    servers = attributes.getServers();
     startDisabled =
         ((PoolFactoryImpl.PoolAttributes) attributes).startDisabled || !pm.isNormal();
     usedByGateway = ((PoolFactoryImpl.PoolAttributes) attributes).isGateway();
@@ -482,7 +478,7 @@ public class PoolImpl implements InternalPool {
 
   @Override
   public List<InetSocketAddress> getLocators() {
-    return locators.stream().map(x -> x.getSocketInetAddress()).collect(Collectors.toList());
+    return locators;
   }
 
   @Override
@@ -492,7 +488,7 @@ public class PoolImpl implements InternalPool {
 
   @Override
   public List<InetSocketAddress> getServers() {
-    return servers.stream().map(x -> x.getSocketInetAddress()).collect(Collectors.toList());
+    return servers;
   }
 
   public GatewaySender getGatewaySender() {
diff --git a/geode-core/src/main/java/org/apache/geode/distributed/Locator.java b/geode-core/src/main/java/org/apache/geode/distributed/Locator.java
index 3d5df2a..f7cf0d1 100644
--- a/geode-core/src/main/java/org/apache/geode/distributed/Locator.java
+++ b/geode-core/src/main/java/org/apache/geode/distributed/Locator.java
@@ -23,6 +23,7 @@ import java.util.Properties;
 
 import org.apache.geode.distributed.internal.InternalLocator;
 import org.apache.geode.internal.inet.LocalHostUtil;
+import org.apache.geode.internal.net.SocketCreator;
 
 /**
  * Represents a distribution locator server that provides discovery information to members and
@@ -385,7 +386,7 @@ public abstract class Locator {
     Object ba = this.bindAddress;
     if (ba == null) {
       try {
-        ba = LocalHostUtil.getLocalHost().getHostName();
+        ba = SocketCreator.getHostName(LocalHostUtil.getLocalHost());
       } catch (java.net.UnknownHostException uh) {
       }
     }
diff --git a/geode-core/src/main/java/org/apache/geode/distributed/LocatorLauncher.java b/geode-core/src/main/java/org/apache/geode/distributed/LocatorLauncher.java
index 21accc1..f5860c9 100644
--- a/geode-core/src/main/java/org/apache/geode/distributed/LocatorLauncher.java
+++ b/geode-core/src/main/java/org/apache/geode/distributed/LocatorLauncher.java
@@ -60,7 +60,6 @@ import org.apache.geode.cache.Cache;
 import org.apache.geode.cache.client.internal.locator.LocatorStatusRequest;
 import org.apache.geode.cache.client.internal.locator.LocatorStatusResponse;
 import org.apache.geode.distributed.internal.InternalLocator;
-import org.apache.geode.distributed.internal.tcpserver.HostAndPort;
 import org.apache.geode.distributed.internal.tcpserver.TcpClient;
 import org.apache.geode.distributed.internal.tcpserver.TcpSocketCreator;
 import org.apache.geode.internal.DistributionLocator;
@@ -325,8 +324,7 @@ public class LocatorLauncher extends AbstractLauncher<String> {
           InternalDataSerializer.getDSFIDSerializer().getObjectSerializer(),
           InternalDataSerializer.getDSFIDSerializer().getObjectDeserializer());
 
-      return (LocatorStatusResponse) client.requestToServer(
-          new HostAndPort(bindAddress == null ? null : bindAddress.getCanonicalHostName(), port),
+      return (LocatorStatusResponse) client.requestToServer(bindAddress, port,
           new LocatorStatusRequest(), timeout, true);
     } catch (ClassNotFoundException e) {
       throw new RuntimeException(e);
diff --git a/geode-core/src/main/java/org/apache/geode/distributed/internal/DistributionConfigImpl.java b/geode-core/src/main/java/org/apache/geode/distributed/internal/DistributionConfigImpl.java
index e039a2a..8a599ba 100644
--- a/geode-core/src/main/java/org/apache/geode/distributed/internal/DistributionConfigImpl.java
+++ b/geode-core/src/main/java/org/apache/geode/distributed/internal/DistributionConfigImpl.java
@@ -89,6 +89,7 @@ import org.apache.geode.InternalGemFireException;
 import org.apache.geode.distributed.DistributedSystem;
 import org.apache.geode.internal.ConfigSource;
 import org.apache.geode.internal.inet.LocalHostUtil;
+import org.apache.geode.internal.net.SocketCreator;
 import org.apache.geode.internal.process.ProcessLauncherContext;
 import org.apache.geode.internal.security.SecurableCommunicationChannel;
 import org.apache.geode.security.AuthTokenEnabledComponents;
@@ -1776,7 +1777,7 @@ public class DistributionConfigImpl extends AbstractDistributionConfig implement
         return bindAddress + "[" + startLocatorPort + "]";
       }
       try {
-        return LocalHostUtil.getLocalHost().getHostName() + "[" + startLocatorPort
+        return SocketCreator.getHostName(LocalHostUtil.getLocalHost()) + "[" + startLocatorPort
             + "]";
       } catch (UnknownHostException ignore) {
         // punt and use this.startLocator instead
diff --git a/geode-core/src/main/java/org/apache/geode/distributed/internal/membership/InternalDistributedMember.java b/geode-core/src/main/java/org/apache/geode/distributed/internal/membership/InternalDistributedMember.java
index 37a1b97..ac2bf6b 100755
--- a/geode-core/src/main/java/org/apache/geode/distributed/internal/membership/InternalDistributedMember.java
+++ b/geode-core/src/main/java/org/apache/geode/distributed/internal/membership/InternalDistributedMember.java
@@ -33,6 +33,8 @@ import org.jgroups.util.UUID;
 import org.apache.geode.InternalGemFireError;
 import org.apache.geode.annotations.Immutable;
 import org.apache.geode.annotations.VisibleForTesting;
+import org.apache.geode.annotations.internal.MutableForTesting;
+import org.apache.geode.cache.client.ServerConnectivityException;
 import org.apache.geode.distributed.DistributedMember;
 import org.apache.geode.distributed.DurableClientAttributes;
 import org.apache.geode.distributed.Role;
@@ -64,6 +66,11 @@ public class InternalDistributedMember
   public static final MemberIdentifierFactoryImpl MEMBER_IDENTIFIER_FACTORY =
       new MemberIdentifierFactoryImpl();
 
+  /** Retrieves an InetAddress given the provided hostname */
+  @MutableForTesting
+  protected static HostnameResolver hostnameResolver =
+      (location) -> InetAddress.getByName(location.getHostName());
+
   private final MemberIdentifier memberIdentifier;
 
   @VisibleForTesting
@@ -100,7 +107,7 @@ public class InternalDistributedMember
   }
 
   private static String getHostName(InetAddress i) {
-    return SocketCreator.resolve_dns ? i.getHostName() : i.getHostAddress();
+    return SocketCreator.resolve_dns ? SocketCreator.getHostName(i) : i.getHostAddress();
   }
 
   /**
@@ -138,8 +145,7 @@ public class InternalDistributedMember
 
   /**
    * Creates a new InternalDistributedMember for use in notifying listeners in client
-   * caches. The version information in the ID is set to Version.CURRENT and the host name
-   * is left unresolved (DistributedMember doesn't expose the InetAddress).
+   * caches. The version information in the ID is set to Version.CURRENT.
    *
    * @param location the coordinates of the server
    */
@@ -147,13 +153,23 @@ public class InternalDistributedMember
   public InternalDistributedMember(ServerLocation location) {
     memberIdentifier =
         MEMBER_IDENTIFIER_FACTORY.create(
-            MemberDataBuilder.newBuilderForLocalHost(location.getHostName())
+            MemberDataBuilder.newBuilder(getInetAddress(location), location.getHostName())
                 .setMembershipPort(location.getPort())
                 .setNetworkPartitionDetectionEnabled(false)
                 .setPreferredForCoordinator(true)
                 .build());
   }
 
+  private static InetAddress getInetAddress(ServerLocation location) {
+    final InetAddress addr;
+    try {
+      addr = hostnameResolver.getInetAddress(location);
+    } catch (UnknownHostException e) {
+      throw new ServerConnectivityException("Unable to resolve server location " + location, e);
+    }
+    return addr;
+  }
+
   /**
    * Create a InternalDistributedMember referring to the current host (as defined by the given
    * string) with additional info including optional connection name and an optional unique string.
@@ -251,6 +267,10 @@ public class InternalDistributedMember
     return mbr;
   }
 
+  public static void setHostnameResolver(final HostnameResolver hostnameResolver) {
+    InternalDistributedMember.hostnameResolver = hostnameResolver;
+  }
+
   /**
    * Returns this client member's durable attributes or null if no durable attributes were created.
    */
@@ -312,7 +332,7 @@ public class InternalDistributedMember
     memberIdentifier.setProcessId(OSProcess.getId());
     try {
       if (SocketCreator.resolve_dns) {
-        setHostName(LocalHostUtil.getLocalHost().getHostName());
+        setHostName(SocketCreator.getHostName(LocalHostUtil.getLocalHost()));
       } else {
         setHostName(LocalHostUtil.getLocalHost().getHostAddress());
       }
diff --git a/geode-core/src/main/java/org/apache/geode/internal/AbstractConfig.java b/geode-core/src/main/java/org/apache/geode/internal/AbstractConfig.java
index 37188fb..75b0b16 100644
--- a/geode-core/src/main/java/org/apache/geode/internal/AbstractConfig.java
+++ b/geode-core/src/main/java/org/apache/geode/internal/AbstractConfig.java
@@ -203,7 +203,7 @@ public abstract class AbstractConfig implements Config {
         // on Windows getHostName on mcast addrs takes ~5 seconds
         addrName = addr.getHostAddress();
       } else {
-        addrName = addr.getHostName();
+        addrName = SocketCreator.getHostName(addr);
       }
       return addrName;
     }
diff --git a/geode-core/src/main/java/org/apache/geode/internal/DSFIDFactory.java b/geode-core/src/main/java/org/apache/geode/internal/DSFIDFactory.java
index 993ad3e..81ee359 100644
--- a/geode-core/src/main/java/org/apache/geode/internal/DSFIDFactory.java
+++ b/geode-core/src/main/java/org/apache/geode/internal/DSFIDFactory.java
@@ -96,7 +96,6 @@ import org.apache.geode.distributed.internal.membership.gms.messages.RemoveMembe
 import org.apache.geode.distributed.internal.membership.gms.messages.SuspectMembersMessage;
 import org.apache.geode.distributed.internal.membership.gms.messages.ViewAckMessage;
 import org.apache.geode.distributed.internal.streaming.StreamingOperation.StreamingReplyMessage;
-import org.apache.geode.distributed.internal.tcpserver.HostAndPort;
 import org.apache.geode.internal.admin.ClientMembershipMessage;
 import org.apache.geode.internal.admin.remote.AddHealthListenerRequest;
 import org.apache.geode.internal.admin.remote.AddHealthListenerResponse;
@@ -973,7 +972,6 @@ public class DSFIDFactory implements DataSerializableFixedID {
     serializer.registerDSFID(GATEWAY_SENDER_QUEUE_ENTRY_SYNCHRONIZATION_ENTRY,
         GatewaySenderQueueEntrySynchronizationOperation.GatewaySenderQueueEntrySynchronizationEntry.class);
     serializer.registerDSFID(ABORT_BACKUP_REQUEST, AbortBackupRequest.class);
-    serializer.registerDSFID(HOST_AND_PORT, HostAndPort.class);
   }
 
   /**
diff --git a/geode-core/src/main/java/org/apache/geode/internal/DistributionLocator.java b/geode-core/src/main/java/org/apache/geode/internal/DistributionLocator.java
index 2842794..82c0e26 100644
--- a/geode-core/src/main/java/org/apache/geode/internal/DistributionLocator.java
+++ b/geode-core/src/main/java/org/apache/geode/internal/DistributionLocator.java
@@ -27,7 +27,6 @@ import org.apache.geode.SystemFailure;
 import org.apache.geode.annotations.internal.MakeNotStatic;
 import org.apache.geode.distributed.internal.InternalDistributedSystem;
 import org.apache.geode.distributed.internal.InternalLocator;
-import org.apache.geode.distributed.internal.tcpserver.HostAndPort;
 import org.apache.geode.distributed.internal.tcpserver.TcpClient;
 import org.apache.geode.internal.net.SocketCreatorFactory;
 import org.apache.geode.internal.security.SecurableCommunicationChannel;
@@ -74,9 +73,8 @@ public class DistributionLocator {
       new TcpClient(SocketCreatorFactory
           .getSocketCreatorForComponent(SecurableCommunicationChannel.LOCATOR),
           InternalDataSerializer.getDSFIDSerializer().getObjectSerializer(),
-          InternalDataSerializer.getDSFIDSerializer().getObjectDeserializer())
-              .stop(new HostAndPort(addr.getHostName(),
-                  port));
+          InternalDataSerializer.getDSFIDSerializer().getObjectDeserializer()).stop(addr,
+              port);
     } catch (ConnectException ignore) {
       // must not be running
     }
diff --git a/geode-core/src/main/java/org/apache/geode/internal/SystemAdmin.java b/geode-core/src/main/java/org/apache/geode/internal/SystemAdmin.java
index 75b7821..33a15a5 100644
--- a/geode-core/src/main/java/org/apache/geode/internal/SystemAdmin.java
+++ b/geode-core/src/main/java/org/apache/geode/internal/SystemAdmin.java
@@ -79,7 +79,6 @@ import org.apache.geode.distributed.internal.DistributionConfigImpl;
 import org.apache.geode.distributed.internal.HighPriorityAckedMessage;
 import org.apache.geode.distributed.internal.InternalDistributedSystem;
 import org.apache.geode.distributed.internal.membership.InternalDistributedMember;
-import org.apache.geode.distributed.internal.tcpserver.HostAndPort;
 import org.apache.geode.distributed.internal.tcpserver.TcpClient;
 import org.apache.geode.internal.admin.remote.TailLogResponse;
 import org.apache.geode.internal.cache.DiskStoreImpl;
@@ -262,10 +261,8 @@ public class SystemAdmin {
     if (Thread.interrupted())
       throw new InterruptedException();
     InetAddress addr = null; // fix for bug 30810
-    if (addressOption == null) {
+    if (addressOption == null)
       addressOption = "";
-    }
-    addressOption = addressOption.trim();
     if (!addressOption.equals("")) {
       // make sure its a valid ip address
       try {
@@ -292,7 +289,7 @@ public class SystemAdmin {
       if (portOption == null || portOption.trim().length() == 0) {
         port = info.getManagerPort();
       }
-      if (addr == null) {
+      if (addressOption.trim().length() == 0) {
         addr = info.getManagerAddress();
       }
 
@@ -301,7 +298,7 @@ public class SystemAdmin {
             .getSocketCreatorForComponent(SecurableCommunicationChannel.LOCATOR),
             InternalDataSerializer.getDSFIDSerializer().getObjectSerializer(),
             InternalDataSerializer.getDSFIDSerializer().getObjectDeserializer())
-                .stop(new HostAndPort(addr.getHostName(), port));
+                .stop(addr, port);
       } catch (java.net.ConnectException ce) {
         System.out.println(
             "Unable to connect to Locator process. Possible causes are that an incorrect bind address/port combination was specified to the stop-locator command or the process is unresponsive.");
diff --git a/geode-core/src/main/java/org/apache/geode/internal/admin/remote/DistributionLocatorId.java b/geode-core/src/main/java/org/apache/geode/internal/admin/remote/DistributionLocatorId.java
index a0526c0..c6f0874 100644
--- a/geode-core/src/main/java/org/apache/geode/internal/admin/remote/DistributionLocatorId.java
+++ b/geode-core/src/main/java/org/apache/geode/internal/admin/remote/DistributionLocatorId.java
@@ -16,19 +16,21 @@
 package org.apache.geode.internal.admin.remote;
 
 import java.net.InetAddress;
+import java.net.InetSocketAddress;
 import java.net.UnknownHostException;
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Collections;
 
 import org.apache.commons.lang3.StringUtils;
+import org.apache.commons.validator.routines.InetAddressValidator;
 
 import org.apache.geode.InternalGemFireException;
 import org.apache.geode.distributed.Locator;
 import org.apache.geode.distributed.internal.DistributionConfig;
-import org.apache.geode.distributed.internal.tcpserver.HostAndPort;
 import org.apache.geode.internal.admin.SSLConfig;
 import org.apache.geode.internal.inet.LocalHostUtil;
+import org.apache.geode.internal.net.SocketCreator;
 
 /**
  * Identifies the host, port, and bindAddress a distribution locator is listening on.
@@ -219,15 +221,24 @@ public class DistributionLocatorId implements java.io.Serializable {
    * ipString Otherwise we create InetAddress each time.
    *
    **/
-  public HostAndPort getHost() throws UnknownHostException {
-    if (host == null && hostname == null) {
-      throw new UnknownHostException("locator ID has no hostname or resolved inet address");
+  public InetSocketAddress getHost() throws UnknownHostException {
+    if (this.hostname != null) {
+      boolean isIpString = InetAddressValidator.getInstance().isValid(this.hostname);
+      if (isIpString) {
+        if (this.host == null) {
+          this.host = InetAddress.getByName(this.hostname);
+        }
+        return new InetSocketAddress(this.host, this.port);
+      }
     }
-    String addr = hostname;
-    if (host != null) {
-      addr = host.getHostName();
+
+    if (this.hostname == null) {
+      if (this.host != null) {
+        return new InetSocketAddress(this.host, this.port);
+      }
+      throw new UnknownHostException("locator ID has no hostname or resolved inet address");
     }
-    return new HostAndPort(addr, port);
+    return new InetSocketAddress(this.hostname, this.port);
   }
 
   /** returns the host name */
@@ -292,7 +303,7 @@ public class DistributionLocatorId implements java.io.Serializable {
       if (isMcastId()) {
         sb.append(this.host.getHostAddress());
       } else {
-        sb.append(this.host.getHostName());
+        sb.append(SocketCreator.getHostName(this.host));
       }
     }
 
diff --git a/geode-core/src/main/java/org/apache/geode/internal/cache/GemFireCacheImpl.java b/geode-core/src/main/java/org/apache/geode/internal/cache/GemFireCacheImpl.java
index 3a10052..06ceb62 100755
--- a/geode-core/src/main/java/org/apache/geode/internal/cache/GemFireCacheImpl.java
+++ b/geode-core/src/main/java/org/apache/geode/internal/cache/GemFireCacheImpl.java
@@ -249,6 +249,7 @@ import org.apache.geode.internal.jta.TransactionManagerImpl;
 import org.apache.geode.internal.lang.ThrowableUtils;
 import org.apache.geode.internal.logging.InternalLogWriter;
 import org.apache.geode.internal.monitoring.ThreadsMonitoring;
+import org.apache.geode.internal.net.SocketCreator;
 import org.apache.geode.internal.offheap.MemoryAllocator;
 import org.apache.geode.internal.security.SecurityService;
 import org.apache.geode.internal.security.SecurityServiceFactory;
@@ -2650,8 +2651,7 @@ public class GemFireCacheImpl implements InternalCache, InternalClientCache, Has
         if (result == null) {
           result = new HashSet<>();
         }
-        result.add(InetSocketAddress.createUnresolved(serverLocation.getHostName(),
-            serverLocation.getPort()));
+        result.add(new InetSocketAddress(serverLocation.getHostName(), serverLocation.getPort()));
       }
     }
     if (result == null) {
@@ -2747,7 +2747,7 @@ public class GemFireCacheImpl implements InternalCache, InternalClientCache, Has
   private PoolFactory createDefaultPF() {
     PoolFactory defaultPoolFactory = PoolManager.createFactory();
     try {
-      String localHostName = LocalHostUtil.getLocalHost().getHostName();
+      String localHostName = SocketCreator.getHostName(LocalHostUtil.getLocalHost());
       defaultPoolFactory.addServer(localHostName, CacheServer.DEFAULT_PORT);
     } catch (UnknownHostException ex) {
       throw new IllegalStateException("Could not determine local host name", ex);
@@ -2772,7 +2772,7 @@ public class GemFireCacheImpl implements InternalCache, InternalClientCache, Has
     if (poolFactoryImpl.getPoolAttributes().locators.isEmpty()
         && poolFactoryImpl.getPoolAttributes().servers.isEmpty()) {
       try {
-        String localHostName = LocalHostUtil.getLocalHost().getHostName();
+        String localHostName = SocketCreator.getHostName(LocalHostUtil.getLocalHost());
         poolFactoryImpl.addServer(localHostName, CacheServer.DEFAULT_PORT);
       } catch (UnknownHostException ex) {
         throw new IllegalStateException("Could not determine local host name", ex);
diff --git a/geode-core/src/main/java/org/apache/geode/internal/cache/PoolFactoryImpl.java b/geode-core/src/main/java/org/apache/geode/internal/cache/PoolFactoryImpl.java
index 51f3e56..09be556 100644
--- a/geode-core/src/main/java/org/apache/geode/internal/cache/PoolFactoryImpl.java
+++ b/geode-core/src/main/java/org/apache/geode/internal/cache/PoolFactoryImpl.java
@@ -17,19 +17,19 @@ package org.apache.geode.internal.cache;
 
 import java.io.DataInput;
 import java.io.DataOutput;
-import java.io.Externalizable;
 import java.io.IOException;
-import java.io.ObjectInput;
-import java.io.ObjectOutput;
+import java.net.InetAddress;
 import java.net.InetSocketAddress;
+import java.net.UnknownHostException;
 import java.util.ArrayList;
+import java.util.Collections;
 import java.util.HashSet;
 import java.util.List;
 import java.util.Objects;
-import java.util.stream.Collectors;
 
 import org.apache.logging.log4j.Logger;
 
+import org.apache.geode.DataSerializable;
 import org.apache.geode.DataSerializer;
 import org.apache.geode.annotations.VisibleForTesting;
 import org.apache.geode.cache.CacheException;
@@ -40,7 +40,7 @@ import org.apache.geode.cache.client.internal.PoolImpl;
 import org.apache.geode.cache.query.QueryService;
 import org.apache.geode.cache.wan.GatewaySender;
 import org.apache.geode.distributed.internal.InternalDistributedSystem;
-import org.apache.geode.distributed.internal.tcpserver.HostAndPort;
+import org.apache.geode.distributed.internal.tcpserver.LocatorAddress;
 import org.apache.geode.internal.monitoring.ThreadsMonitoring;
 import org.apache.geode.logging.internal.log4j.api.LogService;
 import org.apache.geode.pdx.internal.TypeRegistry;
@@ -58,7 +58,7 @@ public class PoolFactoryImpl implements InternalPoolFactory {
    */
   private PoolAttributes attributes = new PoolAttributes();
 
-  private final List<HostAndPort> locatorAddresses = new ArrayList<>();
+  private final List<LocatorAddress> locatorAddresses = new ArrayList<>();
 
   /**
    * The cache that created this factory
@@ -248,6 +248,28 @@ public class PoolFactoryImpl implements InternalPoolFactory {
     return this;
   }
 
+  private InetSocketAddress getInetSocketAddress(String host, int port) {
+    if (port == 0) {
+      throw new IllegalArgumentException("port must be greater than 0 but was " + port);
+      // the rest of the port validation is done by InetSocketAddress
+    }
+    InetSocketAddress sockAddr;
+    try {
+      InetAddress hostAddr = InetAddress.getByName(host);
+      sockAddr = new InetSocketAddress(hostAddr, port);
+    } catch (UnknownHostException ignore) {
+      // IllegalArgumentException ex = new IllegalArgumentException("Unknown host " + host);
+      // ex.initCause(cause);
+      // throw ex;
+      // Fix for #45348
+      logger.warn(
+          "Hostname is unknown: {}. Creating pool with unknown host in case the host becomes known later.",
+          host);
+      sockAddr = new InetSocketAddress(host, port);
+    }
+    return sockAddr;
+  }
+
   @Override
   public PoolFactory setSubscriptionAckInterval(int ackInterval) {
     if (ackInterval <= 0) {
@@ -264,10 +286,9 @@ public class PoolFactoryImpl implements InternalPoolFactory {
       throw new IllegalStateException(
           "A server has already been added. You can only add locators or servers; not both.");
     }
-    validatePort(port);
-    HostAndPort address = new HostAndPort(host, port);
-    attributes.locators.add(address);
-    locatorAddresses.add(address);
+    InetSocketAddress isa = getInetSocketAddress(host, port);
+    attributes.locators.add(isa);
+    locatorAddresses.add(new LocatorAddress(isa, host));
     return this;
   }
 
@@ -277,17 +298,10 @@ public class PoolFactoryImpl implements InternalPoolFactory {
       throw new IllegalStateException(
           "A locator has already been added. You can only add locators or servers; not both.");
     }
-    validatePort(port);
-    attributes.servers.add(new HostAndPort(host, port));
+    attributes.servers.add(getInetSocketAddress(host, port));
     return this;
   }
 
-  private void validatePort(int port) {
-    if (port <= 0) {
-      throw new IllegalArgumentException("port must be greater than 0 but was " + port);
-    }
-  }
-
   @Override
   public PoolFactory reset() {
     // preserve the startDisabled across resets
@@ -318,11 +332,10 @@ public class PoolFactoryImpl implements InternalPoolFactory {
     setSubscriptionAckInterval(cp.getSubscriptionAckInterval());
     setServerGroup(cp.getServerGroup());
     setMultiuserAuthentication(cp.getMultiuserAuthentication());
-    for (InetSocketAddress address : cp.getLocators()) {
-      addLocator(address.getHostName(), address.getPort());
+    for (InetSocketAddress inetSocketAddress : cp.getLocators()) {
+      addLocator(inetSocketAddress.getHostName(), inetSocketAddress.getPort());
     }
-    attributes.servers.addAll(cp.getServers().stream()
-        .map(x -> new HostAndPort(x.getHostName(), x.getPort())).collect(Collectors.toList()));
+    attributes.servers.addAll(cp.getServers());
   }
 
   public void init(GatewaySender sender) {
@@ -392,7 +405,7 @@ public class PoolFactoryImpl implements InternalPoolFactory {
   /**
    * Not a true pool just the attributes. Serialization is used by unit tests
    */
-  public static class PoolAttributes implements Pool, Externalizable {
+  public static class PoolAttributes implements Pool, DataSerializable {
 
     private static final long serialVersionUID = 1L; // for findbugs
 
@@ -417,8 +430,8 @@ public class PoolFactoryImpl implements InternalPoolFactory {
     int subscriptionTimeoutMultipler = DEFAULT_SUBSCRIPTION_TIMEOUT_MULTIPLIER;
     public String serverGroup = DEFAULT_SERVER_GROUP;
     boolean multiuserSecureModeEnabled = DEFAULT_MULTIUSER_AUTHENTICATION;
-    public ArrayList<HostAndPort> locators = new ArrayList<>();
-    public ArrayList<HostAndPort> servers = new ArrayList<>();
+    public ArrayList<InetSocketAddress> locators = new ArrayList<>();
+    public ArrayList<InetSocketAddress> servers = new ArrayList<>();
     public transient boolean startDisabled = false; // only used by junit tests
     public transient LocatorDiscoveryCallback locatorCallback = null; // only used by tests
     public GatewaySender gatewaySender = null;
@@ -554,7 +567,7 @@ public class PoolFactoryImpl implements InternalPoolFactory {
         throw new IllegalStateException(
             "At least one locator or server must be added before a connection pool can be created.");
       }
-      return locators.stream().map(x -> x.getSocketInetAddress()).collect(Collectors.toList());
+      return Collections.unmodifiableList(new ArrayList<>(locators));
     }
 
     @Override
@@ -569,7 +582,7 @@ public class PoolFactoryImpl implements InternalPoolFactory {
             "At least one locator or server must be added before a connection pool can be created.");
       }
       // needs to return a copy.
-      return servers.stream().map(x -> x.getSocketInetAddress()).collect(Collectors.toList());
+      return Collections.unmodifiableList(new ArrayList<>(servers));
     }
 
     @Override
@@ -603,6 +616,7 @@ public class PoolFactoryImpl implements InternalPoolFactory {
     }
 
 
+    @Override
     public void toData(DataOutput out) throws IOException {
       DataSerializer.writePrimitiveInt(connectionTimeout, out);
       DataSerializer.writePrimitiveInt(connectionLifetime, out);
@@ -625,6 +639,7 @@ public class PoolFactoryImpl implements InternalPoolFactory {
       DataSerializer.writePrimitiveInt(socketConnectTimeout, out);
     }
 
+    @Override
     public void fromData(DataInput in) throws IOException, ClassNotFoundException {
       connectionTimeout = DataSerializer.readPrimitiveInt(in);
       connectionLifetime = DataSerializer.readPrimitiveInt(in);
@@ -688,15 +703,5 @@ public class PoolFactoryImpl implements InternalPoolFactory {
           && Objects.equals(locatorCallback, that.locatorCallback)
           && Objects.equals(gatewaySender, that.gatewaySender);
     }
-
-    @Override
-    public void writeExternal(ObjectOutput out) throws IOException {
-      toData(out);
-    }
-
-    @Override
-    public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
-      fromData(in);
-    }
   }
 }
diff --git a/geode-core/src/main/java/org/apache/geode/internal/cache/persistence/PersistentMemberPattern.java b/geode-core/src/main/java/org/apache/geode/internal/cache/persistence/PersistentMemberPattern.java
index db0726e..1b9d56a 100644
--- a/geode-core/src/main/java/org/apache/geode/internal/cache/persistence/PersistentMemberPattern.java
+++ b/geode-core/src/main/java/org/apache/geode/internal/cache/persistence/PersistentMemberPattern.java
@@ -22,6 +22,7 @@ import java.util.UUID;
 
 import org.apache.geode.DataSerializer;
 import org.apache.geode.cache.persistence.PersistentID;
+import org.apache.geode.internal.net.SocketCreator;
 
 /**
  * Implementation of the public PersistentID. It holds the region, host, directory, and timestamp.
@@ -95,7 +96,7 @@ public class PersistentMemberPattern implements PersistentID, Comparable<Persist
     result.append(diskStoreID);
     if (host != null) {
       result.append(" [");
-      result.append(host.getHostName());
+      result.append(SocketCreator.getHostName(host));
       result.append(":");
       result.append(directory);
       result.append(",revoked@").append(revokedTime);
diff --git a/geode-core/src/main/java/org/apache/geode/internal/cache/tier/sockets/AcceptorImpl.java b/geode-core/src/main/java/org/apache/geode/internal/cache/tier/sockets/AcceptorImpl.java
index fe3f206..b4a475e 100755
--- a/geode-core/src/main/java/org/apache/geode/internal/cache/tier/sockets/AcceptorImpl.java
+++ b/geode-core/src/main/java/org/apache/geode/internal/cache/tier/sockets/AcceptorImpl.java
@@ -365,6 +365,7 @@ public class AcceptorImpl implements Acceptor, Runnable {
    * @param maxThreads the maximum number of threads allowed in the server pool
    * @param securityService the SecurityService to use for authentication and authorization
    *
+   * @see SocketCreator#createServerSocket(int, int, InetAddress)
    * @see ClientHealthMonitor
    *
    * @since GemFire 5.7
@@ -511,7 +512,7 @@ public class AcceptorImpl implements Acceptor, Runnable {
       final long tilt = System.currentTimeMillis() + timeLimitMillis;
 
       if (isSelector()) {
-        if (socketCreator.forCluster().useSSL()) {
+        if (socketCreator.useSSL()) {
           throw new IllegalArgumentException(
               "Selector thread pooling can not be used with client/server SSL. The selector can be disabled by setting max-threads=0.");
         }
@@ -1544,7 +1545,7 @@ public class AcceptorImpl implements Acceptor, Runnable {
 
   private CommunicationMode getCommunicationModeForNonSelector(Socket socket) throws IOException {
     socket.setSoTimeout(0);
-    socketCreator.forCluster().handshakeIfSocketIsSSL(socket, acceptTimeout);
+    socketCreator.handshakeIfSocketIsSSL(socket, acceptTimeout);
     byte communicationModeByte = (byte) socket.getInputStream().read();
     if (communicationModeByte == -1) {
       throw new EOFException();
diff --git a/geode-core/src/main/java/org/apache/geode/internal/cache/tier/sockets/CacheClientUpdater.java b/geode-core/src/main/java/org/apache/geode/internal/cache/tier/sockets/CacheClientUpdater.java
index 7a196c7..64eaa1c 100644
--- a/geode-core/src/main/java/org/apache/geode/internal/cache/tier/sockets/CacheClientUpdater.java
+++ b/geode-core/src/main/java/org/apache/geode/internal/cache/tier/sockets/CacheClientUpdater.java
@@ -59,7 +59,6 @@ import org.apache.geode.distributed.internal.InternalDistributedSystem;
 import org.apache.geode.distributed.internal.InternalDistributedSystem.DisconnectListener;
 import org.apache.geode.distributed.internal.ServerLocation;
 import org.apache.geode.distributed.internal.membership.InternalDistributedMember;
-import org.apache.geode.distributed.internal.tcpserver.HostAndPort;
 import org.apache.geode.internal.Assert;
 import org.apache.geode.internal.InternalDataSerializer;
 import org.apache.geode.internal.InternalInstantiator;
@@ -316,8 +315,7 @@ public class CacheClientUpdater extends LoggingThread implements ClientUpdater,
       int socketBufferSize =
           Integer.getInteger("BridgeServer.SOCKET_BUFFER_SIZE", DEFAULT_SOCKET_BUFFER_SIZE);
 
-      mySock = socketCreator.forClient().connect(
-          new HostAndPort(location.getHostName(), location.getPort()),
+      mySock = socketCreator.connectForClient(location.getHostName(), location.getPort(),
           handshakeTimeout, socketBufferSize);
       mySock.setTcpNoDelay(true);
       mySock.setSendBufferSize(socketBufferSize);
diff --git a/geode-core/src/main/java/org/apache/geode/internal/cache/wan/AbstractGatewaySender.java b/geode-core/src/main/java/org/apache/geode/internal/cache/wan/AbstractGatewaySender.java
index b22d053..dfcc6dc 100644
--- a/geode-core/src/main/java/org/apache/geode/internal/cache/wan/AbstractGatewaySender.java
+++ b/geode-core/src/main/java/org/apache/geode/internal/cache/wan/AbstractGatewaySender.java
@@ -791,7 +791,7 @@ public abstract class AbstractGatewaySender implements InternalGatewaySender, Di
     synchronized (this.eventProcessor.getRunningStateLock()) {
       while (this.eventProcessor.getException() == null && this.eventProcessor.isStopped()) {
         try {
-          this.eventProcessor.getRunningStateLock().wait(1000);
+          this.eventProcessor.getRunningStateLock().wait();
         } catch (InterruptedException e) {
           Thread.currentThread().interrupt();
         }
diff --git a/geode-core/src/main/java/org/apache/geode/internal/net/SCAdvancedSocketCreator.java b/geode-core/src/main/java/org/apache/geode/internal/net/SCAdvancedSocketCreator.java
deleted file mode 100644
index 4879e60..0000000
--- a/geode-core/src/main/java/org/apache/geode/internal/net/SCAdvancedSocketCreator.java
+++ /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.
- */
-package org.apache.geode.internal.net;
-
-import java.io.IOException;
-import java.net.InetAddress;
-import java.net.InetSocketAddress;
-import java.net.Socket;
-
-import javax.net.SocketFactory;
-
-import org.apache.geode.GemFireConfigException;
-import org.apache.geode.SystemConnectException;
-import org.apache.geode.distributed.internal.tcpserver.AdvancedSocketCreatorImpl;
-import org.apache.geode.distributed.internal.tcpserver.ConnectionWatcher;
-import org.apache.geode.distributed.internal.tcpserver.HostAndPort;
-
-class SCAdvancedSocketCreator extends AdvancedSocketCreatorImpl {
-  final SocketCreator coreSocketCreator;
-
-  protected SCAdvancedSocketCreator(SocketCreator socketCreator) {
-    super(socketCreator);
-    coreSocketCreator = socketCreator;
-  }
-
-  @Override
-  public void handshakeIfSocketIsSSL(Socket socket, int timeout) throws IOException {
-    coreSocketCreator.handshakeIfSocketIsSSL(socket, timeout);
-  }
-
-  @Override
-  public Socket connect(HostAndPort addr, int timeout,
-      ConnectionWatcher optionalWatcher, boolean allowClientSocketFactory, int socketBufferSize,
-      boolean useSSL) throws IOException {
-
-    coreSocketCreator.printConfig();
-
-    if (!useSSL) {
-      return super.connect(addr, timeout, optionalWatcher, allowClientSocketFactory,
-          socketBufferSize,
-          useSSL);
-    }
-
-    // create an SSL connection
-
-    Socket socket;
-    InetSocketAddress sockaddr = addr.getSocketInetAddress();
-    if (sockaddr.getAddress() == null) {
-      InetAddress address = InetAddress.getByName(sockaddr.getHostName());
-      sockaddr = new InetSocketAddress(address, sockaddr.getPort());
-    }
-
-    if (coreSocketCreator.getSslContext() == null) {
-      throw new GemFireConfigException(
-          "SSL not configured correctly, Please look at previous error");
-    }
-    SocketFactory sf = coreSocketCreator.getSslContext().getSocketFactory();
-    socket = sf.createSocket();
-
-    // Optionally enable SO_KEEPALIVE in the OS network protocol.
-    socket.setKeepAlive(ENABLE_TCP_KEEP_ALIVE);
-
-    // If necessary, set the receive buffer size before connecting the
-    // socket so that large buffers will be allocated on accepted sockets
-    // (see java.net.Socket.setReceiverBufferSize javadocs for details)
-    if (socketBufferSize != -1) {
-      socket.setReceiveBufferSize(socketBufferSize);
-    }
-
-    try {
-      if (optionalWatcher != null) {
-        optionalWatcher.beforeConnect(socket);
-      }
-      socket.connect(sockaddr, Math.max(timeout, 0));
-      coreSocketCreator.configureClientSSLSocket(socket, timeout);
-      return socket;
-
-    } finally {
-      if (optionalWatcher != null) {
-        optionalWatcher.afterConnect(socket);
-      }
-    }
-  }
-
-  @Override
-  protected RuntimeException problemCreatingSocketInPortRangeException(String s, IOException e) {
-    return new GemFireConfigException(s, e);
-  }
-
-  @Override
-  protected RuntimeException noFreePortException(String reason) {
-    return new SystemConnectException(reason);
-  }
-
-  @Override
-  protected Socket createCustomClientSocket(HostAndPort addr) throws IOException {
-    if (coreSocketCreator.getClientSocketFactory() != null) {
-      InetSocketAddress inetSocketAddress = addr.getSocketInetAddress();
-      return coreSocketCreator.getClientSocketFactory().createSocket(inetSocketAddress.getAddress(),
-          inetSocketAddress.getPort());
-    }
-    return null;
-  }
-
-
-
-}
diff --git a/geode-core/src/main/java/org/apache/geode/internal/net/SCServerSocketCreator.java b/geode-core/src/main/java/org/apache/geode/internal/net/SCServerSocketCreator.java
deleted file mode 100644
index 572b330..0000000
--- a/geode-core/src/main/java/org/apache/geode/internal/net/SCServerSocketCreator.java
+++ /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.
- */
-package org.apache.geode.internal.net;
-
-import java.io.IOException;
-import java.net.InetAddress;
-import java.net.InetSocketAddress;
-import java.net.ServerSocket;
-import java.net.Socket;
-
-import javax.net.ServerSocketFactory;
-import javax.net.ssl.SSLParameters;
-import javax.net.ssl.SSLServerSocket;
-
-import org.apache.geode.GemFireConfigException;
-import org.apache.geode.distributed.internal.tcpserver.ServerSocketCreatorImpl;
-import org.apache.geode.internal.admin.SSLConfig;
-import org.apache.geode.net.SSLParameterExtension;
-
-class SCServerSocketCreator extends ServerSocketCreatorImpl {
-  private final SocketCreator coreSocketCreator;
-
-  protected SCServerSocketCreator(SocketCreator socketCreator) {
-    super(socketCreator);
-    coreSocketCreator = socketCreator;
-  }
-
-  @Override
-  public void handshakeIfSocketIsSSL(Socket socket, int timeout) throws IOException {
-    coreSocketCreator.handshakeIfSocketIsSSL(socket, timeout);
-  }
-
-  public ServerSocket createServerSocket(int nport, int backlog, InetAddress bindAddr,
-      int socketBufferSize) throws IOException {
-    return createServerSocket(nport, backlog, bindAddr, socketBufferSize,
-        coreSocketCreator.useSSL());
-  }
-
-  @Override
-  protected ServerSocket createServerSocket(int nport, int backlog, InetAddress bindAddr,
-      int socketBufferSize, boolean sslConnection) throws IOException {
-    coreSocketCreator.printConfig();
-    if (!sslConnection) {
-      return super.createServerSocket(nport, backlog, bindAddr, socketBufferSize, sslConnection);
-    }
-    if (coreSocketCreator.getSslContext() == null) {
-      throw new GemFireConfigException(
-          "SSL not configured correctly, Please look at previous error");
-    }
-    ServerSocketFactory ssf = coreSocketCreator.getSslContext().getServerSocketFactory();
-    SSLServerSocket serverSocket = (SSLServerSocket) ssf.createServerSocket();
-    serverSocket.setReuseAddress(true);
-    // If necessary, set the receive buffer size before binding the socket so
-    // that large buffers will be allocated on accepted sockets (see
-    // java.net.ServerSocket.setReceiverBufferSize javadocs)
-    if (socketBufferSize != -1) {
-      serverSocket.setReceiveBufferSize(socketBufferSize);
-    }
-    serverSocket.bind(new InetSocketAddress(bindAddr, nport), backlog);
-    finishServerSocket(serverSocket);
-    return serverSocket;
-  }
-
-  /**
-   * Configure the SSLServerSocket based on this SocketCreator's settings.
-   */
-  private void finishServerSocket(SSLServerSocket serverSocket) {
-    SSLConfig sslConfig = coreSocketCreator.getSslConfig();
-    serverSocket.setUseClientMode(false);
-    if (sslConfig.isRequireAuth()) {
-      // serverSocket.setWantClientAuth( true );
-      serverSocket.setNeedClientAuth(true);
-    }
-    serverSocket.setEnableSessionCreation(true);
-
-    // restrict protocols
-    String[] protocols = sslConfig.getProtocolsAsStringArray();
-    if (!"any".equalsIgnoreCase(protocols[0])) {
-      serverSocket.setEnabledProtocols(protocols);
-    }
-    // restrict ciphers
-    String[] ciphers = sslConfig.getCiphersAsStringArray();
-    if (!"any".equalsIgnoreCase(ciphers[0])) {
-      serverSocket.setEnabledCipherSuites(ciphers);
-    }
-
-    SSLParameterExtension sslParameterExtension = sslConfig.getSSLParameterExtension();
-    if (sslParameterExtension != null) {
-      SSLParameters modifiedParams =
-          sslParameterExtension.modifySSLServerSocketParameters(serverSocket.getSSLParameters());
-      serverSocket.setSSLParameters(modifiedParams);
-    }
-
-  }
-
-
-}
diff --git a/geode-core/src/main/java/org/apache/geode/internal/net/SocketCreator.java b/geode-core/src/main/java/org/apache/geode/internal/net/SocketCreator.java
index 8027dfd..427e758 100755
--- a/geode-core/src/main/java/org/apache/geode/internal/net/SocketCreator.java
+++ b/geode-core/src/main/java/org/apache/geode/internal/net/SocketCreator.java
@@ -23,6 +23,7 @@ import java.net.InetAddress;
 import java.net.InetSocketAddress;
 import java.net.ServerSocket;
 import java.net.Socket;
+import java.net.SocketAddress;
 import java.net.SocketException;
 import java.net.SocketTimeoutException;
 import java.net.UnknownHostException;
@@ -40,7 +41,10 @@ import java.security.cert.X509Certificate;
 import java.util.List;
 import java.util.Map;
 import java.util.Properties;
+import java.util.concurrent.ConcurrentHashMap;
 
+import javax.net.ServerSocketFactory;
+import javax.net.SocketFactory;
 import javax.net.ssl.KeyManager;
 import javax.net.ssl.KeyManagerFactory;
 import javax.net.ssl.SSLContext;
@@ -50,6 +54,7 @@ import javax.net.ssl.SSLHandshakeException;
 import javax.net.ssl.SSLParameters;
 import javax.net.ssl.SSLPeerUnverifiedException;
 import javax.net.ssl.SSLProtocolException;
+import javax.net.ssl.SSLServerSocket;
 import javax.net.ssl.SSLSocket;
 import javax.net.ssl.TrustManager;
 import javax.net.ssl.TrustManagerFactory;
@@ -59,15 +64,15 @@ import org.apache.commons.lang3.StringUtils;
 import org.apache.logging.log4j.Logger;
 
 import org.apache.geode.GemFireConfigException;
+import org.apache.geode.SystemConnectException;
 import org.apache.geode.SystemFailure;
-import org.apache.geode.annotations.VisibleForTesting;
 import org.apache.geode.annotations.internal.MakeNotStatic;
 import org.apache.geode.cache.wan.GatewaySender;
 import org.apache.geode.cache.wan.GatewayTransportFilter;
 import org.apache.geode.distributed.ClientSocketFactory;
 import org.apache.geode.distributed.internal.DistributionConfig;
 import org.apache.geode.distributed.internal.DistributionConfigImpl;
-import org.apache.geode.distributed.internal.tcpserver.AdvancedSocketCreatorImpl;
+import org.apache.geode.distributed.internal.tcpserver.ConnectionWatcher;
 import org.apache.geode.distributed.internal.tcpserver.TcpSocketCreatorImpl;
 import org.apache.geode.internal.ClassPathLoader;
 import org.apache.geode.internal.admin.SSLConfig;
@@ -83,18 +88,31 @@ import org.apache.geode.util.internal.GeodeGlossary;
 
 
 /**
- * SocketCreators are built using a SocketCreatorFactory using Geode distributed-system properties.
- * They know how to properly configure sockets for TLS (SSL) communications and perform
- * handshakes. Connection-initiation uses a HostAndPort instance that is similar to an
- * InetSocketAddress.
+ * Analyze configuration data (gemfire.properties) and configure sockets accordingly for SSL.
  * <p>
- * SocketCreator also supports a client-socket-factory that is designated with the property
- * gemfire.clientSocketFactory for use in creating client->server connections.
+ * gemfire.useSSL = (true|false) default false.<br/>
+ * gemfire.ssl.debug = (true|false) default false.<br/>
+ * gemfire.ssl.needClientAuth = (true|false) default true.<br/>
+ * gemfire.ssl.protocols = <i>list of protocols</i><br/>
+ * gemfire.ssl.ciphers = <i>list of cipher suites</i><br/>
+ * <p>
+ * The following may be included to configure the certificates used by the Sun Provider.
+ * <p>
+ * javax.net.ssl.trustStore = <i>pathname</i><br/>
+ * javax.net.ssl.trustStorePassword = <i>password</i><br/>
+ * javax.net.ssl.keyStore = <i>pathname</i><br/>
+ * javax.net.ssl.keyStorePassword = <i>password</i><br/>
+ * <p>
+ * Additional properties will be set as System properties to be available as needed by other
+ * provider implementations.
  */
 public class SocketCreator extends TcpSocketCreatorImpl {
 
   private static final Logger logger = LogService.getLogger();
 
+  @MakeNotStatic
+  private static final ConcurrentHashMap<InetAddress, String> hostNames = new ConcurrentHashMap<>();
+
   /**
    * flag to force always using DNS (regardless of the fact that these lookups can hang)
    */
@@ -123,11 +141,17 @@ public class SocketCreator extends TcpSocketCreatorImpl {
   private boolean hostnameValidationDisabledLogShown = false;
 
 
+  /**
+   * context for SSL socket factories
+   */
   private SSLContext sslContext;
 
   private final SSLConfig sslConfig;
 
 
+  /**
+   * A factory used to create client <code>Sockets</code>.
+   */
   private ClientSocketFactory clientSocketFactory;
 
   /**
@@ -135,8 +159,20 @@ public class SocketCreator extends TcpSocketCreatorImpl {
    * gemfire.setTcpKeepAlive java system property. If not set then GemFire will enable keep-alive on
    * server->client and p2p connections.
    */
-  public static final boolean ENABLE_TCP_KEEP_ALIVE =
-      AdvancedSocketCreatorImpl.ENABLE_TCP_KEEP_ALIVE;
+  public static final boolean ENABLE_TCP_KEEP_ALIVE = TcpSocketCreatorImpl.ENABLE_TCP_KEEP_ALIVE;
+
+  // -------------------------------------------------------------------------
+  // Constructor
+  // -------------------------------------------------------------------------
+
+  /**
+   * Constructs new SocketCreator instance.
+   */
+  public SocketCreator(final SSLConfig sslConfig) {
+    this.sslConfig = sslConfig;
+    initialize();
+  }
+
 
   // -------------------------------------------------------------------------
   // Static instance accessors
@@ -149,29 +185,43 @@ public class SocketCreator extends TcpSocketCreatorImpl {
     return LocalHostUtil.getLocalHost();
   }
 
-  // -------------------------------------------------------------------------
-  // Constructor
-  // -------------------------------------------------------------------------
+  /**
+   * returns the host name for the given inet address, using a local cache of names to avoid dns
+   * hits and duplicate strings
+   */
+  public static String getHostName(InetAddress addr) {
+    String result = hostNames.get(addr);
+    if (result == null) {
+      result = addr.getHostName();
+      hostNames.put(addr, result);
+    }
+    return result;
+  }
 
   /**
-   * Constructs new SocketCreator instance.
+   * returns the host name for the given inet address, using a local cache of names to avoid dns
+   * hits and duplicate strings
    */
-  public SocketCreator(final SSLConfig sslConfig) {
-    this.sslConfig = sslConfig;
-    initialize();
+  public static String getCanonicalHostName(InetAddress addr, String hostName) {
+    String result = hostNames.get(addr);
+    if (result == null) {
+      hostNames.put(addr, hostName);
+      return hostName;
+    }
+    return result;
   }
 
+  /**
+   * Reset the hostNames caches
+   */
+  public static void resetHostNameCache() {
+    hostNames.clear();
+  }
 
   // -------------------------------------------------------------------------
   // Initializers (change SocketCreator state)
   // -------------------------------------------------------------------------
 
-  protected void initializeCreators() {
-    serverSocketCreator = new SCServerSocketCreator(this);
-    clientSocketCreator = new SCClientSocketCreator(this);
-    advancedSocketCreator = new SCAdvancedSocketCreator(this);
-  }
-
   /**
    * Initialize this SocketCreator.
    * <p>
@@ -180,7 +230,7 @@ public class SocketCreator extends TcpSocketCreatorImpl {
   private void initialize() {
     try {
       try {
-        if (this.sslConfig.isEnabled() && getSslContext() == null) {
+        if (this.sslConfig.isEnabled() && sslContext == null) {
           sslContext = createAndConfigureSSLContext();
         }
       } catch (Exception e) {
@@ -375,29 +425,10 @@ public class SocketCreator extends TcpSocketCreatorImpl {
     return extendedKeyManagers;
   }
 
-  /**
-   * context for SSL socket factories
-   */
-  @VisibleForTesting
   public SSLContext getSslContext() {
     return sslContext;
   }
 
-  /**
-   * A factory used to create client <code>Sockets</code>.
-   */
-  public ClientSocketFactory getClientSocketFactory() {
-    return clientSocketFactory;
-  }
-
-  public SSLConfig getSslConfig() {
-    return sslConfig;
-  }
-
-  /**
-   * ExtendedAliasKeyManager supports use of certificate aliases in distributed system
-   * properties.
-   */
   private static class ExtendedAliasKeyManager extends X509ExtendedKeyManager {
 
     private final X509ExtendedKeyManager delegate;
@@ -488,23 +519,197 @@ public class SocketCreator extends TcpSocketCreatorImpl {
     }
   }
 
+  // -------------------------------------------------------------------------
+  // Public methods
+  // -------------------------------------------------------------------------
+
   /**
    * Returns true if this SocketCreator is configured to use SSL.
    */
   @Override
-  protected boolean useSSL() {
+  public boolean useSSL() {
     return this.sslConfig.isEnabled();
   }
 
-  // -------------------------------------------------------------------------
-  // Public methods
-  // -------------------------------------------------------------------------
+  public ServerSocket createServerSocket(int nport, int backlog, InetAddress bindAddr,
+      List<GatewayTransportFilter> transportFilters, int socketBufferSize) throws IOException {
+    if (transportFilters.isEmpty()) {
+      return createServerSocket(nport, backlog, bindAddr, socketBufferSize);
+    } else {
+      printConfig();
+      ServerSocket result = new TransportFilterServerSocket(transportFilters);
+      result.setReuseAddress(true);
+      // Set the receive buffer size before binding the socket so
+      // that large buffers will be allocated on accepted sockets (see
+      // java.net.ServerSocket.setReceiverBufferSize javadocs)
+      result.setReceiveBufferSize(socketBufferSize);
+      try {
+        result.bind(new InetSocketAddress(bindAddr, nport), backlog);
+      } catch (BindException e) {
+        BindException throwMe = new BindException(
+            String.format("Failed to create server socket on %s[%s]", bindAddr, nport));
+        throwMe.initCause(e);
+        throw throwMe;
+      }
+      return result;
+    }
+  }
+
+  public ServerSocket createServerSocket(int nport, int backlog, InetAddress bindAddr,
+      int socketBufferSize) throws IOException {
+    return createServerSocket(nport, backlog, bindAddr, socketBufferSize, sslConfig.isEnabled());
+  }
+
+  @Override
+  protected ServerSocket createServerSocket(int nport, int backlog, InetAddress bindAddr,
+      int socketBufferSize, boolean sslConnection) throws IOException {
+    printConfig();
+    if (!sslConnection) {
+      return super.createServerSocket(nport, backlog, bindAddr, socketBufferSize, sslConnection);
+    }
+    if (this.sslContext == null) {
+      throw new GemFireConfigException(
+          "SSL not configured correctly, Please look at previous error");
+    }
+    ServerSocketFactory ssf = this.sslContext.getServerSocketFactory();
+    SSLServerSocket serverSocket = (SSLServerSocket) ssf.createServerSocket();
+    serverSocket.setReuseAddress(true);
+    // If necessary, set the receive buffer size before binding the socket so
+    // that large buffers will be allocated on accepted sockets (see
+    // java.net.ServerSocket.setReceiverBufferSize javadocs)
+    if (socketBufferSize != -1) {
+      serverSocket.setReceiveBufferSize(socketBufferSize);
+    }
+    serverSocket.bind(new InetSocketAddress(bindAddr, nport), backlog);
+    finishServerSocket(serverSocket);
+    return serverSocket;
+  }
+
+  /**
+   * Creates or bind server socket to a random port selected from tcp-port-range which is same as
+   * membership-port-range.
+   *
+   *
+   * @return Returns the new server socket.
+   *
+   */
+  public ServerSocket createServerSocketUsingPortRange(InetAddress ba, int backlog,
+      boolean isBindAddress, boolean useNIO, int tcpBufferSize, int[] tcpPortRange)
+      throws IOException {
+    return createServerSocketUsingPortRange(ba, backlog, isBindAddress, useNIO, tcpBufferSize,
+        tcpPortRange, sslConfig.isEnabled());
+  }
+
+  @Override
+  protected RuntimeException problemCreatingSocketInPortRangeException(String s, IOException e) {
+    return new GemFireConfigException(s, e);
+  }
+
+  @Override
+  protected RuntimeException noFreePortException(String reason) {
+    return new SystemConnectException(reason);
+  }
+
+  /**
+   * Return a client socket. This method is used by client/server clients.
+   */
+  public Socket connectForClient(String host, int port, int timeout) throws IOException {
+    return connect(InetAddress.getByName(host), port, timeout, null, true, -1);
+  }
+
+  /**
+   * Return a client socket. This method is used by client/server clients.
+   */
+  public Socket connectForClient(String host, int port, int timeout, int socketBufferSize)
+      throws IOException {
+    return connect(InetAddress.getByName(host), port, timeout, null, true, socketBufferSize);
+  }
+
+  /**
+   * Return a client socket. This method is used by peers.
+   */
+  public Socket connectForServer(InetAddress inetadd, int port) throws IOException {
+    return connect(inetadd, port, 0, null, false, -1);
+  }
+
+  /**
+   * Return a client socket, timing out if unable to connect and timeout > 0 (millis). The parameter
+   * <i>timeout</i> is ignored if SSL is being used, as there is no timeout argument in the ssl
+   * socket factory
+   */
+  public Socket connect(InetAddress inetadd, int port, int timeout,
+      ConnectionWatcher optionalWatcher, boolean clientSide, int socketBufferSize)
+      throws IOException {
+    return connect(inetadd, port, timeout, optionalWatcher, clientSide, socketBufferSize,
+        sslConfig.isEnabled());
+  }
+
+  /**
+   * Return a client socket, timing out if unable to connect and timeout > 0 (millis). The parameter
+   * <i>timeout</i> is ignored if SSL is being used, as there is no timeout argument in the ssl
+   * socket factory
+   */
+  @Override
+  public Socket connect(InetAddress inetadd, int port, int timeout,
+      ConnectionWatcher optionalWatcher, boolean clientSide, int socketBufferSize,
+      boolean sslConnection) throws IOException {
+
+    printConfig();
+
+    if (!sslConnection) {
+      return super.connect(inetadd, port, timeout, optionalWatcher, clientSide, socketBufferSize,
+          sslConnection);
+    }
+
+    // create an SSL connection
+
+    Socket socket;
+    SocketAddress sockaddr = new InetSocketAddress(inetadd, port);
+    if (this.sslContext == null) {
+      throw new GemFireConfigException(
+          "SSL not configured correctly, Please look at previous error");
+    }
+    SocketFactory sf = this.sslContext.getSocketFactory();
+    socket = sf.createSocket();
+
+    // Optionally enable SO_KEEPALIVE in the OS network protocol.
+    socket.setKeepAlive(ENABLE_TCP_KEEP_ALIVE);
+
+    // If necessary, set the receive buffer size before connecting the
+    // socket so that large buffers will be allocated on accepted sockets
+    // (see java.net.Socket.setReceiverBufferSize javadocs for details)
+    if (socketBufferSize != -1) {
+      socket.setReceiveBufferSize(socketBufferSize);
+    }
+
+    try {
+      if (optionalWatcher != null) {
+        optionalWatcher.beforeConnect(socket);
+      }
+      socket.connect(sockaddr, Math.max(timeout, 0));
+      configureClientSSLSocket(socket, timeout);
+      return socket;
+
+    } finally {
+      if (optionalWatcher != null) {
+        optionalWatcher.afterConnect(socket);
+      }
+    }
+  }
+
+  @Override
+  protected Socket createCustomClientSocket(InetAddress inetadd, int port) throws IOException {
+    if (this.clientSocketFactory != null) {
+      return this.clientSocketFactory.createSocket(inetadd, port);
+    }
+    return null;
+  }
 
   /**
    * Returns an SSLEngine that can be used to perform TLS handshakes and communication
    */
   public SSLEngine createSSLEngine(String hostName, int port) {
-    return getSslContext().createSSLEngine(hostName, port);
+    return sslContext.createSSLEngine(hostName, port);
   }
 
   /**
@@ -598,7 +803,7 @@ public class SocketCreator extends TcpSocketCreatorImpl {
    *
    * @param timeout the number of milliseconds allowed for the handshake to complete
    */
-  void handshakeIfSocketIsSSL(Socket socket, int timeout) throws IOException {
+  public void handshakeIfSocketIsSSL(Socket socket, int timeout) throws IOException {
     if (!(socket instanceof SSLSocket)) {
       return;
     }
@@ -631,48 +836,46 @@ public class SocketCreator extends TcpSocketCreatorImpl {
     }
   }
 
+  // -------------------------------------------------------------------------
+  // Private implementation methods
+  // -------------------------------------------------------------------------
+
   /**
-   * Create a server socket with the given transport filters.<br>
-   * Note: This method is outside of the
-   * client/server/advanced interfaces because it references WAN classes that aren't
-   * available to them.
+   * Configure the SSLServerSocket based on this SocketCreator's settings.
    */
-  public ServerSocket createServerSocket(int nport, int backlog, InetAddress bindAddr,
-      List<GatewayTransportFilter> transportFilters, int socketBufferSize) throws IOException {
-    if (transportFilters.isEmpty()) {
-      return ((SCServerSocketCreator) forCluster())
-          .createServerSocket(nport, backlog, bindAddr, socketBufferSize, useSSL());
-    } else {
-      printConfig();
-      ServerSocket result = new TransportFilterServerSocket(transportFilters);
-      result.setReuseAddress(true);
-      // Set the receive buffer size before binding the socket so
-      // that large buffers will be allocated on accepted sockets (see
-      // java.net.ServerSocket.setReceiverBufferSize javadocs)
-      result.setReceiveBufferSize(socketBufferSize);
-      try {
-        result.bind(new InetSocketAddress(bindAddr, nport), backlog);
-      } catch (BindException e) {
-        BindException throwMe = new BindException(
-            String.format("Failed to create server socket on %s[%s]", bindAddr, nport));
-        throwMe.initCause(e);
-        throw throwMe;
-      }
-      return result;
+  private void finishServerSocket(SSLServerSocket serverSocket) {
+    serverSocket.setUseClientMode(false);
+    if (this.sslConfig.isRequireAuth()) {
+      // serverSocket.setWantClientAuth( true );
+      serverSocket.setNeedClientAuth(true);
     }
-  }
+    serverSocket.setEnableSessionCreation(true);
 
+    // restrict protocols
+    String[] protocols = this.sslConfig.getProtocolsAsStringArray();
+    if (!"any".equalsIgnoreCase(protocols[0])) {
+      serverSocket.setEnabledProtocols(protocols);
+    }
+    // restrict ciphers
+    String[] ciphers = this.sslConfig.getCiphersAsStringArray();
+    if (!"any".equalsIgnoreCase(ciphers[0])) {
+      serverSocket.setEnabledCipherSuites(ciphers);
+    }
 
-  // -------------------------------------------------------------------------
-  // Private implementation methods
-  // -------------------------------------------------------------------------
+    SSLParameterExtension sslParameterExtension = this.sslConfig.getSSLParameterExtension();
+    if (sslParameterExtension != null) {
+      SSLParameters modifiedParams =
+          sslParameterExtension.modifySSLServerSocketParameters(serverSocket.getSSLParameters());
+      serverSocket.setSSLParameters(modifiedParams);
+    }
 
+  }
 
   /**
    * When a socket is accepted from a server socket, it should be passed to this method for SSL
    * configuration.
    */
-  void configureClientSSLSocket(Socket socket, int timeout) throws IOException {
+  private void configureClientSSLSocket(Socket socket, int timeout) throws IOException {
     if (socket instanceof SSLSocket) {
       SSLSocket sslSocket = (SSLSocket) socket;
 
@@ -731,7 +934,7 @@ public class SocketCreator extends TcpSocketCreatorImpl {
   /**
    * Print current configured state to log.
    */
-  void printConfig() {
+  private void printConfig() {
     if (!configShown && logger.isDebugEnabled()) {
       configShown = true;
       StringBuilder sb = new StringBuilder();
@@ -749,6 +952,7 @@ public class SocketCreator extends TcpSocketCreatorImpl {
     }
   }
 
+
   protected void initializeClientSocketFactory() {
     this.clientSocketFactory = null;
     String className =
@@ -776,4 +980,5 @@ public class SocketCreator extends TcpSocketCreatorImpl {
     this.clientSocketFactory = new TransportFilterSocketFactory()
         .setGatewayTransportFilters(sender.getGatewayTransportFilters());
   }
+
 }
diff --git a/geode-core/src/main/java/org/apache/geode/internal/statistics/HostStatSampler.java b/geode-core/src/main/java/org/apache/geode/internal/statistics/HostStatSampler.java
index 2e16264..8b0d91d 100644
--- a/geode-core/src/main/java/org/apache/geode/internal/statistics/HostStatSampler.java
+++ b/geode-core/src/main/java/org/apache/geode/internal/statistics/HostStatSampler.java
@@ -30,6 +30,7 @@ import org.apache.geode.internal.NanoTimer;
 import org.apache.geode.internal.inet.LocalHostUtil;
 import org.apache.geode.internal.io.MainWithChildrenRollingFileHandler;
 import org.apache.geode.internal.logging.log4j.LogMarker;
+import org.apache.geode.internal.net.SocketCreator;
 import org.apache.geode.internal.process.UncheckedPidUnavailableException;
 import org.apache.geode.internal.statistics.platform.OsStatisticsFactory;
 import org.apache.geode.internal.util.concurrent.StoppableCountDownLatch;
@@ -152,7 +153,7 @@ public abstract class HostStatSampler
   @Override
   public String getSystemDirectoryPath() {
     try {
-      return LocalHostUtil.getLocalHost().getHostName();
+      return SocketCreator.getHostName(LocalHostUtil.getLocalHost());
     } catch (UnknownHostException ignore) {
       return "";
     }
diff --git a/geode-core/src/main/java/org/apache/geode/internal/statistics/StatArchiveWriter.java b/geode-core/src/main/java/org/apache/geode/internal/statistics/StatArchiveWriter.java
index 074da02..d84c829 100644
--- a/geode-core/src/main/java/org/apache/geode/internal/statistics/StatArchiveWriter.java
+++ b/geode-core/src/main/java/org/apache/geode/internal/statistics/StatArchiveWriter.java
@@ -41,6 +41,7 @@ import org.apache.geode.annotations.internal.MakeNotStatic;
 import org.apache.geode.internal.NanoTimer;
 import org.apache.geode.internal.inet.LocalHostUtil;
 import org.apache.geode.internal.logging.log4j.LogMarker;
+import org.apache.geode.internal.net.SocketCreator;
 import org.apache.geode.logging.internal.log4j.api.LogService;
 import org.apache.geode.util.internal.GeodeGlossary;
 
@@ -203,7 +204,7 @@ public class StatArchiveWriter implements StatArchiveFormat, SampleHandler {
   protected String getMachineInfo() {
     String machineInfo = System.getProperty("os.arch");
     try {
-      String hostName = LocalHostUtil.getLocalHost().getHostName();
+      String hostName = SocketCreator.getHostName(LocalHostUtil.getLocalHost());
       machineInfo += " " + hostName;
     } catch (UnknownHostException ignore) {
     }
diff --git a/geode-core/src/main/java/org/apache/geode/internal/tcp/TCPConduit.java b/geode-core/src/main/java/org/apache/geode/internal/tcp/TCPConduit.java
index 6130420..a816895 100644
--- a/geode-core/src/main/java/org/apache/geode/internal/tcp/TCPConduit.java
+++ b/geode-core/src/main/java/org/apache/geode/internal/tcp/TCPConduit.java
@@ -255,7 +255,7 @@ public class TCPConduit implements Runnable {
     conTable = connectionTableFactory.apply(this);
 
     this.socketCreator = socketCreator;
-    useSSL = socketCreator.forAdvancedUse().useSSL();
+    useSSL = socketCreator.useSSL();
 
     if (address == null) {
       localHostValidation.run();
@@ -366,9 +366,8 @@ public class TCPConduit implements Runnable {
 
     try {
       if (serverPort <= 0) {
-        socket = socketCreator.forAdvancedUse().createServerSocketUsingPortRange(bindAddress,
-            connectionRequestBacklog, isBindAddress, true, 0, tcpPortRange,
-            socketCreator.forAdvancedUse().useSSL());
+        socket = socketCreator.createServerSocketUsingPortRange(bindAddress,
+            connectionRequestBacklog, isBindAddress, true, 0, tcpPortRange);
 
       } else {
         ServerSocketChannel channel = ServerSocketChannel.open();
diff --git a/geode-core/src/main/java/org/apache/geode/management/internal/ContextAwareSSLRMIClientSocketFactory.java b/geode-core/src/main/java/org/apache/geode/management/internal/ContextAwareSSLRMIClientSocketFactory.java
index 55eeb6a..cadb2b2 100644
--- a/geode-core/src/main/java/org/apache/geode/management/internal/ContextAwareSSLRMIClientSocketFactory.java
+++ b/geode-core/src/main/java/org/apache/geode/management/internal/ContextAwareSSLRMIClientSocketFactory.java
@@ -27,7 +27,6 @@ import java.util.Properties;
 import javax.rmi.ssl.SslRMIClientSocketFactory;
 
 import org.apache.geode.annotations.Immutable;
-import org.apache.geode.distributed.internal.tcpserver.HostAndPort;
 import org.apache.geode.internal.admin.SSLConfig;
 import org.apache.geode.internal.net.SSLConfigurationFactory;
 import org.apache.geode.internal.net.SocketCreator;
@@ -55,7 +54,7 @@ public class ContextAwareSSLRMIClientSocketFactory implements RMIClientSocketFac
     try {
       socketCreator =
           SocketCreatorFactory.getSocketCreatorForComponent(SecurableCommunicationChannel.JMX);
-      return socketCreator.forClient().connect(new HostAndPort(host, port), 0);
+      return socketCreator.connectForClient(host, port, 0);
     } catch (Exception exception) {
       try {
         // In gfsh the ssl config is stored within the GEODE_SSL_CONFIG_PROPERTIES system property.
@@ -65,7 +64,7 @@ public class ContextAwareSSLRMIClientSocketFactory implements RMIClientSocketFac
         SSLConfig sslConfig = SSLConfigurationFactory
             .getSSLConfigForComponent(gfProperties, SecurableCommunicationChannel.JMX);
         socketCreator = new SocketCreator(sslConfig);
-        return socketCreator.forClient().connect(new HostAndPort(host, port), 0);
+        return socketCreator.connectForClient(host, port, 0);
       } catch (Exception finalException) {
         // Back off and use the default factory (javax.net.ssl properties are used to configure
         // SSL).
diff --git a/geode-core/src/main/java/org/apache/geode/management/internal/JmxManagerLocatorRequest.java b/geode-core/src/main/java/org/apache/geode/management/internal/JmxManagerLocatorRequest.java
index cd87917..2ce9a80 100644
--- a/geode-core/src/main/java/org/apache/geode/management/internal/JmxManagerLocatorRequest.java
+++ b/geode-core/src/main/java/org/apache/geode/management/internal/JmxManagerLocatorRequest.java
@@ -17,10 +17,11 @@ package org.apache.geode.management.internal;
 import java.io.DataInput;
 import java.io.DataOutput;
 import java.io.IOException;
+import java.net.InetAddress;
+import java.net.InetSocketAddress;
 import java.util.Properties;
 
 import org.apache.geode.annotations.Immutable;
-import org.apache.geode.distributed.internal.tcpserver.HostAndPort;
 import org.apache.geode.distributed.internal.tcpserver.TcpClient;
 import org.apache.geode.internal.InternalDataSerializer;
 import org.apache.geode.internal.admin.SSLConfig;
@@ -76,6 +77,8 @@ public class JmxManagerLocatorRequest implements DataSerializableFixedID {
    */
   public static JmxManagerLocatorResponse send(String locatorHost, int locatorPort, int msTimeout,
       Properties sslConfigProps) throws IOException, ClassNotFoundException {
+    InetAddress networkAddress = InetAddress.getByName(locatorHost);
+    InetSocketAddress inetSockAddr = new InetSocketAddress(networkAddress, locatorPort);
 
     // simply need to turn sslConfigProps into sslConfig for locator
     SSLConfig sslConfig = SSLConfigurationFactory.getSSLConfigForComponent(sslConfigProps,
@@ -84,8 +87,7 @@ public class JmxManagerLocatorRequest implements DataSerializableFixedID {
     TcpClient client = new TcpClient(socketCreator,
         InternalDataSerializer.getDSFIDSerializer().getObjectSerializer(),
         InternalDataSerializer.getDSFIDSerializer().getObjectDeserializer());
-    Object responseFromServer = client.requestToServer(new HostAndPort(locatorHost, locatorPort),
-        SINGLETON, msTimeout, true);
+    Object responseFromServer = client.requestToServer(inetSockAddr, SINGLETON, msTimeout, true);
 
     if (responseFromServer instanceof JmxManagerLocatorResponse)
       return (JmxManagerLocatorResponse) responseFromServer;
diff --git a/geode-core/src/main/java/org/apache/geode/management/internal/ManagementAgent.java b/geode-core/src/main/java/org/apache/geode/management/internal/ManagementAgent.java
index 247c5e5..f8d5319 100755
--- a/geode-core/src/main/java/org/apache/geode/management/internal/ManagementAgent.java
+++ b/geode-core/src/main/java/org/apache/geode/management/internal/ManagementAgent.java
@@ -227,8 +227,8 @@ public class ManagementAgent {
               SocketCreatorFactory.getSocketCreatorForComponent(SecurableCommunicationChannel.JMX);
           final SocketCreator locatorSocketCreator = SocketCreatorFactory
               .getSocketCreatorForComponent(SecurableCommunicationChannel.LOCATOR);
-          System.setProperty(PULSE_USESSL_MANAGER, jmxSocketCreator.forClient().useSSL() + "");
-          System.setProperty(PULSE_USESSL_LOCATOR, locatorSocketCreator.forClient().useSSL() + "");
+          System.setProperty(PULSE_USESSL_MANAGER, jmxSocketCreator.useSSL() + "");
+          System.setProperty(PULSE_USESSL_LOCATOR, locatorSocketCreator.useSSL() + "");
 
           serviceAttributes.put(HttpService.GEODE_SSLCONFIG_SERVLET_CONTEXT_PARAM,
               createSslProps());
@@ -326,7 +326,7 @@ public class ManagementAgent {
     final SocketCreator socketCreator =
         SocketCreatorFactory.getSocketCreatorForComponent(SecurableCommunicationChannel.JMX);
 
-    final boolean ssl = socketCreator.forClient().useSSL();
+    final boolean ssl = socketCreator.useSSL();
 
     if (logger.isDebugEnabled()) {
       logger.debug("Starting jmx manager agent on port {}{}", port,
@@ -513,7 +513,7 @@ public class ManagementAgent {
 
     @Override
     public ServerSocket createServerSocket(int port) throws IOException {
-      return this.sc.forCluster().createServerSocket(port, TCPConduit.getBackLog(), this.bindAddr);
+      return this.sc.createServerSocket(port, TCPConduit.getBackLog(), this.bindAddr);
     }
   }
 }
diff --git a/geode-core/src/main/java/org/apache/geode/management/internal/api/GeodeConnectionConfig.java b/geode-core/src/main/java/org/apache/geode/management/internal/api/GeodeConnectionConfig.java
index 183c913..8cfbeb2 100644
--- a/geode-core/src/main/java/org/apache/geode/management/internal/api/GeodeConnectionConfig.java
+++ b/geode-core/src/main/java/org/apache/geode/management/internal/api/GeodeConnectionConfig.java
@@ -34,7 +34,6 @@ import org.apache.geode.cache.execute.FunctionService;
 import org.apache.geode.cache.execute.ResultCollector;
 import org.apache.geode.distributed.internal.DistributionConfig;
 import org.apache.geode.distributed.internal.membership.InternalDistributedMember;
-import org.apache.geode.distributed.internal.tcpserver.HostAndPort;
 import org.apache.geode.distributed.internal.tcpserver.TcpClient;
 import org.apache.geode.internal.InternalDataSerializer;
 import org.apache.geode.internal.admin.SSLConfig;
@@ -108,8 +107,7 @@ public class GeodeConnectionConfig extends ConnectionConfig {
     cmsInfo = null;
     for (InetSocketAddress locator : locators) {
       try {
-        cmsInfo = (ClusterManagementServiceInfo) client.requestToServer(
-            new HostAndPort(locator.getHostName(), locator.getPort()),
+        cmsInfo = (ClusterManagementServiceInfo) client.requestToServer(locator,
             new ClusterManagementServiceInfoRequest(), 1000, true);
 
         // do not try anymore if we found one that has cms running
diff --git a/geode-core/src/main/java/org/apache/geode/management/internal/configuration/utils/ClusterConfigurationStatusRetriever.java b/geode-core/src/main/java/org/apache/geode/management/internal/configuration/utils/ClusterConfigurationStatusRetriever.java
index bceb0fe..5e72d0d 100644
--- a/geode-core/src/main/java/org/apache/geode/management/internal/configuration/utils/ClusterConfigurationStatusRetriever.java
+++ b/geode-core/src/main/java/org/apache/geode/management/internal/configuration/utils/ClusterConfigurationStatusRetriever.java
@@ -16,11 +16,11 @@ package org.apache.geode.management.internal.configuration.utils;
 
 
 import java.io.IOException;
+import java.net.InetAddress;
 import java.util.Properties;
 import java.util.Set;
 
 import org.apache.geode.distributed.LocatorLauncher;
-import org.apache.geode.distributed.internal.tcpserver.HostAndPort;
 import org.apache.geode.distributed.internal.tcpserver.TcpClient;
 import org.apache.geode.internal.InternalDataSerializer;
 import org.apache.geode.internal.cache.persistence.PersistentMemberPattern;
@@ -37,14 +37,15 @@ public class ClusterConfigurationStatusRetriever {
       throws ClassNotFoundException, IOException {
     final StringBuilder buffer = new StringBuilder();
 
+    final InetAddress networkAddress = InetAddress.getByName(locatorHostName);
+
     TcpClient client = new TcpClient(
         new SocketCreator(SSLConfigurationFactory.getSSLConfigForComponent(configProps,
             SecurableCommunicationChannel.LOCATOR)),
         InternalDataSerializer.getDSFIDSerializer().getObjectSerializer(),
         InternalDataSerializer.getDSFIDSerializer().getObjectDeserializer());
-    HostAndPort locatorAddress = new HostAndPort(locatorHostName, locatorPort);
     SharedConfigurationStatusResponse statusResponse =
-        (SharedConfigurationStatusResponse) client.requestToServer(locatorAddress,
+        (SharedConfigurationStatusResponse) client.requestToServer(networkAddress, locatorPort,
             new SharedConfigurationStatusRequest(), 10000, true);
 
     for (int i = 0; i < NUM_ATTEMPTS_FOR_SHARED_CONFIGURATION_STATUS; i++) {
@@ -53,8 +54,8 @@ public class ClusterConfigurationStatusRetriever {
           || statusResponse.getStatus().equals(
               org.apache.geode.management.internal.configuration.domain.SharedConfigurationStatus.NOT_STARTED)) {
         statusResponse =
-            (SharedConfigurationStatusResponse) client.requestToServer(locatorAddress,
-                new SharedConfigurationStatusRequest(), 10000, true);
+            (SharedConfigurationStatusResponse) client.requestToServer(networkAddress,
+                locatorPort, new SharedConfigurationStatusRequest(), 10000, true);
         try {
           Thread.sleep(5000);
         } catch (InterruptedException e) {
diff --git a/geode-core/src/main/resources/org/apache/geode/internal/sanctioned-geode-core-serializables.txt b/geode-core/src/main/resources/org/apache/geode/internal/sanctioned-geode-core-serializables.txt
index 7b572ce..3b2ed17 100644
--- a/geode-core/src/main/resources/org/apache/geode/internal/sanctioned-geode-core-serializables.txt
+++ b/geode-core/src/main/resources/org/apache/geode/internal/sanctioned-geode-core-serializables.txt
@@ -259,6 +259,13 @@ org/apache/geode/distributed/internal/deadlock/MessageDependencyMonitor$MessageK
 org/apache/geode/distributed/internal/direct/ShunnedMemberException,true,-6455664684151074915
 org/apache/geode/distributed/internal/locks/DistributedMemberLock$LockReentryPolicy,false
 org/apache/geode/distributed/internal/locks/LockGrantorDestroyedException,true,-3540124531032570817
+org/apache/geode/distributed/internal/membership/api/MemberDisconnectedException,true,-3649273301807236514
+org/apache/geode/distributed/internal/membership/api/MemberShunnedException,true,-8453126202477831557
+org/apache/geode/distributed/internal/membership/api/MemberStartupException,true,6610743861046044144
+org/apache/geode/distributed/internal/membership/api/MembershipClosedException,true,6112938405434046127
+org/apache/geode/distributed/internal/membership/api/MembershipConfigurationException,true,5633602142465129621
+org/apache/geode/distributed/internal/membership/gms/membership/GMSJoinLeave$ViewAbandonedException,false
+org/apache/geode/distributed/internal/membership/gms/messages/InstallViewMessage$messageType,false
 org/apache/geode/internal/ConfigSource,true,-4097017272431018553,description:java/lang/String,type:org/apache/geode/internal/ConfigSource$Type
 org/apache/geode/internal/ConfigSource$Type,false
 org/apache/geode/internal/CopyOnWriteHashSet,true,8591978652141659932
@@ -305,7 +312,6 @@ org/apache/geode/internal/cache/PartitionedRegionDataStore$CreateBucketResult,fa
 org/apache/geode/internal/cache/PartitionedRegionException,true,5113786059279106007
 org/apache/geode/internal/cache/PartitionedRegionQueryEvaluator$MemberResultsList,false,isLastChunkReceived:boolean
 org/apache/geode/internal/cache/PartitionedRegionStatus,true,-6755318987122602065,numberOfLocalEntries:int
-org/apache/geode/internal/cache/PoolFactoryImpl$PoolAttributes,true,1,connectionLifetime:int,connectionTimeout:int,gateway:boolean,gatewaySender:org/apache/geode/cache/wan/GatewaySender,idleTimeout:long,locators:java/util/ArrayList,maxConnections:int,minConnections:int,multiuserSecureModeEnabled:boolean,pingInterval:long,prSingleHopEnabled:boolean,queueAckInterval:int,queueEnabled:boolean,queueMessageTrackingTimeout:int,queueRedundancyLevel:int,readTimeout:int,retryAttempts:int,serverGro [...]
 org/apache/geode/internal/cache/PrimaryBucketException,true,1
 org/apache/geode/internal/cache/PutAllPartialResultException,true,2411654400733621071,result:org/apache/geode/internal/cache/PutAllPartialResultException$PutAllPartialResult
 org/apache/geode/internal/cache/PutAllPartialResultException$PutAllPartialResult,true,-2168767259323206954,firstCauseOfFailure:java/lang/Exception,firstFailedKey:java/lang/Object,succeededKeys:org/apache/geode/internal/cache/tier/sockets/VersionedObjectList,totalMapSize:int
diff --git a/geode-core/src/test/java/org/apache/geode/cache/client/internal/PoolImplTest.java b/geode-core/src/test/java/org/apache/geode/cache/client/internal/PoolImplTest.java
index 80cade1..5487f42 100644
--- a/geode-core/src/test/java/org/apache/geode/cache/client/internal/PoolImplTest.java
+++ b/geode-core/src/test/java/org/apache/geode/cache/client/internal/PoolImplTest.java
@@ -37,7 +37,7 @@ import org.apache.geode.cache.client.ServerConnectivityException;
 import org.apache.geode.cache.client.internal.pooling.ConnectionManagerImpl;
 import org.apache.geode.distributed.internal.DistributionConfig;
 import org.apache.geode.distributed.internal.InternalDistributedSystem;
-import org.apache.geode.distributed.internal.tcpserver.HostAndPort;
+import org.apache.geode.distributed.internal.tcpserver.LocatorAddress;
 import org.apache.geode.internal.cache.InternalCache;
 import org.apache.geode.internal.cache.PoolFactoryImpl;
 import org.apache.geode.internal.cache.PoolManagerImpl;
@@ -154,7 +154,7 @@ public class PoolImplTest {
 
     final ThreadsMonitoring tMonitoring = mock(ThreadsMonitoring.class);
 
-    return PoolImpl.create(poolManager, "pool", poolAttributes, new LinkedList<HostAndPort>(),
+    return PoolImpl.create(poolManager, "pool", poolAttributes, new LinkedList<LocatorAddress>(),
         internalDistributedSystem, internalCache, tMonitoring);
   }
 
diff --git a/geode-core/src/test/java/org/apache/geode/internal/cache/CacheServerImplTest.java b/geode-core/src/test/java/org/apache/geode/internal/cache/CacheServerImplTest.java
index 361e688..4662276 100644
--- a/geode-core/src/test/java/org/apache/geode/internal/cache/CacheServerImplTest.java
+++ b/geode-core/src/test/java/org/apache/geode/internal/cache/CacheServerImplTest.java
@@ -36,7 +36,6 @@ import org.apache.geode.StatisticsType;
 import org.apache.geode.distributed.internal.DistributionConfig;
 import org.apache.geode.distributed.internal.InternalDistributedSystem;
 import org.apache.geode.distributed.internal.ResourceEvent;
-import org.apache.geode.distributed.internal.tcpserver.ClusterSocketCreator;
 import org.apache.geode.internal.cache.tier.Acceptor;
 import org.apache.geode.internal.cache.tier.OverflowAttributes;
 import org.apache.geode.internal.cache.tier.sockets.AcceptorBuilder;
@@ -68,8 +67,6 @@ public class CacheServerImplTest {
     config = mock(DistributionConfig.class);
     securityService = mock(SecurityService.class);
     socketCreator = mock(SocketCreator.class);
-    ClusterSocketCreator ssc = mock(ClusterSocketCreator.class);
-    when(socketCreator.forCluster()).thenReturn(ssc);
     system = mock(InternalDistributedSystem.class);
     advisor = mock(CacheServerAdvisor.class);
 
@@ -82,8 +79,6 @@ public class CacheServerImplTest {
     when(serverSocket.getLocalSocketAddress()).thenReturn(mock(SocketAddress.class));
     when(socketCreator.createServerSocket(anyInt(), anyInt(), any(), any(), anyInt()))
         .thenReturn(serverSocket);
-    when(ssc.createServerSocket(anyInt(), anyInt(), any()))
-        .thenReturn(serverSocket);
     when(statisticsManager.createAtomicStatistics(any(), any())).thenReturn(mock(Statistics.class));
     when(statisticsManager.createType(any(), any(), any())).thenReturn(mock(StatisticsType.class));
     when(system.getConfig()).thenReturn(config);
diff --git a/geode-core/src/test/java/org/apache/geode/internal/cache/tier/sockets/CacheClientUpdaterJUnitTest.java b/geode-core/src/test/java/org/apache/geode/internal/cache/tier/sockets/CacheClientUpdaterJUnitTest.java
index 3cb9c62..d2572e9 100644
--- a/geode-core/src/test/java/org/apache/geode/internal/cache/tier/sockets/CacheClientUpdaterJUnitTest.java
+++ b/geode-core/src/test/java/org/apache/geode/internal/cache/tier/sockets/CacheClientUpdaterJUnitTest.java
@@ -31,8 +31,6 @@ import org.apache.geode.cache.client.internal.EndpointManager;
 import org.apache.geode.cache.client.internal.QueueManager;
 import org.apache.geode.distributed.DistributedSystem;
 import org.apache.geode.distributed.internal.ServerLocation;
-import org.apache.geode.distributed.internal.tcpserver.ClientSocketCreator;
-import org.apache.geode.distributed.internal.tcpserver.HostAndPort;
 import org.apache.geode.internal.cache.tier.ClientSideHandshake;
 import org.apache.geode.internal.net.SocketCreator;
 import org.apache.geode.test.junit.categories.ClientSubscriptionTest;
@@ -59,9 +57,7 @@ public class CacheClientUpdaterJUnitTest {
 
     // engineer a failure to connect via SocketCreator
     SocketCreator socketCreator = mock(SocketCreator.class);
-    ClientSocketCreator csc = mock(ClientSocketCreator.class);
-    when(socketCreator.forClient()).thenReturn(csc);
-    when(csc.connect(any(HostAndPort.class),
+    when(socketCreator.connectForClient(any(String.class), any(Integer.class),
         any(Integer.class), any(Integer.class))).thenThrow(new SocketException("ouch"));
 
     // mock some stats that we can then use to ensure that they're closed when the problem occurs
diff --git a/geode-core/src/test/java/org/apache/geode/internal/net/SocketCreatorJUnitTest.java b/geode-core/src/test/java/org/apache/geode/internal/net/SocketCreatorJUnitTest.java
index 9b8b99a..d37e043 100644
--- a/geode-core/src/test/java/org/apache/geode/internal/net/SocketCreatorJUnitTest.java
+++ b/geode-core/src/test/java/org/apache/geode/internal/net/SocketCreatorJUnitTest.java
@@ -55,7 +55,7 @@ public class SocketCreatorJUnitTest {
     final SSLSocket socket = mock(SSLSocket.class);
 
     final int timeout = 1938236;
-    socketCreator.forCluster().handshakeIfSocketIsSSL(socket, timeout);
+    socketCreator.handshakeIfSocketIsSSL(socket, timeout);
     verify(socket).setSoTimeout(timeout);
   }
 
@@ -65,7 +65,7 @@ public class SocketCreatorJUnitTest {
     final Socket socket = mock(Socket.class);
     final int timeout = 1938236;
 
-    socketCreator.forCluster().handshakeIfSocketIsSSL(socket, timeout);
+    socketCreator.handshakeIfSocketIsSSL(socket, timeout);
     verify(socket, never()).setSoTimeout(timeout);
   }
 
@@ -85,10 +85,10 @@ public class SocketCreatorJUnitTest {
 
     ServerSocket serverSocket = null;
     try {
-      serverSocket = socketCreator.forCluster().createServerSocket(11234, 10, inetAddress);
+      serverSocket = socketCreator.createServerSocket(11234, 10, inetAddress);
       assertThatExceptionOfType(BindException.class).isThrownBy(() -> {
         // call twice on the same port to trigger exception
-        socketCreator.forCluster().createServerSocket(11234, 10, inetAddress);
+        socketCreator.createServerSocket(11234, 10, inetAddress);
       }).withMessageContaining("11234")
           .withMessageContaining(InetAddress.getLocalHost().getHostAddress());
     } finally {
diff --git a/geode-core/src/test/java/org/apache/geode/internal/tcp/TCPConduitTest.java b/geode-core/src/test/java/org/apache/geode/internal/tcp/TCPConduitTest.java
index edd081d..33c6ea1 100644
--- a/geode-core/src/test/java/org/apache/geode/internal/tcp/TCPConduitTest.java
+++ b/geode-core/src/test/java/org/apache/geode/internal/tcp/TCPConduitTest.java
@@ -45,7 +45,6 @@ import org.apache.geode.distributed.internal.DistributionManager;
 import org.apache.geode.distributed.internal.direct.DirectChannel;
 import org.apache.geode.distributed.internal.membership.InternalDistributedMember;
 import org.apache.geode.distributed.internal.membership.api.Membership;
-import org.apache.geode.internal.admin.SSLConfig;
 import org.apache.geode.internal.inet.LocalHostUtil;
 import org.apache.geode.internal.net.SocketCreator;
 
@@ -65,7 +64,7 @@ public class TCPConduitTest {
     membership = cast(mock(Membership.class));
     directChannel = mock(DirectChannel.class);
     connectionTable = mock(ConnectionTable.class);
-    socketCreator = new SocketCreator(new SSLConfig.Builder().build());
+    socketCreator = mock(SocketCreator.class);
     localHost = LocalHostUtil.getLocalHost();
 
     when(directChannel.getDM())
diff --git a/geode-cq/src/distributedTest/java/org/apache/geode/internal/cache/tier/sockets/DurableClientTestBase.java b/geode-cq/src/distributedTest/java/org/apache/geode/internal/cache/tier/sockets/DurableClientTestBase.java
index 529ac87..3c4b627 100644
--- a/geode-cq/src/distributedTest/java/org/apache/geode/internal/cache/tier/sockets/DurableClientTestBase.java
+++ b/geode-cq/src/distributedTest/java/org/apache/geode/internal/cache/tier/sockets/DurableClientTestBase.java
@@ -199,8 +199,7 @@ public class DurableClientTestBase extends JUnit4DistributedTestCase {
 
   public void disconnectDurableClient(boolean keepAlive) {
     printClientProxyState("Before");
-    this.durableClientVM.invoke("close durable client cache",
-        () -> CacheServerTestUtil.closeCache(keepAlive));
+    this.durableClientVM.invoke(() -> CacheServerTestUtil.closeCache(keepAlive));
     await()
         .until(CacheServerTestUtil::getCache, nullValue());
     printClientProxyState("after");
diff --git a/geode-cq/src/distributedTest/java/org/apache/geode/internal/cache/tier/sockets/DurableClientTestCase.java b/geode-cq/src/distributedTest/java/org/apache/geode/internal/cache/tier/sockets/DurableClientTestCase.java
index b4ce7c7..24073d6 100755
--- a/geode-cq/src/distributedTest/java/org/apache/geode/internal/cache/tier/sockets/DurableClientTestCase.java
+++ b/geode-cq/src/distributedTest/java/org/apache/geode/internal/cache/tier/sockets/DurableClientTestCase.java
@@ -311,13 +311,6 @@ public class DurableClientTestCase extends DurableClientTestBase {
     // Verify the durable client received the updates
     this.checkListenerEvents(1, 1, -1, this.durableClientVM);
 
-    server1VM.invoke("wait for client acknowledgement", () -> {
-      CacheClientProxy proxy = getClientProxy();
-      await().untilAsserted(
-          () -> assertThat(proxy._messageDispatcher._messageQueue.stats.getEventsRemoved())
-              .isGreaterThan(0));
-    });
-
     // Stop the durable client
     this.disconnectDurableClient(true);
 
@@ -331,10 +324,12 @@ public class DurableClientTestCase extends DurableClientTestBase {
     this.server1VM.invoke(new CacheSerializableRunnable("Verify durable client") {
       @Override
       public void run2() throws CacheException {
+        // Find the proxy
         CacheClientProxy proxy = getClientProxy();
         assertThat(proxy).isNotNull();
+
         // Verify the queue size
-        assertThat(proxy.getQueueSize()).isEqualTo(1);
+        assertThat(1).isEqualTo(proxy.getQueueSize());
       }
     });
 
diff --git a/geode-dunit/src/main/java/org/apache/geode/cache/client/internal/LocatorTestBase.java b/geode-dunit/src/main/java/org/apache/geode/cache/client/internal/LocatorTestBase.java
index 3de2162..340fd3e 100644
--- a/geode-dunit/src/main/java/org/apache/geode/cache/client/internal/LocatorTestBase.java
+++ b/geode-dunit/src/main/java/org/apache/geode/cache/client/internal/LocatorTestBase.java
@@ -237,12 +237,10 @@ public abstract class LocatorTestBase extends JUnit4DistributedTestCase {
 
   protected void startBridgeClientInVM(VM vm, final String group, final String host, final int port,
       final String... regions) throws Exception {
-    vm.invoke(() -> {
-      PoolFactoryImpl pf = new PoolFactoryImpl(null);
-      pf.addLocator(host, port).setServerGroup(group).setPingInterval(200)
-          .setSubscriptionEnabled(true).setSubscriptionRedundancy(-1);
-      startBridgeClientInVM(null, pf.getPoolAttributes(), regions);
-    });
+    PoolFactoryImpl pf = new PoolFactoryImpl(null);
+    pf.addLocator(host, port).setServerGroup(group).setPingInterval(200)
+        .setSubscriptionEnabled(true).setSubscriptionRedundancy(-1);
+    startBridgeClientInVM(vm, pf.getPoolAttributes(), regions);
   }
 
   protected void startBridgeClientInVM(VM vm, final Pool pool, final String... regions)
diff --git a/geode-dunit/src/main/java/org/apache/geode/test/dunit/rules/DistributedRule.java b/geode-dunit/src/main/java/org/apache/geode/test/dunit/rules/DistributedRule.java
index 992dd0f..7799697 100644
--- a/geode-dunit/src/main/java/org/apache/geode/test/dunit/rules/DistributedRule.java
+++ b/geode-dunit/src/main/java/org/apache/geode/test/dunit/rules/DistributedRule.java
@@ -241,6 +241,7 @@ public class DistributedRule extends AbstractDistributedRule {
       QueryObserverHolder.reset();
       QueryTestUtils.setCache(null);
       RegionTestCase.preSnapshotRegion = null;
+      SocketCreator.resetHostNameCache();
       SocketCreator.resolve_dns = true;
       TcpClient.clearStaticData();
 
diff --git a/geode-membership/src/integrationTest/java/org/apache/geode/distributed/internal/membership/gms/GMSUtilTest.java b/geode-membership/src/integrationTest/java/org/apache/geode/distributed/internal/membership/gms/GMSUtilTest.java
index 4a1ed00..f448aae 100644
--- a/geode-membership/src/integrationTest/java/org/apache/geode/distributed/internal/membership/gms/GMSUtilTest.java
+++ b/geode-membership/src/integrationTest/java/org/apache/geode/distributed/internal/membership/gms/GMSUtilTest.java
@@ -20,6 +20,7 @@ import static org.assertj.core.api.Assertions.assertThat;
 import static org.assertj.core.api.Assertions.assertThatThrownBy;
 
 import java.net.InetAddress;
+import java.net.InetSocketAddress;
 import java.util.List;
 
 import junitparams.JUnitParamsRunner;
@@ -28,7 +29,7 @@ import org.junit.Test;
 import org.junit.runner.RunWith;
 
 import org.apache.geode.distributed.internal.membership.api.MembershipConfigurationException;
-import org.apache.geode.distributed.internal.tcpserver.HostAndPort;
+import org.apache.geode.distributed.internal.membership.gms.membership.HostAddress;
 
 @RunWith(JUnitParamsRunner.class)
 public class GMSUtilTest {
@@ -48,7 +49,8 @@ public class GMSUtilTest {
         parseLocators(RESOLVEABLE_LOOPBACK_HOST + "[" + PORT + "]",
             InetAddress.getLoopbackAddress()))
                 .contains(
-                    new HostAndPort(RESOLVEABLE_LOOPBACK_HOST, PORT));
+                    new HostAddress(new InetSocketAddress(RESOLVEABLE_LOOPBACK_HOST, PORT),
+                        RESOLVEABLE_LOOPBACK_HOST));
   }
 
   @Test
@@ -71,10 +73,11 @@ public class GMSUtilTest {
 
   @Test
   public void unresolveableAddressNotChecked() throws MembershipConfigurationException {
-    final List<HostAndPort> HostAndPortes =
+    final List<HostAddress> hostAddresses =
         parseLocators(UNRESOLVEABLE_HOST + "[" + PORT + "]", (InetAddress) null);
-    assertThat(HostAndPortes)
-        .contains(new HostAndPort(UNRESOLVEABLE_HOST, PORT));
+    assertThat(hostAddresses)
+        .contains(new HostAddress(new InetSocketAddress(UNRESOLVEABLE_HOST, PORT),
+            UNRESOLVEABLE_HOST));
   }
 
   @Test
@@ -83,7 +86,8 @@ public class GMSUtilTest {
     final String locatorsString = RESOLVEABLE_LOOPBACK_HOST + "[" + validPort + "]";
     assertThat(parseLocators(locatorsString, InetAddress.getLoopbackAddress()))
         .contains(
-            new HostAndPort(RESOLVEABLE_LOOPBACK_HOST, validPort));
+            new HostAddress(new InetSocketAddress(RESOLVEABLE_LOOPBACK_HOST, validPort),
+                RESOLVEABLE_LOOPBACK_HOST));
   }
 
   @Test
@@ -102,7 +106,7 @@ public class GMSUtilTest {
       throws MembershipConfigurationException {
     assertThat(parseLocators(locatorsString, (InetAddress) null))
         .contains(
-            new HostAndPort("127.0.0.1", 1234));
+            new HostAddress(new InetSocketAddress("127.0.0.1", 1234), "127.0.0.1"));
   }
 
   @Test
@@ -111,20 +115,23 @@ public class GMSUtilTest {
       throws MembershipConfigurationException {
     assertThat(parseLocators(locatorsString, (InetAddress) null))
         .contains(
-            new HostAndPort("fdf0:76cf:a0ed:9449::5", 12233));
+            new HostAddress(new InetSocketAddress("fdf0:76cf:a0ed:9449::5", 12233),
+                "fdf0:76cf:a0ed:9449::5"));
   }
 
   @Test
   public void multipleHosts() throws MembershipConfigurationException {
-    final List<HostAndPort> addys =
+    final List<HostAddress> addys =
         parseLocators(
             "geodecluster-sample-locator-0.geodecluster-sample-locator[10334],"
                 + "geodecluster-sample-locator-1.geodecluster-sample-locator[10334],"
                 + "geodecluster-sample-locator-2.geodecluster-sample-locator[10334]",
             (InetAddress) null);
     assertThat(addys).contains(
-        new HostAndPort("geodecluster-sample-locator-2.geodecluster-sample-locator",
-            10334));
+        new HostAddress(
+            new InetSocketAddress("geodecluster-sample-locator-2.geodecluster-sample-locator",
+                10334),
+            "geodecluster-sample-locator-2.geodecluster-sample-locator"));
     assertThat(addys).hasSize(3);
   }
 
@@ -142,11 +149,12 @@ public class GMSUtilTest {
   @Test
   public void nonLoopbackBindAddressDoesNotResolveLocatorAddress()
       throws MembershipConfigurationException {
-    final List<HostAndPort> hostAndPorts =
+    final List<HostAddress> hostAddresses =
         parseLocators(UNRESOLVEABLE_HOST + "[" + PORT + "]",
             RESOLVEABLE_NON_LOOPBACK_HOST);
-    assertThat(hostAndPorts)
-        .contains(new HostAndPort(UNRESOLVEABLE_HOST, PORT));
+    assertThat(hostAddresses)
+        .contains(new HostAddress(new InetSocketAddress(UNRESOLVEABLE_HOST, PORT),
+            UNRESOLVEABLE_HOST));
   }
 
 }
diff --git a/geode-membership/src/integrationTest/java/org/apache/geode/distributed/internal/membership/gms/membership/GMSJoinLeaveJUnitTest.java b/geode-membership/src/integrationTest/java/org/apache/geode/distributed/internal/membership/gms/membership/GMSJoinLeaveJUnitTest.java
index c65f8ef..e98dfde 100644
--- a/geode-membership/src/integrationTest/java/org/apache/geode/distributed/internal/membership/gms/membership/GMSJoinLeaveJUnitTest.java
+++ b/geode-membership/src/integrationTest/java/org/apache/geode/distributed/internal/membership/gms/membership/GMSJoinLeaveJUnitTest.java
@@ -35,6 +35,7 @@ import static org.mockito.Mockito.when;
 
 import java.io.IOException;
 import java.net.InetAddress;
+import java.net.InetSocketAddress;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collections;
@@ -81,7 +82,6 @@ import org.apache.geode.distributed.internal.membership.gms.messages.NetworkPart
 import org.apache.geode.distributed.internal.membership.gms.messages.RemoveMemberMessage;
 import org.apache.geode.distributed.internal.membership.gms.messages.ViewAckMessage;
 import org.apache.geode.distributed.internal.membership.gms.util.MemberIdentifierUtil;
-import org.apache.geode.distributed.internal.tcpserver.HostAndPort;
 import org.apache.geode.distributed.internal.tcpserver.TcpClient;
 import org.apache.geode.internal.serialization.Version;
 import org.apache.geode.test.junit.categories.MembershipTest;
@@ -211,7 +211,7 @@ public class GMSJoinLeaveJUnitTest {
     initMocks(false);
     when(mockConfig.getLocatorWaitTime()).thenReturn(15000);
 
-    when(locatorClient.requestToServer(isA(HostAndPort.class),
+    when(locatorClient.requestToServer(isA(InetSocketAddress.class),
         isA(FindCoordinatorRequest.class), anyInt(), anyBoolean()))
             .thenThrow(new IOException("Connection refused"));
 
@@ -222,7 +222,7 @@ public class GMSJoinLeaveJUnitTest {
         .isInstanceOf(MemberStartupException.class)
         .hasMessageContaining("Interrupted while trying to contact locators");
     assertThat(Thread.currentThread().interrupted()).isTrue();
-    verify(locatorClient, times(1)).requestToServer(isA(HostAndPort.class),
+    verify(locatorClient, times(1)).requestToServer(isA(InetSocketAddress.class),
         isA(FindCoordinatorRequest.class), anyInt(), anyBoolean());
   }
 
@@ -429,7 +429,7 @@ public class GMSJoinLeaveJUnitTest {
 
   @Test
   public void multipleLocatorsWithSameAddressAreCanonicalized() throws Exception {
-    List<HostAndPort> locators = GMSUtil.parseLocators(
+    List<HostAddress> locators = GMSUtil.parseLocators(
         "localhost[1234],localhost[1234],localhost[1234]", (InetAddress) null);
     assertThat(locators.size()).isEqualTo(1);
   }
@@ -1428,7 +1428,7 @@ public class GMSJoinLeaveJUnitTest {
     FindCoordinatorResponse fcr = new FindCoordinatorResponse(mockMembers[0], mockMembers[0], false,
         null, registrants, false, true, null);
 
-    when(locatorClient.requestToServer(isA(HostAndPort.class),
+    when(locatorClient.requestToServer(isA(InetSocketAddress.class),
         isA(FindCoordinatorRequest.class), anyInt(), anyBoolean()))
             .thenReturn(fcr);
 
@@ -1449,7 +1449,7 @@ public class GMSJoinLeaveJUnitTest {
       JoinResponseMessage jrm = new JoinResponseMessage(mockMembers[0], view, 0);
       gmsJoinLeave.setJoinResponseMessage(jrm);
 
-      when(locatorClient.requestToServer(eq(new HostAndPort("localhost", 12346)),
+      when(locatorClient.requestToServer(eq(new InetSocketAddress("localhost", 12346)),
           isA(FindCoordinatorRequest.class), anyInt(), anyBoolean()))
               .thenReturn(fcr);
 
diff --git a/geode-membership/src/main/java/org/apache/geode/distributed/internal/membership/gms/GMSUtil.java b/geode-membership/src/main/java/org/apache/geode/distributed/internal/membership/gms/GMSUtil.java
index b09cb4e..bba8f76 100644
--- a/geode-membership/src/main/java/org/apache/geode/distributed/internal/membership/gms/GMSUtil.java
+++ b/geode-membership/src/main/java/org/apache/geode/distributed/internal/membership/gms/GMSUtil.java
@@ -28,7 +28,7 @@ import java.util.StringTokenizer;
 
 import org.apache.geode.distributed.internal.membership.api.MemberIdentifier;
 import org.apache.geode.distributed.internal.membership.api.MembershipConfigurationException;
-import org.apache.geode.distributed.internal.tcpserver.HostAndPort;
+import org.apache.geode.distributed.internal.membership.gms.membership.HostAddress;
 import org.apache.geode.internal.inet.LocalHostUtil;
 import org.apache.geode.internal.serialization.DeserializationContext;
 import org.apache.geode.internal.serialization.SerializationContext;
@@ -46,7 +46,7 @@ public class GMSUtil {
    * @param bindAddress optional address to check for loopback compatibility
    * @return addresses of locators
    */
-  public static List<HostAndPort> parseLocators(String locatorsString, String bindAddress)
+  public static List<HostAddress> parseLocators(String locatorsString, String bindAddress)
       throws MembershipConfigurationException {
     InetAddress addr = null;
 
@@ -82,10 +82,12 @@ public class GMSUtil {
    * @param locatorsString a DistributionConfig "locators" string
    * @param bindAddress optional address to check for loopback compatibility
    * @return addresses of locators
+   *
+   * @see org.apache.geode.distributed.ConfigurationProperties#LOCATORS for format
    */
-  public static List<HostAndPort> parseLocators(String locatorsString, InetAddress bindAddress)
+  public static List<HostAddress> parseLocators(String locatorsString, InetAddress bindAddress)
       throws MembershipConfigurationException {
-    List<HostAndPort> result = new ArrayList<>(2);
+    List<HostAddress> result = new ArrayList<>(2);
     Set<InetSocketAddress> inetAddresses = new HashSet<>();
     String host;
     final boolean isLoopback = ((bindAddress != null) && bindAddress.isLoopbackAddress());
@@ -147,10 +149,10 @@ public class GMSUtil {
         }
       }
 
-      HostAndPort hostAndPort = new HostAndPort(host, port);
+      HostAddress la = new HostAddress(isa, host);
       if (!inetAddresses.contains(isa)) {
         inetAddresses.add(isa);
-        result.add(hostAndPort);
+        result.add(la);
       }
     }
 
diff --git a/geode-membership/src/main/java/org/apache/geode/distributed/internal/membership/gms/MemberDataBuilderImpl.java b/geode-membership/src/main/java/org/apache/geode/distributed/internal/membership/gms/MemberDataBuilderImpl.java
index 3776175..b0eca8f 100644
--- a/geode-membership/src/main/java/org/apache/geode/distributed/internal/membership/gms/MemberDataBuilderImpl.java
+++ b/geode-membership/src/main/java/org/apache/geode/distributed/internal/membership/gms/MemberDataBuilderImpl.java
@@ -76,13 +76,13 @@ public class MemberDataBuilderImpl implements MemberDataBuilder {
     this.hostName = hostName;
   }
 
-  private MemberDataBuilderImpl(String hostName) {
+  private MemberDataBuilderImpl(String fakeHostName) {
     try {
       inetAddress = LocalHostUtil.getLocalHost();
     } catch (UnknownHostException e2) {
       throw new RuntimeException("Unable to resolve local host address", e2);
     }
-    this.hostName = hostName;
+    hostName = fakeHostName;
   }
 
   public MemberDataBuilderImpl setMembershipPort(int membershipPort) {
diff --git a/geode-membership/src/main/java/org/apache/geode/distributed/internal/membership/gms/MemberIdentifierImpl.java b/geode-membership/src/main/java/org/apache/geode/distributed/internal/membership/gms/MemberIdentifierImpl.java
index d9553f6..2268b5a 100644
--- a/geode-membership/src/main/java/org/apache/geode/distributed/internal/membership/gms/MemberIdentifierImpl.java
+++ b/geode-membership/src/main/java/org/apache/geode/distributed/internal/membership/gms/MemberIdentifierImpl.java
@@ -436,9 +436,9 @@ public class MemberIdentifierImpl implements MemberIdentifier, DataSerializableF
     String host;
 
     InetAddress add = getInetAddress();
-    if ((add != null) && (add.isMulticastAddress() || useIpAddress)) {
+    if (add.isMulticastAddress() || useIpAddress)
       host = add.getHostAddress();
-    } else {
+    else {
       String hostName = memberData.getHostName();
       InetAddressValidator inetAddressValidator = InetAddressValidator.getInstance();
       boolean isIpAddress = inetAddressValidator.isValid(hostName);
diff --git a/geode-membership/src/main/java/org/apache/geode/distributed/internal/membership/gms/fd/GMSHealthMonitor.java b/geode-membership/src/main/java/org/apache/geode/distributed/internal/membership/gms/fd/GMSHealthMonitor.java
index bd95e57..803f4de 100644
--- a/geode-membership/src/main/java/org/apache/geode/distributed/internal/membership/gms/fd/GMSHealthMonitor.java
+++ b/geode-membership/src/main/java/org/apache/geode/distributed/internal/membership/gms/fd/GMSHealthMonitor.java
@@ -68,7 +68,6 @@ import org.apache.geode.distributed.internal.membership.gms.messages.HeartbeatRe
 import org.apache.geode.distributed.internal.membership.gms.messages.SuspectMembersMessage;
 import org.apache.geode.distributed.internal.membership.gms.messages.SuspectRequest;
 import org.apache.geode.distributed.internal.tcpserver.ConnectionWatcher;
-import org.apache.geode.distributed.internal.tcpserver.HostAndPort;
 import org.apache.geode.distributed.internal.tcpserver.TcpSocketCreator;
 import org.apache.geode.internal.lang.JavaWorkarounds;
 import org.apache.geode.internal.serialization.Version;
@@ -574,8 +573,8 @@ public class GMSHealthMonitor<ID extends MemberIdentifier> implements HealthMoni
         logger.debug("Checking member {} with TCP socket connection {}:{}.", suspectMember,
             suspectMember.getInetAddress(), port);
         clientSocket =
-            socketCreator.forAdvancedUse()
-                .connect(new HostAndPort(suspectMember.getHostName(), port), (int) memberTimeout,
+            socketCreator
+                .connect(suspectMember.getInetAddress(), port, (int) memberTimeout,
                     new ConnectTimeoutTask(services.getTimer(), memberTimeout), false, -1, false);
         clientSocket.setTcpNoDelay(true);
         passed = doTCPCheckMember(suspectMember, clientSocket);
@@ -681,7 +680,7 @@ public class GMSHealthMonitor<ID extends MemberIdentifier> implements HealthMoni
   }
 
   ServerSocket createServerSocket(InetAddress socketAddress, int[] portRange) throws IOException {
-    ServerSocket newSocket = socketCreator.forAdvancedUse()
+    ServerSocket newSocket = socketCreator
         .createServerSocketUsingPortRange(socketAddress, 50/* backlog */, true/* isBindAddress */,
             false/* useNIO */, 65536/* tcpBufferSize */, portRange, false);
     socketPort = newSocket.getLocalPort();
diff --git a/geode-membership/src/main/java/org/apache/geode/distributed/internal/membership/gms/locator/GMSLocator.java b/geode-membership/src/main/java/org/apache/geode/distributed/internal/membership/gms/locator/GMSLocator.java
index adf8660..eb2939b 100644
--- a/geode-membership/src/main/java/org/apache/geode/distributed/internal/membership/gms/locator/GMSLocator.java
+++ b/geode-membership/src/main/java/org/apache/geode/distributed/internal/membership/gms/locator/GMSLocator.java
@@ -23,6 +23,7 @@ import java.io.IOException;
 import java.io.ObjectInputStream;
 import java.io.ObjectOutputStream;
 import java.net.InetAddress;
+import java.net.InetSocketAddress;
 import java.nio.file.Path;
 import java.util.ArrayList;
 import java.util.Collection;
@@ -44,8 +45,8 @@ import org.apache.geode.distributed.internal.membership.gms.GMSMembershipView;
 import org.apache.geode.distributed.internal.membership.gms.GMSUtil;
 import org.apache.geode.distributed.internal.membership.gms.Services;
 import org.apache.geode.distributed.internal.membership.gms.interfaces.Locator;
+import org.apache.geode.distributed.internal.membership.gms.membership.HostAddress;
 import org.apache.geode.distributed.internal.membership.gms.messenger.GMSMemberWrapper;
-import org.apache.geode.distributed.internal.tcpserver.HostAndPort;
 import org.apache.geode.distributed.internal.tcpserver.TcpClient;
 import org.apache.geode.distributed.internal.tcpserver.TcpHandler;
 import org.apache.geode.distributed.internal.tcpserver.TcpServer;
@@ -72,7 +73,7 @@ public class GMSLocator<ID extends MemberIdentifier> implements Locator<ID>, Tcp
   private final boolean networkPartitionDetectionEnabled;
   private final String securityUDPDHAlgo;
   private final String locatorString;
-  private final List<HostAndPort> locators;
+  private final List<HostAddress> locators;
   private final MembershipLocatorStatistics locatorStats;
   private final Set<ID> registrants = new HashSet<>();
   private final Map<GMSMemberWrapper, byte[]> publicKeys =
@@ -411,8 +412,8 @@ public class GMSLocator<ID extends MemberIdentifier> implements Locator<ID>, Tcp
   }
 
   private boolean recoverFromOtherLocators() {
-    for (HostAndPort other : locators) {
-      if (recover(other)) {
+    for (HostAddress other : locators) {
+      if (recover(other.getSocketInetAddress())) {
         logger.info("Peer locator recovered state from {}", other);
         return true;
       }
@@ -420,10 +421,10 @@ public class GMSLocator<ID extends MemberIdentifier> implements Locator<ID>, Tcp
     return false;
   }
 
-  private boolean recover(HostAndPort other) {
+  private boolean recover(InetSocketAddress other) {
     try {
       logger.info("Peer locator attempting to recover from {}", other);
-      Object response = locatorClient.requestToServer(other,
+      Object response = locatorClient.requestToServer(other.getAddress(), other.getPort(),
           new GetViewRequest(), 20000, true);
       if (response instanceof GetViewResponse) {
         view = ((GetViewResponse<ID>) response).getView();
diff --git a/geode-membership/src/main/java/org/apache/geode/distributed/internal/membership/gms/locator/MembershipLocatorImpl.java b/geode-membership/src/main/java/org/apache/geode/distributed/internal/membership/gms/locator/MembershipLocatorImpl.java
index 81f3e80..999e6cb 100644
--- a/geode-membership/src/main/java/org/apache/geode/distributed/internal/membership/gms/locator/MembershipLocatorImpl.java
+++ b/geode-membership/src/main/java/org/apache/geode/distributed/internal/membership/gms/locator/MembershipLocatorImpl.java
@@ -37,7 +37,6 @@ import org.apache.geode.distributed.internal.membership.api.MembershipLocator;
 import org.apache.geode.distributed.internal.membership.api.MembershipLocatorStatistics;
 import org.apache.geode.distributed.internal.membership.gms.GMSMembership;
 import org.apache.geode.distributed.internal.membership.gms.Services;
-import org.apache.geode.distributed.internal.tcpserver.HostAndPort;
 import org.apache.geode.distributed.internal.tcpserver.ProtocolChecker;
 import org.apache.geode.distributed.internal.tcpserver.TcpClient;
 import org.apache.geode.distributed.internal.tcpserver.TcpHandler;
@@ -177,8 +176,7 @@ public class MembershipLocatorImpl<ID extends MemberIdentifier> implements Membe
     if (isAlive()) {
       logger.info("Stopping {}", this);
       try {
-        locatorClient
-            .stop(new HostAndPort(((InetSocketAddress) getBindAddress()).getHostName(), getPort()));
+        locatorClient.stop(((InetSocketAddress) getBindAddress()).getAddress(), getPort());
       } catch (ConnectException ignore) {
         // must not be running
       }
diff --git a/geode-membership/src/main/java/org/apache/geode/distributed/internal/membership/gms/membership/GMSJoinLeave.java b/geode-membership/src/main/java/org/apache/geode/distributed/internal/membership/gms/membership/GMSJoinLeave.java
index 95b3e3a..35c8f2c 100644
--- a/geode-membership/src/main/java/org/apache/geode/distributed/internal/membership/gms/membership/GMSJoinLeave.java
+++ b/geode-membership/src/main/java/org/apache/geode/distributed/internal/membership/gms/membership/GMSJoinLeave.java
@@ -20,6 +20,7 @@ import static org.apache.geode.internal.serialization.DataSerializableFixedID.LE
 import static org.apache.geode.internal.serialization.DataSerializableFixedID.REMOVE_MEMBER_REQUEST;
 
 import java.io.IOException;
+import java.net.InetSocketAddress;
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Collections;
@@ -61,7 +62,6 @@ import org.apache.geode.distributed.internal.membership.gms.messages.LeaveReques
 import org.apache.geode.distributed.internal.membership.gms.messages.NetworkPartitionMessage;
 import org.apache.geode.distributed.internal.membership.gms.messages.RemoveMemberMessage;
 import org.apache.geode.distributed.internal.membership.gms.messages.ViewAckMessage;
-import org.apache.geode.distributed.internal.tcpserver.HostAndPort;
 import org.apache.geode.distributed.internal.tcpserver.TcpClient;
 import org.apache.geode.internal.serialization.Version;
 import org.apache.geode.logging.internal.executors.LoggingExecutors;
@@ -179,7 +179,7 @@ public class GMSJoinLeave<ID extends MemberIdentifier> implements JoinLeave<ID>
    */
   private GMSMembershipView<ID> lastConflictingView;
 
-  private List<HostAndPort> locators;
+  private List<HostAddress> locators;
 
   /**
    * a list of join/leave/crashes
@@ -1140,9 +1140,10 @@ public class GMSJoinLeave<ID extends MemberIdentifier> implements JoinLeave<ID>
     state.locatorsContacted = 0;
 
     do {
-      for (HostAndPort laddr : locators) {
+      for (HostAddress laddr : locators) {
         try {
-          Object o = locatorClient.requestToServer(laddr, request, connectTimeout, true);
+          InetSocketAddress addr = laddr.getSocketInetAddress();
+          Object o = locatorClient.requestToServer(addr, request, connectTimeout, true);
           FindCoordinatorResponse<ID> response =
               (o instanceof FindCoordinatorResponse) ? (FindCoordinatorResponse<ID>) o : null;
           if (response != null) {
diff --git a/geode-core/src/main/java/org/apache/geode/internal/net/SCClientSocketCreator.java b/geode-membership/src/main/java/org/apache/geode/distributed/internal/membership/gms/membership/HostAddress.java
similarity index 58%
rename from geode-core/src/main/java/org/apache/geode/internal/net/SCClientSocketCreator.java
rename to geode-membership/src/main/java/org/apache/geode/distributed/internal/membership/gms/membership/HostAddress.java
index 01afdfb..3edde3b 100644
--- a/geode-core/src/main/java/org/apache/geode/internal/net/SCClientSocketCreator.java
+++ b/geode-membership/src/main/java/org/apache/geode/distributed/internal/membership/gms/membership/HostAddress.java
@@ -12,24 +12,16 @@
  * or implied. See the License for the specific language governing permissions and limitations under
  * the License.
  */
-package org.apache.geode.internal.net;
+package org.apache.geode.distributed.internal.membership.gms.membership;
 
-import java.io.IOException;
-import java.net.Socket;
+import java.net.InetSocketAddress;
 
-import org.apache.geode.distributed.internal.tcpserver.ClientSocketCreatorImpl;
+import org.apache.geode.distributed.internal.tcpserver.LocatorAddress;
 
-class SCClientSocketCreator extends ClientSocketCreatorImpl {
-  private final SocketCreator coreSocketCreator;
+public class HostAddress extends LocatorAddress {
 
-  protected SCClientSocketCreator(SocketCreator socketCreator) {
-    super(socketCreator);
-    coreSocketCreator = socketCreator;
-  }
-
-  @Override
-  public void handshakeIfSocketIsSSL(Socket socket, int timeout) throws IOException {
-    coreSocketCreator.handshakeIfSocketIsSSL(socket, timeout);
+  public HostAddress(InetSocketAddress loc, String locStr) {
+    super(loc, locStr);
   }
 
 }
diff --git a/geode-protobuf/src/integrationTest/java/org/apache/geode/internal/protocol/protobuf/v1/acceptance/CacheConnectionIntegrationTest.java b/geode-protobuf/src/integrationTest/java/org/apache/geode/internal/protocol/protobuf/v1/acceptance/CacheConnectionIntegrationTest.java
index 5917829..2a2d2b5 100644
--- a/geode-protobuf/src/integrationTest/java/org/apache/geode/internal/protocol/protobuf/v1/acceptance/CacheConnectionIntegrationTest.java
+++ b/geode-protobuf/src/integrationTest/java/org/apache/geode/internal/protocol/protobuf/v1/acceptance/CacheConnectionIntegrationTest.java
@@ -60,7 +60,6 @@ import org.apache.geode.cache.RegionFactory;
 import org.apache.geode.cache.server.CacheServer;
 import org.apache.geode.distributed.ConfigurationProperties;
 import org.apache.geode.distributed.internal.InternalDistributedSystem;
-import org.apache.geode.distributed.internal.tcpserver.HostAndPort;
 import org.apache.geode.internal.AvailablePortHelper;
 import org.apache.geode.internal.admin.SSLConfig;
 import org.apache.geode.internal.cache.InternalCacheServer;
@@ -273,7 +272,6 @@ public class CacheConnectionIntegrationTest {
     sslConfigBuilder.setEndpointIdentificationEnabled(false);
 
     SocketCreator socketCreator = new SocketCreator(sslConfigBuilder.build());
-    return socketCreator.forClient().connect(new HostAndPort("localhost", cacheServerPort),
-        5000);
+    return socketCreator.connectForClient("localhost", cacheServerPort, 5000);
   }
 }
diff --git a/geode-protobuf/src/integrationTest/java/org/apache/geode/internal/protocol/protobuf/v1/acceptance/CacheOperationsJUnitTest.java b/geode-protobuf/src/integrationTest/java/org/apache/geode/internal/protocol/protobuf/v1/acceptance/CacheOperationsJUnitTest.java
index f4d2e70..b40cabd 100644
--- a/geode-protobuf/src/integrationTest/java/org/apache/geode/internal/protocol/protobuf/v1/acceptance/CacheOperationsJUnitTest.java
+++ b/geode-protobuf/src/integrationTest/java/org/apache/geode/internal/protocol/protobuf/v1/acceptance/CacheOperationsJUnitTest.java
@@ -53,7 +53,6 @@ import org.apache.geode.cache.CacheFactory;
 import org.apache.geode.cache.RegionFactory;
 import org.apache.geode.cache.server.CacheServer;
 import org.apache.geode.distributed.ConfigurationProperties;
-import org.apache.geode.distributed.internal.tcpserver.HostAndPort;
 import org.apache.geode.internal.AvailablePortHelper;
 import org.apache.geode.internal.admin.SSLConfig;
 import org.apache.geode.internal.net.SocketCreator;
@@ -402,7 +401,6 @@ public class CacheOperationsJUnitTest {
     sslConfigBuilder.setKeystorePassword("password");
 
     SocketCreator socketCreator = new SocketCreator(sslConfigBuilder.build());
-    return socketCreator.forClient().connect(new HostAndPort("localhost", cacheServerPort),
-        5000);
+    return socketCreator.connectForClient("localhost", cacheServerPort, 5000);
   }
 }
diff --git a/geode-serialization/src/main/java/org/apache/geode/internal/serialization/DataSerializableFixedID.java b/geode-serialization/src/main/java/org/apache/geode/internal/serialization/DataSerializableFixedID.java
index e00dd64..50b52bf 100644
--- a/geode-serialization/src/main/java/org/apache/geode/internal/serialization/DataSerializableFixedID.java
+++ b/geode-serialization/src/main/java/org/apache/geode/internal/serialization/DataSerializableFixedID.java
@@ -673,7 +673,6 @@ public interface DataSerializableFixedID extends SerializationVersions, BasicSer
   short GATEWAY_SENDER_QUEUE_ENTRY_SYNCHRONIZATION_ENTRY = 2182;
   short ABORT_BACKUP_REQUEST = 2183;
   short MEMBER_IDENTIFIER = 2184;
-  short HOST_AND_PORT = 2185;
 
   // NOTE, codes > 65535 will take 4 bytes to serialize
 
diff --git a/geode-serialization/src/main/java/org/apache/geode/internal/serialization/StaticSerialization.java b/geode-serialization/src/main/java/org/apache/geode/internal/serialization/StaticSerialization.java
index 09f62a8..aa4e46a 100644
--- a/geode-serialization/src/main/java/org/apache/geode/internal/serialization/StaticSerialization.java
+++ b/geode-serialization/src/main/java/org/apache/geode/internal/serialization/StaticSerialization.java
@@ -266,7 +266,6 @@ public class StaticSerialization {
     }
 
     try {
-      // note: this does not throw UnknownHostException at this time
       InetAddress addr = InetAddress.getByAddress(address);
       return addr;
     } catch (UnknownHostException ex) {
diff --git a/geode-tcp-server/src/distributedTest/java/org/apache/geode/distributed/internal/tcpserver/TcpServerGossipVersionDUnitTest.java b/geode-tcp-server/src/distributedTest/java/org/apache/geode/distributed/internal/tcpserver/TcpServerGossipVersionDUnitTest.java
index f321a9a..b283358 100644
--- a/geode-tcp-server/src/distributedTest/java/org/apache/geode/distributed/internal/tcpserver/TcpServerGossipVersionDUnitTest.java
+++ b/geode-tcp-server/src/distributedTest/java/org/apache/geode/distributed/internal/tcpserver/TcpServerGossipVersionDUnitTest.java
@@ -149,8 +149,7 @@ public class TcpServerGossipVersionDUnitTest extends JUnit4DistributedTestCase {
           .getSocketCreatorForComponent(SecurableCommunicationChannel.LOCATOR),
           InternalDataSerializer.getDSFIDSerializer().getObjectSerializer(),
           InternalDataSerializer.getDSFIDSerializer().getObjectDeserializer())
-              .requestToServer(new HostAndPort(LocalHostUtil.getLocalHost().getHostName(), port0),
-                  req, 5000);
+              .requestToServer(LocalHostUtil.getLocalHost(), port0, req, 5000);
       assertThat(response).isNotNull();
 
     } catch (IllegalStateException e) {
diff --git a/geode-tcp-server/src/distributedTest/java/org/apache/geode/distributed/internal/tcpserver/TcpServerJUnitTest.java b/geode-tcp-server/src/distributedTest/java/org/apache/geode/distributed/internal/tcpserver/TcpServerJUnitTest.java
index 991c10b..a0947e5 100644
--- a/geode-tcp-server/src/distributedTest/java/org/apache/geode/distributed/internal/tcpserver/TcpServerJUnitTest.java
+++ b/geode-tcp-server/src/distributedTest/java/org/apache/geode/distributed/internal/tcpserver/TcpServerJUnitTest.java
@@ -32,7 +32,6 @@ import java.io.IOException;
 import java.net.ConnectException;
 import java.net.InetAddress;
 import java.net.SocketException;
-import java.net.UnknownHostException;
 import java.util.HashSet;
 import java.util.Properties;
 import java.util.Set;
@@ -126,14 +125,6 @@ public class TcpServerJUnitTest {
   }
 
   @Test
-  public void testConnectToUnknownHost() throws Exception {
-    final TcpClient tcpClient = createTcpClient();
-    InfoRequest testInfoRequest = new InfoRequest();
-    assertThatThrownBy(() -> tcpClient.requestToServer(new HostAndPort("unknown host name", port),
-        testInfoRequest, TIMEOUT)).isInstanceOf(UnknownHostException.class);
-  }
-
-  @Test
   public void testClientGetInfo() throws Exception {
     TcpHandler handler = new InfoRequestHandler();
     start(handler);
@@ -142,11 +133,10 @@ public class TcpServerJUnitTest {
 
     InfoRequest testInfoRequest = new InfoRequest();
     InfoResponse testInfoResponse =
-        (InfoResponse) tcpClient.requestToServer(new HostAndPort(localhost.getHostAddress(), port),
-            testInfoRequest, TIMEOUT);
+        (InfoResponse) tcpClient.requestToServer(localhost, port, testInfoRequest, TIMEOUT);
     assertThat(testInfoResponse.getInfo()[0]).contains("geode-tcp-server");
 
-    String[] requestedInfo = tcpClient.getInfo(new HostAndPort(localhost.getHostAddress(), port));
+    String[] requestedInfo = tcpClient.getInfo(localhost, port);
     assertNotNull(requestedInfo);
     assertTrue(requestedInfo.length > 1);
 
@@ -177,8 +167,7 @@ public class TcpServerJUnitTest {
       public void run() {
         Boolean delay = Boolean.valueOf(true);
         try {
-          tcpClient.requestToServer(new HostAndPort(localhost.getHostAddress(), port), delay,
-              TIMEOUT);
+          tcpClient.requestToServer(localhost, port, delay, TIMEOUT);
         } catch (IOException e) {
           e.printStackTrace();
         } catch (ClassNotFoundException e) {
@@ -191,8 +180,7 @@ public class TcpServerJUnitTest {
     try {
       Thread.sleep(500);
       assertFalse(done.get());
-      tcpClient.requestToServer(new HostAndPort(localhost.getHostAddress(), port),
-          Boolean.valueOf(false), TIMEOUT);
+      tcpClient.requestToServer(localhost, port, Boolean.valueOf(false), TIMEOUT);
       assertFalse(done.get());
 
       latch.countDown();
@@ -218,9 +206,8 @@ public class TcpServerJUnitTest {
 
     // Due to the mocked handler, an EOFException will be thrown on the client. This is expected.
     assertThatThrownBy(
-        () -> tcpClient.requestToServer(new HostAndPort(localhost.getHostAddress(), port),
-            new TestObject(), TIMEOUT))
-                .isInstanceOf(EOFException.class);
+        () -> tcpClient.requestToServer(localhost, port, new TestObject(), TIMEOUT))
+            .isInstanceOf(EOFException.class);
 
     // Change the mock handler behavior to echo the request back
     doAnswer(new Answer() {
@@ -234,8 +221,7 @@ public class TcpServerJUnitTest {
     TestObject test = new TestObject();
     test.id = 5;
     TestObject result =
-        (TestObject) tcpClient.requestToServer(new HostAndPort(localhost.getHostAddress(), port),
-            test, TIMEOUT);
+        (TestObject) tcpClient.requestToServer(localhost, port, test, TIMEOUT);
 
     assertEquals(test.id, result.id);
 
@@ -247,7 +233,7 @@ public class TcpServerJUnitTest {
 
   private void stopServer(final TcpClient tcpClient) throws InterruptedException {
     try {
-      tcpClient.stop(new HostAndPort(localhost.getHostAddress(), port));
+      tcpClient.stop(localhost, port);
     } catch (ConnectException ignore) {
       // must not be running
     }
diff --git a/geode-tcp-server/src/distributedTest/java/org/apache/geode/distributed/internal/tcpserver/TcpServerProductVersionDUnitTest.java b/geode-tcp-server/src/distributedTest/java/org/apache/geode/distributed/internal/tcpserver/TcpServerProductVersionDUnitTest.java
index 9bc0f31..e98cbf8 100644
--- a/geode-tcp-server/src/distributedTest/java/org/apache/geode/distributed/internal/tcpserver/TcpServerProductVersionDUnitTest.java
+++ b/geode-tcp-server/src/distributedTest/java/org/apache/geode/distributed/internal/tcpserver/TcpServerProductVersionDUnitTest.java
@@ -23,8 +23,6 @@ import java.io.File;
 import java.io.Serializable;
 import java.lang.reflect.Constructor;
 import java.lang.reflect.InvocationTargetException;
-import java.lang.reflect.Method;
-import java.net.InetAddress;
 import java.util.Arrays;
 import java.util.Collection;
 import java.util.List;
@@ -170,19 +168,8 @@ public class TcpServerProductVersionDUnitTest implements Serializable {
         tcpClient = getLegacyTcpClient();
       }
 
-      Object response;
-      try {
-        Method requestToServer =
-            TcpClient.class.getMethod("requestToServer", InetAddress.class, int.class, Object.class,
-                int.class);
-        response = requestToServer.invoke(tcpClient, SocketCreator.getLocalHost(), locatorPort,
-            requestMessage, 1000);
-      } catch (NoSuchMethodException e) {
-        response = tcpClient
-            .requestToServer(
-                new HostAndPort(SocketCreator.getLocalHost().getHostAddress(), locatorPort),
-                requestMessage, 1000);
-      }
+      final Object response = tcpClient
+          .requestToServer(SocketCreator.getLocalHost(), locatorPort, requestMessage, 1000);
 
       final Class<?> responseClass = Class.forName(responseClassName);
 
diff --git a/geode-tcp-server/src/main/java/org/apache/geode/distributed/internal/tcpserver/AdvancedSocketCreator.java b/geode-tcp-server/src/main/java/org/apache/geode/distributed/internal/tcpserver/AdvancedSocketCreator.java
deleted file mode 100644
index a93df50..0000000
--- a/geode-tcp-server/src/main/java/org/apache/geode/distributed/internal/tcpserver/AdvancedSocketCreator.java
+++ /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.
- */
-package org.apache.geode.distributed.internal.tcpserver;
-
-import java.io.IOException;
-import java.net.InetAddress;
-import java.net.ServerSocket;
-import java.net.Socket;
-
-
-/**
- * AdvancedSocketCreator provides a couple of methods for either client/server
- * or cluster communications that don't fit neatly into either of the ClientSocketCreator
- * or ClusterSocketCreator interfaces.
- */
-public interface AdvancedSocketCreator {
-  /**
-   * Returns true if this socket creator is configured to use SSL by default
-   */
-  boolean useSSL();
-
-  /**
-   * After creating a socket connection use this method to initiate the SSL
-   * handshake. If SSL is not enabled for the socket this method does nothing.
-   */
-  void handshakeIfSocketIsSSL(Socket socket, int timeout) throws IOException;
-
-  /**
-   * This method is used to create a ServerSocket that uses a port in a specific
-   * range of values. You can also specify whether SSL is or is not used.
-   */
-  ServerSocket createServerSocketUsingPortRange(InetAddress ba, int backlog,
-      boolean isBindAddress, boolean useNIO,
-      int tcpBufferSize, int[] tcpPortRange,
-      boolean sslConnection) throws IOException;
-
-  /**
-   * This method gives you pretty much full control over creating a connection
-   * to the given host/port. Use it with care.
-   * <p>
-   * Return a client socket, timing out if unable to connect and timeout > 0 (millis). The parameter
-   * <i>timeout</i> is ignored if SSL is being used, as there is no timeout argument in the ssl
-   * socket factory
-   */
-  Socket connect(HostAndPort addr, int timeout,
-      ConnectionWatcher optionalWatcher, boolean allowClientSocketFactory,
-      int socketBufferSize,
-      boolean useSSL) throws IOException;
-}
diff --git a/geode-tcp-server/src/main/java/org/apache/geode/distributed/internal/tcpserver/AdvancedSocketCreatorImpl.java b/geode-tcp-server/src/main/java/org/apache/geode/distributed/internal/tcpserver/AdvancedSocketCreatorImpl.java
deleted file mode 100644
index 16104ec..0000000
--- a/geode-tcp-server/src/main/java/org/apache/geode/distributed/internal/tcpserver/AdvancedSocketCreatorImpl.java
+++ /dev/null
@@ -1,180 +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 org.apache.geode.distributed.internal.tcpserver;
-
-import java.io.IOException;
-import java.net.InetAddress;
-import java.net.InetSocketAddress;
-import java.net.ServerSocket;
-import java.net.Socket;
-import java.nio.channels.ServerSocketChannel;
-import java.util.concurrent.ThreadLocalRandom;
-
-import org.apache.geode.util.internal.GeodeGlossary;
-
-public class AdvancedSocketCreatorImpl implements AdvancedSocketCreator {
-
-  public static final boolean ENABLE_TCP_KEEP_ALIVE;
-
-  static {
-    // bug #49484 - customers want tcp/ip keep-alive turned on by default
-    // to avoid dropped connections. It can be turned off by setting this
-    // property to false
-    String str = System.getProperty(GeodeGlossary.GEMFIRE_PREFIX + "setTcpKeepAlive");
-    if (str != null) {
-      ENABLE_TCP_KEEP_ALIVE = Boolean.valueOf(str);
-    } else {
-      ENABLE_TCP_KEEP_ALIVE = true;
-    }
-  }
-
-  protected final TcpSocketCreatorImpl socketCreator;
-
-  protected AdvancedSocketCreatorImpl(TcpSocketCreatorImpl socketCreator) {
-    this.socketCreator = socketCreator;
-  }
-
-  @Override
-  public boolean useSSL() {
-    return socketCreator.useSSL();
-  }
-
-  @Override
-  public void handshakeIfSocketIsSSL(Socket socket, int timeout) throws IOException {
-    if (useSSL()) {
-      throw new IllegalStateException("Handshake on SSL connections is not supported");
-    }
-  }
-
-  @Override
-  public Socket connect(HostAndPort addr, int timeout,
-      ConnectionWatcher optionalWatcher, boolean allowClientSocketFactory,
-      int socketBufferSize, boolean useSSL) throws IOException {
-    if (useSSL) {
-      throw new IllegalArgumentException();
-    }
-    Socket socket = null;
-    if (allowClientSocketFactory) {
-      socket = createCustomClientSocket(addr);
-    }
-    if (socket == null) {
-      socket = new Socket();
-
-      // Optionally enable SO_KEEPALIVE in the OS network protocol.
-      socket.setKeepAlive(ENABLE_TCP_KEEP_ALIVE);
-
-      if (socketBufferSize != -1) {
-        socket.setReceiveBufferSize(socketBufferSize);
-      }
-      if (optionalWatcher != null) {
-        optionalWatcher.beforeConnect(socket);
-      }
-      InetSocketAddress inetSocketAddress = addr.getSocketInetAddress();
-      try {
-        InetAddress serverAddress = inetSocketAddress.getAddress();
-        if (serverAddress == null) {
-          serverAddress = InetAddress.getByName(inetSocketAddress.getHostName());
-        }
-        socket.connect(
-            new InetSocketAddress(serverAddress, inetSocketAddress.getPort()),
-            Math.max(timeout, 0));
-      } finally {
-        if (optionalWatcher != null) {
-          optionalWatcher.afterConnect(socket);
-        }
-      }
-    }
-    return socket;
-  }
-
-  @Override
-  public final ServerSocket createServerSocketUsingPortRange(InetAddress ba, int backlog,
-      boolean isBindAddress, boolean useNIO,
-      int tcpBufferSize, int[] tcpPortRange,
-      boolean sslConnection) throws IOException {
-    try {
-      // Get a random port from range.
-      int startingPort = tcpPortRange[0]
-          + ThreadLocalRandom.current().nextInt(tcpPortRange[1] - tcpPortRange[0] + 1);
-      int localPort = startingPort;
-      int portLimit = tcpPortRange[1];
-
-      while (true) {
-        if (localPort > portLimit) {
-          if (startingPort != 0) {
-            localPort = tcpPortRange[0];
-            portLimit = startingPort - 1;
-            startingPort = 0;
-          } else {
-            throw noFreePortException(
-                String.format("Unable to find a free port in the membership-port-range: [%d,%d]",
-                    tcpPortRange[0], tcpPortRange[1]));
-          }
-        }
-        ServerSocket socket = null;
-        try {
-          if (useNIO) {
-            ServerSocketChannel channel = ServerSocketChannel.open();
-            socket = channel.socket();
-
-            InetSocketAddress address =
-                new InetSocketAddress(isBindAddress ? ba : null, localPort);
-            socket.bind(address, backlog);
-          } else {
-            socket = socketCreator.serverSocketCreator.createServerSocket(localPort,
-                backlog, isBindAddress ? ba : null,
-                tcpBufferSize, sslConnection);
-          }
-          return socket;
-        } catch (java.net.SocketException ex) {
-          if (socket != null && !socket.isClosed()) {
-            socket.close();
-          }
-          localPort++;
-        }
-      }
-    } catch (IOException e) {
-      throw problemCreatingSocketInPortRangeException(
-          "unable to create a socket in the membership-port range", e);
-    }
-  }
-
-  /**
-   * Overridable method for creating an exception during search of port-range
-   */
-  protected RuntimeException problemCreatingSocketInPortRangeException(String s, IOException e) {
-    return new RuntimeException(s, e);
-  }
-
-  /**
-   * Overridable method for creating an exception during search of port-range
-   */
-  protected RuntimeException noFreePortException(String reason) {
-    return new RuntimeException(reason);
-  }
-
-  /**
-   * reimplement this method to use a custom socket factory to create and configure a new
-   * client-side socket
-   *
-   * @return the socket, or null if no custom client socket factory is available
-   */
-  protected Socket createCustomClientSocket(HostAndPort addr) throws IOException {
-    throw new UnsupportedOperationException(
-        "custom client socket factory is not supported by this socket creator");
-  }
-
-
-}
diff --git a/geode-tcp-server/src/main/java/org/apache/geode/distributed/internal/tcpserver/ClientSocketCreator.java b/geode-tcp-server/src/main/java/org/apache/geode/distributed/internal/tcpserver/ClientSocketCreator.java
deleted file mode 100644
index dd360d0..0000000
--- a/geode-tcp-server/src/main/java/org/apache/geode/distributed/internal/tcpserver/ClientSocketCreator.java
+++ /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.
- */
-package org.apache.geode.distributed.internal.tcpserver;
-
-import java.io.IOException;
-import java.net.Socket;
-
-/**
- * ClientSocketCreator should be used, in most cases, in client caches and for WAN
- * connections. It allows the use of a socket factory in creating connections to servers.
- */
-public interface ClientSocketCreator {
-
-  /**
-   * Returns true if this socket creator is configured to use SSL by default
-   */
-  boolean useSSL();
-
-  /**
-   * After creating a socket connection use this method to initiate the SSL
-   * handshake. If SSL is not enabled for the socket this method does nothing.
-   */
-  void handshakeIfSocketIsSSL(Socket socket, int timeout) throws IOException;
-
-  /**
-   * Create a connection to the given host/port using client-cache defaults for things
-   * like socket buffer size
-   */
-  Socket connect(HostAndPort addr, int connectTimeout) throws IOException;
-
-  /**
-   * Creates a connection to the given host/port
-   */
-  Socket connect(HostAndPort addr, int connectTimeout, int socketBufferSize)
-      throws IOException;
-}
diff --git a/geode-tcp-server/src/main/java/org/apache/geode/distributed/internal/tcpserver/ClientSocketCreatorImpl.java b/geode-tcp-server/src/main/java/org/apache/geode/distributed/internal/tcpserver/ClientSocketCreatorImpl.java
deleted file mode 100644
index 2479f82..0000000
--- a/geode-tcp-server/src/main/java/org/apache/geode/distributed/internal/tcpserver/ClientSocketCreatorImpl.java
+++ /dev/null
@@ -1,54 +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 org.apache.geode.distributed.internal.tcpserver;
-
-import java.io.IOException;
-import java.net.Socket;
-
-public class ClientSocketCreatorImpl implements ClientSocketCreator {
-  protected final TcpSocketCreatorImpl socketCreator;
-
-  protected ClientSocketCreatorImpl(TcpSocketCreatorImpl socketCreator) {
-    this.socketCreator = socketCreator;
-  }
-
-  @Override
-  public boolean useSSL() {
-    return socketCreator.useSSL();
-  }
-
-  @Override
-  public void handshakeIfSocketIsSSL(Socket socket, int timeout) throws IOException {
-    if (useSSL()) {
-      throw new IllegalStateException("Handshake on SSL connections is not supported");
-    }
-  }
-
-  /**
-   * Return a client socket. This method is used by client/server clients.
-   */
-  public Socket connect(HostAndPort addr, int timeout) throws IOException {
-    return socketCreator.connect(addr, timeout, null, true, -1);
-  }
-
-  /**
-   * Return a client socket. This method is used by client/server clients.
-   */
-  public Socket connect(HostAndPort addr, int timeout, int socketBufferSize)
-      throws IOException {
-    return socketCreator.connect(addr, timeout, null, true, socketBufferSize);
-  }
-
-}
diff --git a/geode-tcp-server/src/main/java/org/apache/geode/distributed/internal/tcpserver/ClusterSocketCreator.java b/geode-tcp-server/src/main/java/org/apache/geode/distributed/internal/tcpserver/ClusterSocketCreator.java
deleted file mode 100644
index ccf4c69..0000000
--- a/geode-tcp-server/src/main/java/org/apache/geode/distributed/internal/tcpserver/ClusterSocketCreator.java
+++ /dev/null
@@ -1,66 +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 org.apache.geode.distributed.internal.tcpserver;
-
-import java.io.IOException;
-import java.net.InetAddress;
-import java.net.ServerSocket;
-import java.net.Socket;
-
-/**
- * ServerSocketCreator should be used to create connections between peers in
- * a cluster.
- */
-public interface ClusterSocketCreator {
-
-  /**
-   * Returns true if this socket creator is configured to use SSL by default
-   */
-  boolean useSSL();
-
-  /**
-   * After creating a socket connection use this method to initiate the SSL
-   * handshake. If SSL is not enabled for the socket this method does nothing.
-   */
-  void handshakeIfSocketIsSSL(Socket socket, int timeout) throws IOException;
-
-  /**
-   * Create a server socket that listens on all interfaces
-   */
-  ServerSocket createServerSocket(int nport, int backlog) throws IOException;
-
-  /**
-   * Create a server socket that is bound to the given address
-   */
-  ServerSocket createServerSocket(int nport, int backlog, InetAddress bindAddr)
-      throws IOException;
-
-  /**
-   * Creates a connection to the given host/port. This method ignores any
-   * custom client-side socket factory that may be installed.
-   */
-  Socket connect(HostAndPort addr) throws IOException;
-
-  /**
-   * Creates a connection to the given host/port. The ConnectionWatcher may be null.
-   * If it is not null the watcher is notified before and after the connection is created.
-   * This is typically used by a timer task in order to take action should connection-formation
-   * take too long.
-   * <p>
-   * This method ignores any custom client-side socket factory that may be installed.
-   */
-  Socket connect(HostAndPort addr, int timeout,
-      ConnectionWatcher optionalWatcher) throws IOException;
-}
diff --git a/geode-tcp-server/src/main/java/org/apache/geode/distributed/internal/tcpserver/HostAndPort.java b/geode-tcp-server/src/main/java/org/apache/geode/distributed/internal/tcpserver/HostAndPort.java
deleted file mode 100644
index 860eae5..0000000
--- a/geode-tcp-server/src/main/java/org/apache/geode/distributed/internal/tcpserver/HostAndPort.java
+++ /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.
- */
-package org.apache.geode.distributed.internal.tcpserver;
-
-import java.io.DataInput;
-import java.io.DataOutput;
-import java.io.IOException;
-import java.net.InetAddress;
-import java.net.InetSocketAddress;
-import java.util.Objects;
-
-import org.apache.commons.validator.routines.InetAddressValidator;
-
-import org.apache.geode.internal.serialization.DataSerializableFixedID;
-import org.apache.geode.internal.serialization.DeserializationContext;
-import org.apache.geode.internal.serialization.SerializationContext;
-import org.apache.geode.internal.serialization.StaticSerialization;
-import org.apache.geode.internal.serialization.Version;
-
-/**
- * This class is serializable for testing. A number of client/server and WAN tests
- * transmit PoolAttributes between unit test JVMs using RMI. PoolAttributes are
- * Externalizable for this purpose and use Geode serialization to transmit HostAndPort
- * objects along with other attributes.
- */
-public class HostAndPort implements DataSerializableFixedID {
-
-  private InetSocketAddress socketInetAddress;
-
-  public HostAndPort() {
-    // serialization constructor
-  }
-
-  public HostAndPort(String hostName, int port) {
-    if (hostName == null) {
-      socketInetAddress = new InetSocketAddress(port);
-    } else if (InetAddressValidator.getInstance().isValid(hostName)) {
-      // numeric address - use as-is
-      socketInetAddress = new InetSocketAddress(hostName, port);
-    } else {
-      // non-numeric address - resolve hostname when needed
-      socketInetAddress = InetSocketAddress.createUnresolved(hostName, port);
-    }
-  }
-
-  /**
-   * If location is not litteral IP address a new resolved {@link InetSocketAddress} is returned.
-   *
-   * @return resolved {@link InetSocketAddress}, otherwise stored {@link InetSocketAddress} if
-   *         literal IP address is used.
-   */
-  public InetSocketAddress getSocketInetAddress() {
-    if (socketInetAddress.isUnresolved()) {
-      // note that this leaves the InetAddress null if the hostname isn't resolvable
-      return new InetSocketAddress(socketInetAddress.getHostString(), socketInetAddress.getPort());
-    } else {
-      return this.socketInetAddress;
-    }
-  }
-
-  public String getHostName() {
-    return socketInetAddress.getHostString();
-  }
-
-  public int getPort() {
-    return socketInetAddress.getPort();
-  }
-
-  @Override
-  public int hashCode() {
-    return socketInetAddress.hashCode();
-  }
-
-  @Override
-  public boolean equals(Object o) {
-    if (this == o) {
-      return true;
-    }
-    if (o == null || getClass() != o.getClass()) {
-      return false;
-    }
-    HostAndPort that = (HostAndPort) o;
-    return Objects.equals(socketInetAddress, that.socketInetAddress);
-  }
-
-  @Override
-  public String toString() {
-    return getClass().getSimpleName() + " [socketInetAddress=" + socketInetAddress + "]";
-  }
-
-  private InetSocketAddress cloneUnresolved(final InetSocketAddress inetSocketAddress) {
-    return InetSocketAddress.createUnresolved(inetSocketAddress.getHostString(),
-        inetSocketAddress.getPort());
-  }
-
-  public InetAddress getAddress() {
-    return getSocketInetAddress().getAddress();
-  }
-
-  @Override
-  public int getDSFID() {
-    return HOST_AND_PORT;
-  }
-
-  @Override
-  public void toData(DataOutput out, SerializationContext context) throws IOException {
-    if (socketInetAddress.isUnresolved()) {
-      out.writeByte(0);
-      StaticSerialization.writeString(getHostName(), out);
-      out.writeInt(getPort());
-    } else {
-      out.writeByte(1);
-      StaticSerialization.writeInetAddress(socketInetAddress.getAddress(), out);
-      out.writeInt(getPort());
-    }
-  }
-
-  @Override
-  public void fromData(DataInput in, DeserializationContext context)
-      throws IOException, ClassNotFoundException {
-    InetAddress address = null;
-    byte flags = in.readByte();
-    if ((flags & 1) == 0) {
-      String hostName = StaticSerialization.readString(in);
-      int port = in.readInt();
-      if (hostName == null || hostName.isEmpty()) {
-        socketInetAddress = new InetSocketAddress(port);
-      } else {
-        socketInetAddress = InetSocketAddress.createUnresolved(hostName, port);
-      }
-    } else {
-      address = StaticSerialization.readInetAddress(in);
-      int port = in.readInt();
-      socketInetAddress = new InetSocketAddress(address, port);
-    }
-  }
-
-  @Override
-  public Version[] getSerializationVersions() {
-    return new Version[0];
-  }
-}
diff --git a/geode-tcp-server/src/main/java/org/apache/geode/distributed/internal/tcpserver/LocatorAddress.java b/geode-tcp-server/src/main/java/org/apache/geode/distributed/internal/tcpserver/LocatorAddress.java
new file mode 100644
index 0000000..0097b50
--- /dev/null
+++ b/geode-tcp-server/src/main/java/org/apache/geode/distributed/internal/tcpserver/LocatorAddress.java
@@ -0,0 +1,91 @@
+/*
+ * 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 org.apache.geode.distributed.internal.tcpserver;
+
+import java.net.InetSocketAddress;
+import java.util.Objects;
+
+import org.apache.commons.validator.routines.InetAddressValidator;
+
+public class LocatorAddress {
+
+  private final InetSocketAddress socketInetAddress;
+
+  public LocatorAddress(InetSocketAddress loc, String locStr) {
+    if (InetAddressValidator.getInstance().isValid(locStr)) {
+      socketInetAddress = new InetSocketAddress(locStr, loc.getPort());
+    } else {
+      socketInetAddress = cloneUnresolved(loc);
+    }
+  }
+
+  /**
+   * @deprecated Users should not care if literal IP or hostname is used.
+   */
+  @Deprecated
+  public boolean isIpString() {
+    return !socketInetAddress.isUnresolved();
+  }
+
+  /**
+   * If location is not litteral IP address a new resolved {@link InetSocketAddress} is returned.
+   *
+   * @return resolved {@link InetSocketAddress}, otherwise stored {@link InetSocketAddress} if
+   *         literal IP address is used.
+   */
+  public InetSocketAddress getSocketInetAddress() {
+    if (socketInetAddress.isUnresolved()) {
+      return new InetSocketAddress(socketInetAddress.getHostString(), socketInetAddress.getPort());
+    } else {
+      return this.socketInetAddress;
+    }
+  }
+
+  public String getHostName() {
+    return socketInetAddress.getHostString();
+  }
+
+  public int getPort() {
+    return socketInetAddress.getPort();
+  }
+
+  @Override
+  public int hashCode() {
+    return socketInetAddress.hashCode();
+  }
+
+  @Override
+  public boolean equals(Object o) {
+    if (this == o) {
+      return true;
+    }
+    if (o == null || getClass() != o.getClass()) {
+      return false;
+    }
+    LocatorAddress that = (LocatorAddress) o;
+    return Objects.equals(socketInetAddress, that.socketInetAddress);
+  }
+
+  @Override
+  public String toString() {
+    return getClass().getSimpleName() + " [socketInetAddress=" + socketInetAddress + "]";
+  }
+
+  private InetSocketAddress cloneUnresolved(final InetSocketAddress inetSocketAddress) {
+    return InetSocketAddress.createUnresolved(inetSocketAddress.getHostString(),
+        inetSocketAddress.getPort());
+  }
+
+}
diff --git a/geode-tcp-server/src/main/java/org/apache/geode/distributed/internal/tcpserver/ServerSocketCreatorImpl.java b/geode-tcp-server/src/main/java/org/apache/geode/distributed/internal/tcpserver/ServerSocketCreatorImpl.java
deleted file mode 100644
index ad637ad..0000000
--- a/geode-tcp-server/src/main/java/org/apache/geode/distributed/internal/tcpserver/ServerSocketCreatorImpl.java
+++ /dev/null
@@ -1,96 +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 org.apache.geode.distributed.internal.tcpserver;
-
-import java.io.IOException;
-import java.net.BindException;
-import java.net.InetAddress;
-import java.net.InetSocketAddress;
-import java.net.ServerSocket;
-import java.net.Socket;
-
-public class ServerSocketCreatorImpl implements ClusterSocketCreator {
-  private final TcpSocketCreatorImpl socketCreator;
-
-  protected ServerSocketCreatorImpl(TcpSocketCreatorImpl socketCreator) {
-
-    this.socketCreator = socketCreator;
-  }
-
-  public boolean useSSL() {
-    return socketCreator.useSSL();
-  }
-
-  public void handshakeIfSocketIsSSL(Socket socket, int timeout) throws IOException {
-    if (useSSL()) {
-      throw new IllegalStateException("Handshake on SSL connections is not supported");
-    }
-  }
-
-  @Override
-  public final ServerSocket createServerSocket(int nport, int backlog) throws IOException {
-    return createServerSocket(nport, backlog, null, -1, useSSL());
-  }
-
-  @Override
-  public final ServerSocket createServerSocket(int nport, int backlog, InetAddress bindAddr)
-      throws IOException {
-    return createServerSocket(nport, backlog, bindAddr, -1, useSSL());
-  }
-
-  /**
-   * Overridable method for creating a server socket. Override this if you are implementing
-   * SSL communications or otherwise need to customize server socket creation.
-   */
-  protected ServerSocket createServerSocket(int nport, int backlog, InetAddress bindAddr,
-      int socketBufferSize, boolean sslConnection) throws IOException {
-    if (sslConnection) {
-      throw new UnsupportedOperationException();
-    }
-    ServerSocket result = new ServerSocket();
-    result.setReuseAddress(true);
-    if (socketBufferSize != -1) {
-      result.setReceiveBufferSize(socketBufferSize);
-    }
-    try {
-      result.bind(new InetSocketAddress(bindAddr, nport), backlog);
-    } catch (BindException e) {
-      BindException throwMe =
-          new BindException(String.format("Failed to create server socket on %s[%s]",
-              bindAddr == null ? InetAddress.getLocalHost().getHostAddress() : bindAddr,
-              nport));
-      throwMe.initCause(e);
-      throw throwMe;
-    }
-    return result;
-  }
-
-  /**
-   * Return a client socket. This method is used by peers.
-   */
-  public Socket connect(HostAndPort addr) throws IOException {
-    return socketCreator.connect(addr, 0, null, false, -1);
-  }
-
-  @Override
-  public final Socket connect(HostAndPort addr, int timeout,
-      ConnectionWatcher optionalWatcher)
-      throws IOException {
-    return socketCreator.advancedSocketCreator.connect(addr, timeout, optionalWatcher, false, -1,
-        useSSL());
-  }
-
-
-}
diff --git a/geode-tcp-server/src/main/java/org/apache/geode/distributed/internal/tcpserver/TcpClient.java b/geode-tcp-server/src/main/java/org/apache/geode/distributed/internal/tcpserver/TcpClient.java
index d1089d0..fcae472 100644
--- a/geode-tcp-server/src/main/java/org/apache/geode/distributed/internal/tcpserver/TcpClient.java
+++ b/geode-tcp-server/src/main/java/org/apache/geode/distributed/internal/tcpserver/TcpClient.java
@@ -21,6 +21,8 @@ import java.io.EOFException;
 import java.io.IOException;
 import java.io.InputStream;
 import java.io.OutputStream;
+import java.net.InetAddress;
+import java.net.InetSocketAddress;
 import java.net.Socket;
 import java.util.HashMap;
 import java.util.Map;
@@ -52,7 +54,7 @@ public class TcpClient {
   private static final int DEFAULT_REQUEST_TIMEOUT = 60 * 2 * 1000;
 
   @MakeNotStatic
-  private static final Map<HostAndPort, Short> serverVersions =
+  private static final Map<InetSocketAddress, Short> serverVersions =
       new HashMap<>();
 
   private final TcpSocketCreator socketCreator;
@@ -74,17 +76,17 @@ public class TcpClient {
   /**
    * Stops the Locator running on a given host and port
    */
-  public void stop(HostAndPort addr) throws java.net.ConnectException {
+  public void stop(InetAddress addr, int port) throws java.net.ConnectException {
     try {
       ShutdownRequest request = new ShutdownRequest();
-      requestToServer(addr, request, DEFAULT_REQUEST_TIMEOUT);
+      requestToServer(addr, port, request, DEFAULT_REQUEST_TIMEOUT);
     } catch (java.net.ConnectException ce) {
       // must not be running, rethrow so the caller can handle.
       // In most cases this Exception should be ignored.
       throw ce;
     } catch (Exception ex) {
       logger.error(
-          "TcpClient.stop(): exception connecting to locator " + addr + ex);
+          "TcpClient.stop(): exception connecting to locator " + addr + ":" + port + ": " + ex);
     }
   }
 
@@ -93,17 +95,17 @@ public class TcpClient {
    * <code>String</code>s are returned: the first string is the working directory of the locator
    * and the second string is the product directory of the locator.
    */
-  public String[] getInfo(HostAndPort addr) {
+  public String[] getInfo(InetAddress addr, int port) {
     try {
       InfoRequest request = new InfoRequest();
       InfoResponse response =
-          (InfoResponse) requestToServer(addr, request, DEFAULT_REQUEST_TIMEOUT);
+          (InfoResponse) requestToServer(addr, port, request, DEFAULT_REQUEST_TIMEOUT);
       return response.getInfo();
     } catch (java.net.ConnectException ignore) {
       return null;
     } catch (Exception ex) {
       logger.error(
-          "TcpClient.getInfo(): exception connecting to locator " + addr + ": " + ex);
+          "TcpClient.getInfo(): exception connecting to locator " + addr + ":" + port + ": " + ex);
       return null;
     }
 
@@ -113,31 +115,53 @@ public class TcpClient {
    * Send a request to a Locator and expect a reply
    *
    * @param addr The locator's address
+   * @param port The locator's tcp/ip port
    * @param request The request message
    * @param timeout Timeout for sending the message and receiving a reply
    * @return the reply
    */
-  public Object requestToServer(HostAndPort addr, Object request, int timeout)
+  public Object requestToServer(InetAddress addr, int port, Object request, int timeout)
       throws IOException, ClassNotFoundException {
 
-    return requestToServer(addr, request, timeout, true);
+    return requestToServer(addr, port, request, timeout, true);
   }
 
   /**
    * Send a request to a Locator
    *
    * @param addr The locator's address
+   * @param port The locator's tcp/ip port
+   * @param request The request message
+   * @param timeout Timeout for sending the message and receiving a reply
+   * @param replyExpected Whether to wait for a reply
+   * @return the reply
+   */
+  public Object requestToServer(InetAddress addr, int port, Object request, int timeout,
+      boolean replyExpected) throws IOException, ClassNotFoundException {
+    InetSocketAddress ipAddr;
+    if (addr == null) {
+      ipAddr = new InetSocketAddress(port);
+    } else {
+      ipAddr = new InetSocketAddress(addr, port); // fix for bug 30810
+    }
+    return requestToServer(ipAddr, request, timeout, replyExpected);
+  }
+
+  /**
+   * Send a request to a Locator
+   *
+   * @param ipAddr The locator's inet socket address
    * @param request The request message
    * @param timeout Timeout for sending the message and receiving a reply
    * @param replyExpected Whether to wait for a reply
    * @return The reply, or null if no reply is expected
    */
-  public Object requestToServer(HostAndPort addr, Object request, int timeout,
+  public Object requestToServer(InetSocketAddress ipAddr, Object request, int timeout,
       boolean replyExpected) throws IOException, ClassNotFoundException {
     long giveupTime = System.currentTimeMillis() + timeout;
 
     // Get the GemFire version of the TcpServer first, before sending any other request.
-    short serverVersion = getServerVersion(addr, timeout);
+    short serverVersion = getServerVersion(ipAddr, timeout);
 
     if (serverVersion > Version.CURRENT_ORDINAL) {
       serverVersion = Version.CURRENT_ORDINAL;
@@ -155,10 +179,10 @@ public class TcpClient {
       return null;
     }
 
-    logger.debug("TcpClient sending {} to {}", request, addr);
+    logger.debug("TcpClient sending {} to {}", request, ipAddr);
 
     Socket sock =
-        socketCreator.forCluster().connect(addr, (int) newTimeout, null);
+        socketCreator.connect(ipAddr.getAddress(), ipAddr.getPort(), (int) newTimeout, null, false);
     sock.setSoTimeout((int) newTimeout);
     DataOutputStream out = null;
     try {
@@ -186,7 +210,7 @@ public class TcpClient {
           return response;
         } catch (EOFException ex) {
           logger.debug("requestToServer EOFException ", ex);
-          EOFException eof = new EOFException("Locator at " + addr
+          EOFException eof = new EOFException("Locator at " + ipAddr
               + " did not respond. This is normal if the locator was shutdown. If it wasn't check its log for exceptions.");
           eof.initCause(ex);
           throw eof;
@@ -208,7 +232,7 @@ public class TcpClient {
           // with the socket and is closing it. Aborting the connection by
           // setting SO_LINGER to zero will clean up the TIME_WAIT socket on
           // the locator's machine.
-          if (!sock.isClosed() && !socketCreator.forCluster().useSSL()) {
+          if (!sock.isClosed() && !socketCreator.useSSL()) {
             sock.setSoLinger(true, 0);
           }
         }
@@ -222,7 +246,7 @@ public class TcpClient {
     }
   }
 
-  private Short getServerVersion(HostAndPort addr, int timeout)
+  private Short getServerVersion(InetSocketAddress ipAddr, int timeout)
       throws IOException, ClassNotFoundException {
 
     int gossipVersion;
@@ -231,7 +255,7 @@ public class TcpClient {
 
     // Get GemFire version of TcpServer first, before sending any other request.
     synchronized (serverVersions) {
-      serverVersion = serverVersions.get(addr);
+      serverVersion = serverVersions.get(ipAddr);
     }
 
     if (serverVersion != null) {
@@ -241,7 +265,7 @@ public class TcpClient {
     gossipVersion = TcpServer.getOldGossipVersion();
 
     try {
-      sock = socketCreator.forCluster().connect(addr, timeout, null);
+      sock = socketCreator.connect(ipAddr.getAddress(), ipAddr.getPort(), timeout, null, false);
       sock.setSoTimeout(timeout);
     } catch (SSLException e) {
       throw new IllegalStateException("Unable to form SSL connection", e);
@@ -272,7 +296,7 @@ public class TcpClient {
         VersionResponse response = (VersionResponse) readObject;
         serverVersion = response.getVersionOrdinal();
         synchronized (serverVersions) {
-          serverVersions.put(addr, serverVersion);
+          serverVersions.put(ipAddr, serverVersion);
         }
 
         return serverVersion;
@@ -294,7 +318,7 @@ public class TcpClient {
 
     }
     synchronized (serverVersions) {
-      serverVersions.put(addr, Version.GFE_57.ordinal());
+      serverVersions.put(ipAddr, Version.GFE_57.ordinal());
     }
     return Short.valueOf(Version.GFE_57.ordinal());
   }
diff --git a/geode-tcp-server/src/main/java/org/apache/geode/distributed/internal/tcpserver/TcpServer.java b/geode-tcp-server/src/main/java/org/apache/geode/distributed/internal/tcpserver/TcpServer.java
index 7f2d828..5c25ac8 100755
--- a/geode-tcp-server/src/main/java/org/apache/geode/distributed/internal/tcpserver/TcpServer.java
+++ b/geode-tcp-server/src/main/java/org/apache/geode/distributed/internal/tcpserver/TcpServer.java
@@ -189,10 +189,10 @@ public class TcpServer {
   private void initializeServerSocket() throws IOException {
     if (srv_sock == null || srv_sock.isClosed()) {
       if (bind_address == null) {
-        srv_sock = socketCreator.forCluster().createServerSocket(port, backlogLimit);
+        srv_sock = socketCreator.createServerSocket(port, backlogLimit);
         bind_address = srv_sock.getInetAddress();
       } else {
-        srv_sock = socketCreator.forCluster().createServerSocket(port, backlogLimit, bind_address);
+        srv_sock = socketCreator.createServerSocket(port, backlogLimit, bind_address);
       }
       // GEODE-4176 - set the port from a wild-card bind so that handlers know the correct value
 
@@ -304,7 +304,7 @@ public class TcpServer {
       DataInputStream input = null;
       try {
         socket.setSoTimeout(readTimeout);
-        socketCreator.forCluster().handshakeIfSocketIsSSL(socket, readTimeout);
+        socketCreator.handshakeIfSocketIsSSL(socket, readTimeout);
 
         try {
           input = new DataInputStream(socket.getInputStream());
diff --git a/geode-tcp-server/src/main/java/org/apache/geode/distributed/internal/tcpserver/TcpSocketCreator.java b/geode-tcp-server/src/main/java/org/apache/geode/distributed/internal/tcpserver/TcpSocketCreator.java
index a16b1cb..11b7876 100644
--- a/geode-tcp-server/src/main/java/org/apache/geode/distributed/internal/tcpserver/TcpSocketCreator.java
+++ b/geode-tcp-server/src/main/java/org/apache/geode/distributed/internal/tcpserver/TcpSocketCreator.java
@@ -15,24 +15,34 @@
 
 package org.apache.geode.distributed.internal.tcpserver;
 
+import java.io.IOException;
+import java.net.InetAddress;
+import java.net.ServerSocket;
+import java.net.Socket;
 
 
 /**
  * Create sockets for TcpServer (and TcpClient).
  */
 public interface TcpSocketCreator {
-  /**
-   * Returns a socket creator for server and peer-to-peer sockets
-   */
-  ClusterSocketCreator forCluster();
-
-  /**
-   * Returns a socket creator for client caches and WAN senders
-   */
-  ClientSocketCreator forClient();
-
-  /**
-   * Returns a socket creator for advanced use
-   */
-  AdvancedSocketCreator forAdvancedUse();
+  boolean useSSL();
+
+  ServerSocket createServerSocket(int nport, int backlog) throws IOException;
+
+  ServerSocket createServerSocket(int nport, int backlog, InetAddress bindAddr)
+      throws IOException;
+
+  ServerSocket createServerSocketUsingPortRange(InetAddress ba, int backlog,
+      boolean isBindAddress, boolean useNIO, int tcpBufferSize, int[] tcpPortRange,
+      boolean sslConnection) throws IOException;
+
+  Socket connect(InetAddress inetadd, int port, int timeout,
+      ConnectionWatcher optionalWatcher, boolean clientSide) throws IOException;
+
+  Socket connect(InetAddress inetadd, int port, int timeout,
+      ConnectionWatcher optionalWatcher, boolean clientSide, int socketBufferSize,
+      boolean sslConnection) throws IOException;
+
+  void handshakeIfSocketIsSSL(Socket socket, int timeout) throws IOException;
+
 }
diff --git a/geode-tcp-server/src/main/java/org/apache/geode/distributed/internal/tcpserver/TcpSocketCreatorImpl.java b/geode-tcp-server/src/main/java/org/apache/geode/distributed/internal/tcpserver/TcpSocketCreatorImpl.java
index 8cb33e6..8dc4d9e 100644
--- a/geode-tcp-server/src/main/java/org/apache/geode/distributed/internal/tcpserver/TcpSocketCreatorImpl.java
+++ b/geode-tcp-server/src/main/java/org/apache/geode/distributed/internal/tcpserver/TcpSocketCreatorImpl.java
@@ -15,8 +15,15 @@
 package org.apache.geode.distributed.internal.tcpserver;
 
 import java.io.IOException;
+import java.net.BindException;
+import java.net.InetAddress;
+import java.net.InetSocketAddress;
+import java.net.ServerSocket;
 import java.net.Socket;
+import java.nio.channels.ServerSocketChannel;
+import java.util.concurrent.ThreadLocalRandom;
 
+import org.apache.geode.util.internal.GeodeGlossary;
 
 /**
  * TcpSocketCreatorImpl is a simple implementation of TcpSocketCreator for use in the
@@ -26,46 +33,188 @@ import java.net.Socket;
 public class TcpSocketCreatorImpl implements TcpSocketCreator {
 
 
-  protected ServerSocketCreatorImpl serverSocketCreator;
-  protected ClientSocketCreatorImpl clientSocketCreator;
-  protected AdvancedSocketCreatorImpl advancedSocketCreator;
+  public static final boolean ENABLE_TCP_KEEP_ALIVE;
 
-  public TcpSocketCreatorImpl() {
-    initializeCreators();
+  static {
+    // bug #49484 - customers want tcp/ip keep-alive turned on by default
+    // to avoid dropped connections. It can be turned off by setting this
+    // property to false
+    String str = System.getProperty(GeodeGlossary.GEMFIRE_PREFIX + "setTcpKeepAlive");
+    if (str != null) {
+      ENABLE_TCP_KEEP_ALIVE = Boolean.valueOf(str);
+    } else {
+      ENABLE_TCP_KEEP_ALIVE = true;
+    }
   }
 
-  protected void initializeCreators() {
-    serverSocketCreator = new ServerSocketCreatorImpl(this);
-    clientSocketCreator = new ClientSocketCreatorImpl(this);
-    advancedSocketCreator = new AdvancedSocketCreatorImpl(this);
-  }
+  public TcpSocketCreatorImpl() {}
 
 
-  protected boolean useSSL() {
+  @Override
+  public boolean useSSL() {
     return false;
   }
 
-  Socket connect(HostAndPort addr, int timeout,
-      ConnectionWatcher optionalWatcher, boolean clientSide, int socketBufferSize)
+  @Override
+  public final ServerSocket createServerSocket(int nport, int backlog) throws IOException {
+    return createServerSocket(nport, backlog, null, -1, useSSL());
+  }
+
+  @Override
+  public final ServerSocket createServerSocket(int nport, int backlog, InetAddress bindAddr)
       throws IOException {
-    return forAdvancedUse().connect(addr, timeout, optionalWatcher, clientSide, socketBufferSize,
-        useSSL());
+    return createServerSocket(nport, backlog, bindAddr, -1, useSSL());
+  }
+
+  @Override
+  public final ServerSocket createServerSocketUsingPortRange(InetAddress ba, int backlog,
+      boolean isBindAddress, boolean useNIO,
+      int tcpBufferSize, int[] tcpPortRange,
+      boolean sslConnection) throws IOException {
+    try {
+      // Get a random port from range.
+      int startingPort = tcpPortRange[0]
+          + ThreadLocalRandom.current().nextInt(tcpPortRange[1] - tcpPortRange[0] + 1);
+      int localPort = startingPort;
+      int portLimit = tcpPortRange[1];
+
+      while (true) {
+        if (localPort > portLimit) {
+          if (startingPort != 0) {
+            localPort = tcpPortRange[0];
+            portLimit = startingPort - 1;
+            startingPort = 0;
+          } else {
+            throw noFreePortException(
+                String.format("Unable to find a free port in the membership-port-range: [%d,%d]",
+                    tcpPortRange[0], tcpPortRange[1]));
+          }
+        }
+        ServerSocket socket = null;
+        try {
+          if (useNIO) {
+            ServerSocketChannel channel = ServerSocketChannel.open();
+            socket = channel.socket();
+
+            InetSocketAddress address = new InetSocketAddress(isBindAddress ? ba : null, localPort);
+            socket.bind(address, backlog);
+          } else {
+            socket = this.createServerSocket(localPort, backlog, isBindAddress ? ba : null,
+                tcpBufferSize, sslConnection);
+          }
+          return socket;
+        } catch (java.net.SocketException ex) {
+          if (socket != null && !socket.isClosed()) {
+            socket.close();
+          }
+          localPort++;
+        }
+      }
+    } catch (IOException e) {
+      throw problemCreatingSocketInPortRangeException(
+          "unable to create a socket in the membership-port range", e);
+    }
+  }
+
+  /**
+   * Overridable method for creating an exception during search of port-range
+   */
+  protected RuntimeException problemCreatingSocketInPortRangeException(String s, IOException e) {
+    return new RuntimeException(s, e);
+  }
+
+  /**
+   * Overridable method for creating an exception during search of port-range
+   */
+  protected RuntimeException noFreePortException(String reason) {
+    return new RuntimeException(reason);
+  }
+
+  /**
+   * Overridable method for creating a server socket. Override this if you are implementing
+   * SSL communications or otherwise need to customize server socket creation.
+   */
+  protected ServerSocket createServerSocket(int nport, int backlog, InetAddress bindAddr,
+      int socketBufferSize, boolean sslConnection) throws IOException {
+    if (sslConnection) {
+      throw new UnsupportedOperationException();
+    }
+    ServerSocket result = new ServerSocket();
+    result.setReuseAddress(true);
+    if (socketBufferSize != -1) {
+      result.setReceiveBufferSize(socketBufferSize);
+    }
+    try {
+      result.bind(new InetSocketAddress(bindAddr, nport), backlog);
+    } catch (BindException e) {
+      BindException throwMe =
+          new BindException(String.format("Failed to create server socket on %s[%s]",
+              bindAddr == null ? InetAddress.getLocalHost().getHostAddress() : bindAddr,
+              String.valueOf(nport)));
+      throwMe.initCause(e);
+      throw throwMe;
+    }
+    return result;
   }
 
 
   @Override
-  public ClusterSocketCreator forCluster() {
-    return serverSocketCreator;
+  public final Socket connect(InetAddress inetadd, int port, int timeout,
+      ConnectionWatcher optionalWatcher, boolean clientSide)
+      throws IOException {
+    return connect(inetadd, port, timeout, optionalWatcher, clientSide, -1, useSSL());
   }
 
   @Override
-  public ClientSocketCreator forClient() {
-    return clientSocketCreator;
+  public Socket connect(InetAddress inetadd, int port, int timeout,
+      ConnectionWatcher optionalWatcher, boolean clientSide,
+      int socketBufferSize, boolean sslConnection) throws IOException {
+    if (sslConnection) {
+      throw new IllegalArgumentException();
+    }
+    Socket socket = null;
+    if (clientSide) {
+      socket = createCustomClientSocket(inetadd, port);
+    }
+    if (socket == null) {
+      socket = new Socket();
+
+      // Optionally enable SO_KEEPALIVE in the OS network protocol.
+      socket.setKeepAlive(ENABLE_TCP_KEEP_ALIVE);
+
+      if (socketBufferSize != -1) {
+        socket.setReceiveBufferSize(socketBufferSize);
+      }
+      if (optionalWatcher != null) {
+        optionalWatcher.beforeConnect(socket);
+      }
+      try {
+        socket.connect(new InetSocketAddress(inetadd, port), Math.max(timeout, 0));
+      } finally {
+        if (optionalWatcher != null) {
+          optionalWatcher.afterConnect(socket);
+        }
+      }
+    }
+    return socket;
+  }
+
+  /**
+   * reimplement this method to use a custom socket factory to create and configure a new
+   * client-side socket
+   *
+   * @return the socket, or null if no custom client socket factory is available
+   */
+  protected Socket createCustomClientSocket(InetAddress inetaddr, int port) throws IOException {
+    throw new UnsupportedOperationException(
+        "custom client socket factory is not supported by this socket creator");
   }
 
   @Override
-  public AdvancedSocketCreator forAdvancedUse() {
-    return advancedSocketCreator;
+  public void handshakeIfSocketIsSSL(Socket socket, int timeout) throws IOException {
+    if (useSSL()) {
+      throw new IllegalStateException("Handshake on SSL connections is not supported");
+    }
   }
 
 }
diff --git a/geode-tcp-server/src/test/java/org/apache/geode/distributed/internal/tcpserver/HostAndPortTest.java b/geode-tcp-server/src/test/java/org/apache/geode/distributed/internal/tcpserver/LocatorAddressTest.java
similarity index 56%
rename from geode-tcp-server/src/test/java/org/apache/geode/distributed/internal/tcpserver/HostAndPortTest.java
rename to geode-tcp-server/src/test/java/org/apache/geode/distributed/internal/tcpserver/LocatorAddressTest.java
index 1381721..ad2ed0e 100644
--- a/geode-tcp-server/src/test/java/org/apache/geode/distributed/internal/tcpserver/HostAndPortTest.java
+++ b/geode-tcp-server/src/test/java/org/apache/geode/distributed/internal/tcpserver/LocatorAddressTest.java
@@ -20,14 +20,15 @@ import java.net.InetSocketAddress;
 
 import org.junit.Test;
 
-public class HostAndPortTest {
+public class LocatorAddressTest {
 
   /**
    * Test that getSocketInentAddress returns resolved InetSocketAddress
    */
   @Test
   public void Test_getSocketInentAddress_returns_resolved_SocketAddress() {
-    HostAndPort locator1 = new HostAndPort("localhost", 8080);
+    InetSocketAddress host1address = new InetSocketAddress(8080);
+    LocatorAddress locator1 = new LocatorAddress(host1address, "localhost");
 
     InetSocketAddress actual = locator1.getSocketInetAddress();
 
@@ -39,7 +40,8 @@ public class HostAndPortTest {
    */
   @Test
   public void Test_getSocketInentAddress_returns_unresolved_SocketAddress() {
-    HostAndPort locator1 = new HostAndPort("fakelocalhost", 8090);
+    InetSocketAddress host1address = InetSocketAddress.createUnresolved("fakelocalhost", 8090);
+    LocatorAddress locator1 = new LocatorAddress(host1address, "fakelocalhost");
 
     InetSocketAddress actual = locator1.getSocketInetAddress();
 
@@ -47,43 +49,61 @@ public class HostAndPortTest {
   }
 
   /**
-   * Test whether HostAndPort are equal, when created from resolved and unresolved
+   * Test whether LocatorAddress are equal, when created from resolved and unresolved
    * InetSocketAddress
    */
   @Test
   public void Test_equals_LocatorAddress_from_resolved_and_unresolved_SocketAddress() {
-    HostAndPort locator1 = new HostAndPort("localhost", 8080);
+    InetSocketAddress host1address = InetSocketAddress.createUnresolved("localhost", 8090);
+    LocatorAddress locator1 = new LocatorAddress(host1address, "localhost");
 
     InetSocketAddress host2address = locator1.getSocketInetAddress();
-    HostAndPort locator2 = new HostAndPort("localhost", host2address.getPort());
+    LocatorAddress locator2 = new LocatorAddress(host2address, "localhost");
 
+    assertThat(host1address.isUnresolved()).isTrue();
     assertThat(host2address.isUnresolved()).isFalse();
     assertThat(locator1.equals(locator2)).isTrue();
   }
 
   @Test
   public void Test_getPort_returns_port() {
-    HostAndPort locator1 = new HostAndPort("localhost", 8090);
+    InetSocketAddress host1address = InetSocketAddress.createUnresolved("localhost", 8090);
+    LocatorAddress locator1 = new LocatorAddress(host1address, "localhost");
     assertThat(locator1.getPort()).isEqualTo(8090);
   }
 
   @Test
   public void Test_getHostName_returns_hostname() {
-    HostAndPort locator1 = new HostAndPort("fakelocalhost", 8091);
+    InetSocketAddress host1address = InetSocketAddress.createUnresolved("fakelocalhost", 8091);
+    LocatorAddress locator1 = new LocatorAddress(host1address, "fakelocalhost");
     assertThat(locator1.getHostName()).isEqualTo("fakelocalhost");
   }
 
   @Test
   public void Test_hashCode_of_SocketAddress() {
     InetSocketAddress host1address = InetSocketAddress.createUnresolved("fakelocalhost", 8091);
-    HostAndPort locator1 = new HostAndPort("fakelocalhost", 8091);
+    LocatorAddress locator1 = new LocatorAddress(host1address, "fakelocalhost");
     assertThat(locator1.hashCode()).isEqualTo(host1address.hashCode());
   }
 
   @Test
   public void Test_toString_LocatorAddress() {
-    HostAndPort locator1 = new HostAndPort("fakelocalhost", 8091);
+    InetSocketAddress host1address = InetSocketAddress.createUnresolved("fakelocalhost", 8091);
+    LocatorAddress locator1 = new LocatorAddress(host1address, "fakelocalhost");
     assertThat(locator1.toString()).contains("socketInetAddress");
   }
 
+  @Test
+  public void Test_isIpString_for_LocatorAddress_constructed_from_IPstring() {
+    InetSocketAddress host1address = new InetSocketAddress(8080);
+    LocatorAddress locator1 = new LocatorAddress(host1address, "127.0.0.1");
+    assertThat(locator1.isIpString()).isTrue();
+  }
+
+  @Test
+  public void Test_isIpString_for_LocatorAddress_constructed_from_hostname() {
+    InetSocketAddress host1address = new InetSocketAddress(8080);
+    LocatorAddress locator1 = new LocatorAddress(host1address, "localhost");
+    assertThat(locator1.isIpString()).isFalse();
+  }
 }
diff --git a/geode-wan/src/distributedTest/java/org/apache/geode/internal/cache/wan/serial/WANHostNameVerificationDistributedTest.java b/geode-wan/src/distributedTest/java/org/apache/geode/internal/cache/wan/serial/WANHostNameVerificationDistributedTest.java
index 27ce3ff..329e800 100644
--- a/geode-wan/src/distributedTest/java/org/apache/geode/internal/cache/wan/serial/WANHostNameVerificationDistributedTest.java
+++ b/geode-wan/src/distributedTest/java/org/apache/geode/internal/cache/wan/serial/WANHostNameVerificationDistributedTest.java
@@ -43,8 +43,6 @@ import org.apache.geode.cache.wan.GatewaySenderFactory;
 import org.apache.geode.internal.AvailablePortHelper;
 import org.apache.geode.internal.cache.wan.AbstractGatewaySender;
 import org.apache.geode.internal.cache.wan.GatewaySenderEventRemoteDispatcher;
-import org.apache.geode.internal.inet.LocalHostUtil;
-import org.apache.geode.test.awaitility.GeodeAwaitility;
 import org.apache.geode.test.dunit.IgnoredException;
 import org.apache.geode.test.dunit.rules.ClusterStartupRule;
 import org.apache.geode.test.dunit.rules.MemberVM;
@@ -113,12 +111,7 @@ public class WANHostNameVerificationDistributedTest {
     locator_ln.waitUntilRegionIsReadyOnExactlyThisManyServers("/region", 1);
 
     // create gateway sender
-    server_ln.invoke(() -> {
-      GeodeAwaitility.await().until(() -> {
-        WANHostNameVerificationDistributedTest.createGatewaySender();
-        return true;
-      });
-    });
+    server_ln.invoke(WANHostNameVerificationDistributedTest::createGatewaySender);
 
     return locator_ln.getPort();
   }
@@ -147,12 +140,7 @@ public class WANHostNameVerificationDistributedTest {
     locator_ny.waitUntilRegionIsReadyOnExactlyThisManyServers("/region", 1);
 
     // create gateway sender
-    server_ny.invoke(() -> {
-      GeodeAwaitility.await().until(() -> {
-        WANHostNameVerificationDistributedTest.createGatewayReceiver();
-        return true;
-      });
-    });
+    server_ny.invoke(WANHostNameVerificationDistributedTest::createGatewayReceiver);
   }
 
   private static void createGatewayReceiver() {
@@ -214,22 +202,15 @@ public class WANHostNameVerificationDistributedTest {
         // ClusterStartupRule uses 'localhost' as locator host
         .sanDnsName(InetAddress.getLoopbackAddress().getHostName())
         .sanDnsName(InetAddress.getLocalHost().getHostName())
-        .sanDnsName(InetAddress.getLocalHost().getHostAddress())
-        .sanDnsName(LocalHostUtil.getLocalHost().getCanonicalHostName())
         .sanIpAddress(InetAddress.getLocalHost())
         .sanIpAddress(InetAddress.getByName("0.0.0.0")) // to pass on windows
-        .sanIpAddress(LocalHostUtil.getLocalHost())
         .generate();
 
     CertificateMaterial server_ln_cert = new CertificateBuilder()
         .commonName("server_ln")
         .issuedBy(ca)
         .sanDnsName(InetAddress.getLocalHost().getHostName())
-        .sanDnsName(LocalHostUtil.getLocalHost().getHostName())
-        .sanDnsName(LocalHostUtil.getLocalHost().getCanonicalHostName())
-        .sanDnsName(InetAddress.getLocalHost().getHostAddress())
         .sanIpAddress(InetAddress.getLocalHost())
-        .sanIpAddress(LocalHostUtil.getLocalHost())
         .generate();
 
     CertificateMaterial locator_ny_cert = new CertificateBuilder()
@@ -239,12 +220,8 @@ public class WANHostNameVerificationDistributedTest {
         .sanDnsName(InetAddress.getLoopbackAddress().getHostName())
         .sanDnsName(InetAddress.getLocalHost().getHostName())
         .sanDnsName(InetAddress.getLocalHost().getCanonicalHostName())
-        .sanDnsName(LocalHostUtil.getLocalHost().getCanonicalHostName())
-        .sanDnsName(LocalHostUtil.getLocalHost().getHostName())
-        .sanDnsName(InetAddress.getLocalHost().getHostAddress())
         .sanIpAddress(InetAddress.getLocalHost())
         .sanIpAddress(InetAddress.getByName("0.0.0.0")) // to pass on windows
-        .sanIpAddress(LocalHostUtil.getLocalHost())
         .generate();
 
     CertificateMaterial server_ny_cert = new CertificateBuilder()
@@ -252,11 +229,7 @@ public class WANHostNameVerificationDistributedTest {
         .issuedBy(ca)
         .sanDnsName(InetAddress.getLocalHost().getHostName())
         .sanDnsName(InetAddress.getLocalHost().getCanonicalHostName())
-        .sanDnsName(LocalHostUtil.getLocalHost().getHostName())
-        .sanDnsName(LocalHostUtil.getLocalHost().getCanonicalHostName())
-        .sanDnsName(InetAddress.getLocalHost().getHostAddress())
         .sanIpAddress(InetAddress.getLocalHost())
-        .sanIpAddress(LocalHostUtil.getLocalHost())
         .generate();
 
     setupWanSites(ca, locator_ln_cert, server_ln_cert, locator_ny_cert, server_ny_cert);
diff --git a/geode-wan/src/main/java/org/apache/geode/cache/client/internal/locator/wan/LocatorDiscovery.java b/geode-wan/src/main/java/org/apache/geode/cache/client/internal/locator/wan/LocatorDiscovery.java
index 62b2fab..ce1c7e2 100644
--- a/geode-wan/src/main/java/org/apache/geode/cache/client/internal/locator/wan/LocatorDiscovery.java
+++ b/geode-wan/src/main/java/org/apache/geode/cache/client/internal/locator/wan/LocatorDiscovery.java
@@ -21,7 +21,6 @@ import java.util.concurrent.ConcurrentHashMap;
 import org.apache.logging.log4j.Logger;
 
 import org.apache.geode.distributed.internal.WanLocatorDiscoverer;
-import org.apache.geode.distributed.internal.tcpserver.HostAndPort;
 import org.apache.geode.distributed.internal.tcpserver.TcpClient;
 import org.apache.geode.internal.InternalDataSerializer;
 import org.apache.geode.internal.admin.remote.DistributionLocatorId;
@@ -139,8 +138,8 @@ public class LocatorDiscovery {
     while (!getDiscoverer().isStopped()) {
       try {
         RemoteLocatorJoinResponse response =
-            (RemoteLocatorJoinResponse) locatorClient.requestToServer(locatorId.getHost(),
-                request, WanLocatorDiscoverer.WAN_LOCATOR_CONNECTION_TIMEOUT, true);
+            (RemoteLocatorJoinResponse) locatorClient.requestToServer(locatorId.getHost(), request,
+                WanLocatorDiscoverer.WAN_LOCATOR_CONNECTION_TIMEOUT, true);
         if (response != null) {
           LocatorHelper.addExchangedLocators(response.getLocators(), this.locatorListener);
           logger.info("Locator discovery task exchanged locator information {} with {}: {}.",
@@ -186,8 +185,7 @@ public class LocatorDiscovery {
       RemoteLocatorJoinResponse response;
       try {
         response =
-            (RemoteLocatorJoinResponse) locatorClient.requestToServer(
-                remoteLocator.getHost(),
+            (RemoteLocatorJoinResponse) locatorClient.requestToServer(remoteLocator.getHost(),
                 request, WanLocatorDiscoverer.WAN_LOCATOR_CONNECTION_TIMEOUT, true);
         if (response != null) {
           LocatorHelper.addExchangedLocators(response.getLocators(), this.locatorListener);
@@ -197,8 +195,7 @@ public class LocatorDiscovery {
           while (true) {
             Thread.sleep(WAN_LOCATOR_PING_INTERVAL);
             RemoteLocatorPingResponse pingResponse =
-                (RemoteLocatorPingResponse) locatorClient.requestToServer(
-                    new HostAndPort(remoteLocator.getHostName(), remoteLocator.getPort()),
+                (RemoteLocatorPingResponse) locatorClient.requestToServer(remoteLocator.getHost(),
                     pingRequest, WanLocatorDiscoverer.WAN_LOCATOR_CONNECTION_TIMEOUT, true);
             if (pingResponse != null) {
               continue;
diff --git a/geode-wan/src/main/java/org/apache/geode/cache/client/internal/locator/wan/LocatorMembershipListenerImpl.java b/geode-wan/src/main/java/org/apache/geode/cache/client/internal/locator/wan/LocatorMembershipListenerImpl.java
index 112feb6..31315ed 100644
--- a/geode-wan/src/main/java/org/apache/geode/cache/client/internal/locator/wan/LocatorMembershipListenerImpl.java
+++ b/geode-wan/src/main/java/org/apache/geode/cache/client/internal/locator/wan/LocatorMembershipListenerImpl.java
@@ -244,8 +244,7 @@ public class LocatorMembershipListenerImpl implements LocatorMembershipListener
       DistributionLocatorId advertisedLocator = locatorJoinMessage.getLocator();
 
       try {
-        tcpClient.requestToServer(targetLocator.getHost(),
-            locatorJoinMessage, memberTimeout,
+        tcpClient.requestToServer(targetLocator.getHost(), locatorJoinMessage, memberTimeout,
             false);
       } catch (Exception exception) {
         if (logger.isDebugEnabled()) {
@@ -267,8 +266,7 @@ public class LocatorMembershipListenerImpl implements LocatorMembershipListener
       DistributionLocatorId advertisedLocator = locatorJoinMessage.getLocator();
 
       try {
-        tcpClient.requestToServer(targetLocator.getHost(),
-            locatorJoinMessage, memberTimeout,
+        tcpClient.requestToServer(targetLocator.getHost(), locatorJoinMessage, memberTimeout,
             false);
 
         return true;
diff --git a/geode-wan/src/test/java/org/apache/geode/cache/client/internal/locator/wan/LocatorMembershipListenerTest.java b/geode-wan/src/test/java/org/apache/geode/cache/client/internal/locator/wan/LocatorMembershipListenerTest.java
index d282128..f3770a6 100644
--- a/geode-wan/src/test/java/org/apache/geode/cache/client/internal/locator/wan/LocatorMembershipListenerTest.java
+++ b/geode-wan/src/test/java/org/apache/geode/cache/client/internal/locator/wan/LocatorMembershipListenerTest.java
@@ -30,6 +30,7 @@ import static org.mockito.Mockito.when;
 
 import java.io.EOFException;
 import java.io.IOException;
+import java.net.InetSocketAddress;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collection;
@@ -49,7 +50,6 @@ import org.junit.Before;
 import org.junit.Test;
 
 import org.apache.geode.distributed.internal.DistributionConfig;
-import org.apache.geode.distributed.internal.tcpserver.HostAndPort;
 import org.apache.geode.distributed.internal.tcpserver.TcpClient;
 import org.apache.geode.internal.admin.remote.DistributionLocatorId;
 import org.apache.geode.test.junit.ResultCaptor;
@@ -211,7 +211,7 @@ public class LocatorMembershipListenerTest {
         any(DistributionLocatorId.class), anyMap(), any(DistributionLocatorId.class), anyInt());
     locatorMembershipListener.locatorJoined(2, joiningLocator, locator1Site1);
     joinLocatorsDistributorThread(resultCaptor);
-    verify(tcpClient, times(0)).requestToServer(any(HostAndPort.class),
+    verify(tcpClient, times(0)).requestToServer(any(InetSocketAddress.class),
         any(LocatorJoinMessage.class), anyInt(), anyBoolean());
   }
 
diff --git a/geode-wan/src/test/java/org/apache/geode/internal/cache/wan/GatewaySenderEventRemoteDispatcherIntegrationTest.java b/geode-wan/src/test/java/org/apache/geode/internal/cache/wan/GatewaySenderEventRemoteDispatcherIntegrationTest.java
index 1b17e6d..f564b08 100644
--- a/geode-wan/src/test/java/org/apache/geode/internal/cache/wan/GatewaySenderEventRemoteDispatcherIntegrationTest.java
+++ b/geode-wan/src/test/java/org/apache/geode/internal/cache/wan/GatewaySenderEventRemoteDispatcherIntegrationTest.java
@@ -22,6 +22,8 @@ import static org.mockito.Mockito.doThrow;
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.verify;
 
+import java.net.InetAddress;
+import java.net.UnknownHostException;
 import java.util.LinkedList;
 import java.util.Properties;
 
@@ -81,6 +83,14 @@ public class GatewaySenderEventRemoteDispatcherIntegrationTest {
         new GatewaySenderEventRemoteDispatcher(eventProcessor, connection);
 
     /*
+     * Set a HostnameResolver which simulates a failed
+     * hostname lookup resulting in an UnknownHostException
+     */
+    InternalDistributedMember.setHostnameResolver(ignored -> {
+      throw new UnknownHostException("a.b.c");
+    });
+
+    /*
      * We have mocked our connection to throw a RuntimeException when readAcknowledgement() is
      * called, then in the exception handling for that RuntimeException, the UnknownHostException
      * will be thrown when trying to notify listeners of the crash.
@@ -88,6 +98,13 @@ public class GatewaySenderEventRemoteDispatcherIntegrationTest {
     dispatcher.readAcknowledgement();
 
     /*
+     * Need to reset the hostname resolver to a real InetAddress resolver as it is static state and
+     * we do not want it to throw an UnknownHostException in subsequent test runs.
+     */
+    InternalDistributedMember
+        .setHostnameResolver((location) -> InetAddress.getByName(location.getHostName()));
+
+    /*
      * The handling of the UnknownHostException should not result in the event processor being
      * stopped, so assert that setIsStopped(true) was never called.
      */