You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@activemq.apache.org by br...@apache.org on 2022/03/01 10:15:25 UTC

[activemq-artemis] branch main updated: ARTEMIS-3660 - rename broker-balancer to connection-router

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

brusdev pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/activemq-artemis.git


The following commit(s) were added to refs/heads/main by this push:
     new dcaebfb  ARTEMIS-3660 - rename broker-balancer to connection-router
dcaebfb is described below

commit dcaebfb24e9b2c30cbf93bfe799d08d8bb0ec711
Author: gtully <ga...@gmail.com>
AuthorDate: Fri Jan 28 13:47:53 2022 +0000

    ARTEMIS-3660 - rename broker-balancer to connection-router
---
 .../artemis/api/core/ActiveMQExceptionType.java    |   4 +-
 ...xception.java => ActiveMQRoutingException.java} |  10 +--
 ...erControl.java => ConnectionRouterControl.java} |   4 +-
 .../api/core/management/ObjectNameBuilder.java     |   8 +-
 .../artemis/api/core/management/ResourceNames.java |   2 +-
 .../core/client/ActiveMQClientMessageBundle.java   |   4 +-
 .../core/client/impl/ClientSessionImpl.java        |   6 +-
 .../core/protocol/core/CoreRemotingConnection.java |   2 +-
 .../core/impl/ActiveMQClientProtocolManager.java   |   2 +-
 .../protocol/core/impl/RemotingConnectionImpl.java |   4 +-
 .../remoting/impl/netty/TransportConstants.java    |   6 +-
 .../artemis/spi/core/remoting/Connection.java      |   2 +-
 .../core/management/OperationAnnotationTest.java   |   2 +-
 .../amqp/broker/ProtonProtocolManager.java         |  12 +--
 .../amqp/proton/AMQPConnectionContext.java         |   4 +-
 ...edirectContext.java => AMQPRoutingContext.java} |   6 +-
 ...edirectHandler.java => AMQPRoutingHandler.java} |  32 +++----
 .../amqp/sasl/AnonymousServerSASLFactory.java      |   4 +-
 .../amqp/sasl/ExternalServerSASLFactory.java       |   4 +-
 .../amqp/sasl/GSSAPIServerSASLFactory.java         |   4 +-
 .../protocol/amqp/sasl/PlainServerSASLFactory.java |   4 +-
 .../protocol/amqp/sasl/ServerSASLFactory.java      |   4 +-
 .../amqp/sasl/scram/SCRAMServerSASLFactory.java    |   4 +-
 .../core/protocol/mqtt/MQTTProtocolHandler.java    |   2 +-
 .../core/protocol/mqtt/MQTTProtocolManager.java    |  10 +--
 ...edirectContext.java => MQTTRoutingContext.java} |   6 +-
 ...edirectHandler.java => MQTTRoutingHandler.java} |  14 +--
 .../core/protocol/openwire/OpenWireConnection.java |   4 +-
 .../protocol/openwire/OpenWireProtocolManager.java |  10 +--
 ...ectContext.java => OpenWireRoutingContext.java} |   6 +-
 ...ectHandler.java => OpenWireRoutingHandler.java} |  14 +--
 .../core/protocol/stomp/StompProtocolManager.java  |   6 +-
 .../artemis/core/config/Configuration.java         |   8 +-
 .../core/config/impl/ConfigurationImpl.java        |  16 ++--
 .../artemis/core/config/impl/Validators.java       |   8 +-
 .../{balancing => routing}/CacheConfiguration.java |   2 +-
 .../ConnectionRouterConfiguration.java}            |  36 ++++----
 .../NamedPropertyConfiguration.java                |   2 +-
 .../{balancing => routing}/PoolConfiguration.java  |   2 +-
 .../deployers/impl/FileConfigurationParser.java    |  50 +++++------
 ...lImpl.java => ConnectionRouterControlImpl.java} |  34 ++++----
 .../protocol/core/impl/ActiveMQPacketHandler.java  |   8 +-
 ...ectContext.java => ActiveMQRoutingContext.java} |   6 +-
 ...ectHandler.java => ActiveMQRoutingHandler.java} |  22 ++---
 .../protocol/core/impl/CoreProtocolManager.java    |  10 +--
 .../core/remoting/impl/netty/NettyAcceptor.java    |   6 +-
 .../remoting/impl/netty/NettyServerConnection.java |  10 +--
 .../artemis/core/server/ActiveMQMessageBundle.java |  18 ++--
 .../artemis/core/server/ActiveMQServer.java        |   4 +-
 .../artemis/core/server/ActiveMQServerLogger.java  |  14 +--
 .../core/server/impl/ActiveMQServerImpl.java       |  16 ++--
 .../core/server/management/ManagementService.java  |   6 +-
 .../management/impl/ManagementServiceImpl.java     |  24 +++---
 .../ConnectionRouter.java}                         |  74 ++++++++--------
 .../ConnectionRouterManager.java}                  |  84 +++++++++---------
 .../KeyResolver.java}                              |  12 +--
 .../TargetKey.java => routing/KeyType.java}        |   8 +-
 .../RoutingContext.java}                           |  19 +++--
 .../RoutingHandler.java}                           |  35 ++++----
 .../{balancing => routing}/caches/Cache.java       |   2 +-
 .../{balancing => routing}/caches/LocalCache.java  |   2 +-
 .../policies/AbstractPolicy.java                   |   4 +-
 .../policies/ConsistentHashPolicy.java             |   4 +-
 .../policies/FirstElementPolicy.java               |   4 +-
 .../policies/LeastConnectionsPolicy.java           |   6 +-
 .../{balancing => routing}/policies/Policy.java    |   6 +-
 .../policies/PolicyFactory.java                    |   2 +-
 .../policies/PolicyFactoryResolver.java            |   6 +-
 .../policies/RoundRobinPolicy.java                 |   4 +-
 .../{balancing => routing}/pools/AbstractPool.java |  10 +--
 .../{balancing => routing}/pools/ClusterPool.java  |   4 +-
 .../pools/DiscoveryGroupService.java               |   2 +-
 .../pools/DiscoveryPool.java                       |   4 +-
 .../pools/DiscoveryService.java                    |   2 +-
 .../server/{balancing => routing}/pools/Pool.java  |   6 +-
 .../{balancing => routing}/pools/StaticPool.java   |   4 +-
 .../targets/AbstractTarget.java                    |   2 +-
 .../targets/AbstractTargetFactory.java             |   2 +-
 .../targets/ActiveMQTarget.java                    |   6 +-
 .../targets/ActiveMQTargetFactory.java             |   2 +-
 .../targets/LocalTarget.java                       |   2 +-
 .../{balancing => routing}/targets/Target.java     |   2 +-
 .../targets/TargetFactory.java                     |   2 +-
 .../targets/TargetListener.java                    |   2 +-
 .../targets/TargetMonitor.java                     |   2 +-
 .../targets/TargetProbe.java                       |   2 +-
 .../targets/TargetResult.java                      |   2 +-
 .../transformer/ConsistentHashModulo.java          |   8 +-
 .../transformer/KeyTransformer.java                |   2 +-
 .../transformer/TransformerFactory.java            |   2 +-
 .../transformer/TransformerFactoryResolver.java    |   6 +-
 .../spi/core/protocol/AbstractProtocolManager.java |   4 +-
 .../artemis/spi/core/protocol/ProtocolManager.java |   6 +-
 .../resources/schema/artemis-configuration.xsd     |  32 +++----
 .../core/config/impl/ConfigurationImplTest.java    |  28 +++---
 .../core/config/impl/FileConfigurationTest.java    |  38 ++++-----
 .../server/group/impl/ClusteredResetMockTest.java  |   6 +-
 .../ConnectionRouterManagerTest.java}              |  43 +++++-----
 .../ConnectionRouterTest.java}                     |  23 +++--
 .../caches/LocalCacheTest.java                     |   2 +-
 .../policies/ConsistentHashPolicyTest.java         |   6 +-
 .../policies/FirstElementPolicyTest.java           |   6 +-
 .../policies/LeastConnectionsPolicyTest.java       |   6 +-
 .../policies/PolicyFactoryResolverTest.java        |   2 +-
 .../policies/PolicyTestBase.java                   |   6 +-
 .../policies/RoundRobinPolicyTest.java             |   6 +-
 .../pools/DiscoveryPoolTest.java                   |   8 +-
 .../pools/MockDiscoveryService.java                |   2 +-
 .../{balancing => routing}/pools/PoolTestBase.java |   8 +-
 .../pools/StaticPoolTest.java                      |   4 +-
 .../targets/KeyTypeResolverTest.java}              |  60 ++++++-------
 .../{balancing => routing}/targets/MockTarget.java |   2 +-
 .../targets/MockTargetFactory.java                 |   2 +-
 .../targets/MockTargetProbe.java                   |   2 +-
 .../transformer/ConsistentHashModuloTest.java      |   6 +-
 .../TransformerFactoryResolverTest.java            |   2 +-
 .../resources/ConfigurationTest-full-config.xml    |  38 ++++-----
 .../ConfigurationTest-xinclude-config.xml          |  38 ++++-----
 docs/user-manual/en/SUMMARY.md                     |   2 +-
 .../{broker-balancers.md => connection-routers.md} |  94 ++++++++++-----------
 ...workflow.png => connection_router_workflow.png} | Bin
 docs/user-manual/en/versions.md                    |   2 +-
 .../evenly-redirect/pom.xml                        |   2 +-
 .../evenly-redirect/readme.md                      |   2 +-
 .../artemis/jms/example/EvenlyRedirectExample.java |   4 +-
 .../src/main/resources/activemq/server0/broker.xml |  15 ++--
 .../src/main/resources/activemq/server1/broker.xml |   0
 .../src/main/resources/activemq/server2/broker.xml |   0
 .../{broker-balancer => connection-router}/pom.xml |   4 +-
 .../symmetric-redirect/pom.xml                     |   2 +-
 .../symmetric-redirect/readme.md                   |   2 +-
 .../jms/example/SymmetricRedirectExample.java      |   0
 .../src/main/resources/activemq/server0/broker.xml |  14 +--
 .../src/main/resources/activemq/server1/broker.xml |  14 +--
 .../symmetric-simple/pom.xml                       |   2 +-
 .../symmetric-simple/readme.md                     |  10 +--
 .../jms/example/SymmetricSimpleExample.java        |   0
 .../src/main/resources/activemq/server0/broker.xml |  14 +--
 .../src/main/resources/activemq/server1/broker.xml |  14 +--
 examples/features/pom.xml                          |   4 +-
 ...lTest.java => ConnectionRouterControlTest.java} |  68 +++++++--------
 .../management/ManagementControlHelper.java        |  10 +--
 .../{balancing => routing}/AmqpRedirectTest.java   |  30 +++----
 .../AutoClientIDShardClusterTest.java              |  28 +++---
 .../{balancing => routing}/ElasticQueueTest.java   |  58 ++++++-------
 .../KeyTypeTest.java}                              |  28 +++---
 .../{balancing => routing}/MQTTRedirectTest.java   |  20 ++---
 .../{balancing => routing}/RedirectTest.java       |  46 +++++-----
 .../RoutingTestBase.java}                          |  64 +++++++-------
 149 files changed, 899 insertions(+), 896 deletions(-)

diff --git a/artemis-commons/src/main/java/org/apache/activemq/artemis/api/core/ActiveMQExceptionType.java b/artemis-commons/src/main/java/org/apache/activemq/artemis/api/core/ActiveMQExceptionType.java
index 2c6e585..03d18e9 100644
--- a/artemis-commons/src/main/java/org/apache/activemq/artemis/api/core/ActiveMQExceptionType.java
+++ b/artemis-commons/src/main/java/org/apache/activemq/artemis/api/core/ActiveMQExceptionType.java
@@ -268,10 +268,10 @@ public enum ActiveMQExceptionType {
          return new ActiveMQDivertDoesNotExistException(msg);
       }
    },
-   REDIRECTED(222) {
+   ROUTING_EXCEPTION(222) {
       @Override
       public ActiveMQException createException(String msg) {
-         return new ActiveMQRedirectedException(msg);
+         return new ActiveMQRoutingException(msg);
       }
    };
    private static final Map<Integer, ActiveMQExceptionType> TYPE_MAP;
diff --git a/artemis-commons/src/main/java/org/apache/activemq/artemis/api/core/ActiveMQRedirectedException.java b/artemis-commons/src/main/java/org/apache/activemq/artemis/api/core/ActiveMQRoutingException.java
similarity index 77%
rename from artemis-commons/src/main/java/org/apache/activemq/artemis/api/core/ActiveMQRedirectedException.java
rename to artemis-commons/src/main/java/org/apache/activemq/artemis/api/core/ActiveMQRoutingException.java
index ed52b04..514719c 100644
--- a/artemis-commons/src/main/java/org/apache/activemq/artemis/api/core/ActiveMQRedirectedException.java
+++ b/artemis-commons/src/main/java/org/apache/activemq/artemis/api/core/ActiveMQRoutingException.java
@@ -19,16 +19,16 @@ package org.apache.activemq.artemis.api.core;
 /**
  * A client was redirected.
  */
-public final class ActiveMQRedirectedException extends ActiveMQException {
+public final class ActiveMQRoutingException extends ActiveMQException {
 
    private static final long serialVersionUID = 7414966383933311627L;
 
-   public ActiveMQRedirectedException() {
-      super(ActiveMQExceptionType.REDIRECTED);
+   public ActiveMQRoutingException() {
+      super(ActiveMQExceptionType.ROUTING_EXCEPTION);
    }
 
-   public ActiveMQRedirectedException(String message) {
-      super(ActiveMQExceptionType.REDIRECTED, message);
+   public ActiveMQRoutingException(String message) {
+      super(ActiveMQExceptionType.ROUTING_EXCEPTION, message);
    }
 }
 
diff --git a/artemis-core-client/src/main/java/org/apache/activemq/artemis/api/core/management/BrokerBalancerControl.java b/artemis-core-client/src/main/java/org/apache/activemq/artemis/api/core/management/ConnectionRouterControl.java
similarity index 94%
rename from artemis-core-client/src/main/java/org/apache/activemq/artemis/api/core/management/BrokerBalancerControl.java
rename to artemis-core-client/src/main/java/org/apache/activemq/artemis/api/core/management/ConnectionRouterControl.java
index f781bc1..50565ee 100644
--- a/artemis-core-client/src/main/java/org/apache/activemq/artemis/api/core/management/BrokerBalancerControl.java
+++ b/artemis-core-client/src/main/java/org/apache/activemq/artemis/api/core/management/ConnectionRouterControl.java
@@ -20,9 +20,9 @@ import javax.management.MBeanOperationInfo;
 import javax.management.openmbean.CompositeData;
 
 /**
- * A BrokerBalancerControl is used to manage a BrokerBalancer.
+ * A ConnectionRouterControl is used to manage a ConnectionRouter
  */
-public interface BrokerBalancerControl {
+public interface ConnectionRouterControl {
    @Operation(desc = "Get the target associated with key", impact = MBeanOperationInfo.INFO)
    CompositeData getTarget(@Parameter(desc = "a key", name = "key") String key) throws Exception;
 
diff --git a/artemis-core-client/src/main/java/org/apache/activemq/artemis/api/core/management/ObjectNameBuilder.java b/artemis-core-client/src/main/java/org/apache/activemq/artemis/api/core/management/ObjectNameBuilder.java
index 559f740..d08bb27 100644
--- a/artemis-core-client/src/main/java/org/apache/activemq/artemis/api/core/management/ObjectNameBuilder.java
+++ b/artemis-core-client/src/main/java/org/apache/activemq/artemis/api/core/management/ObjectNameBuilder.java
@@ -145,12 +145,12 @@ public final class ObjectNameBuilder {
    }
 
    /**
-    * Returns the ObjectName used by BrokerBalancerControl.
+    * Returns the ObjectName used by ConnectionRouterControl.
     *
-    * @see BrokerBalancerControl
+    * @see ConnectionRouterControl
     */
-   public ObjectName getBrokerBalancerObjectName(final String name) throws Exception {
-      return createObjectName("broker-balancer", name);
+   public ObjectName getConnectionRouterObjectName(final String name) throws Exception {
+      return createObjectName("connection-router", name);
    }
 
    private ObjectName createObjectName(final String type, final String name) throws Exception {
diff --git a/artemis-core-client/src/main/java/org/apache/activemq/artemis/api/core/management/ResourceNames.java b/artemis-core-client/src/main/java/org/apache/activemq/artemis/api/core/management/ResourceNames.java
index 0d45dd9..6092214 100644
--- a/artemis-core-client/src/main/java/org/apache/activemq/artemis/api/core/management/ResourceNames.java
+++ b/artemis-core-client/src/main/java/org/apache/activemq/artemis/api/core/management/ResourceNames.java
@@ -44,7 +44,7 @@ public final class ResourceNames {
 
    public static final String BROADCAST_GROUP = "broadcastgroup.";
 
-   public static final String BROKER_BALANCER = "brokerbalancer.";
+   public static final String CONNECTION_ROUTER = "connectionrouter.";
 
    public static final String RETROACTIVE_SUFFIX = "retro";
 
diff --git a/artemis-core-client/src/main/java/org/apache/activemq/artemis/core/client/ActiveMQClientMessageBundle.java b/artemis-core-client/src/main/java/org/apache/activemq/artemis/core/client/ActiveMQClientMessageBundle.java
index 3bbf51b..15194db 100644
--- a/artemis-core-client/src/main/java/org/apache/activemq/artemis/core/client/ActiveMQClientMessageBundle.java
+++ b/artemis-core-client/src/main/java/org/apache/activemq/artemis/core/client/ActiveMQClientMessageBundle.java
@@ -27,7 +27,7 @@ import org.apache.activemq.artemis.api.core.ActiveMQLargeMessageException;
 import org.apache.activemq.artemis.api.core.ActiveMQLargeMessageInterruptedException;
 import org.apache.activemq.artemis.api.core.ActiveMQNotConnectedException;
 import org.apache.activemq.artemis.api.core.ActiveMQObjectClosedException;
-import org.apache.activemq.artemis.api.core.ActiveMQRedirectedException;
+import org.apache.activemq.artemis.api.core.ActiveMQRoutingException;
 import org.apache.activemq.artemis.api.core.ActiveMQTransactionOutcomeUnknownException;
 import org.apache.activemq.artemis.api.core.ActiveMQTransactionRolledBackException;
 import org.apache.activemq.artemis.api.core.ActiveMQUnBlockedException;
@@ -240,5 +240,5 @@ public interface ActiveMQClientMessageBundle {
    RuntimeException failedToHandlePacket(@Cause Exception e);
 
    @Message(id = 219066, value = "The connection was redirected")
-   ActiveMQRedirectedException redirected();
+   ActiveMQRoutingException redirected();
 }
diff --git a/artemis-core-client/src/main/java/org/apache/activemq/artemis/core/client/impl/ClientSessionImpl.java b/artemis-core-client/src/main/java/org/apache/activemq/artemis/core/client/impl/ClientSessionImpl.java
index 5f1d6e5..fc90c7c 100644
--- a/artemis-core-client/src/main/java/org/apache/activemq/artemis/core/client/impl/ClientSessionImpl.java
+++ b/artemis-core-client/src/main/java/org/apache/activemq/artemis/core/client/impl/ClientSessionImpl.java
@@ -33,7 +33,7 @@ import org.apache.activemq.artemis.api.core.ActiveMQBuffer;
 import org.apache.activemq.artemis.api.core.ActiveMQBuffers;
 import org.apache.activemq.artemis.api.core.ActiveMQException;
 import org.apache.activemq.artemis.api.core.ActiveMQExceptionType;
-import org.apache.activemq.artemis.api.core.ActiveMQRedirectedException;
+import org.apache.activemq.artemis.api.core.ActiveMQRoutingException;
 import org.apache.activemq.artemis.api.core.Message;
 import org.apache.activemq.artemis.api.core.QueueAttributes;
 import org.apache.activemq.artemis.api.core.QueueConfiguration;
@@ -1461,8 +1461,8 @@ public final class ClientSessionImpl implements ClientSessionInternal, FailureLi
 
                sessionContext.returnBlocking(cause);
             }
-         } catch (ActiveMQRedirectedException e) {
-            logger.info("failedToHandleFailover.ActiveMQRedirectedException");
+         } catch (ActiveMQRoutingException e) {
+            logger.info("failedToHandleFailover.ActiveMQRoutingException");
             suc = false;
          } catch (Throwable t) {
             ActiveMQClientLogger.LOGGER.failedToHandleFailover(t);
diff --git a/artemis-core-client/src/main/java/org/apache/activemq/artemis/core/protocol/core/CoreRemotingConnection.java b/artemis-core-client/src/main/java/org/apache/activemq/artemis/core/protocol/core/CoreRemotingConnection.java
index 61a01dc..aa85590 100644
--- a/artemis-core-client/src/main/java/org/apache/activemq/artemis/core/protocol/core/CoreRemotingConnection.java
+++ b/artemis-core-client/src/main/java/org/apache/activemq/artemis/core/protocol/core/CoreRemotingConnection.java
@@ -56,7 +56,7 @@ public interface CoreRemotingConnection extends RemotingConnection {
       return  version >= PacketImpl.ARTEMIS_2_18_0_VERSION;
    }
 
-   default boolean isVersionSupportRedirect() {
+   default boolean isVersionSupportRouting() {
       int version = getChannelVersion();
       return  version >= PacketImpl.ARTEMIS_2_18_0_VERSION;
    }
diff --git a/artemis-core-client/src/main/java/org/apache/activemq/artemis/core/protocol/core/impl/ActiveMQClientProtocolManager.java b/artemis-core-client/src/main/java/org/apache/activemq/artemis/core/protocol/core/impl/ActiveMQClientProtocolManager.java
index aaa4a82..0d0cb0d 100644
--- a/artemis-core-client/src/main/java/org/apache/activemq/artemis/core/protocol/core/impl/ActiveMQClientProtocolManager.java
+++ b/artemis-core-client/src/main/java/org/apache/activemq/artemis/core/protocol/core/impl/ActiveMQClientProtocolManager.java
@@ -309,7 +309,7 @@ public class ActiveMQClientProtocolManager implements ClientProtocolManager {
                   throw cause;
 
                if (cause.getType() == ActiveMQExceptionType.UNBLOCKED ||
-                       cause.getType() == ActiveMQExceptionType.REDIRECTED) {
+                       cause.getType() == ActiveMQExceptionType.ROUTING_EXCEPTION) {
                   // This means the thread was blocked on create session and failover unblocked it
                   // so failover could occur
 
diff --git a/artemis-core-client/src/main/java/org/apache/activemq/artemis/core/protocol/core/impl/RemotingConnectionImpl.java b/artemis-core-client/src/main/java/org/apache/activemq/artemis/core/protocol/core/impl/RemotingConnectionImpl.java
index cec722c..0960732 100644
--- a/artemis-core-client/src/main/java/org/apache/activemq/artemis/core/protocol/core/impl/RemotingConnectionImpl.java
+++ b/artemis-core-client/src/main/java/org/apache/activemq/artemis/core/protocol/core/impl/RemotingConnectionImpl.java
@@ -26,7 +26,7 @@ import java.util.concurrent.TimeUnit;
 
 import org.apache.activemq.artemis.api.core.ActiveMQBuffer;
 import org.apache.activemq.artemis.api.core.ActiveMQException;
-import org.apache.activemq.artemis.api.core.ActiveMQRedirectedException;
+import org.apache.activemq.artemis.api.core.ActiveMQRoutingException;
 import org.apache.activemq.artemis.api.core.ActiveMQRemoteDisconnectException;
 import org.apache.activemq.artemis.api.core.DisconnectReason;
 import org.apache.activemq.artemis.api.core.Interceptor;
@@ -208,7 +208,7 @@ public class RemotingConnectionImpl extends AbstractRemotingConnection implement
          destroyed = true;
       }
 
-      if (!(me instanceof ActiveMQRemoteDisconnectException) && !(me instanceof ActiveMQRedirectedException)) {
+      if (!(me instanceof ActiveMQRemoteDisconnectException) && !(me instanceof ActiveMQRoutingException)) {
          ActiveMQClientLogger.LOGGER.connectionFailureDetected(transportConnection.getRemoteAddress(), me.getMessage(), me.getType());
       }
 
diff --git a/artemis-core-client/src/main/java/org/apache/activemq/artemis/core/remoting/impl/netty/TransportConstants.java b/artemis-core-client/src/main/java/org/apache/activemq/artemis/core/remoting/impl/netty/TransportConstants.java
index 4eae868..de5eaad 100644
--- a/artemis-core-client/src/main/java/org/apache/activemq/artemis/core/remoting/impl/netty/TransportConstants.java
+++ b/artemis-core-client/src/main/java/org/apache/activemq/artemis/core/remoting/impl/netty/TransportConstants.java
@@ -363,9 +363,9 @@ public class TransportConstants {
 
    public static final boolean DEFAULT_PROXY_REMOTE_DNS = false;
 
-   public static final String REDIRECT_TO = "redirect-to";
+   public static final String ROUTER = "router";
 
-   public static final String DEFAULT_REDIRECT_TO = null;
+   public static final String DEFAULT_ROUTER = null;
 
    private static int parseDefaultVariable(String variableName, int defaultValue) {
       try {
@@ -444,7 +444,7 @@ public class TransportConstants {
       allowableAcceptorKeys.add(TransportConstants.QUIET_PERIOD);
       allowableAcceptorKeys.add(TransportConstants.DISABLE_STOMP_SERVER_HEADER);
       allowableAcceptorKeys.add(TransportConstants.AUTO_START);
-      allowableAcceptorKeys.add(TransportConstants.REDIRECT_TO);
+      allowableAcceptorKeys.add(TransportConstants.ROUTER);
 
       ALLOWABLE_ACCEPTOR_KEYS = Collections.unmodifiableSet(allowableAcceptorKeys);
 
diff --git a/artemis-core-client/src/main/java/org/apache/activemq/artemis/spi/core/remoting/Connection.java b/artemis-core-client/src/main/java/org/apache/activemq/artemis/spi/core/remoting/Connection.java
index 0067c1e..4ece14b 100644
--- a/artemis-core-client/src/main/java/org/apache/activemq/artemis/spi/core/remoting/Connection.java
+++ b/artemis-core-client/src/main/java/org/apache/activemq/artemis/spi/core/remoting/Connection.java
@@ -177,7 +177,7 @@ public interface Connection {
       return null;
    }
 
-   default String getRedirectTo() {
+   default String getRouter() {
       return null;
    }
 }
diff --git a/artemis-core-client/src/test/java/org/apache/activemq/artemis/api/core/management/OperationAnnotationTest.java b/artemis-core-client/src/test/java/org/apache/activemq/artemis/api/core/management/OperationAnnotationTest.java
index 1451f15..8ef438f 100644
--- a/artemis-core-client/src/test/java/org/apache/activemq/artemis/api/core/management/OperationAnnotationTest.java
+++ b/artemis-core-client/src/test/java/org/apache/activemq/artemis/api/core/management/OperationAnnotationTest.java
@@ -43,7 +43,7 @@ public class OperationAnnotationTest {
                                           {AcceptorControl.class},
                                           {ClusterConnectionControl.class},
                                           {BroadcastGroupControl.class},
-                                          {BrokerBalancerControl.class}});
+                                          {ConnectionRouterControl.class}});
    }
 
    private Class<?> managementClass;
diff --git a/artemis-protocols/artemis-amqp-protocol/src/main/java/org/apache/activemq/artemis/protocol/amqp/broker/ProtonProtocolManager.java b/artemis-protocols/artemis-amqp-protocol/src/main/java/org/apache/activemq/artemis/protocol/amqp/broker/ProtonProtocolManager.java
index 4f427cd..fafd833 100644
--- a/artemis-protocols/artemis-amqp-protocol/src/main/java/org/apache/activemq/artemis/protocol/amqp/broker/ProtonProtocolManager.java
+++ b/artemis-protocols/artemis-amqp-protocol/src/main/java/org/apache/activemq/artemis/protocol/amqp/broker/ProtonProtocolManager.java
@@ -36,7 +36,7 @@ import org.apache.activemq.artemis.protocol.amqp.client.ProtonClientProtocolMana
 import org.apache.activemq.artemis.protocol.amqp.connect.mirror.ReferenceNodeStore;
 import org.apache.activemq.artemis.protocol.amqp.proton.AMQPConnectionContext;
 import org.apache.activemq.artemis.protocol.amqp.proton.AMQPConstants;
-import org.apache.activemq.artemis.protocol.amqp.proton.AMQPRedirectHandler;
+import org.apache.activemq.artemis.protocol.amqp.proton.AMQPRoutingHandler;
 import org.apache.activemq.artemis.protocol.amqp.proton.AmqpSupport;
 import org.apache.activemq.artemis.protocol.amqp.sasl.ClientSASLFactory;
 import org.apache.activemq.artemis.protocol.amqp.sasl.MechanismFinder;
@@ -54,7 +54,7 @@ import org.jboss.logging.Logger;
 /**
  * A proton protocol manager, basically reads the Proton Input and maps proton resources to ActiveMQ Artemis resources
  */
-public class ProtonProtocolManager extends AbstractProtocolManager<AMQPMessage, AmqpInterceptor, ActiveMQProtonRemotingConnection, AMQPRedirectHandler> implements NotificationListener {
+public class ProtonProtocolManager extends AbstractProtocolManager<AMQPMessage, AmqpInterceptor, ActiveMQProtonRemotingConnection, AMQPRoutingHandler> implements NotificationListener {
 
    private static final Logger logger = Logger.getLogger(ProtonProtocolManager.class);
 
@@ -106,7 +106,7 @@ public class ProtonProtocolManager extends AbstractProtocolManager<AMQPMessage,
 
    private boolean directDeliver = true;
 
-   private final AMQPRedirectHandler redirectHandler;
+   private final AMQPRoutingHandler routingHandler;
 
    /*
    * used when you want to treat senders as a subscription on an address rather than consuming from the actual queue for
@@ -120,7 +120,7 @@ public class ProtonProtocolManager extends AbstractProtocolManager<AMQPMessage,
       this.factory = factory;
       this.server = server;
       this.updateInterceptors(incomingInterceptors, outgoingInterceptors);
-      redirectHandler = new AMQPRedirectHandler(server);
+      routingHandler = new AMQPRoutingHandler(server);
    }
 
    public synchronized ReferenceNodeStore getReferenceIDSupplier() {
@@ -348,8 +348,8 @@ public class ProtonProtocolManager extends AbstractProtocolManager<AMQPMessage,
    }
 
    @Override
-   public AMQPRedirectHandler getRedirectHandler() {
-      return redirectHandler;
+   public AMQPRoutingHandler getRoutingHandler() {
+      return routingHandler;
    }
 
    public String invokeIncoming(AMQPMessage message, ActiveMQProtonRemotingConnection connection) {
diff --git a/artemis-protocols/artemis-amqp-protocol/src/main/java/org/apache/activemq/artemis/protocol/amqp/proton/AMQPConnectionContext.java b/artemis-protocols/artemis-amqp-protocol/src/main/java/org/apache/activemq/artemis/protocol/amqp/proton/AMQPConnectionContext.java
index f11e6cb..35b5b8f 100644
--- a/artemis-protocols/artemis-amqp-protocol/src/main/java/org/apache/activemq/artemis/protocol/amqp/proton/AMQPConnectionContext.java
+++ b/artemis-protocols/artemis-amqp-protocol/src/main/java/org/apache/activemq/artemis/protocol/amqp/proton/AMQPConnectionContext.java
@@ -548,8 +548,8 @@ public class AMQPConnectionContext extends ProtonInitializable implements EventH
          log.error("Error init connection", e);
       }
 
-      if (!validateUser(connection) || (connectionCallback.getTransportConnection().getRedirectTo() != null
-         && protocolManager.getRedirectHandler().redirect(this, connection)) || !validateConnection(connection)) {
+      if (!validateUser(connection) || (connectionCallback.getTransportConnection().getRouter() != null
+         && protocolManager.getRoutingHandler().route(this, connection)) || !validateConnection(connection)) {
          connection.close();
       } else {
          connection.setContext(AMQPConnectionContext.this);
diff --git a/artemis-protocols/artemis-amqp-protocol/src/main/java/org/apache/activemq/artemis/protocol/amqp/proton/AMQPRedirectContext.java b/artemis-protocols/artemis-amqp-protocol/src/main/java/org/apache/activemq/artemis/protocol/amqp/proton/AMQPRoutingContext.java
similarity index 85%
rename from artemis-protocols/artemis-amqp-protocol/src/main/java/org/apache/activemq/artemis/protocol/amqp/proton/AMQPRedirectContext.java
rename to artemis-protocols/artemis-amqp-protocol/src/main/java/org/apache/activemq/artemis/protocol/amqp/proton/AMQPRoutingContext.java
index 9c24bd2..fb0eb85 100644
--- a/artemis-protocols/artemis-amqp-protocol/src/main/java/org/apache/activemq/artemis/protocol/amqp/proton/AMQPRedirectContext.java
+++ b/artemis-protocols/artemis-amqp-protocol/src/main/java/org/apache/activemq/artemis/protocol/amqp/proton/AMQPRoutingContext.java
@@ -17,10 +17,10 @@
 
 package org.apache.activemq.artemis.protocol.amqp.proton;
 
-import org.apache.activemq.artemis.core.server.balancing.RedirectContext;
+import org.apache.activemq.artemis.core.server.routing.RoutingContext;
 import org.apache.qpid.proton.engine.Connection;
 
-public class AMQPRedirectContext extends RedirectContext {
+public class AMQPRoutingContext extends RoutingContext {
    private final Connection protonConnection;
 
 
@@ -29,7 +29,7 @@ public class AMQPRedirectContext extends RedirectContext {
    }
 
 
-   public AMQPRedirectContext(AMQPConnectionContext connectionContext, Connection protonConnection) {
+   public AMQPRoutingContext(AMQPConnectionContext connectionContext, Connection protonConnection) {
       super(connectionContext.getConnectionCallback().getProtonConnectionDelegate(), connectionContext.getRemoteContainer(),
          connectionContext.getSASLResult() != null ? connectionContext.getSASLResult().getUser() : null);
       this.protonConnection = protonConnection;
diff --git a/artemis-protocols/artemis-amqp-protocol/src/main/java/org/apache/activemq/artemis/protocol/amqp/proton/AMQPRedirectHandler.java b/artemis-protocols/artemis-amqp-protocol/src/main/java/org/apache/activemq/artemis/protocol/amqp/proton/AMQPRoutingHandler.java
similarity index 64%
rename from artemis-protocols/artemis-amqp-protocol/src/main/java/org/apache/activemq/artemis/protocol/amqp/proton/AMQPRedirectHandler.java
rename to artemis-protocols/artemis-amqp-protocol/src/main/java/org/apache/activemq/artemis/protocol/amqp/proton/AMQPRoutingHandler.java
index 92abb55..0d6891d 100644
--- a/artemis-protocols/artemis-amqp-protocol/src/main/java/org/apache/activemq/artemis/protocol/amqp/proton/AMQPRedirectHandler.java
+++ b/artemis-protocols/artemis-amqp-protocol/src/main/java/org/apache/activemq/artemis/protocol/amqp/proton/AMQPRoutingHandler.java
@@ -19,53 +19,54 @@ package org.apache.activemq.artemis.protocol.amqp.proton;
 
 import org.apache.activemq.artemis.core.remoting.impl.netty.TransportConstants;
 import org.apache.activemq.artemis.core.server.ActiveMQServer;
-import org.apache.activemq.artemis.core.server.balancing.RedirectHandler;
+import org.apache.activemq.artemis.core.server.routing.RoutingHandler;
 import org.apache.activemq.artemis.utils.ConfigurationHelper;
 import org.apache.qpid.proton.amqp.Symbol;
 import org.apache.qpid.proton.amqp.transport.ConnectionError;
 import org.apache.qpid.proton.amqp.transport.ErrorCondition;
 import org.apache.qpid.proton.engine.Connection;
 
+import java.util.Collections;
 import java.util.HashMap;
 import java.util.Map;
 
-public class AMQPRedirectHandler extends RedirectHandler<AMQPRedirectContext> {
+public class AMQPRoutingHandler extends RoutingHandler<AMQPRoutingContext> {
 
-   public AMQPRedirectHandler(ActiveMQServer server) {
+   public AMQPRoutingHandler(ActiveMQServer server) {
       super(server);
    }
 
 
-   public boolean redirect(AMQPConnectionContext connectionContext, Connection protonConnection) throws Exception {
-      return redirect(new AMQPRedirectContext(connectionContext, protonConnection));
+   public boolean route(AMQPConnectionContext connectionContext, Connection protonConnection) throws Exception {
+      return route(new AMQPRoutingContext(connectionContext, protonConnection));
    }
 
    @Override
-   protected void cannotRedirect(AMQPRedirectContext context) {
+   protected void refuse(AMQPRoutingContext context) {
       ErrorCondition error = new ErrorCondition();
       error.setCondition(ConnectionError.CONNECTION_FORCED);
       switch (context.getResult().getStatus()) {
          case REFUSED_USE_ANOTHER:
-            error.setDescription(String.format("Broker balancer %s, rejected this connection", context.getConnection().getTransportConnection().getRedirectTo()));
+            error.setDescription(String.format("Connection router %s rejected this connection", context.getRouter()));
             break;
          case REFUSED_UNAVAILABLE:
-            error.setDescription(String.format("Broker balancer %s is not ready to redirect", context.getConnection().getTransportConnection().getRedirectTo()));
+            error.setDescription(String.format("Connection router %s is not ready", context.getRouter()));
             break;
       }
 
       Connection protonConnection = context.getProtonConnection();
       protonConnection.setCondition(error);
-      addConnectionOpenFailureHint(protonConnection);
+      protonConnection.setProperties(Collections.singletonMap(AmqpSupport.CONNECTION_OPEN_FAILED, true));
    }
 
    @Override
-   protected void redirectTo(AMQPRedirectContext context) {
+   protected void redirect(AMQPRoutingContext context) {
       String host = ConfigurationHelper.getStringProperty(TransportConstants.HOST_PROP_NAME, TransportConstants.DEFAULT_HOST, context.getTarget().getConnector().getParams());
       int port = ConfigurationHelper.getIntProperty(TransportConstants.PORT_PROP_NAME, TransportConstants.DEFAULT_PORT, context.getTarget().getConnector().getParams());
 
       ErrorCondition error = new ErrorCondition();
       error.setCondition(ConnectionError.REDIRECT);
-      error.setDescription(String.format("Connection redirected to %s:%d by broker balancer %s", host, port, context.getConnection().getTransportConnection().getRedirectTo()));
+      error.setDescription(String.format("Connection router %s redirected this connection to %s:%d", context.getRouter(), host, port));
       Map<Symbol, Object>  info = new HashMap<>();
       info.put(AmqpSupport.NETWORK_HOST, host);
       info.put(AmqpSupport.PORT, port);
@@ -73,13 +74,6 @@ public class AMQPRedirectHandler extends RedirectHandler<AMQPRedirectContext> {
 
       Connection protonConnection = context.getProtonConnection();
       protonConnection.setCondition(error);
-      addConnectionOpenFailureHint(protonConnection);
-   }
-
-   private void addConnectionOpenFailureHint(Connection connection) {
-      Map<Symbol, Object> connProps = new HashMap<>();
-      connProps.put(AmqpSupport.CONNECTION_OPEN_FAILED, true);
-
-      connection.setProperties(connProps);
+      protonConnection.setProperties(Collections.singletonMap(AmqpSupport.CONNECTION_OPEN_FAILED, true));
    }
 }
diff --git a/artemis-protocols/artemis-amqp-protocol/src/main/java/org/apache/activemq/artemis/protocol/amqp/sasl/AnonymousServerSASLFactory.java b/artemis-protocols/artemis-amqp-protocol/src/main/java/org/apache/activemq/artemis/protocol/amqp/sasl/AnonymousServerSASLFactory.java
index 485b0ef..790ff2f 100644
--- a/artemis-protocols/artemis-amqp-protocol/src/main/java/org/apache/activemq/artemis/protocol/amqp/sasl/AnonymousServerSASLFactory.java
+++ b/artemis-protocols/artemis-amqp-protocol/src/main/java/org/apache/activemq/artemis/protocol/amqp/sasl/AnonymousServerSASLFactory.java
@@ -18,7 +18,7 @@ package org.apache.activemq.artemis.protocol.amqp.sasl;
 
 import org.apache.activemq.artemis.core.server.ActiveMQServer;
 import org.apache.activemq.artemis.protocol.amqp.broker.AmqpInterceptor;
-import org.apache.activemq.artemis.protocol.amqp.proton.AMQPRedirectHandler;
+import org.apache.activemq.artemis.protocol.amqp.proton.AMQPRoutingHandler;
 import org.apache.activemq.artemis.spi.core.protocol.ProtocolManager;
 import org.apache.activemq.artemis.spi.core.protocol.RemotingConnection;
 import org.apache.activemq.artemis.spi.core.remoting.Connection;
@@ -31,7 +31,7 @@ public class AnonymousServerSASLFactory implements ServerSASLFactory {
    }
 
    @Override
-   public ServerSASL create(ActiveMQServer server, ProtocolManager<AmqpInterceptor, AMQPRedirectHandler> manager, Connection connection,
+   public ServerSASL create(ActiveMQServer server, ProtocolManager<AmqpInterceptor, AMQPRoutingHandler> manager, Connection connection,
                             RemotingConnection remotingConnection) {
       return new AnonymousServerSASL();
    }
diff --git a/artemis-protocols/artemis-amqp-protocol/src/main/java/org/apache/activemq/artemis/protocol/amqp/sasl/ExternalServerSASLFactory.java b/artemis-protocols/artemis-amqp-protocol/src/main/java/org/apache/activemq/artemis/protocol/amqp/sasl/ExternalServerSASLFactory.java
index 9bcaf05..edb93f0 100644
--- a/artemis-protocols/artemis-amqp-protocol/src/main/java/org/apache/activemq/artemis/protocol/amqp/sasl/ExternalServerSASLFactory.java
+++ b/artemis-protocols/artemis-amqp-protocol/src/main/java/org/apache/activemq/artemis/protocol/amqp/sasl/ExternalServerSASLFactory.java
@@ -21,7 +21,7 @@ import java.security.Principal;
 import org.apache.activemq.artemis.core.remoting.CertificateUtil;
 import org.apache.activemq.artemis.core.server.ActiveMQServer;
 import org.apache.activemq.artemis.protocol.amqp.broker.AmqpInterceptor;
-import org.apache.activemq.artemis.protocol.amqp.proton.AMQPRedirectHandler;
+import org.apache.activemq.artemis.protocol.amqp.proton.AMQPRoutingHandler;
 import org.apache.activemq.artemis.spi.core.protocol.ProtocolManager;
 import org.apache.activemq.artemis.spi.core.protocol.RemotingConnection;
 import org.apache.activemq.artemis.spi.core.remoting.Connection;
@@ -40,7 +40,7 @@ public class ExternalServerSASLFactory implements ServerSASLFactory {
    }
 
    @Override
-   public ServerSASL create(ActiveMQServer server, ProtocolManager<AmqpInterceptor, AMQPRedirectHandler> manager, Connection connection,
+   public ServerSASL create(ActiveMQServer server, ProtocolManager<AmqpInterceptor, AMQPRoutingHandler> manager, Connection connection,
                             RemotingConnection remotingConnection) {
       // validate ssl cert present
       Principal principal = CertificateUtil.getPeerPrincipalFromConnection(remotingConnection);
diff --git a/artemis-protocols/artemis-amqp-protocol/src/main/java/org/apache/activemq/artemis/protocol/amqp/sasl/GSSAPIServerSASLFactory.java b/artemis-protocols/artemis-amqp-protocol/src/main/java/org/apache/activemq/artemis/protocol/amqp/sasl/GSSAPIServerSASLFactory.java
index 098668e..d3316d7 100644
--- a/artemis-protocols/artemis-amqp-protocol/src/main/java/org/apache/activemq/artemis/protocol/amqp/sasl/GSSAPIServerSASLFactory.java
+++ b/artemis-protocols/artemis-amqp-protocol/src/main/java/org/apache/activemq/artemis/protocol/amqp/sasl/GSSAPIServerSASLFactory.java
@@ -19,7 +19,7 @@ package org.apache.activemq.artemis.protocol.amqp.sasl;
 import org.apache.activemq.artemis.core.server.ActiveMQServer;
 import org.apache.activemq.artemis.protocol.amqp.broker.AmqpInterceptor;
 import org.apache.activemq.artemis.protocol.amqp.broker.ProtonProtocolManager;
-import org.apache.activemq.artemis.protocol.amqp.proton.AMQPRedirectHandler;
+import org.apache.activemq.artemis.protocol.amqp.proton.AMQPRoutingHandler;
 import org.apache.activemq.artemis.spi.core.protocol.ProtocolManager;
 import org.apache.activemq.artemis.spi.core.protocol.RemotingConnection;
 import org.apache.activemq.artemis.spi.core.remoting.Connection;
@@ -35,7 +35,7 @@ public class GSSAPIServerSASLFactory implements ServerSASLFactory {
    }
 
    @Override
-   public ServerSASL create(ActiveMQServer server, ProtocolManager<AmqpInterceptor, AMQPRedirectHandler> manager, Connection connection,
+   public ServerSASL create(ActiveMQServer server, ProtocolManager<AmqpInterceptor, AMQPRoutingHandler> manager, Connection connection,
                             RemotingConnection remotingConnection) {
       if (manager instanceof ProtonProtocolManager) {
          GSSAPIServerSASL gssapiServerSASL = new GSSAPIServerSASL();
diff --git a/artemis-protocols/artemis-amqp-protocol/src/main/java/org/apache/activemq/artemis/protocol/amqp/sasl/PlainServerSASLFactory.java b/artemis-protocols/artemis-amqp-protocol/src/main/java/org/apache/activemq/artemis/protocol/amqp/sasl/PlainServerSASLFactory.java
index 2596c82..7b94352 100644
--- a/artemis-protocols/artemis-amqp-protocol/src/main/java/org/apache/activemq/artemis/protocol/amqp/sasl/PlainServerSASLFactory.java
+++ b/artemis-protocols/artemis-amqp-protocol/src/main/java/org/apache/activemq/artemis/protocol/amqp/sasl/PlainServerSASLFactory.java
@@ -18,7 +18,7 @@ package org.apache.activemq.artemis.protocol.amqp.sasl;
 
 import org.apache.activemq.artemis.core.server.ActiveMQServer;
 import org.apache.activemq.artemis.protocol.amqp.broker.AmqpInterceptor;
-import org.apache.activemq.artemis.protocol.amqp.proton.AMQPRedirectHandler;
+import org.apache.activemq.artemis.protocol.amqp.proton.AMQPRoutingHandler;
 import org.apache.activemq.artemis.spi.core.protocol.ProtocolManager;
 import org.apache.activemq.artemis.spi.core.protocol.RemotingConnection;
 import org.apache.activemq.artemis.spi.core.remoting.Connection;
@@ -31,7 +31,7 @@ public class PlainServerSASLFactory implements ServerSASLFactory {
    }
 
    @Override
-   public ServerSASL create(ActiveMQServer server, ProtocolManager<AmqpInterceptor, AMQPRedirectHandler> manager, Connection connection,
+   public ServerSASL create(ActiveMQServer server, ProtocolManager<AmqpInterceptor, AMQPRoutingHandler> manager, Connection connection,
                             RemotingConnection remotingConnection) {
       return new PlainSASL(server.getSecurityStore(), manager.getSecurityDomain(), connection.getProtocolConnection());
    }
diff --git a/artemis-protocols/artemis-amqp-protocol/src/main/java/org/apache/activemq/artemis/protocol/amqp/sasl/ServerSASLFactory.java b/artemis-protocols/artemis-amqp-protocol/src/main/java/org/apache/activemq/artemis/protocol/amqp/sasl/ServerSASLFactory.java
index ded4b27..5cfa522 100644
--- a/artemis-protocols/artemis-amqp-protocol/src/main/java/org/apache/activemq/artemis/protocol/amqp/sasl/ServerSASLFactory.java
+++ b/artemis-protocols/artemis-amqp-protocol/src/main/java/org/apache/activemq/artemis/protocol/amqp/sasl/ServerSASLFactory.java
@@ -18,7 +18,7 @@ package org.apache.activemq.artemis.protocol.amqp.sasl;
 
 import org.apache.activemq.artemis.core.server.ActiveMQServer;
 import org.apache.activemq.artemis.protocol.amqp.broker.AmqpInterceptor;
-import org.apache.activemq.artemis.protocol.amqp.proton.AMQPRedirectHandler;
+import org.apache.activemq.artemis.protocol.amqp.proton.AMQPRoutingHandler;
 import org.apache.activemq.artemis.spi.core.protocol.ProtocolManager;
 import org.apache.activemq.artemis.spi.core.protocol.RemotingConnection;
 import org.apache.activemq.artemis.spi.core.remoting.Connection;
@@ -41,7 +41,7 @@ public interface ServerSASLFactory {
     * @param remotingConnection
     * @return a new instance of {@link ServerSASL} that implements the provided mechanism
     */
-   ServerSASL create(ActiveMQServer server, ProtocolManager<AmqpInterceptor, AMQPRedirectHandler> manager, Connection connection,
+   ServerSASL create(ActiveMQServer server, ProtocolManager<AmqpInterceptor, AMQPRoutingHandler> manager, Connection connection,
                      RemotingConnection remotingConnection);
 
    /**
diff --git a/artemis-protocols/artemis-amqp-protocol/src/main/java/org/apache/activemq/artemis/protocol/amqp/sasl/scram/SCRAMServerSASLFactory.java b/artemis-protocols/artemis-amqp-protocol/src/main/java/org/apache/activemq/artemis/protocol/amqp/sasl/scram/SCRAMServerSASLFactory.java
index 3719005..5b1aabe 100644
--- a/artemis-protocols/artemis-amqp-protocol/src/main/java/org/apache/activemq/artemis/protocol/amqp/sasl/scram/SCRAMServerSASLFactory.java
+++ b/artemis-protocols/artemis-amqp-protocol/src/main/java/org/apache/activemq/artemis/protocol/amqp/sasl/scram/SCRAMServerSASLFactory.java
@@ -31,7 +31,7 @@ import javax.security.auth.login.LoginException;
 import org.apache.activemq.artemis.core.server.ActiveMQServer;
 import org.apache.activemq.artemis.protocol.amqp.broker.AmqpInterceptor;
 import org.apache.activemq.artemis.protocol.amqp.broker.ProtonProtocolManager;
-import org.apache.activemq.artemis.protocol.amqp.proton.AMQPRedirectHandler;
+import org.apache.activemq.artemis.protocol.amqp.proton.AMQPRoutingHandler;
 import org.apache.activemq.artemis.protocol.amqp.sasl.ServerSASL;
 import org.apache.activemq.artemis.protocol.amqp.sasl.ServerSASLFactory;
 import org.apache.activemq.artemis.spi.core.protocol.ProtocolManager;
@@ -68,7 +68,7 @@ public abstract class SCRAMServerSASLFactory implements ServerSASLFactory {
    }
 
    @Override
-   public ServerSASL create(ActiveMQServer server, ProtocolManager<AmqpInterceptor, AMQPRedirectHandler> manager, Connection connection,
+   public ServerSASL create(ActiveMQServer server, ProtocolManager<AmqpInterceptor, AMQPRoutingHandler> manager, Connection connection,
                             RemotingConnection remotingConnection) {
       try {
          if (manager instanceof ProtonProtocolManager) {
diff --git a/artemis-protocols/artemis-mqtt-protocol/src/main/java/org/apache/activemq/artemis/core/protocol/mqtt/MQTTProtocolHandler.java b/artemis-protocols/artemis-mqtt-protocol/src/main/java/org/apache/activemq/artemis/core/protocol/mqtt/MQTTProtocolHandler.java
index 03728fa..6e9d6bf 100644
--- a/artemis-protocols/artemis-mqtt-protocol/src/main/java/org/apache/activemq/artemis/core/protocol/mqtt/MQTTProtocolHandler.java
+++ b/artemis-protocols/artemis-mqtt-protocol/src/main/java/org/apache/activemq/artemis/core/protocol/mqtt/MQTTProtocolHandler.java
@@ -241,7 +241,7 @@ public class MQTTProtocolHandler extends ChannelInboundHandlerAdapter {
          return;
       }
 
-      if (connection.getTransportConnection().getRedirectTo() == null || !protocolManager.getRedirectHandler().redirect(connection, session, connect)) {
+      if (connection.getTransportConnection().getRouter() == null || !protocolManager.getRoutingHandler().route(connection, session, connect)) {
          /* [MQTT-3.1.2-2] Reject unsupported clients. */
          int packetVersion = connect.variableHeader().version();
          if (packetVersion != MqttVersion.MQTT_3_1.protocolLevel() &&
diff --git a/artemis-protocols/artemis-mqtt-protocol/src/main/java/org/apache/activemq/artemis/core/protocol/mqtt/MQTTProtocolManager.java b/artemis-protocols/artemis-mqtt-protocol/src/main/java/org/apache/activemq/artemis/core/protocol/mqtt/MQTTProtocolManager.java
index 046eb33..5a42d26 100644
--- a/artemis-protocols/artemis-mqtt-protocol/src/main/java/org/apache/activemq/artemis/core/protocol/mqtt/MQTTProtocolManager.java
+++ b/artemis-protocols/artemis-mqtt-protocol/src/main/java/org/apache/activemq/artemis/core/protocol/mqtt/MQTTProtocolManager.java
@@ -47,7 +47,7 @@ import org.apache.activemq.artemis.spi.core.remoting.Connection;
 import org.apache.activemq.artemis.utils.collections.TypedProperties;
 import org.jboss.logging.Logger;
 
-public class MQTTProtocolManager extends AbstractProtocolManager<MqttMessage, MQTTInterceptor, MQTTConnection, MQTTRedirectHandler> implements NotificationListener {
+public class MQTTProtocolManager extends AbstractProtocolManager<MqttMessage, MQTTInterceptor, MQTTConnection, MQTTRoutingHandler> implements NotificationListener {
 
    private static final Logger logger = Logger.getLogger(MQTTProtocolManager.class);
 
@@ -72,7 +72,7 @@ public class MQTTProtocolManager extends AbstractProtocolManager<MqttMessage, MQ
 
    private int maximumPacketSize = MQTTUtil.DEFAULT_MAXIMUM_PACKET_SIZE;
 
-   private final MQTTRedirectHandler redirectHandler;
+   private final MQTTRoutingHandler routingHandler;
 
    MQTTProtocolManager(ActiveMQServer server,
                        List<BaseInterceptor> incomingInterceptors,
@@ -80,7 +80,7 @@ public class MQTTProtocolManager extends AbstractProtocolManager<MqttMessage, MQ
       this.server = server;
       this.updateInterceptors(incomingInterceptors, outgoingInterceptors);
       server.getManagementService().addNotificationListener(this);
-      redirectHandler = new MQTTRedirectHandler(server);
+      routingHandler = new MQTTRoutingHandler(server);
    }
 
    public int getDefaultMqttSessionExpiryInterval() {
@@ -315,8 +315,8 @@ public class MQTTProtocolManager extends AbstractProtocolManager<MqttMessage, MQ
    }
 
    @Override
-   public MQTTRedirectHandler getRedirectHandler() {
-      return redirectHandler;
+   public MQTTRoutingHandler getRoutingHandler() {
+      return routingHandler;
    }
 
    public String invokeIncoming(MqttMessage mqttMessage, MQTTConnection connection) {
diff --git a/artemis-protocols/artemis-mqtt-protocol/src/main/java/org/apache/activemq/artemis/core/protocol/mqtt/MQTTRedirectContext.java b/artemis-protocols/artemis-mqtt-protocol/src/main/java/org/apache/activemq/artemis/core/protocol/mqtt/MQTTRoutingContext.java
similarity index 82%
rename from artemis-protocols/artemis-mqtt-protocol/src/main/java/org/apache/activemq/artemis/core/protocol/mqtt/MQTTRedirectContext.java
rename to artemis-protocols/artemis-mqtt-protocol/src/main/java/org/apache/activemq/artemis/core/protocol/mqtt/MQTTRoutingContext.java
index 1cb4059..07f4ea1 100644
--- a/artemis-protocols/artemis-mqtt-protocol/src/main/java/org/apache/activemq/artemis/core/protocol/mqtt/MQTTRedirectContext.java
+++ b/artemis-protocols/artemis-mqtt-protocol/src/main/java/org/apache/activemq/artemis/core/protocol/mqtt/MQTTRoutingContext.java
@@ -18,9 +18,9 @@
 package org.apache.activemq.artemis.core.protocol.mqtt;
 
 import io.netty.handler.codec.mqtt.MqttConnectMessage;
-import org.apache.activemq.artemis.core.server.balancing.RedirectContext;
+import org.apache.activemq.artemis.core.server.routing.RoutingContext;
 
-public class MQTTRedirectContext extends RedirectContext {
+public class MQTTRoutingContext extends RoutingContext {
 
    private final MQTTSession mqttSession;
 
@@ -30,7 +30,7 @@ public class MQTTRedirectContext extends RedirectContext {
    }
 
 
-   public MQTTRedirectContext(MQTTConnection mqttConnection, MQTTSession mqttSession, MqttConnectMessage connect) {
+   public MQTTRoutingContext(MQTTConnection mqttConnection, MQTTSession mqttSession, MqttConnectMessage connect) {
       super(mqttConnection, connect.payload().clientIdentifier(), connect.payload().userName());
       this.mqttSession = mqttSession;
    }
diff --git a/artemis-protocols/artemis-mqtt-protocol/src/main/java/org/apache/activemq/artemis/core/protocol/mqtt/MQTTRedirectHandler.java b/artemis-protocols/artemis-mqtt-protocol/src/main/java/org/apache/activemq/artemis/core/protocol/mqtt/MQTTRoutingHandler.java
similarity index 81%
rename from artemis-protocols/artemis-mqtt-protocol/src/main/java/org/apache/activemq/artemis/core/protocol/mqtt/MQTTRedirectHandler.java
rename to artemis-protocols/artemis-mqtt-protocol/src/main/java/org/apache/activemq/artemis/core/protocol/mqtt/MQTTRoutingHandler.java
index ba7983e..51ab72c 100644
--- a/artemis-protocols/artemis-mqtt-protocol/src/main/java/org/apache/activemq/artemis/core/protocol/mqtt/MQTTRedirectHandler.java
+++ b/artemis-protocols/artemis-mqtt-protocol/src/main/java/org/apache/activemq/artemis/core/protocol/mqtt/MQTTRoutingHandler.java
@@ -21,23 +21,23 @@ import io.netty.handler.codec.mqtt.MqttConnectMessage;
 import io.netty.handler.codec.mqtt.MqttProperties;
 import org.apache.activemq.artemis.core.remoting.impl.netty.TransportConstants;
 import org.apache.activemq.artemis.core.server.ActiveMQServer;
-import org.apache.activemq.artemis.core.server.balancing.RedirectHandler;
+import org.apache.activemq.artemis.core.server.routing.RoutingHandler;
 import org.apache.activemq.artemis.utils.ConfigurationHelper;
 
 import static io.netty.handler.codec.mqtt.MqttProperties.MqttPropertyType.SERVER_REFERENCE;
 
-public class MQTTRedirectHandler extends RedirectHandler<MQTTRedirectContext> {
+public class MQTTRoutingHandler extends RoutingHandler<MQTTRoutingContext> {
 
-   protected MQTTRedirectHandler(ActiveMQServer server) {
+   protected MQTTRoutingHandler(ActiveMQServer server) {
       super(server);
    }
 
-   public boolean redirect(MQTTConnection mqttConnection, MQTTSession mqttSession, MqttConnectMessage connect) throws Exception {
-      return redirect(new MQTTRedirectContext(mqttConnection, mqttSession, connect));
+   public boolean route(MQTTConnection mqttConnection, MQTTSession mqttSession, MqttConnectMessage connect) throws Exception {
+      return route(new MQTTRoutingContext(mqttConnection, mqttSession, connect));
    }
 
    @Override
-   protected void cannotRedirect(MQTTRedirectContext context) {
+   protected void refuse(MQTTRoutingContext context) {
       switch (context.getResult().getStatus()) {
          case REFUSED_USE_ANOTHER:
             context.getMQTTSession().getProtocolHandler().sendConnack(MQTTReasonCodes.USE_ANOTHER_SERVER);
@@ -50,7 +50,7 @@ public class MQTTRedirectHandler extends RedirectHandler<MQTTRedirectContext> {
    }
 
    @Override
-   protected void redirectTo(MQTTRedirectContext context) {
+   protected void redirect(MQTTRoutingContext context) {
       String host = ConfigurationHelper.getStringProperty(TransportConstants.HOST_PROP_NAME, TransportConstants.DEFAULT_HOST, context.getTarget().getConnector().getParams());
       int port = ConfigurationHelper.getIntProperty(TransportConstants.PORT_PROP_NAME, TransportConstants.DEFAULT_PORT, context.getTarget().getConnector().getParams());
 
diff --git a/artemis-protocols/artemis-openwire-protocol/src/main/java/org/apache/activemq/artemis/core/protocol/openwire/OpenWireConnection.java b/artemis-protocols/artemis-openwire-protocol/src/main/java/org/apache/activemq/artemis/core/protocol/openwire/OpenWireConnection.java
index 6820566..9fd1c14 100644
--- a/artemis-protocols/artemis-openwire-protocol/src/main/java/org/apache/activemq/artemis/core/protocol/openwire/OpenWireConnection.java
+++ b/artemis-protocols/artemis-openwire-protocol/src/main/java/org/apache/activemq/artemis/core/protocol/openwire/OpenWireConnection.java
@@ -1189,8 +1189,8 @@ public class OpenWireConnection extends AbstractRemotingConnection implements Se
       public Response processAddConnection(ConnectionInfo info) throws Exception {
          try {
             protocolManager.validateUser(OpenWireConnection.this, info);
-            if (transportConnection.getRedirectTo() != null) {
-               if (protocolManager.getRedirectHandler().redirect(OpenWireConnection.this, info)) {
+            if (transportConnection.getRouter() != null) {
+               if (protocolManager.getRoutingHandler().route(OpenWireConnection.this, info)) {
                   shutdown(true);
                   return null;
                }
diff --git a/artemis-protocols/artemis-openwire-protocol/src/main/java/org/apache/activemq/artemis/core/protocol/openwire/OpenWireProtocolManager.java b/artemis-protocols/artemis-openwire-protocol/src/main/java/org/apache/activemq/artemis/core/protocol/openwire/OpenWireProtocolManager.java
index 7c487e3..e5c37e8 100644
--- a/artemis-protocols/artemis-openwire-protocol/src/main/java/org/apache/activemq/artemis/core/protocol/openwire/OpenWireProtocolManager.java
+++ b/artemis-protocols/artemis-openwire-protocol/src/main/java/org/apache/activemq/artemis/core/protocol/openwire/OpenWireProtocolManager.java
@@ -83,7 +83,7 @@ import org.apache.activemq.util.LongSequenceGenerator;
 
 import static org.apache.activemq.artemis.core.protocol.openwire.util.OpenWireUtil.SELECTOR_AWARE_OPTION;
 
-public class OpenWireProtocolManager  extends AbstractProtocolManager<Command, OpenWireInterceptor, OpenWireConnection, OpenWireRedirectHandler> implements ClusterTopologyListener {
+public class OpenWireProtocolManager  extends AbstractProtocolManager<Command, OpenWireInterceptor, OpenWireConnection, OpenWireRoutingHandler> implements ClusterTopologyListener {
 
    private static final List<String> websocketRegistryNames = Collections.EMPTY_LIST;
 
@@ -143,7 +143,7 @@ public class OpenWireProtocolManager  extends AbstractProtocolManager<Command, O
    private final List<OpenWireInterceptor> incomingInterceptors = new ArrayList<>();
    private final List<OpenWireInterceptor> outgoingInterceptors = new ArrayList<>();
 
-   private final OpenWireRedirectHandler redirectHandler;
+   private final OpenWireRoutingHandler routingHandler;
 
    protected static class VirtualTopicConfig {
       public int filterPathTerminus;
@@ -195,7 +195,7 @@ public class OpenWireProtocolManager  extends AbstractProtocolManager<Command, O
       //make sure we don't cluster advisories
       clusterManager.addProtocolIgnoredAddress(AdvisorySupport.ADVISORY_TOPIC_PREFIX);
 
-      redirectHandler = new OpenWireRedirectHandler(server, this);
+      routingHandler = new OpenWireRoutingHandler(server, this);
    }
 
    /** Is Duplicate detection enabled when used with failover clients. */
@@ -681,8 +681,8 @@ public class OpenWireProtocolManager  extends AbstractProtocolManager<Command, O
    }
 
    @Override
-   public OpenWireRedirectHandler getRedirectHandler() {
-      return redirectHandler;
+   public OpenWireRoutingHandler getRoutingHandler() {
+      return routingHandler;
    }
 
    @Override
diff --git a/artemis-protocols/artemis-openwire-protocol/src/main/java/org/apache/activemq/artemis/core/protocol/openwire/OpenWireRedirectContext.java b/artemis-protocols/artemis-openwire-protocol/src/main/java/org/apache/activemq/artemis/core/protocol/openwire/OpenWireRoutingContext.java
similarity index 83%
rename from artemis-protocols/artemis-openwire-protocol/src/main/java/org/apache/activemq/artemis/core/protocol/openwire/OpenWireRedirectContext.java
rename to artemis-protocols/artemis-openwire-protocol/src/main/java/org/apache/activemq/artemis/core/protocol/openwire/OpenWireRoutingContext.java
index 047a4c9..cfcaf4a 100644
--- a/artemis-protocols/artemis-openwire-protocol/src/main/java/org/apache/activemq/artemis/core/protocol/openwire/OpenWireRedirectContext.java
+++ b/artemis-protocols/artemis-openwire-protocol/src/main/java/org/apache/activemq/artemis/core/protocol/openwire/OpenWireRoutingContext.java
@@ -17,10 +17,10 @@
 
 package org.apache.activemq.artemis.core.protocol.openwire;
 
-import org.apache.activemq.artemis.core.server.balancing.RedirectContext;
+import org.apache.activemq.artemis.core.server.routing.RoutingContext;
 import org.apache.activemq.command.ConnectionInfo;
 
-public class OpenWireRedirectContext extends RedirectContext {
+public class OpenWireRoutingContext extends RoutingContext {
 
    private final OpenWireConnection openWireConnection;
 
@@ -30,7 +30,7 @@ public class OpenWireRedirectContext extends RedirectContext {
    }
 
 
-   public OpenWireRedirectContext(OpenWireConnection openWireConnection, ConnectionInfo connectionInfo) {
+   public OpenWireRoutingContext(OpenWireConnection openWireConnection, ConnectionInfo connectionInfo) {
       super(openWireConnection.getRemotingConnection(), connectionInfo.getClientId(), connectionInfo.getUserName());
       this.openWireConnection = openWireConnection;
    }
diff --git a/artemis-protocols/artemis-openwire-protocol/src/main/java/org/apache/activemq/artemis/core/protocol/openwire/OpenWireRedirectHandler.java b/artemis-protocols/artemis-openwire-protocol/src/main/java/org/apache/activemq/artemis/core/protocol/openwire/OpenWireRoutingHandler.java
similarity index 76%
rename from artemis-protocols/artemis-openwire-protocol/src/main/java/org/apache/activemq/artemis/core/protocol/openwire/OpenWireRedirectHandler.java
rename to artemis-protocols/artemis-openwire-protocol/src/main/java/org/apache/activemq/artemis/core/protocol/openwire/OpenWireRoutingHandler.java
index 83510af..9607164 100644
--- a/artemis-protocols/artemis-openwire-protocol/src/main/java/org/apache/activemq/artemis/core/protocol/openwire/OpenWireRedirectHandler.java
+++ b/artemis-protocols/artemis-openwire-protocol/src/main/java/org/apache/activemq/artemis/core/protocol/openwire/OpenWireRoutingHandler.java
@@ -19,34 +19,34 @@ package org.apache.activemq.artemis.core.protocol.openwire;
 
 import org.apache.activemq.artemis.core.remoting.impl.netty.TransportConstants;
 import org.apache.activemq.artemis.core.server.ActiveMQServer;
-import org.apache.activemq.artemis.core.server.balancing.RedirectHandler;
+import org.apache.activemq.artemis.core.server.routing.RoutingHandler;
 import org.apache.activemq.artemis.utils.ConfigurationHelper;
 import org.apache.activemq.command.ConnectionControl;
 import org.apache.activemq.command.ConnectionInfo;
 
-public class OpenWireRedirectHandler extends RedirectHandler<OpenWireRedirectContext> {
+public class OpenWireRoutingHandler extends RoutingHandler<OpenWireRoutingContext> {
 
    private final OpenWireProtocolManager protocolManager;
 
-   protected OpenWireRedirectHandler(ActiveMQServer server, OpenWireProtocolManager protocolManager) {
+   protected OpenWireRoutingHandler(ActiveMQServer server, OpenWireProtocolManager protocolManager) {
       super(server);
       this.protocolManager = protocolManager;
    }
 
-   public boolean redirect(OpenWireConnection openWireConnection, ConnectionInfo connectionInfo) throws Exception {
+   public boolean route(OpenWireConnection openWireConnection, ConnectionInfo connectionInfo) throws Exception {
       if (!connectionInfo.isFaultTolerant()) {
          throw new java.lang.IllegalStateException("Client not fault tolerant");
       }
 
-      return redirect(new OpenWireRedirectContext(openWireConnection, connectionInfo));
+      return route(new OpenWireRoutingContext(openWireConnection, connectionInfo));
    }
 
    @Override
-   protected void cannotRedirect(OpenWireRedirectContext context) throws Exception {
+   protected void refuse(OpenWireRoutingContext context) throws Exception {
    }
 
    @Override
-   protected void redirectTo(OpenWireRedirectContext context) throws Exception {
+   protected void redirect(OpenWireRoutingContext context) throws Exception {
       String host = ConfigurationHelper.getStringProperty(TransportConstants.HOST_PROP_NAME, TransportConstants.DEFAULT_HOST, context.getTarget().getConnector().getParams());
       int port = ConfigurationHelper.getIntProperty(TransportConstants.PORT_PROP_NAME, TransportConstants.DEFAULT_PORT, context.getTarget().getConnector().getParams());
 
diff --git a/artemis-protocols/artemis-stomp-protocol/src/main/java/org/apache/activemq/artemis/core/protocol/stomp/StompProtocolManager.java b/artemis-protocols/artemis-stomp-protocol/src/main/java/org/apache/activemq/artemis/core/protocol/stomp/StompProtocolManager.java
index ba23348..87d5c28 100644
--- a/artemis-protocols/artemis-stomp-protocol/src/main/java/org/apache/activemq/artemis/core/protocol/stomp/StompProtocolManager.java
+++ b/artemis-protocols/artemis-stomp-protocol/src/main/java/org/apache/activemq/artemis/core/protocol/stomp/StompProtocolManager.java
@@ -38,7 +38,7 @@ import org.apache.activemq.artemis.core.remoting.impl.netty.TransportConstants;
 import org.apache.activemq.artemis.core.server.ActiveMQServer;
 import org.apache.activemq.artemis.core.server.ActiveMQServerLogger;
 import org.apache.activemq.artemis.core.server.ServerSession;
-import org.apache.activemq.artemis.core.server.balancing.RedirectHandler;
+import org.apache.activemq.artemis.core.server.routing.RoutingHandler;
 import org.apache.activemq.artemis.logs.AuditLogger;
 import org.apache.activemq.artemis.spi.core.protocol.AbstractProtocolManager;
 import org.apache.activemq.artemis.spi.core.protocol.ConnectionEntry;
@@ -53,7 +53,7 @@ import static org.apache.activemq.artemis.core.protocol.stomp.ActiveMQStompProto
 /**
  * StompProtocolManager
  */
-public class StompProtocolManager extends AbstractProtocolManager<StompFrame, StompFrameInterceptor, StompConnection, RedirectHandler> {
+public class StompProtocolManager extends AbstractProtocolManager<StompFrame, StompFrameInterceptor, StompConnection, RoutingHandler> {
 
    private static final List<String> websocketRegistryNames = Arrays.asList("v10.stomp", "v11.stomp", "v12.stomp");
 
@@ -186,7 +186,7 @@ public class StompProtocolManager extends AbstractProtocolManager<StompFrame, St
    }
 
    @Override
-   public RedirectHandler getRedirectHandler() {
+   public RoutingHandler getRoutingHandler() {
       return null;
    }
 
diff --git a/artemis-server/src/main/java/org/apache/activemq/artemis/core/config/Configuration.java b/artemis-server/src/main/java/org/apache/activemq/artemis/core/config/Configuration.java
index 69d0bda..16cfcf6 100644
--- a/artemis-server/src/main/java/org/apache/activemq/artemis/core/config/Configuration.java
+++ b/artemis-server/src/main/java/org/apache/activemq/artemis/core/config/Configuration.java
@@ -25,7 +25,7 @@ import java.util.concurrent.TimeUnit;
 
 import org.apache.activemq.artemis.api.core.QueueConfiguration;
 import org.apache.activemq.artemis.core.config.amqpBrokerConnectivity.AMQPBrokerConnectConfiguration;
-import org.apache.activemq.artemis.core.config.balancing.BrokerBalancerConfiguration;
+import org.apache.activemq.artemis.core.config.routing.ConnectionRouterConfiguration;
 import org.apache.activemq.artemis.core.server.metrics.ActiveMQMetricsPlugin;
 import org.apache.activemq.artemis.core.server.plugin.ActiveMQServerFederationPlugin;
 import org.apache.activemq.artemis.core.server.plugin.ActiveMQServerAddressPlugin;
@@ -467,14 +467,14 @@ public interface Configuration {
    /**
     * Returns the redirects configured for this server.
     */
-   List<BrokerBalancerConfiguration> getBalancerConfigurations();
+   List<ConnectionRouterConfiguration> getConnectionRouters();
 
    /**
     * Sets the redirects configured for this server.
     */
-   Configuration setBalancerConfigurations(List<BrokerBalancerConfiguration> configs);
+   Configuration setConnectionRouters(List<ConnectionRouterConfiguration> configs);
 
-   Configuration addBalancerConfiguration(BrokerBalancerConfiguration config);
+   Configuration addConnectionRouter(ConnectionRouterConfiguration config);
 
    /**
     * Returns the cluster connections configured for this server.
diff --git a/artemis-server/src/main/java/org/apache/activemq/artemis/core/config/impl/ConfigurationImpl.java b/artemis-server/src/main/java/org/apache/activemq/artemis/core/config/impl/ConfigurationImpl.java
index 7bac741..8ab3507 100644
--- a/artemis-server/src/main/java/org/apache/activemq/artemis/core/config/impl/ConfigurationImpl.java
+++ b/artemis-server/src/main/java/org/apache/activemq/artemis/core/config/impl/ConfigurationImpl.java
@@ -55,7 +55,7 @@ import org.apache.activemq.artemis.api.core.Pair;
 import org.apache.activemq.artemis.api.core.QueueConfiguration;
 import org.apache.activemq.artemis.api.core.SimpleString;
 import org.apache.activemq.artemis.api.core.TransportConfiguration;
-import org.apache.activemq.artemis.core.config.balancing.BrokerBalancerConfiguration;
+import org.apache.activemq.artemis.core.config.routing.ConnectionRouterConfiguration;
 import org.apache.activemq.artemis.core.config.amqpBrokerConnectivity.AMQPBrokerConnectConfiguration;
 import org.apache.activemq.artemis.core.config.BridgeConfiguration;
 import org.apache.activemq.artemis.core.config.ClusterConnectionConfiguration;
@@ -182,7 +182,7 @@ public class ConfigurationImpl implements Configuration, Serializable {
 
    protected List<DivertConfiguration> divertConfigurations = new ArrayList<>();
 
-   protected List<BrokerBalancerConfiguration> brokerBalancerConfigurations = new ArrayList<>();
+   protected List<ConnectionRouterConfiguration> connectionRouters = new ArrayList<>();
 
    protected List<ClusterConnectionConfiguration> clusterConfigurations = new ArrayList<>();
 
@@ -901,19 +901,19 @@ public class ConfigurationImpl implements Configuration, Serializable {
    }
 
    @Override
-   public List<BrokerBalancerConfiguration> getBalancerConfigurations() {
-      return brokerBalancerConfigurations;
+   public List<ConnectionRouterConfiguration> getConnectionRouters() {
+      return connectionRouters;
    }
 
    @Override
-   public ConfigurationImpl setBalancerConfigurations(final List<BrokerBalancerConfiguration> configs) {
-      brokerBalancerConfigurations = configs;
+   public ConfigurationImpl setConnectionRouters(final List<ConnectionRouterConfiguration> configs) {
+      connectionRouters = configs;
       return this;
    }
 
    @Override
-   public ConfigurationImpl addBalancerConfiguration(final BrokerBalancerConfiguration config) {
-      brokerBalancerConfigurations.add(config);
+   public ConfigurationImpl addConnectionRouter(final ConnectionRouterConfiguration config) {
+      connectionRouters.add(config);
       return this;
    }
 
diff --git a/artemis-server/src/main/java/org/apache/activemq/artemis/core/config/impl/Validators.java b/artemis-server/src/main/java/org/apache/activemq/artemis/core/config/impl/Validators.java
index 9c8ad50..3aa5af5 100644
--- a/artemis-server/src/main/java/org/apache/activemq/artemis/core/config/impl/Validators.java
+++ b/artemis-server/src/main/java/org/apache/activemq/artemis/core/config/impl/Validators.java
@@ -18,7 +18,7 @@ package org.apache.activemq.artemis.core.config.impl;
 
 import java.util.EnumSet;
 
-import org.apache.activemq.artemis.core.server.balancing.targets.TargetKey;
+import org.apache.activemq.artemis.core.server.routing.KeyType;
 import org.apache.activemq.artemis.core.server.ActiveMQMessageBundle;
 import org.apache.activemq.artemis.core.server.ComponentConfigurationRoutingType;
 import org.apache.activemq.artemis.core.server.JournalType;
@@ -275,12 +275,12 @@ public final class Validators {
       }
    };
 
-   public static final Validator TARGET_KEY = new Validator() {
+   public static final Validator KEY_TYPE = new Validator() {
       @Override
       public void validate(final String name, final Object value) {
          String val = (String) value;
-         if (val == null || !EnumSet.allOf(TargetKey.class).contains(TargetKey.valueOf(val))) {
-            throw ActiveMQMessageBundle.BUNDLE.invalidTargetKey(val);
+         if (val == null || !EnumSet.allOf(KeyType.class).contains(KeyType.valueOf(val))) {
+            throw ActiveMQMessageBundle.BUNDLE.invalidConnectionRouterKey(val);
          }
       }
    };
diff --git a/artemis-server/src/main/java/org/apache/activemq/artemis/core/config/balancing/CacheConfiguration.java b/artemis-server/src/main/java/org/apache/activemq/artemis/core/config/routing/CacheConfiguration.java
similarity index 95%
rename from artemis-server/src/main/java/org/apache/activemq/artemis/core/config/balancing/CacheConfiguration.java
rename to artemis-server/src/main/java/org/apache/activemq/artemis/core/config/routing/CacheConfiguration.java
index f3bf22a..4ec81ea 100644
--- a/artemis-server/src/main/java/org/apache/activemq/artemis/core/config/balancing/CacheConfiguration.java
+++ b/artemis-server/src/main/java/org/apache/activemq/artemis/core/config/routing/CacheConfiguration.java
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-package org.apache.activemq.artemis.core.config.balancing;
+package org.apache.activemq.artemis.core.config.routing;
 
 import java.io.Serializable;
 
diff --git a/artemis-server/src/main/java/org/apache/activemq/artemis/core/config/balancing/BrokerBalancerConfiguration.java b/artemis-server/src/main/java/org/apache/activemq/artemis/core/config/routing/ConnectionRouterConfiguration.java
similarity index 66%
rename from artemis-server/src/main/java/org/apache/activemq/artemis/core/config/balancing/BrokerBalancerConfiguration.java
rename to artemis-server/src/main/java/org/apache/activemq/artemis/core/config/routing/ConnectionRouterConfiguration.java
index cf218fa..47596d9 100644
--- a/artemis-server/src/main/java/org/apache/activemq/artemis/core/config/balancing/BrokerBalancerConfiguration.java
+++ b/artemis-server/src/main/java/org/apache/activemq/artemis/core/config/routing/ConnectionRouterConfiguration.java
@@ -14,17 +14,17 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.activemq.artemis.core.config.balancing;
+package org.apache.activemq.artemis.core.config.routing;
 
-import org.apache.activemq.artemis.core.server.balancing.targets.TargetKey;
+import org.apache.activemq.artemis.core.server.routing.KeyType;
 
 import java.io.Serializable;
 
-public class BrokerBalancerConfiguration implements Serializable {
+public class ConnectionRouterConfiguration implements Serializable {
 
    private String name = null;
-   private TargetKey targetKey = TargetKey.SOURCE_IP;
-   private String targetKeyFilter = null;
+   private KeyType keyType = KeyType.SOURCE_IP;
+   private String keyFilter = null;
    private String localTargetFilter = null;
    private CacheConfiguration cacheConfiguration = null;
    private PoolConfiguration poolConfiguration = null;
@@ -35,26 +35,26 @@ public class BrokerBalancerConfiguration implements Serializable {
       return name;
    }
 
-   public BrokerBalancerConfiguration setName(String name) {
+   public ConnectionRouterConfiguration setName(String name) {
       this.name = name;
       return this;
    }
 
-   public TargetKey getTargetKey() {
-      return targetKey;
+   public KeyType getKeyType() {
+      return keyType;
    }
 
-   public BrokerBalancerConfiguration setTargetKey(TargetKey targetKey) {
-      this.targetKey = targetKey;
+   public ConnectionRouterConfiguration setKeyType(KeyType keyType) {
+      this.keyType = keyType;
       return this;
    }
 
-   public String getTargetKeyFilter() {
-      return targetKeyFilter;
+   public String getKeyFilter() {
+      return keyFilter;
    }
 
-   public BrokerBalancerConfiguration setTargetKeyFilter(String targetKeyFilter) {
-      this.targetKeyFilter = targetKeyFilter;
+   public ConnectionRouterConfiguration setKeyFilter(String keyFilter) {
+      this.keyFilter = keyFilter;
       return this;
    }
 
@@ -62,7 +62,7 @@ public class BrokerBalancerConfiguration implements Serializable {
       return localTargetFilter;
    }
 
-   public BrokerBalancerConfiguration setLocalTargetFilter(String localTargetFilter) {
+   public ConnectionRouterConfiguration setLocalTargetFilter(String localTargetFilter) {
       this.localTargetFilter = localTargetFilter;
       return this;
    }
@@ -71,7 +71,7 @@ public class BrokerBalancerConfiguration implements Serializable {
       return cacheConfiguration;
    }
 
-   public BrokerBalancerConfiguration setCacheConfiguration(CacheConfiguration cacheConfiguration) {
+   public ConnectionRouterConfiguration setCacheConfiguration(CacheConfiguration cacheConfiguration) {
       this.cacheConfiguration = cacheConfiguration;
       return this;
    }
@@ -80,7 +80,7 @@ public class BrokerBalancerConfiguration implements Serializable {
       return policyConfiguration;
    }
 
-   public BrokerBalancerConfiguration setPolicyConfiguration(NamedPropertyConfiguration policyConfiguration) {
+   public ConnectionRouterConfiguration setPolicyConfiguration(NamedPropertyConfiguration policyConfiguration) {
       this.policyConfiguration = policyConfiguration;
       return this;
    }
@@ -89,7 +89,7 @@ public class BrokerBalancerConfiguration implements Serializable {
       return poolConfiguration;
    }
 
-   public BrokerBalancerConfiguration setPoolConfiguration(PoolConfiguration poolConfiguration) {
+   public ConnectionRouterConfiguration setPoolConfiguration(PoolConfiguration poolConfiguration) {
       this.poolConfiguration = poolConfiguration;
       return this;
    }
diff --git a/artemis-server/src/main/java/org/apache/activemq/artemis/core/config/balancing/NamedPropertyConfiguration.java b/artemis-server/src/main/java/org/apache/activemq/artemis/core/config/routing/NamedPropertyConfiguration.java
similarity index 95%
rename from artemis-server/src/main/java/org/apache/activemq/artemis/core/config/balancing/NamedPropertyConfiguration.java
rename to artemis-server/src/main/java/org/apache/activemq/artemis/core/config/routing/NamedPropertyConfiguration.java
index eefa61d..34f3296 100644
--- a/artemis-server/src/main/java/org/apache/activemq/artemis/core/config/balancing/NamedPropertyConfiguration.java
+++ b/artemis-server/src/main/java/org/apache/activemq/artemis/core/config/routing/NamedPropertyConfiguration.java
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-package org.apache.activemq.artemis.core.config.balancing;
+package org.apache.activemq.artemis.core.config.routing;
 
 import java.io.Serializable;
 import java.util.Map;
diff --git a/artemis-server/src/main/java/org/apache/activemq/artemis/core/config/balancing/PoolConfiguration.java b/artemis-server/src/main/java/org/apache/activemq/artemis/core/config/routing/PoolConfiguration.java
similarity index 98%
rename from artemis-server/src/main/java/org/apache/activemq/artemis/core/config/balancing/PoolConfiguration.java
rename to artemis-server/src/main/java/org/apache/activemq/artemis/core/config/routing/PoolConfiguration.java
index 1c7abc7..df6db65 100644
--- a/artemis-server/src/main/java/org/apache/activemq/artemis/core/config/balancing/PoolConfiguration.java
+++ b/artemis-server/src/main/java/org/apache/activemq/artemis/core/config/routing/PoolConfiguration.java
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-package org.apache.activemq.artemis.core.config.balancing;
+package org.apache.activemq.artemis.core.config.routing;
 
 import java.io.Serializable;
 import java.util.List;
diff --git a/artemis-server/src/main/java/org/apache/activemq/artemis/core/deployers/impl/FileConfigurationParser.java b/artemis-server/src/main/java/org/apache/activemq/artemis/core/deployers/impl/FileConfigurationParser.java
index 9fb7689..c78cf0d 100644
--- a/artemis-server/src/main/java/org/apache/activemq/artemis/core/deployers/impl/FileConfigurationParser.java
+++ b/artemis-server/src/main/java/org/apache/activemq/artemis/core/deployers/impl/FileConfigurationParser.java
@@ -46,9 +46,9 @@ import org.apache.activemq.artemis.api.core.SimpleString;
 import org.apache.activemq.artemis.api.core.TransportConfiguration;
 import org.apache.activemq.artemis.api.core.UDPBroadcastEndpointFactory;
 import org.apache.activemq.artemis.api.core.client.ActiveMQClient;
-import org.apache.activemq.artemis.core.config.balancing.BrokerBalancerConfiguration;
-import org.apache.activemq.artemis.core.config.balancing.CacheConfiguration;
-import org.apache.activemq.artemis.core.config.balancing.NamedPropertyConfiguration;
+import org.apache.activemq.artemis.core.config.routing.ConnectionRouterConfiguration;
+import org.apache.activemq.artemis.core.config.routing.CacheConfiguration;
+import org.apache.activemq.artemis.core.config.routing.NamedPropertyConfiguration;
 import org.apache.activemq.artemis.core.config.amqpBrokerConnectivity.AMQPBrokerConnectConfiguration;
 import org.apache.activemq.artemis.core.config.BridgeConfiguration;
 import org.apache.activemq.artemis.core.config.ClusterConnectionConfiguration;
@@ -65,7 +65,7 @@ import org.apache.activemq.artemis.core.config.WildcardConfiguration;
 import org.apache.activemq.artemis.core.config.amqpBrokerConnectivity.AMQPBrokerConnectionElement;
 import org.apache.activemq.artemis.core.config.amqpBrokerConnectivity.AMQPBrokerConnectionAddressType;
 import org.apache.activemq.artemis.core.config.amqpBrokerConnectivity.AMQPMirrorBrokerConnectionElement;
-import org.apache.activemq.artemis.core.config.balancing.PoolConfiguration;
+import org.apache.activemq.artemis.core.config.routing.PoolConfiguration;
 import org.apache.activemq.artemis.core.config.federation.FederationAddressPolicyConfiguration;
 import org.apache.activemq.artemis.core.config.federation.FederationDownstreamConfiguration;
 import org.apache.activemq.artemis.core.config.federation.FederationPolicySet;
@@ -92,9 +92,9 @@ import org.apache.activemq.artemis.core.server.ActiveMQServerLogger;
 import org.apache.activemq.artemis.core.server.ComponentConfigurationRoutingType;
 import org.apache.activemq.artemis.core.server.JournalType;
 import org.apache.activemq.artemis.core.server.SecuritySettingPlugin;
-import org.apache.activemq.artemis.core.server.balancing.policies.PolicyFactoryResolver;
-import org.apache.activemq.artemis.core.server.balancing.targets.TargetKey;
-import org.apache.activemq.artemis.core.server.balancing.transformer.TransformerFactoryResolver;
+import org.apache.activemq.artemis.core.server.routing.policies.PolicyFactoryResolver;
+import org.apache.activemq.artemis.core.server.routing.KeyType;
+import org.apache.activemq.artemis.core.server.routing.transformer.TransformerFactoryResolver;
 import org.apache.activemq.artemis.core.server.cluster.impl.MessageLoadBalancingType;
 import org.apache.activemq.artemis.core.server.group.impl.GroupingHandlerConfiguration;
 import org.apache.activemq.artemis.core.server.metrics.ActiveMQMetricsPlugin;
@@ -634,16 +634,16 @@ public final class FileConfigurationParser extends XMLConfigurationUtil {
          parseDivertConfiguration(dvNode, config);
       }
 
-      NodeList ccBalancers = e.getElementsByTagName("broker-balancers");
+      NodeList ccConnectionRouters = e.getElementsByTagName("connection-routers");
 
-      if (ccBalancers != null) {
-         NodeList ccBalancer = e.getElementsByTagName("broker-balancer");
+      if (ccConnectionRouters != null) {
+         NodeList ccConnectionRouter = e.getElementsByTagName("connection-router");
 
-         if (ccBalancer != null) {
-            for (int i = 0; i < ccBalancer.getLength(); i++) {
-               Element ccNode = (Element) ccBalancer.item(i);
+         if (ccConnectionRouter != null) {
+            for (int i = 0; i < ccConnectionRouter.getLength(); i++) {
+               Element ccNode = (Element) ccConnectionRouter.item(i);
 
-               parseBalancerConfiguration(ccNode, config);
+               parseConnectionRouterConfiguration(ccNode, config);
             }
          }
       }
@@ -2646,16 +2646,16 @@ public final class FileConfigurationParser extends XMLConfigurationUtil {
       mainConfig.getDivertConfigurations().add(config);
    }
 
-   private void parseBalancerConfiguration(final Element e, final Configuration config) throws Exception {
-      BrokerBalancerConfiguration brokerBalancerConfiguration = new BrokerBalancerConfiguration();
+   private void parseConnectionRouterConfiguration(final Element e, final Configuration config) throws Exception {
+      ConnectionRouterConfiguration connectionRouterConfiguration = new ConnectionRouterConfiguration();
 
-      brokerBalancerConfiguration.setName(e.getAttribute("name"));
+      connectionRouterConfiguration.setName(e.getAttribute("name"));
 
-      brokerBalancerConfiguration.setTargetKey(TargetKey.valueOf(getString(e, "target-key", brokerBalancerConfiguration.getTargetKey().name(), Validators.TARGET_KEY)));
+      connectionRouterConfiguration.setKeyType(KeyType.valueOf(getString(e, "key-type", connectionRouterConfiguration.getKeyType().name(), Validators.KEY_TYPE)));
 
-      brokerBalancerConfiguration.setTargetKeyFilter(getString(e, "target-key-filter", brokerBalancerConfiguration.getTargetKeyFilter(), Validators.NO_CHECK));
+      connectionRouterConfiguration.setKeyFilter(getString(e, "key-filter", connectionRouterConfiguration.getKeyFilter(), Validators.NO_CHECK));
 
-      brokerBalancerConfiguration.setLocalTargetFilter(getString(e, "local-target-filter", brokerBalancerConfiguration.getLocalTargetFilter(), Validators.NO_CHECK));
+      connectionRouterConfiguration.setLocalTargetFilter(getString(e, "local-target-filter", connectionRouterConfiguration.getLocalTargetFilter(), Validators.NO_CHECK));
 
       NamedPropertyConfiguration policyConfiguration = null;
       PoolConfiguration poolConfiguration = null;
@@ -2667,23 +2667,23 @@ public final class FileConfigurationParser extends XMLConfigurationUtil {
          if (child.getNodeName().equals("cache")) {
             CacheConfiguration cacheConfiguration = new CacheConfiguration();
             parseCacheConfiguration((Element) child, cacheConfiguration);
-            brokerBalancerConfiguration.setCacheConfiguration(cacheConfiguration);
+            connectionRouterConfiguration.setCacheConfiguration(cacheConfiguration);
          } else if (child.getNodeName().equals("policy")) {
             policyConfiguration = new NamedPropertyConfiguration();
             parsePolicyConfiguration((Element) child, policyConfiguration);
-            brokerBalancerConfiguration.setPolicyConfiguration(policyConfiguration);
+            connectionRouterConfiguration.setPolicyConfiguration(policyConfiguration);
          } else if (child.getNodeName().equals("pool")) {
             poolConfiguration = new PoolConfiguration();
             parsePoolConfiguration((Element) child, config, poolConfiguration);
-            brokerBalancerConfiguration.setPoolConfiguration(poolConfiguration);
+            connectionRouterConfiguration.setPoolConfiguration(poolConfiguration);
          } else if (child.getNodeName().equals("local-target-key-transformer")) {
             policyConfiguration = new NamedPropertyConfiguration();
             parseTransformerConfiguration((Element) child, policyConfiguration);
-            brokerBalancerConfiguration.setTransformerConfiguration(policyConfiguration);
+            connectionRouterConfiguration.setTransformerConfiguration(policyConfiguration);
          }
       }
 
-      config.getBalancerConfigurations().add(brokerBalancerConfiguration);
+      config.getConnectionRouters().add(connectionRouterConfiguration);
    }
 
    private void parseCacheConfiguration(final Element e, final CacheConfiguration cacheConfiguration) throws ClassNotFoundException {
diff --git a/artemis-server/src/main/java/org/apache/activemq/artemis/core/management/impl/BrokerBalancerControlImpl.java b/artemis-server/src/main/java/org/apache/activemq/artemis/core/management/impl/ConnectionRouterControlImpl.java
similarity index 82%
rename from artemis-server/src/main/java/org/apache/activemq/artemis/core/management/impl/BrokerBalancerControlImpl.java
rename to artemis-server/src/main/java/org/apache/activemq/artemis/core/management/impl/ConnectionRouterControlImpl.java
index 857f20a..416ad71 100644
--- a/artemis-server/src/main/java/org/apache/activemq/artemis/core/management/impl/BrokerBalancerControlImpl.java
+++ b/artemis-server/src/main/java/org/apache/activemq/artemis/core/management/impl/ConnectionRouterControlImpl.java
@@ -18,11 +18,11 @@
 package org.apache.activemq.artemis.core.management.impl;
 
 import org.apache.activemq.artemis.api.core.TransportConfiguration;
-import org.apache.activemq.artemis.api.core.management.BrokerBalancerControl;
+import org.apache.activemq.artemis.api.core.management.ConnectionRouterControl;
 import org.apache.activemq.artemis.core.persistence.StorageManager;
-import org.apache.activemq.artemis.core.server.balancing.BrokerBalancer;
-import org.apache.activemq.artemis.core.server.balancing.targets.Target;
-import org.apache.activemq.artemis.core.server.balancing.targets.TargetResult;
+import org.apache.activemq.artemis.core.server.routing.ConnectionRouter;
+import org.apache.activemq.artemis.core.server.routing.targets.Target;
+import org.apache.activemq.artemis.core.server.routing.targets.TargetResult;
 import org.apache.activemq.artemis.utils.JsonLoader;
 
 import org.apache.activemq.artemis.json.JsonObjectBuilder;
@@ -40,8 +40,8 @@ import javax.management.openmbean.TabularDataSupport;
 import javax.management.openmbean.TabularType;
 import java.util.Map;
 
-public class BrokerBalancerControlImpl extends AbstractControl implements BrokerBalancerControl {
-   private final BrokerBalancer balancer;
+public class ConnectionRouterControlImpl extends AbstractControl implements ConnectionRouterControl {
+   private final ConnectionRouter connectionRouter;
 
 
    private static CompositeType parameterType;
@@ -53,14 +53,14 @@ public class BrokerBalancerControlImpl extends AbstractControl implements Broker
    private static CompositeType targetType;
 
 
-   public BrokerBalancerControlImpl(final BrokerBalancer balancer, final StorageManager storageManager) throws NotCompliantMBeanException {
-      super(BrokerBalancerControl.class, storageManager);
-      this.balancer = balancer;
+   public ConnectionRouterControlImpl(final ConnectionRouter connectionRouter, final StorageManager storageManager) throws NotCompliantMBeanException {
+      super(ConnectionRouterControl.class, storageManager);
+      this.connectionRouter = connectionRouter;
    }
 
    @Override
    public CompositeData getTarget(String key) throws Exception {
-      TargetResult result = balancer.getTarget(key);
+      TargetResult result = connectionRouter.getTarget(key);
       if (TargetResult.Status.OK == result.getStatus()) {
          CompositeData connectorData = null;
          TransportConfiguration connector = result.getTarget().getConnector();
@@ -87,7 +87,7 @@ public class BrokerBalancerControlImpl extends AbstractControl implements Broker
 
    @Override
    public String getTargetAsJSON(String key) {
-      TargetResult result = balancer.getTarget(key);
+      TargetResult result = connectionRouter.getTarget(key);
       if (TargetResult.Status.OK == result.getStatus()) {
          TransportConfiguration connector = result.getTarget().getConnector();
 
@@ -109,32 +109,32 @@ public class BrokerBalancerControlImpl extends AbstractControl implements Broker
 
    @Override
    public void setLocalTargetFilter(String regExp) {
-      balancer.setLocalTargetFilter(regExp);
+      connectionRouter.setLocalTargetFilter(regExp);
    }
 
    @Override
    public String getLocalTargetFilter() {
-      return balancer.getLocalTargetFilter();
+      return connectionRouter.getLocalTargetFilter();
    }
 
    @Override
    public void setTargetKeyFilter(String regExp) {
-      balancer.getTargetKeyResolver().setKeyFilter(regExp);
+      connectionRouter.getTargetKeyResolver().setKeyFilter(regExp);
    }
 
    @Override
    public String getTargetKeyFilter() {
-      return balancer.getTargetKeyResolver().getKeyFilter();
+      return connectionRouter.getTargetKeyResolver().getKeyFilter();
    }
 
    @Override
    protected MBeanOperationInfo[] fillMBeanOperationInfo() {
-      return MBeanInfoHelper.getMBeanOperationsInfo(BrokerBalancerControl.class);
+      return MBeanInfoHelper.getMBeanOperationsInfo(ConnectionRouterControl.class);
    }
 
    @Override
    protected MBeanAttributeInfo[] fillMBeanAttributeInfo() {
-      return MBeanInfoHelper.getMBeanAttributesInfo(BrokerBalancerControl.class);
+      return MBeanInfoHelper.getMBeanAttributesInfo(ConnectionRouterControl.class);
    }
 
 
diff --git a/artemis-server/src/main/java/org/apache/activemq/artemis/core/protocol/core/impl/ActiveMQPacketHandler.java b/artemis-server/src/main/java/org/apache/activemq/artemis/core/protocol/core/impl/ActiveMQPacketHandler.java
index a2322a9..85fabe2 100644
--- a/artemis-server/src/main/java/org/apache/activemq/artemis/core/protocol/core/impl/ActiveMQPacketHandler.java
+++ b/artemis-server/src/main/java/org/apache/activemq/artemis/core/protocol/core/impl/ActiveMQPacketHandler.java
@@ -172,8 +172,8 @@ public class ActiveMQPacketHandler implements ChannelHandler {
          }
 
          final String validatedUser = server.validateUser(activeMQPrincipal == null ? request.getUsername() : activeMQPrincipal.getUserName(), activeMQPrincipal == null ? request.getPassword() : activeMQPrincipal.getPassword(), connection, protocolManager.getSecurityDomain());
-         if (connection.getTransportConnection().getRedirectTo() != null) {
-            protocolManager.getRedirectHandler().redirect(connection, request);
+         if (connection.getTransportConnection().getRouter() != null) {
+            protocolManager.getRoutingHandler().route(connection, request);
          }
 
          OperationContext sessionOperationContext = server.newOperationContext();
@@ -198,8 +198,8 @@ public class ActiveMQPacketHandler implements ChannelHandler {
          if (e.getType() == ActiveMQExceptionType.INCOMPATIBLE_CLIENT_SERVER_VERSIONS) {
             incompatibleVersion = true;
             logger.debug("Sending ActiveMQException after Incompatible client", e);
-         } else if (e.getType() == ActiveMQExceptionType.REDIRECTED) {
-            logger.debug("Sending ActiveMQException after redirected client", e);
+         } else if (e.getType() == ActiveMQExceptionType.ROUTING_EXCEPTION) {
+            logger.debug("Sending ActiveMQException after routing client", e);
          } else {
             ActiveMQServerLogger.LOGGER.failedToCreateSession(e);
          }
diff --git a/artemis-server/src/main/java/org/apache/activemq/artemis/core/protocol/core/impl/ActiveMQRedirectContext.java b/artemis-server/src/main/java/org/apache/activemq/artemis/core/protocol/core/impl/ActiveMQRoutingContext.java
similarity index 82%
rename from artemis-server/src/main/java/org/apache/activemq/artemis/core/protocol/core/impl/ActiveMQRedirectContext.java
rename to artemis-server/src/main/java/org/apache/activemq/artemis/core/protocol/core/impl/ActiveMQRoutingContext.java
index 575c9c0..2b2a423 100644
--- a/artemis-server/src/main/java/org/apache/activemq/artemis/core/protocol/core/impl/ActiveMQRedirectContext.java
+++ b/artemis-server/src/main/java/org/apache/activemq/artemis/core/protocol/core/impl/ActiveMQRoutingContext.java
@@ -19,10 +19,10 @@ package org.apache.activemq.artemis.core.protocol.core.impl;
 
 import org.apache.activemq.artemis.core.protocol.core.CoreRemotingConnection;
 import org.apache.activemq.artemis.core.protocol.core.impl.wireformat.CreateSessionMessage;
-import org.apache.activemq.artemis.core.server.balancing.RedirectContext;
+import org.apache.activemq.artemis.core.server.routing.RoutingContext;
 
-public class ActiveMQRedirectContext extends RedirectContext {
-   public ActiveMQRedirectContext(CoreRemotingConnection connection, CreateSessionMessage message) {
+public class ActiveMQRoutingContext extends RoutingContext {
+   public ActiveMQRoutingContext(CoreRemotingConnection connection, CreateSessionMessage message) {
       super(connection, connection.getClientID(), message.getUsername());
    }
 }
diff --git a/artemis-server/src/main/java/org/apache/activemq/artemis/core/protocol/core/impl/ActiveMQRedirectHandler.java b/artemis-server/src/main/java/org/apache/activemq/artemis/core/protocol/core/impl/ActiveMQRoutingHandler.java
similarity index 64%
rename from artemis-server/src/main/java/org/apache/activemq/artemis/core/protocol/core/impl/ActiveMQRedirectHandler.java
rename to artemis-server/src/main/java/org/apache/activemq/artemis/core/protocol/core/impl/ActiveMQRoutingHandler.java
index bf775ab..35713c1 100644
--- a/artemis-server/src/main/java/org/apache/activemq/artemis/core/protocol/core/impl/ActiveMQRedirectHandler.java
+++ b/artemis-server/src/main/java/org/apache/activemq/artemis/core/protocol/core/impl/ActiveMQRoutingHandler.java
@@ -22,36 +22,36 @@ import org.apache.activemq.artemis.core.protocol.core.CoreRemotingConnection;
 import org.apache.activemq.artemis.core.protocol.core.impl.wireformat.CreateSessionMessage;
 import org.apache.activemq.artemis.core.server.ActiveMQMessageBundle;
 import org.apache.activemq.artemis.core.server.ActiveMQServer;
-import org.apache.activemq.artemis.core.server.balancing.RedirectHandler;
+import org.apache.activemq.artemis.core.server.routing.RoutingHandler;
 
-public class ActiveMQRedirectHandler extends RedirectHandler<ActiveMQRedirectContext> {
+public class ActiveMQRoutingHandler extends RoutingHandler<ActiveMQRoutingContext> {
 
-   public ActiveMQRedirectHandler(ActiveMQServer server) {
+   public ActiveMQRoutingHandler(ActiveMQServer server) {
       super(server);
    }
 
-   public boolean redirect(CoreRemotingConnection connection, CreateSessionMessage message) throws Exception {
-      if (!connection.isVersionSupportRedirect()) {
+   public boolean route(CoreRemotingConnection connection, CreateSessionMessage message) throws Exception {
+      if (!connection.isVersionSupportRouting()) {
          throw ActiveMQMessageBundle.BUNDLE.incompatibleClientServer();
       }
 
-      return redirect(new ActiveMQRedirectContext(connection, message));
+      return route(new ActiveMQRoutingContext(connection, message));
    }
 
    @Override
-   public void cannotRedirect(ActiveMQRedirectContext context) throws Exception {
+   public void refuse(ActiveMQRoutingContext context) throws Exception {
       switch (context.getResult().getStatus()) {
          case REFUSED_UNAVAILABLE:
-            throw ActiveMQMessageBundle.BUNDLE.cannotRedirect();
+            throw ActiveMQMessageBundle.BUNDLE.connectionRouterNotReady(context.getRouter());
          case REFUSED_USE_ANOTHER:
-            throw ActiveMQMessageBundle.BUNDLE.balancerReject();
+            throw ActiveMQMessageBundle.BUNDLE.connectionRejected(context.getRouter());
       }
    }
 
    @Override
-   public void redirectTo(ActiveMQRedirectContext context) throws Exception {
+   public void redirect(ActiveMQRoutingContext context) throws Exception {
       context.getConnection().disconnect(DisconnectReason.REDIRECT, context.getTarget().getNodeID(), context.getTarget().getConnector());
 
-      throw ActiveMQMessageBundle.BUNDLE.redirectConnection(context.getTarget().getConnector());
+      throw ActiveMQMessageBundle.BUNDLE.connectionRedirected(context.getRouter(), context.getTarget().getConnector());
    }
 }
diff --git a/artemis-server/src/main/java/org/apache/activemq/artemis/core/protocol/core/impl/CoreProtocolManager.java b/artemis-server/src/main/java/org/apache/activemq/artemis/core/protocol/core/impl/CoreProtocolManager.java
index c56513b..054facc 100644
--- a/artemis-server/src/main/java/org/apache/activemq/artemis/core/protocol/core/impl/CoreProtocolManager.java
+++ b/artemis-server/src/main/java/org/apache/activemq/artemis/core/protocol/core/impl/CoreProtocolManager.java
@@ -73,7 +73,7 @@ import org.apache.activemq.artemis.spi.core.remoting.Acceptor;
 import org.apache.activemq.artemis.spi.core.remoting.Connection;
 import org.jboss.logging.Logger;
 
-public class CoreProtocolManager implements ProtocolManager<Interceptor, ActiveMQRedirectHandler> {
+public class CoreProtocolManager implements ProtocolManager<Interceptor, ActiveMQRoutingHandler> {
 
    private static final Logger logger = Logger.getLogger(CoreProtocolManager.class);
 
@@ -91,7 +91,7 @@ public class CoreProtocolManager implements ProtocolManager<Interceptor, ActiveM
 
    private String securityDomain;
 
-   private final ActiveMQRedirectHandler redirectHandler;
+   private final ActiveMQRoutingHandler routingHandler;
 
    public CoreProtocolManager(final CoreProtocolManagerFactory factory,
                               final ActiveMQServer server,
@@ -105,7 +105,7 @@ public class CoreProtocolManager implements ProtocolManager<Interceptor, ActiveM
 
       this.outgoingInterceptors = outgoingInterceptors;
 
-      this.redirectHandler = new ActiveMQRedirectHandler(server);
+      this.routingHandler = new ActiveMQRoutingHandler(server);
    }
 
    @Override
@@ -239,8 +239,8 @@ public class CoreProtocolManager implements ProtocolManager<Interceptor, ActiveM
    }
 
    @Override
-   public ActiveMQRedirectHandler getRedirectHandler() {
-      return redirectHandler;
+   public ActiveMQRoutingHandler getRoutingHandler() {
+      return routingHandler;
    }
 
    private boolean isArtemis(ActiveMQBuffer buffer) {
diff --git a/artemis-server/src/main/java/org/apache/activemq/artemis/core/remoting/impl/netty/NettyAcceptor.java b/artemis-server/src/main/java/org/apache/activemq/artemis/core/remoting/impl/netty/NettyAcceptor.java
index c3d62af..9f9c2c9 100644
--- a/artemis-server/src/main/java/org/apache/activemq/artemis/core/remoting/impl/netty/NettyAcceptor.java
+++ b/artemis-server/src/main/java/org/apache/activemq/artemis/core/remoting/impl/netty/NettyAcceptor.java
@@ -233,7 +233,7 @@ public class NettyAcceptor extends AbstractAcceptor {
 
    private final boolean autoStart;
 
-   private final String redirectTo;
+   private final String router;
 
    final AtomicBoolean warningPrinted = new AtomicBoolean(false);
 
@@ -375,7 +375,7 @@ public class NettyAcceptor extends AbstractAcceptor {
 
       autoStart = ConfigurationHelper.getBooleanProperty(TransportConstants.AUTO_START, TransportConstants.DEFAULT_AUTO_START, configuration);
 
-      redirectTo = ConfigurationHelper.getStringProperty(TransportConstants.REDIRECT_TO, TransportConstants.DEFAULT_REDIRECT_TO, configuration);
+      router = ConfigurationHelper.getStringProperty(TransportConstants.ROUTER, TransportConstants.DEFAULT_ROUTER, configuration);
    }
 
    private Object loadSSLContext() {
@@ -911,7 +911,7 @@ public class NettyAcceptor extends AbstractAcceptor {
             super.channelActive(ctx);
             Listener connectionListener = new Listener();
 
-            NettyServerConnection nc = new NettyServerConnection(configuration, ctx.channel(), connectionListener, !httpEnabled && batchDelay > 0, directDeliver, redirectTo);
+            NettyServerConnection nc = new NettyServerConnection(configuration, ctx.channel(), connectionListener, !httpEnabled && batchDelay > 0, directDeliver, router);
 
             connectionListener.connectionCreated(NettyAcceptor.this, nc, protocolHandler.getProtocol(protocol));
 
diff --git a/artemis-server/src/main/java/org/apache/activemq/artemis/core/remoting/impl/netty/NettyServerConnection.java b/artemis-server/src/main/java/org/apache/activemq/artemis/core/remoting/impl/netty/NettyServerConnection.java
index 7fadb18..93c732e 100644
--- a/artemis-server/src/main/java/org/apache/activemq/artemis/core/remoting/impl/netty/NettyServerConnection.java
+++ b/artemis-server/src/main/java/org/apache/activemq/artemis/core/remoting/impl/netty/NettyServerConnection.java
@@ -25,17 +25,17 @@ public class NettyServerConnection extends NettyConnection {
 
    private String sniHostname;
 
-   private final String redirectTo;
+   private final String router;
 
    public NettyServerConnection(Map<String, Object> configuration,
                                 Channel channel,
                                 ServerConnectionLifeCycleListener listener,
                                 boolean batchingEnabled,
                                 boolean directDeliver,
-                                String redirectTo) {
+                                String router) {
       super(configuration, channel, listener, batchingEnabled, directDeliver);
 
-      this.redirectTo = redirectTo;
+      this.router = router;
    }
 
    @Override
@@ -48,7 +48,7 @@ public class NettyServerConnection extends NettyConnection {
    }
 
    @Override
-   public String getRedirectTo() {
-      return redirectTo;
+   public String getRouter() {
+      return router;
    }
 }
diff --git a/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/ActiveMQMessageBundle.java b/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/ActiveMQMessageBundle.java
index 454c44c..da15be5 100644
--- a/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/ActiveMQMessageBundle.java
+++ b/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/ActiveMQMessageBundle.java
@@ -39,7 +39,7 @@ import org.apache.activemq.artemis.api.core.ActiveMQInvalidTransientQueueUseExce
 import org.apache.activemq.artemis.api.core.ActiveMQNonExistentQueueException;
 import org.apache.activemq.artemis.api.core.ActiveMQQueueExistsException;
 import org.apache.activemq.artemis.api.core.ActiveMQQueueMaxConsumerLimitReached;
-import org.apache.activemq.artemis.api.core.ActiveMQRedirectedException;
+import org.apache.activemq.artemis.api.core.ActiveMQRoutingException;
 import org.apache.activemq.artemis.api.core.ActiveMQRemoteDisconnectException;
 import org.apache.activemq.artemis.api.core.ActiveMQReplicationTimeooutException;
 import org.apache.activemq.artemis.api.core.ActiveMQSecurityException;
@@ -508,18 +508,18 @@ public interface ActiveMQMessageBundle {
    @Message(id = 229235, value = "Incompatible binding with name {0} already exists: {1}", format = Message.Format.MESSAGE_FORMAT)
    ActiveMQIllegalStateException bindingAlreadyExists(String name, String binding);
 
-   @Message(id = 229236, value = "Invalid target key {0}", format = Message.Format.MESSAGE_FORMAT)
-   IllegalArgumentException invalidTargetKey(String val);
+   @Message(id = 229236, value = "Invalid connection router key {0}", format = Message.Format.MESSAGE_FORMAT)
+   IllegalArgumentException invalidConnectionRouterKey(String val);
 
-   @Message(id = 229237, value = "Connection redirected to {0}", format = Message.Format.MESSAGE_FORMAT)
-   ActiveMQRedirectedException redirectConnection(TransportConfiguration connector);
+   @Message(id = 229237, value = "Connection router {0} redirected the connection to {1}", format = Message.Format.MESSAGE_FORMAT)
+   ActiveMQRoutingException connectionRedirected(String connectionRouter, TransportConfiguration connector);
 
-   @Message(id = 229238, value = "No target to redirect the connection")
-   ActiveMQRedirectedException cannotRedirect();
+   @Message(id = 229238, value = "Connection router {0} not ready", format = Message.Format.MESSAGE_FORMAT)
+   ActiveMQRoutingException connectionRouterNotReady(String connectionRouter);
 
    @Message(id = 229239, value = "There is no retention configured. In order to use the replay method you must specify journal-retention-directory element on the broker.xml")
    IllegalArgumentException noRetention();
 
-   @Message(id = 229240, value = "Balancer rejected the connection")
-   ActiveMQRemoteDisconnectException balancerReject();
+   @Message(id = 229240, value = "Connection router {0} rejected the connection", format = Message.Format.MESSAGE_FORMAT)
+   ActiveMQRemoteDisconnectException connectionRejected(String connectionRouter);
 }
diff --git a/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/ActiveMQServer.java b/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/ActiveMQServer.java
index 2c216ba..5a88dd0 100644
--- a/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/ActiveMQServer.java
+++ b/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/ActiveMQServer.java
@@ -68,7 +68,7 @@ import org.apache.activemq.artemis.core.server.plugin.ActiveMQServerMessagePlugi
 import org.apache.activemq.artemis.core.server.plugin.ActiveMQServerQueuePlugin;
 import org.apache.activemq.artemis.core.server.plugin.ActiveMQServerResourcePlugin;
 import org.apache.activemq.artemis.core.server.plugin.ActiveMQServerSessionPlugin;
-import org.apache.activemq.artemis.core.server.balancing.BrokerBalancerManager;
+import org.apache.activemq.artemis.core.server.routing.ConnectionRouterManager;
 import org.apache.activemq.artemis.core.server.reload.ReloadManager;
 import org.apache.activemq.artemis.core.settings.HierarchicalRepository;
 import org.apache.activemq.artemis.core.settings.impl.AddressSettings;
@@ -958,7 +958,7 @@ public interface ActiveMQServer extends ServiceComponent {
 
    void reloadConfigurationFile() throws Exception;
 
-   BrokerBalancerManager getBalancerManager();
+   ConnectionRouterManager getConnectionRouterManager();
 
    String validateUser(String username, String password, RemotingConnection connection, String securityDomain) throws Exception;
 
diff --git a/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/ActiveMQServerLogger.java b/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/ActiveMQServerLogger.java
index 87f0827..2f0180e 100644
--- a/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/ActiveMQServerLogger.java
+++ b/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/ActiveMQServerLogger.java
@@ -40,7 +40,7 @@ import org.apache.activemq.artemis.core.persistence.OperationContext;
 import org.apache.activemq.artemis.core.protocol.core.Packet;
 import org.apache.activemq.artemis.core.protocol.core.impl.wireformat.BackupReplicationStartFailedMessage;
 import org.apache.activemq.artemis.core.remoting.impl.netty.TransportConstants;
-import org.apache.activemq.artemis.core.server.balancing.targets.Target;
+import org.apache.activemq.artemis.core.server.routing.targets.Target;
 import org.apache.activemq.artemis.core.server.cluster.Bridge;
 import org.apache.activemq.artemis.core.server.cluster.impl.BridgeImpl;
 import org.apache.activemq.artemis.core.server.cluster.impl.ClusterConnectionImpl;
@@ -454,12 +454,12 @@ public interface ActiveMQServerLogger extends BasicLogger {
    void requestedQuorumVotes(int vote);
 
    @LogMessage(level = Logger.Level.INFO)
-   @Message(id = 221085, value = "Redirect {0} to {1}", format = Message.Format.MESSAGE_FORMAT)
-   void redirectClientConnection(Connection connection, Target target);
+   @Message(id = 221085, value = "Route {0} to {1}", format = Message.Format.MESSAGE_FORMAT)
+   void routeClientConnection(Connection connection, Target target);
 
    @LogMessage(level = Logger.Level.INFO)
-   @Message(id = 221086, value = "Cannot redirect {0}", format = Message.Format.MESSAGE_FORMAT)
-   void cannotRedirectClientConnection(Connection connection);
+   @Message(id = 221086, value = "Cannot route {0}", format = Message.Format.MESSAGE_FORMAT)
+   void cannotRouteClientConnection(Connection connection);
 
    @LogMessage(level = Logger.Level.WARN)
    @Message(id = 222000, value = "ActiveMQServer is being finalized and has not been stopped. Please remember to stop the server before letting it go out of scope",
@@ -2189,8 +2189,8 @@ public interface ActiveMQServerLogger extends BasicLogger {
    void pageStoreStop(SimpleString storeName, long addressSize, long maxSize, long globalMaxSize);
 
    @LogMessage(level = Logger.Level.WARN)
-   @Message(id = 224109, value = "BrokerBalancer {0} not found", format = Message.Format.MESSAGE_FORMAT)
-   void brokerBalancerNotFound(String name);
+   @Message(id = 224109, value = "ConnectionRouter {0} not found", format = Message.Format.MESSAGE_FORMAT)
+   void connectionRouterNotFound(String name);
 
    @LogMessage(level = Logger.Level.WARN)
    @Message(id = 224110, value = "Configuration 'whitelist' is deprecated, please use the 'allowlist' configuration", format = Message.Format.MESSAGE_FORMAT)
diff --git a/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/impl/ActiveMQServerImpl.java b/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/impl/ActiveMQServerImpl.java
index daad672..f76d0b2 100644
--- a/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/impl/ActiveMQServerImpl.java
+++ b/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/impl/ActiveMQServerImpl.java
@@ -143,7 +143,6 @@ import org.apache.activemq.artemis.core.server.ServerConsumer;
 import org.apache.activemq.artemis.core.server.ServerSession;
 import org.apache.activemq.artemis.core.server.ServiceComponent;
 import org.apache.activemq.artemis.core.server.ServiceRegistry;
-import org.apache.activemq.artemis.core.server.balancing.BrokerBalancerManager;
 import org.apache.activemq.artemis.core.server.cluster.BackupManager;
 import org.apache.activemq.artemis.core.server.cluster.Bridge;
 import org.apache.activemq.artemis.core.server.cluster.ClusterConnection;
@@ -174,6 +173,7 @@ import org.apache.activemq.artemis.core.server.plugin.ActiveMQServerMessagePlugi
 import org.apache.activemq.artemis.core.server.plugin.ActiveMQServerQueuePlugin;
 import org.apache.activemq.artemis.core.server.plugin.ActiveMQServerResourcePlugin;
 import org.apache.activemq.artemis.core.server.plugin.ActiveMQServerSessionPlugin;
+import org.apache.activemq.artemis.core.server.routing.ConnectionRouterManager;
 import org.apache.activemq.artemis.core.server.reload.ReloadManager;
 import org.apache.activemq.artemis.core.server.reload.ReloadManagerImpl;
 import org.apache.activemq.artemis.core.server.replay.ReplayManager;
@@ -294,7 +294,7 @@ public class ActiveMQServerImpl implements ActiveMQServer {
 
    private volatile RemotingService remotingService;
 
-   private volatile BrokerBalancerManager balancerManager;
+   private volatile ConnectionRouterManager connectionRouterManager;
 
    private final List<ProtocolManagerFactory> protocolManagerFactories = new ArrayList<>();
 
@@ -1236,7 +1236,7 @@ public class ActiveMQServerImpl implements ActiveMQServer {
             }
          }
 
-         stopComponent(balancerManager);
+         stopComponent(connectionRouterManager);
 
          stopComponent(connectorsService);
 
@@ -1677,8 +1677,8 @@ public class ActiveMQServerImpl implements ActiveMQServer {
    }
 
    @Override
-   public BrokerBalancerManager getBalancerManager() {
-      return balancerManager;
+   public ConnectionRouterManager getConnectionRouterManager() {
+      return connectionRouterManager;
    }
 
    public BackupManager getBackupManager() {
@@ -3165,9 +3165,9 @@ public class ActiveMQServerImpl implements ActiveMQServer {
 
       federationManager.deploy();
 
-      balancerManager = new BrokerBalancerManager(configuration, this, scheduledPool);
+      connectionRouterManager = new ConnectionRouterManager(configuration, this, scheduledPool);
 
-      balancerManager.deploy();
+      connectionRouterManager.deploy();
 
       remotingService = new RemotingServiceImpl(clusterManager, configuration, this, managementService, scheduledPool, protocolManagerFactories, executorFactory.getExecutor(), serviceRegistry);
 
@@ -3332,7 +3332,7 @@ public class ActiveMQServerImpl implements ActiveMQServer {
             federationManager.start();
          }
 
-         balancerManager.start();
+         connectionRouterManager.start();
 
          startProtocolServices();
 
diff --git a/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/management/ManagementService.java b/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/management/ManagementService.java
index ac9b492..649a285 100644
--- a/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/management/ManagementService.java
+++ b/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/management/ManagementService.java
@@ -43,7 +43,7 @@ import org.apache.activemq.artemis.core.server.ActiveMQServer;
 import org.apache.activemq.artemis.core.server.Divert;
 import org.apache.activemq.artemis.core.server.Queue;
 import org.apache.activemq.artemis.core.server.QueueFactory;
-import org.apache.activemq.artemis.core.server.balancing.BrokerBalancer;
+import org.apache.activemq.artemis.core.server.routing.ConnectionRouter;
 import org.apache.activemq.artemis.core.server.cluster.Bridge;
 import org.apache.activemq.artemis.core.server.cluster.BroadcastGroup;
 import org.apache.activemq.artemis.core.server.cluster.ClusterConnection;
@@ -127,9 +127,9 @@ public interface ManagementService extends NotificationService, ActiveMQComponen
 
    void unregisterCluster(String name) throws Exception;
 
-   void registerBrokerBalancer(BrokerBalancer balancer) throws Exception;
+   void registerConnectionRouter(ConnectionRouter router) throws Exception;
 
-   void unregisterBrokerBalancer(String name) throws Exception;
+   void unregisterConnectionRouter(String name) throws Exception;
 
    Object getResource(String resourceName);
 
diff --git a/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/management/impl/ManagementServiceImpl.java b/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/management/impl/ManagementServiceImpl.java
index d99ac0d..903dc40 100644
--- a/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/management/impl/ManagementServiceImpl.java
+++ b/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/management/impl/ManagementServiceImpl.java
@@ -48,7 +48,7 @@ import org.apache.activemq.artemis.api.core.management.ActiveMQServerControl;
 import org.apache.activemq.artemis.api.core.management.AddressControl;
 import org.apache.activemq.artemis.api.core.management.BaseBroadcastGroupControl;
 import org.apache.activemq.artemis.api.core.management.BridgeControl;
-import org.apache.activemq.artemis.api.core.management.BrokerBalancerControl;
+import org.apache.activemq.artemis.api.core.management.ConnectionRouterControl;
 import org.apache.activemq.artemis.api.core.management.ClusterConnectionControl;
 import org.apache.activemq.artemis.api.core.management.DivertControl;
 import org.apache.activemq.artemis.api.core.management.ManagementHelper;
@@ -63,7 +63,7 @@ import org.apache.activemq.artemis.core.management.impl.AddressControlImpl;
 import org.apache.activemq.artemis.core.management.impl.BaseBroadcastGroupControlImpl;
 import org.apache.activemq.artemis.core.management.impl.BridgeControlImpl;
 import org.apache.activemq.artemis.core.management.impl.BroadcastGroupControlImpl;
-import org.apache.activemq.artemis.core.management.impl.BrokerBalancerControlImpl;
+import org.apache.activemq.artemis.core.management.impl.ConnectionRouterControlImpl;
 import org.apache.activemq.artemis.core.management.impl.ClusterConnectionControlImpl;
 import org.apache.activemq.artemis.core.management.impl.DivertControlImpl;
 import org.apache.activemq.artemis.core.management.impl.JGroupsChannelBroadcastGroupControlImpl;
@@ -85,7 +85,7 @@ import org.apache.activemq.artemis.core.server.ActiveMQServerLogger;
 import org.apache.activemq.artemis.core.server.Divert;
 import org.apache.activemq.artemis.core.server.Queue;
 import org.apache.activemq.artemis.core.server.QueueFactory;
-import org.apache.activemq.artemis.core.server.balancing.BrokerBalancer;
+import org.apache.activemq.artemis.core.server.routing.ConnectionRouter;
 import org.apache.activemq.artemis.core.server.cluster.Bridge;
 import org.apache.activemq.artemis.core.server.cluster.BroadcastGroup;
 import org.apache.activemq.artemis.core.server.cluster.ClusterConnection;
@@ -486,22 +486,22 @@ public class ManagementServiceImpl implements ManagementService {
    }
 
    @Override
-   public synchronized void registerBrokerBalancer(final BrokerBalancer balancer) throws Exception {
-      ObjectName objectName = objectNameBuilder.getBrokerBalancerObjectName(balancer.getName());
-      BrokerBalancerControl brokerBalancerControl = new BrokerBalancerControlImpl(balancer, storageManager);
-      registerInJMX(objectName, brokerBalancerControl);
-      registerInRegistry(ResourceNames.BROKER_BALANCER + balancer.getName(), brokerBalancerControl);
+   public synchronized void registerConnectionRouter(final ConnectionRouter router) throws Exception {
+      ObjectName objectName = objectNameBuilder.getConnectionRouterObjectName(router.getName());
+      ConnectionRouterControl connectionRouterControl = new ConnectionRouterControlImpl(router, storageManager);
+      registerInJMX(objectName, connectionRouterControl);
+      registerInRegistry(ResourceNames.CONNECTION_ROUTER + router.getName(), connectionRouterControl);
 
       if (logger.isDebugEnabled()) {
-         logger.debug("registered broker balancer " + objectName);
+         logger.debug("registered connection router " + objectName);
       }
    }
 
    @Override
-   public synchronized void unregisterBrokerBalancer(final String name) throws Exception {
-      ObjectName objectName = objectNameBuilder.getBrokerBalancerObjectName(name);
+   public synchronized void unregisterConnectionRouter(final String name) throws Exception {
+      ObjectName objectName = objectNameBuilder.getConnectionRouterObjectName(name);
       unregisterFromJMX(objectName);
-      unregisterFromRegistry(ResourceNames.BROKER_BALANCER + name);
+      unregisterFromRegistry(ResourceNames.CONNECTION_ROUTER + name);
    }
 
    @Override
diff --git a/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/balancing/BrokerBalancer.java b/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/routing/ConnectionRouter.java
similarity index 68%
rename from artemis-server/src/main/java/org/apache/activemq/artemis/core/server/balancing/BrokerBalancer.java
rename to artemis-server/src/main/java/org/apache/activemq/artemis/core/server/routing/ConnectionRouter.java
index 55f8c57..a51dd42 100644
--- a/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/balancing/BrokerBalancer.java
+++ b/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/routing/ConnectionRouter.java
@@ -15,35 +15,33 @@
  * limitations under the License.
  */
 
-package org.apache.activemq.artemis.core.server.balancing;
+package org.apache.activemq.artemis.core.server.routing;
 
 import org.apache.activemq.artemis.api.config.ActiveMQDefaultConfiguration;
 import org.apache.activemq.artemis.core.server.ActiveMQComponent;
-import org.apache.activemq.artemis.core.server.balancing.caches.Cache;
-import org.apache.activemq.artemis.core.server.balancing.policies.Policy;
-import org.apache.activemq.artemis.core.server.balancing.pools.Pool;
-import org.apache.activemq.artemis.core.server.balancing.targets.Target;
-import org.apache.activemq.artemis.core.server.balancing.targets.TargetKey;
-import org.apache.activemq.artemis.core.server.balancing.targets.TargetKeyResolver;
-import org.apache.activemq.artemis.core.server.balancing.targets.TargetResult;
-import org.apache.activemq.artemis.core.server.balancing.transformer.KeyTransformer;
+import org.apache.activemq.artemis.core.server.routing.caches.Cache;
+import org.apache.activemq.artemis.core.server.routing.policies.Policy;
+import org.apache.activemq.artemis.core.server.routing.pools.Pool;
+import org.apache.activemq.artemis.core.server.routing.targets.Target;
+import org.apache.activemq.artemis.core.server.routing.targets.TargetResult;
+import org.apache.activemq.artemis.core.server.routing.transformer.KeyTransformer;
 import org.apache.activemq.artemis.spi.core.remoting.Connection;
 import org.jboss.logging.Logger;
 
 import java.util.List;
 import java.util.regex.Pattern;
 
-public class BrokerBalancer implements ActiveMQComponent {
-   private static final Logger logger = Logger.getLogger(BrokerBalancer.class);
+public class ConnectionRouter implements ActiveMQComponent {
+   private static final Logger logger = Logger.getLogger(ConnectionRouter.class);
 
 
-   public static final String CLIENT_ID_PREFIX = ActiveMQDefaultConfiguration.DEFAULT_INTERNAL_NAMING_PREFIX + "balancer.client.";
+   public static final String CLIENT_ID_PREFIX = ActiveMQDefaultConfiguration.DEFAULT_INTERNAL_NAMING_PREFIX + "router.client.";
 
    private final String name;
 
-   private final TargetKey targetKey;
+   private final KeyType keyType;
 
-   private final TargetKeyResolver targetKeyResolver;
+   private final KeyResolver keyResolver;
 
    private final TargetResult localTarget;
 
@@ -63,8 +61,8 @@ public class BrokerBalancer implements ActiveMQComponent {
       return name;
    }
 
-   public TargetKey getTargetKey() {
-      return targetKey;
+   public KeyType getTargetKey() {
+      return keyType;
    }
 
    public Target getLocalTarget() {
@@ -93,22 +91,22 @@ public class BrokerBalancer implements ActiveMQComponent {
    }
 
 
-   public BrokerBalancer(final String name,
-                         final TargetKey targetKey,
-                         final String targetKeyFilter,
-                         final Target localTarget,
-                         final String localTargetFilter,
-                         final Cache cache,
-                         final Pool pool,
-                         final Policy policy,
-                         KeyTransformer transformer) {
+   public ConnectionRouter(final String name,
+                           final KeyType keyType,
+                           final String targetKeyFilter,
+                           final Target localTarget,
+                           final String localTargetFilter,
+                           final Cache cache,
+                           final Pool pool,
+                           final Policy policy,
+                           KeyTransformer transformer) {
       this.name = name;
 
-      this.targetKey = targetKey;
+      this.keyType = keyType;
 
       this.transformer = transformer;
 
-      this.targetKeyResolver = new TargetKeyResolver(targetKey, targetKeyFilter);
+      this.keyResolver = new KeyResolver(keyType, targetKeyFilter);
 
       this.localTarget = new TargetResult(localTarget);
 
@@ -148,22 +146,22 @@ public class BrokerBalancer implements ActiveMQComponent {
    }
 
    public TargetResult getTarget(Connection connection, String clientID, String username) {
-      if (clientID != null && clientID.startsWith(BrokerBalancer.CLIENT_ID_PREFIX)) {
+      if (clientID != null && clientID.startsWith(ConnectionRouter.CLIENT_ID_PREFIX)) {
          if (logger.isDebugEnabled()) {
-            logger.debug("The clientID [" + clientID + "] starts with BrokerBalancer.CLIENT_ID_PREFIX");
+            logger.debug("The clientID [" + clientID + "] starts with ConnectionRouter.CLIENT_ID_PREFIX");
          }
 
          return localTarget;
       }
 
-      return getTarget(targetKeyResolver.resolve(connection, clientID, username));
+      return getTarget(keyResolver.resolve(connection, clientID, username));
    }
 
    public TargetResult getTarget(String key) {
 
       if (this.localTargetFilter != null && this.localTargetFilter.matcher(transform(key)).matches()) {
          if (logger.isDebugEnabled()) {
-            logger.debug("The " + targetKey + "[" + key + "] matches the localTargetFilter " + localTargetFilter.pattern());
+            logger.debug("The " + keyType + "[" + key + "] matches the localTargetFilter " + localTargetFilter.pattern());
          }
 
          return localTarget;
@@ -179,21 +177,21 @@ public class BrokerBalancer implements ActiveMQComponent {
          String nodeId = cache.get(key);
 
          if (logger.isDebugEnabled()) {
-            logger.debug("The cache returns target [" + nodeId + "] for " + targetKey + "[" + key + "]");
+            logger.debug("The cache returns target [" + nodeId + "] for " + keyType + "[" + key + "]");
          }
 
          if (nodeId != null) {
             Target target = pool.getReadyTarget(nodeId);
             if (target != null) {
                if (logger.isDebugEnabled()) {
-                  logger.debug("The target [" + nodeId + "] is ready for " + targetKey + "[" + key + "]");
+                  logger.debug("The target [" + nodeId + "] is ready for " + keyType + "[" + key + "]");
                }
 
                return new TargetResult(target);
             }
 
             if (logger.isDebugEnabled()) {
-               logger.debug("The target [" + nodeId + "] is not ready for " + targetKey + "[" + key + "]");
+               logger.debug("The target [" + nodeId + "] is not ready for " + keyType + "[" + key + "]");
             }
          }
       }
@@ -203,14 +201,14 @@ public class BrokerBalancer implements ActiveMQComponent {
       Target target = policy.selectTarget(targets, key);
 
       if (logger.isDebugEnabled()) {
-         logger.debug("The policy selects [" + target + "] from " + targets + " for " + targetKey + "[" + key + "]");
+         logger.debug("The policy selects [" + target + "] from " + targets + " for " + keyType + "[" + key + "]");
       }
 
       if (target != null) {
          result = new TargetResult(target);
          if (cache != null) {
             if (logger.isDebugEnabled()) {
-               logger.debug("Caching " + targetKey + "[" + key + "] for [" + target + "]");
+               logger.debug("Caching " + keyType + "[" + key + "] for [" + target + "]");
             }
             cache.put(key, target.getNodeID());
          }
@@ -227,8 +225,8 @@ public class BrokerBalancer implements ActiveMQComponent {
       }
    }
 
-   public TargetKeyResolver getTargetKeyResolver() {
-      return targetKeyResolver;
+   public KeyResolver getTargetKeyResolver() {
+      return keyResolver;
    }
 
    private String transform(String key) {
diff --git a/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/balancing/BrokerBalancerManager.java b/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/routing/ConnectionRouterManager.java
similarity index 67%
rename from artemis-server/src/main/java/org/apache/activemq/artemis/core/server/balancing/BrokerBalancerManager.java
rename to artemis-server/src/main/java/org/apache/activemq/artemis/core/server/routing/ConnectionRouterManager.java
index 72b99d1..67d6d55 100644
--- a/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/balancing/BrokerBalancerManager.java
+++ b/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/routing/ConnectionRouterManager.java
@@ -15,36 +15,36 @@
  * limitations under the License.
  */
 
-package org.apache.activemq.artemis.core.server.balancing;
+package org.apache.activemq.artemis.core.server.routing;
 
 import org.apache.activemq.artemis.api.core.DiscoveryGroupConfiguration;
 import org.apache.activemq.artemis.api.core.TransportConfiguration;
 import org.apache.activemq.artemis.core.cluster.DiscoveryGroup;
-import org.apache.activemq.artemis.core.config.balancing.BrokerBalancerConfiguration;
-import org.apache.activemq.artemis.core.config.balancing.CacheConfiguration;
-import org.apache.activemq.artemis.core.config.balancing.NamedPropertyConfiguration;
-import org.apache.activemq.artemis.core.config.balancing.PoolConfiguration;
+import org.apache.activemq.artemis.core.config.routing.ConnectionRouterConfiguration;
+import org.apache.activemq.artemis.core.config.routing.CacheConfiguration;
+import org.apache.activemq.artemis.core.config.routing.NamedPropertyConfiguration;
+import org.apache.activemq.artemis.core.config.routing.PoolConfiguration;
 import org.apache.activemq.artemis.core.config.Configuration;
 import org.apache.activemq.artemis.core.server.ActiveMQComponent;
 import org.apache.activemq.artemis.core.server.ActiveMQServer;
-import org.apache.activemq.artemis.core.server.balancing.caches.Cache;
-import org.apache.activemq.artemis.core.server.balancing.caches.LocalCache;
-import org.apache.activemq.artemis.core.server.balancing.policies.Policy;
-import org.apache.activemq.artemis.core.server.balancing.policies.PolicyFactory;
-import org.apache.activemq.artemis.core.server.balancing.policies.PolicyFactoryResolver;
-import org.apache.activemq.artemis.core.server.balancing.pools.ClusterPool;
-import org.apache.activemq.artemis.core.server.balancing.pools.DiscoveryGroupService;
-import org.apache.activemq.artemis.core.server.balancing.pools.DiscoveryPool;
-import org.apache.activemq.artemis.core.server.balancing.pools.DiscoveryService;
-import org.apache.activemq.artemis.core.server.balancing.pools.Pool;
-import org.apache.activemq.artemis.core.server.balancing.pools.StaticPool;
-import org.apache.activemq.artemis.core.server.balancing.targets.ActiveMQTargetFactory;
-import org.apache.activemq.artemis.core.server.balancing.targets.LocalTarget;
-import org.apache.activemq.artemis.core.server.balancing.targets.Target;
-import org.apache.activemq.artemis.core.server.balancing.targets.TargetFactory;
-import org.apache.activemq.artemis.core.server.balancing.transformer.KeyTransformer;
-import org.apache.activemq.artemis.core.server.balancing.transformer.TransformerFactory;
-import org.apache.activemq.artemis.core.server.balancing.transformer.TransformerFactoryResolver;
+import org.apache.activemq.artemis.core.server.routing.caches.Cache;
+import org.apache.activemq.artemis.core.server.routing.caches.LocalCache;
+import org.apache.activemq.artemis.core.server.routing.policies.Policy;
+import org.apache.activemq.artemis.core.server.routing.policies.PolicyFactory;
+import org.apache.activemq.artemis.core.server.routing.policies.PolicyFactoryResolver;
+import org.apache.activemq.artemis.core.server.routing.pools.ClusterPool;
+import org.apache.activemq.artemis.core.server.routing.pools.DiscoveryGroupService;
+import org.apache.activemq.artemis.core.server.routing.pools.DiscoveryPool;
+import org.apache.activemq.artemis.core.server.routing.pools.DiscoveryService;
+import org.apache.activemq.artemis.core.server.routing.pools.Pool;
+import org.apache.activemq.artemis.core.server.routing.pools.StaticPool;
+import org.apache.activemq.artemis.core.server.routing.targets.ActiveMQTargetFactory;
+import org.apache.activemq.artemis.core.server.routing.targets.LocalTarget;
+import org.apache.activemq.artemis.core.server.routing.targets.Target;
+import org.apache.activemq.artemis.core.server.routing.targets.TargetFactory;
+import org.apache.activemq.artemis.core.server.routing.transformer.KeyTransformer;
+import org.apache.activemq.artemis.core.server.routing.transformer.TransformerFactory;
+import org.apache.activemq.artemis.core.server.routing.transformer.TransformerFactoryResolver;
 import org.apache.activemq.artemis.core.server.cluster.ClusterConnection;
 import org.jboss.logging.Logger;
 
@@ -54,8 +54,8 @@ import java.util.List;
 import java.util.Map;
 import java.util.concurrent.ScheduledExecutorService;
 
-public final class BrokerBalancerManager implements ActiveMQComponent {
-   private static final Logger logger = Logger.getLogger(BrokerBalancerManager.class);
+public final class ConnectionRouterManager implements ActiveMQComponent {
+   private static final Logger logger = Logger.getLogger(ConnectionRouterManager.class);
 
    public static final String CACHE_ID_PREFIX = "$.BC.";
 
@@ -68,7 +68,7 @@ public final class BrokerBalancerManager implements ActiveMQComponent {
 
    private volatile boolean started = false;
 
-   private Map<String, BrokerBalancer> balancerControllers = new HashMap<>();
+   private Map<String, ConnectionRouter> connectionRouters = new HashMap<>();
 
 
    @Override
@@ -77,21 +77,21 @@ public final class BrokerBalancerManager implements ActiveMQComponent {
    }
 
 
-   public BrokerBalancerManager(final Configuration config, final ActiveMQServer server, ScheduledExecutorService scheduledExecutor) {
+   public ConnectionRouterManager(final Configuration config, final ActiveMQServer server, ScheduledExecutorService scheduledExecutor) {
       this.config = config;
       this.server = server;
       this.scheduledExecutor = scheduledExecutor;
    }
 
    public void deploy() throws Exception {
-      for (BrokerBalancerConfiguration balancerConfig : config.getBalancerConfigurations()) {
-         deployBrokerBalancer(balancerConfig);
+      for (ConnectionRouterConfiguration connectionRouterConfig : config.getConnectionRouters()) {
+         deployConnectionRouter(connectionRouterConfig);
       }
    }
 
-   public void deployBrokerBalancer(BrokerBalancerConfiguration config) throws Exception {
+   public void deployConnectionRouter(ConnectionRouterConfiguration config) throws Exception {
       if (logger.isDebugEnabled()) {
-         logger.debugf("Deploying BrokerBalancer " + config.getName());
+         logger.debugf("Deploying ConnectionRouter " + config.getName());
       }
 
       Target localTarget = new LocalTarget(null, server);
@@ -121,12 +121,12 @@ public final class BrokerBalancerManager implements ActiveMQComponent {
          transformer = deployTransformer(transformerConfiguration);
       }
 
-      BrokerBalancer balancer = new BrokerBalancer(config.getName(), config.getTargetKey(), config.getTargetKeyFilter(),
-                                                   localTarget, config.getLocalTargetFilter(), cache, pool, policy, transformer);
+      ConnectionRouter connectionRouter = new ConnectionRouter(config.getName(), config.getKeyType(),
+         config.getKeyFilter(), localTarget, config.getLocalTargetFilter(), cache, pool, policy, transformer);
 
-      balancerControllers.put(balancer.getName(), balancer);
+      connectionRouters.put(connectionRouter.getName(), connectionRouter);
 
-      server.getManagementService().registerBrokerBalancer(balancer);
+      server.getManagementService().registerConnectionRouter(connectionRouter);
    }
 
    private Cache deployCache(CacheConfiguration configuration, String name) throws ClassNotFoundException {
@@ -212,14 +212,14 @@ public final class BrokerBalancerManager implements ActiveMQComponent {
       return transformer;
    }
 
-   public BrokerBalancer getBalancer(String name) {
-      return balancerControllers.get(name);
+   public ConnectionRouter getRouter(String name) {
+      return connectionRouters.get(name);
    }
 
    @Override
    public void start() throws Exception {
-      for (BrokerBalancer brokerBalancer : balancerControllers.values()) {
-         brokerBalancer.start();
+      for (ConnectionRouter connectionRouter : connectionRouters.values()) {
+         connectionRouter.start();
       }
 
       started = true;
@@ -229,9 +229,9 @@ public final class BrokerBalancerManager implements ActiveMQComponent {
    public void stop() throws Exception {
       started = false;
 
-      for (BrokerBalancer balancer : balancerControllers.values()) {
-         balancer.stop();
-         server.getManagementService().unregisterBrokerBalancer(balancer.getName());
+      for (ConnectionRouter connectionRouter : connectionRouters.values()) {
+         connectionRouter.stop();
+         server.getManagementService().unregisterConnectionRouter(connectionRouter.getName());
       }
    }
 }
diff --git a/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/balancing/targets/TargetKeyResolver.java b/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/routing/KeyResolver.java
similarity index 93%
rename from artemis-server/src/main/java/org/apache/activemq/artemis/core/server/balancing/targets/TargetKeyResolver.java
rename to artemis-server/src/main/java/org/apache/activemq/artemis/core/server/routing/KeyResolver.java
index 28b8e49..6f9637a 100644
--- a/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/balancing/targets/TargetKeyResolver.java
+++ b/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/routing/KeyResolver.java
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-package org.apache.activemq.artemis.core.server.balancing.targets;
+package org.apache.activemq.artemis.core.server.routing;
 
 import javax.security.auth.Subject;
 
@@ -26,22 +26,22 @@ import org.jboss.logging.Logger;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
 
-public class TargetKeyResolver {
+public class KeyResolver {
    public static final String DEFAULT_KEY_VALUE = "DEFAULT";
 
 
-   private static final Logger logger = Logger.getLogger(TargetKeyResolver.class);
+   private static final Logger logger = Logger.getLogger(KeyResolver.class);
 
    private static final char SOCKET_ADDRESS_DELIMITER = ':';
    private static final String SOCKET_ADDRESS_PREFIX = "/";
 
 
-   private final TargetKey key;
+   private final KeyType key;
 
    private volatile Pattern keyFilter;
 
 
-   public TargetKey getKey() {
+   public KeyType getKey() {
       return key;
    }
 
@@ -49,7 +49,7 @@ public class TargetKeyResolver {
       return keyFilter != null ? keyFilter.pattern() : null;
    }
 
-   public TargetKeyResolver(TargetKey key, String keyFilter) {
+   public KeyResolver(KeyType key, String keyFilter) {
       this.key = key;
       setKeyFilter(keyFilter);
    }
diff --git a/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/balancing/targets/TargetKey.java b/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/routing/KeyType.java
similarity index 89%
rename from artemis-server/src/main/java/org/apache/activemq/artemis/core/server/balancing/targets/TargetKey.java
rename to artemis-server/src/main/java/org/apache/activemq/artemis/core/server/routing/KeyType.java
index 3493ec3..93a02cc 100644
--- a/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/balancing/targets/TargetKey.java
+++ b/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/routing/KeyType.java
@@ -15,16 +15,16 @@
  * limitations under the License.
  */
 
-package org.apache.activemq.artemis.core.server.balancing.targets;
+package org.apache.activemq.artemis.core.server.routing;
 
-public enum TargetKey {
+public enum KeyType {
    CLIENT_ID, SNI_HOST, SOURCE_IP, USER_NAME, ROLE_NAME;
 
    public static final String validValues;
 
    static {
       StringBuffer stringBuffer = new StringBuffer();
-      for (TargetKey type : TargetKey.values()) {
+      for (KeyType type : KeyType.values()) {
 
          if (stringBuffer.length() != 0) {
             stringBuffer.append(",");
@@ -36,7 +36,7 @@ public enum TargetKey {
       validValues = stringBuffer.toString();
    }
 
-   public static TargetKey getType(String type) {
+   public static KeyType getType(String type) {
       switch (type) {
          case "CLIENT_ID":
             return CLIENT_ID;
diff --git a/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/balancing/RedirectContext.java b/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/routing/RoutingContext.java
similarity index 72%
rename from artemis-server/src/main/java/org/apache/activemq/artemis/core/server/balancing/RedirectContext.java
rename to artemis-server/src/main/java/org/apache/activemq/artemis/core/server/routing/RoutingContext.java
index 697fcbc..26c70c3 100644
--- a/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/balancing/RedirectContext.java
+++ b/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/routing/RoutingContext.java
@@ -15,13 +15,14 @@
  * limitations under the License.
  */
 
-package org.apache.activemq.artemis.core.server.balancing;
+package org.apache.activemq.artemis.core.server.routing;
 
-import org.apache.activemq.artemis.core.server.balancing.targets.Target;
-import org.apache.activemq.artemis.core.server.balancing.targets.TargetResult;
+import org.apache.activemq.artemis.core.server.routing.targets.Target;
+import org.apache.activemq.artemis.core.server.routing.targets.TargetResult;
 import org.apache.activemq.artemis.spi.core.protocol.RemotingConnection;
+import org.apache.activemq.artemis.spi.core.remoting.Connection;
 
-public class RedirectContext {
+public class RoutingContext {
    private final RemotingConnection connection;
 
    private final String clientID;
@@ -34,6 +35,14 @@ public class RedirectContext {
       return connection;
    }
 
+   public String getRouter() {
+      return connection.getTransportConnection().getRouter();
+   }
+
+   public Connection getTransportConnection() {
+      return connection.getTransportConnection();
+   }
+
    public String getClientID() {
       return clientID;
    }
@@ -54,7 +63,7 @@ public class RedirectContext {
       this.result = result;
    }
 
-   public RedirectContext(RemotingConnection connection, String clientID, String username) {
+   public RoutingContext(RemotingConnection connection, String clientID, String username) {
       this.connection = connection;
       this.clientID = clientID;
       this.username = username;
diff --git a/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/balancing/RedirectHandler.java b/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/routing/RoutingHandler.java
similarity index 51%
rename from artemis-server/src/main/java/org/apache/activemq/artemis/core/server/balancing/RedirectHandler.java
rename to artemis-server/src/main/java/org/apache/activemq/artemis/core/server/routing/RoutingHandler.java
index 0e1ee4c..1380844 100644
--- a/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/balancing/RedirectHandler.java
+++ b/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/routing/RoutingHandler.java
@@ -15,14 +15,13 @@
  * limitations under the License.
  */
 
-package org.apache.activemq.artemis.core.server.balancing;
+package org.apache.activemq.artemis.core.server.routing;
 
 import org.apache.activemq.artemis.core.server.ActiveMQServer;
 import org.apache.activemq.artemis.core.server.ActiveMQServerLogger;
-import org.apache.activemq.artemis.core.server.balancing.targets.TargetResult;
-import org.apache.activemq.artemis.spi.core.remoting.Connection;
+import org.apache.activemq.artemis.core.server.routing.targets.TargetResult;
 
-public abstract class RedirectHandler<T extends RedirectContext> {
+public abstract class RoutingHandler<T extends RoutingContext> {
    private final ActiveMQServer server;
 
 
@@ -31,41 +30,39 @@ public abstract class RedirectHandler<T extends RedirectContext> {
    }
 
 
-   protected RedirectHandler(ActiveMQServer server) {
+   protected RoutingHandler(ActiveMQServer server) {
       this.server = server;
    }
 
-   protected abstract void cannotRedirect(T context) throws Exception;
+   protected abstract void refuse(T context) throws Exception;
 
-   protected abstract void redirectTo(T context) throws Exception;
+   protected abstract void redirect(T context) throws Exception;
 
-   protected boolean redirect(T context) throws Exception {
-      Connection transportConnection = context.getConnection().getTransportConnection();
+   protected boolean route(T context) throws Exception {
+      ConnectionRouter connectionRouter = getServer().getConnectionRouterManager().getRouter(context.getRouter());
 
-      BrokerBalancer brokerBalancer = getServer().getBalancerManager().getBalancer(transportConnection.getRedirectTo());
+      if (connectionRouter == null) {
+         ActiveMQServerLogger.LOGGER.connectionRouterNotFound(context.getRouter());
 
-      if (brokerBalancer == null) {
-         ActiveMQServerLogger.LOGGER.brokerBalancerNotFound(transportConnection.getRedirectTo());
-
-         cannotRedirect(context);
+         refuse(context);
 
          return true;
       }
 
-      context.setResult(brokerBalancer.getTarget(transportConnection, context.getClientID(), context.getUsername()));
+      context.setResult(connectionRouter.getTarget(context.getTransportConnection(), context.getClientID(), context.getUsername()));
 
       if (TargetResult.Status.OK != context.getResult().getStatus()) {
-         ActiveMQServerLogger.LOGGER.cannotRedirectClientConnection(transportConnection);
+         ActiveMQServerLogger.LOGGER.cannotRouteClientConnection(context.getTransportConnection());
 
-         cannotRedirect(context);
+         refuse(context);
 
          return true;
       }
 
-      ActiveMQServerLogger.LOGGER.redirectClientConnection(transportConnection, context.getTarget());
+      ActiveMQServerLogger.LOGGER.routeClientConnection(context.getTransportConnection(), context.getTarget());
 
       if (!context.getTarget().isLocal()) {
-         redirectTo(context);
+         redirect(context);
 
          return true;
       }
diff --git a/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/balancing/caches/Cache.java b/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/routing/caches/Cache.java
similarity index 93%
rename from artemis-server/src/main/java/org/apache/activemq/artemis/core/server/balancing/caches/Cache.java
rename to artemis-server/src/main/java/org/apache/activemq/artemis/core/server/routing/caches/Cache.java
index 58b1b1d..94dd19a 100644
--- a/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/balancing/caches/Cache.java
+++ b/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/routing/caches/Cache.java
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-package org.apache.activemq.artemis.core.server.balancing.caches;
+package org.apache.activemq.artemis.core.server.routing.caches;
 
 public interface Cache {
 
diff --git a/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/balancing/caches/LocalCache.java b/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/routing/caches/LocalCache.java
similarity index 98%
rename from artemis-server/src/main/java/org/apache/activemq/artemis/core/server/balancing/caches/LocalCache.java
rename to artemis-server/src/main/java/org/apache/activemq/artemis/core/server/routing/caches/LocalCache.java
index 94113f2..3831948 100644
--- a/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/balancing/caches/LocalCache.java
+++ b/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/routing/caches/LocalCache.java
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-package org.apache.activemq.artemis.core.server.balancing.caches;
+package org.apache.activemq.artemis.core.server.routing.caches;
 
 import com.google.common.cache.CacheBuilder;
 import com.google.common.cache.RemovalListener;
diff --git a/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/balancing/policies/AbstractPolicy.java b/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/routing/policies/AbstractPolicy.java
similarity index 90%
rename from artemis-server/src/main/java/org/apache/activemq/artemis/core/server/balancing/policies/AbstractPolicy.java
rename to artemis-server/src/main/java/org/apache/activemq/artemis/core/server/routing/policies/AbstractPolicy.java
index 8cb7a92..1fab573 100644
--- a/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/balancing/policies/AbstractPolicy.java
+++ b/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/routing/policies/AbstractPolicy.java
@@ -15,9 +15,9 @@
  * limitations under the License.
  */
 
-package org.apache.activemq.artemis.core.server.balancing.policies;
+package org.apache.activemq.artemis.core.server.routing.policies;
 
-import org.apache.activemq.artemis.core.server.balancing.targets.TargetProbe;
+import org.apache.activemq.artemis.core.server.routing.targets.TargetProbe;
 
 import java.util.Map;
 
diff --git a/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/balancing/policies/ConsistentHashPolicy.java b/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/routing/policies/ConsistentHashPolicy.java
similarity index 93%
rename from artemis-server/src/main/java/org/apache/activemq/artemis/core/server/balancing/policies/ConsistentHashPolicy.java
rename to artemis-server/src/main/java/org/apache/activemq/artemis/core/server/routing/policies/ConsistentHashPolicy.java
index 4c0dd46..d3806ff 100644
--- a/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/balancing/policies/ConsistentHashPolicy.java
+++ b/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/routing/policies/ConsistentHashPolicy.java
@@ -15,9 +15,9 @@
  * limitations under the License.
  */
 
-package org.apache.activemq.artemis.core.server.balancing.policies;
+package org.apache.activemq.artemis.core.server.routing.policies;
 
-import org.apache.activemq.artemis.core.server.balancing.targets.Target;
+import org.apache.activemq.artemis.core.server.routing.targets.Target;
 
 import java.util.List;
 import java.util.Map;
diff --git a/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/balancing/policies/FirstElementPolicy.java b/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/routing/policies/FirstElementPolicy.java
similarity index 89%
rename from artemis-server/src/main/java/org/apache/activemq/artemis/core/server/balancing/policies/FirstElementPolicy.java
rename to artemis-server/src/main/java/org/apache/activemq/artemis/core/server/routing/policies/FirstElementPolicy.java
index de8bf5b..3b4d11b 100644
--- a/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/balancing/policies/FirstElementPolicy.java
+++ b/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/routing/policies/FirstElementPolicy.java
@@ -15,9 +15,9 @@
  * limitations under the License.
  */
 
-package org.apache.activemq.artemis.core.server.balancing.policies;
+package org.apache.activemq.artemis.core.server.routing.policies;
 
-import org.apache.activemq.artemis.core.server.balancing.targets.Target;
+import org.apache.activemq.artemis.core.server.routing.targets.Target;
 
 import java.util.List;
 
diff --git a/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/balancing/policies/LeastConnectionsPolicy.java b/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/routing/policies/LeastConnectionsPolicy.java
similarity index 95%
rename from artemis-server/src/main/java/org/apache/activemq/artemis/core/server/balancing/policies/LeastConnectionsPolicy.java
rename to artemis-server/src/main/java/org/apache/activemq/artemis/core/server/routing/policies/LeastConnectionsPolicy.java
index 184cfc9..0375f43 100644
--- a/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/balancing/policies/LeastConnectionsPolicy.java
+++ b/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/routing/policies/LeastConnectionsPolicy.java
@@ -15,10 +15,10 @@
  * limitations under the License.
  */
 
-package org.apache.activemq.artemis.core.server.balancing.policies;
+package org.apache.activemq.artemis.core.server.routing.policies;
 
-import org.apache.activemq.artemis.core.server.balancing.targets.Target;
-import org.apache.activemq.artemis.core.server.balancing.targets.TargetProbe;
+import org.apache.activemq.artemis.core.server.routing.targets.Target;
+import org.apache.activemq.artemis.core.server.routing.targets.TargetProbe;
 import org.jboss.logging.Logger;
 
 import java.util.ArrayList;
diff --git a/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/balancing/policies/Policy.java b/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/routing/policies/Policy.java
similarity index 83%
rename from artemis-server/src/main/java/org/apache/activemq/artemis/core/server/balancing/policies/Policy.java
rename to artemis-server/src/main/java/org/apache/activemq/artemis/core/server/routing/policies/Policy.java
index e74f2ea..2dfc3a3 100644
--- a/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/balancing/policies/Policy.java
+++ b/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/routing/policies/Policy.java
@@ -15,10 +15,10 @@
  * limitations under the License.
  */
 
-package org.apache.activemq.artemis.core.server.balancing.policies;
+package org.apache.activemq.artemis.core.server.routing.policies;
 
-import org.apache.activemq.artemis.core.server.balancing.targets.Target;
-import org.apache.activemq.artemis.core.server.balancing.targets.TargetProbe;
+import org.apache.activemq.artemis.core.server.routing.targets.Target;
+import org.apache.activemq.artemis.core.server.routing.targets.TargetProbe;
 
 import java.util.List;
 import java.util.Map;
diff --git a/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/balancing/policies/PolicyFactory.java b/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/routing/policies/PolicyFactory.java
similarity index 92%
rename from artemis-server/src/main/java/org/apache/activemq/artemis/core/server/balancing/policies/PolicyFactory.java
rename to artemis-server/src/main/java/org/apache/activemq/artemis/core/server/routing/policies/PolicyFactory.java
index 227fda9..1c958b3 100644
--- a/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/balancing/policies/PolicyFactory.java
+++ b/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/routing/policies/PolicyFactory.java
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-package org.apache.activemq.artemis.core.server.balancing.policies;
+package org.apache.activemq.artemis.core.server.routing.policies;
 
 public interface PolicyFactory {
    Policy create();
diff --git a/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/balancing/policies/PolicyFactoryResolver.java b/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/routing/policies/PolicyFactoryResolver.java
similarity index 92%
rename from artemis-server/src/main/java/org/apache/activemq/artemis/core/server/balancing/policies/PolicyFactoryResolver.java
rename to artemis-server/src/main/java/org/apache/activemq/artemis/core/server/routing/policies/PolicyFactoryResolver.java
index 45a61db..9c8c031 100644
--- a/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/balancing/policies/PolicyFactoryResolver.java
+++ b/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/routing/policies/PolicyFactoryResolver.java
@@ -15,9 +15,9 @@
  * limitations under the License.
  */
 
-package org.apache.activemq.artemis.core.server.balancing.policies;
+package org.apache.activemq.artemis.core.server.routing.policies;
 
-import org.apache.activemq.artemis.core.server.balancing.BrokerBalancer;
+import org.apache.activemq.artemis.core.server.routing.ConnectionRouter;
 
 import java.util.HashMap;
 import java.util.Map;
@@ -56,7 +56,7 @@ public class PolicyFactoryResolver {
 
    private void loadPolicyFactories() {
       ServiceLoader<PolicyFactory> serviceLoader = ServiceLoader.load(
-         PolicyFactory.class, BrokerBalancer.class.getClassLoader());
+         PolicyFactory.class, ConnectionRouter.class.getClassLoader());
 
       for (PolicyFactory policyFactory : serviceLoader) {
          policyFactories.put(keyFromClassName(policyFactory.getClass().getName()), policyFactory);
diff --git a/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/balancing/policies/RoundRobinPolicy.java b/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/routing/policies/RoundRobinPolicy.java
similarity index 90%
rename from artemis-server/src/main/java/org/apache/activemq/artemis/core/server/balancing/policies/RoundRobinPolicy.java
rename to artemis-server/src/main/java/org/apache/activemq/artemis/core/server/routing/policies/RoundRobinPolicy.java
index 7698d5e..7149464 100644
--- a/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/balancing/policies/RoundRobinPolicy.java
+++ b/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/routing/policies/RoundRobinPolicy.java
@@ -15,9 +15,9 @@
  * limitations under the License.
  */
 
-package org.apache.activemq.artemis.core.server.balancing.policies;
+package org.apache.activemq.artemis.core.server.routing.policies;
 
-import org.apache.activemq.artemis.core.server.balancing.targets.Target;
+import org.apache.activemq.artemis.core.server.routing.targets.Target;
 import org.apache.activemq.artemis.utils.RandomUtil;
 
 import java.util.List;
diff --git a/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/balancing/pools/AbstractPool.java b/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/routing/pools/AbstractPool.java
similarity index 95%
rename from artemis-server/src/main/java/org/apache/activemq/artemis/core/server/balancing/pools/AbstractPool.java
rename to artemis-server/src/main/java/org/apache/activemq/artemis/core/server/routing/pools/AbstractPool.java
index 7860625..e684621 100644
--- a/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/balancing/pools/AbstractPool.java
+++ b/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/routing/pools/AbstractPool.java
@@ -15,13 +15,13 @@
  * limitations under the License.
  */
 
-package org.apache.activemq.artemis.core.server.balancing.pools;
+package org.apache.activemq.artemis.core.server.routing.pools;
 
 import org.apache.activemq.artemis.api.core.TransportConfiguration;
-import org.apache.activemq.artemis.core.server.balancing.targets.Target;
-import org.apache.activemq.artemis.core.server.balancing.targets.TargetFactory;
-import org.apache.activemq.artemis.core.server.balancing.targets.TargetMonitor;
-import org.apache.activemq.artemis.core.server.balancing.targets.TargetProbe;
+import org.apache.activemq.artemis.core.server.routing.targets.Target;
+import org.apache.activemq.artemis.core.server.routing.targets.TargetFactory;
+import org.apache.activemq.artemis.core.server.routing.targets.TargetMonitor;
+import org.apache.activemq.artemis.core.server.routing.targets.TargetProbe;
 import org.jboss.logging.Logger;
 
 import java.util.ArrayList;
diff --git a/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/balancing/pools/ClusterPool.java b/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/routing/pools/ClusterPool.java
similarity index 94%
rename from artemis-server/src/main/java/org/apache/activemq/artemis/core/server/balancing/pools/ClusterPool.java
rename to artemis-server/src/main/java/org/apache/activemq/artemis/core/server/routing/pools/ClusterPool.java
index e2a7a28..bf56b0e 100644
--- a/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/balancing/pools/ClusterPool.java
+++ b/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/routing/pools/ClusterPool.java
@@ -15,11 +15,11 @@
  * limitations under the License.
  */
 
-package org.apache.activemq.artemis.core.server.balancing.pools;
+package org.apache.activemq.artemis.core.server.routing.pools;
 
 import org.apache.activemq.artemis.api.core.client.ClusterTopologyListener;
 import org.apache.activemq.artemis.api.core.client.TopologyMember;
-import org.apache.activemq.artemis.core.server.balancing.targets.TargetFactory;
+import org.apache.activemq.artemis.core.server.routing.targets.TargetFactory;
 import org.apache.activemq.artemis.core.server.cluster.ClusterConnection;
 
 import java.util.Map;
diff --git a/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/balancing/pools/DiscoveryGroupService.java b/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/routing/pools/DiscoveryGroupService.java
similarity index 97%
rename from artemis-server/src/main/java/org/apache/activemq/artemis/core/server/balancing/pools/DiscoveryGroupService.java
rename to artemis-server/src/main/java/org/apache/activemq/artemis/core/server/routing/pools/DiscoveryGroupService.java
index 47fbc6e..f38ccf3 100644
--- a/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/balancing/pools/DiscoveryGroupService.java
+++ b/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/routing/pools/DiscoveryGroupService.java
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-package org.apache.activemq.artemis.core.server.balancing.pools;
+package org.apache.activemq.artemis.core.server.routing.pools;
 
 import org.apache.activemq.artemis.core.cluster.DiscoveryEntry;
 import org.apache.activemq.artemis.core.cluster.DiscoveryGroup;
diff --git a/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/balancing/pools/DiscoveryPool.java b/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/routing/pools/DiscoveryPool.java
similarity index 93%
rename from artemis-server/src/main/java/org/apache/activemq/artemis/core/server/balancing/pools/DiscoveryPool.java
rename to artemis-server/src/main/java/org/apache/activemq/artemis/core/server/routing/pools/DiscoveryPool.java
index 03c3a8c..4e8ae6c 100644
--- a/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/balancing/pools/DiscoveryPool.java
+++ b/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/routing/pools/DiscoveryPool.java
@@ -15,9 +15,9 @@
  * limitations under the License.
  */
 
-package org.apache.activemq.artemis.core.server.balancing.pools;
+package org.apache.activemq.artemis.core.server.routing.pools;
 
-import org.apache.activemq.artemis.core.server.balancing.targets.TargetFactory;
+import org.apache.activemq.artemis.core.server.routing.targets.TargetFactory;
 
 import java.util.concurrent.ScheduledExecutorService;
 
diff --git a/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/balancing/pools/DiscoveryService.java b/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/routing/pools/DiscoveryService.java
similarity index 97%
rename from artemis-server/src/main/java/org/apache/activemq/artemis/core/server/balancing/pools/DiscoveryService.java
rename to artemis-server/src/main/java/org/apache/activemq/artemis/core/server/routing/pools/DiscoveryService.java
index a45fede..25246df 100644
--- a/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/balancing/pools/DiscoveryService.java
+++ b/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/routing/pools/DiscoveryService.java
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-package org.apache.activemq.artemis.core.server.balancing.pools;
+package org.apache.activemq.artemis.core.server.routing.pools;
 
 import org.apache.activemq.artemis.api.core.TransportConfiguration;
 import org.apache.activemq.artemis.core.server.ActiveMQComponent;
diff --git a/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/balancing/pools/Pool.java b/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/routing/pools/Pool.java
similarity index 88%
rename from artemis-server/src/main/java/org/apache/activemq/artemis/core/server/balancing/pools/Pool.java
rename to artemis-server/src/main/java/org/apache/activemq/artemis/core/server/routing/pools/Pool.java
index 43e3214..e42aec4 100644
--- a/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/balancing/pools/Pool.java
+++ b/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/routing/pools/Pool.java
@@ -15,11 +15,11 @@
  * limitations under the License.
  */
 
-package org.apache.activemq.artemis.core.server.balancing.pools;
+package org.apache.activemq.artemis.core.server.routing.pools;
 
 import org.apache.activemq.artemis.core.server.ActiveMQComponent;
-import org.apache.activemq.artemis.core.server.balancing.targets.Target;
-import org.apache.activemq.artemis.core.server.balancing.targets.TargetProbe;
+import org.apache.activemq.artemis.core.server.routing.targets.Target;
+import org.apache.activemq.artemis.core.server.routing.targets.TargetProbe;
 
 import java.util.List;
 
diff --git a/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/balancing/pools/StaticPool.java b/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/routing/pools/StaticPool.java
similarity index 91%
rename from artemis-server/src/main/java/org/apache/activemq/artemis/core/server/balancing/pools/StaticPool.java
rename to artemis-server/src/main/java/org/apache/activemq/artemis/core/server/routing/pools/StaticPool.java
index c652d4a..369eef3 100644
--- a/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/balancing/pools/StaticPool.java
+++ b/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/routing/pools/StaticPool.java
@@ -15,10 +15,10 @@
  * limitations under the License.
  */
 
-package org.apache.activemq.artemis.core.server.balancing.pools;
+package org.apache.activemq.artemis.core.server.routing.pools;
 
 import org.apache.activemq.artemis.api.core.TransportConfiguration;
-import org.apache.activemq.artemis.core.server.balancing.targets.TargetFactory;
+import org.apache.activemq.artemis.core.server.routing.targets.TargetFactory;
 
 import java.util.List;
 import java.util.concurrent.ScheduledExecutorService;
diff --git a/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/balancing/targets/AbstractTarget.java b/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/routing/targets/AbstractTarget.java
similarity index 97%
rename from artemis-server/src/main/java/org/apache/activemq/artemis/core/server/balancing/targets/AbstractTarget.java
rename to artemis-server/src/main/java/org/apache/activemq/artemis/core/server/routing/targets/AbstractTarget.java
index 3f123e5..8821c9e 100644
--- a/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/balancing/targets/AbstractTarget.java
+++ b/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/routing/targets/AbstractTarget.java
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-package org.apache.activemq.artemis.core.server.balancing.targets;
+package org.apache.activemq.artemis.core.server.routing.targets;
 
 import org.apache.activemq.artemis.api.core.TransportConfiguration;
 
diff --git a/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/balancing/targets/AbstractTargetFactory.java b/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/routing/targets/AbstractTargetFactory.java
similarity index 95%
rename from artemis-server/src/main/java/org/apache/activemq/artemis/core/server/balancing/targets/AbstractTargetFactory.java
rename to artemis-server/src/main/java/org/apache/activemq/artemis/core/server/routing/targets/AbstractTargetFactory.java
index 9ca15f3..ae16c7a 100644
--- a/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/balancing/targets/AbstractTargetFactory.java
+++ b/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/routing/targets/AbstractTargetFactory.java
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-package org.apache.activemq.artemis.core.server.balancing.targets;
+package org.apache.activemq.artemis.core.server.routing.targets;
 
 public abstract class AbstractTargetFactory implements TargetFactory {
 
diff --git a/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/balancing/targets/ActiveMQTarget.java b/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/routing/targets/ActiveMQTarget.java
similarity index 94%
rename from artemis-server/src/main/java/org/apache/activemq/artemis/core/server/balancing/targets/ActiveMQTarget.java
rename to artemis-server/src/main/java/org/apache/activemq/artemis/core/server/routing/targets/ActiveMQTarget.java
index adbd426..594cbaa 100644
--- a/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/balancing/targets/ActiveMQTarget.java
+++ b/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/routing/targets/ActiveMQTarget.java
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-package org.apache.activemq.artemis.core.server.balancing.targets;
+package org.apache.activemq.artemis.core.server.routing.targets;
 
 import org.apache.activemq.artemis.api.core.ActiveMQException;
 import org.apache.activemq.artemis.api.core.TransportConfiguration;
@@ -25,7 +25,7 @@ import org.apache.activemq.artemis.api.core.client.ServerLocator;
 import org.apache.activemq.artemis.api.core.management.ActiveMQManagementProxy;
 import org.apache.activemq.artemis.api.core.management.ResourceNames;
 import org.apache.activemq.artemis.core.remoting.FailureListener;
-import org.apache.activemq.artemis.core.server.balancing.BrokerBalancer;
+import org.apache.activemq.artemis.core.server.routing.ConnectionRouter;
 import org.apache.activemq.artemis.spi.core.protocol.RemotingConnection;
 import org.apache.activemq.artemis.utils.UUIDGenerator;
 import org.jboss.logging.Logger;
@@ -67,7 +67,7 @@ public class ActiveMQTarget extends AbstractTarget implements FailureListener {
 
       managementProxy = new ActiveMQManagementProxy(sessionFactory.createSession(getUsername(), getPassword(),
          false, true, true, false, ActiveMQClient.DEFAULT_ACK_BATCH_SIZE,
-         BrokerBalancer.CLIENT_ID_PREFIX + UUIDGenerator.getInstance().generateStringUUID()).start());
+         ConnectionRouter.CLIENT_ID_PREFIX + UUIDGenerator.getInstance().generateStringUUID()).start());
 
       if (getNodeID() == null) {
          setNodeID(getAttribute(ResourceNames.BROKER, "NodeID", String.class, 3000));
diff --git a/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/balancing/targets/ActiveMQTargetFactory.java b/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/routing/targets/ActiveMQTargetFactory.java
similarity index 94%
rename from artemis-server/src/main/java/org/apache/activemq/artemis/core/server/balancing/targets/ActiveMQTargetFactory.java
rename to artemis-server/src/main/java/org/apache/activemq/artemis/core/server/routing/targets/ActiveMQTargetFactory.java
index b7cb9f9..ca67001 100644
--- a/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/balancing/targets/ActiveMQTargetFactory.java
+++ b/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/routing/targets/ActiveMQTargetFactory.java
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-package org.apache.activemq.artemis.core.server.balancing.targets;
+package org.apache.activemq.artemis.core.server.routing.targets;
 
 import org.apache.activemq.artemis.api.core.TransportConfiguration;
 
diff --git a/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/balancing/targets/LocalTarget.java b/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/routing/targets/LocalTarget.java
similarity index 97%
rename from artemis-server/src/main/java/org/apache/activemq/artemis/core/server/balancing/targets/LocalTarget.java
rename to artemis-server/src/main/java/org/apache/activemq/artemis/core/server/routing/targets/LocalTarget.java
index 86043fe..1690009 100644
--- a/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/balancing/targets/LocalTarget.java
+++ b/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/routing/targets/LocalTarget.java
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-package org.apache.activemq.artemis.core.server.balancing.targets;
+package org.apache.activemq.artemis.core.server.routing.targets;
 
 import org.apache.activemq.artemis.api.core.TransportConfiguration;
 import org.apache.activemq.artemis.core.server.ActiveMQServer;
diff --git a/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/balancing/targets/Target.java b/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/routing/targets/Target.java
similarity index 96%
rename from artemis-server/src/main/java/org/apache/activemq/artemis/core/server/balancing/targets/Target.java
rename to artemis-server/src/main/java/org/apache/activemq/artemis/core/server/routing/targets/Target.java
index fb09d87..c429ede 100644
--- a/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/balancing/targets/Target.java
+++ b/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/routing/targets/Target.java
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-package org.apache.activemq.artemis.core.server.balancing.targets;
+package org.apache.activemq.artemis.core.server.routing.targets;
 
 import org.apache.activemq.artemis.api.core.TransportConfiguration;
 
diff --git a/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/balancing/targets/TargetFactory.java b/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/routing/targets/TargetFactory.java
similarity index 94%
rename from artemis-server/src/main/java/org/apache/activemq/artemis/core/server/balancing/targets/TargetFactory.java
rename to artemis-server/src/main/java/org/apache/activemq/artemis/core/server/routing/targets/TargetFactory.java
index 508be40..cda6959 100644
--- a/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/balancing/targets/TargetFactory.java
+++ b/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/routing/targets/TargetFactory.java
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-package org.apache.activemq.artemis.core.server.balancing.targets;
+package org.apache.activemq.artemis.core.server.routing.targets;
 
 import org.apache.activemq.artemis.api.core.TransportConfiguration;
 
diff --git a/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/balancing/targets/TargetListener.java b/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/routing/targets/TargetListener.java
similarity index 93%
rename from artemis-server/src/main/java/org/apache/activemq/artemis/core/server/balancing/targets/TargetListener.java
rename to artemis-server/src/main/java/org/apache/activemq/artemis/core/server/routing/targets/TargetListener.java
index 266d736..3e4f7a8 100644
--- a/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/balancing/targets/TargetListener.java
+++ b/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/routing/targets/TargetListener.java
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-package org.apache.activemq.artemis.core.server.balancing.targets;
+package org.apache.activemq.artemis.core.server.routing.targets;
 
 public interface TargetListener {
    void targetConnected();
diff --git a/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/balancing/targets/TargetMonitor.java b/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/routing/targets/TargetMonitor.java
similarity index 98%
rename from artemis-server/src/main/java/org/apache/activemq/artemis/core/server/balancing/targets/TargetMonitor.java
rename to artemis-server/src/main/java/org/apache/activemq/artemis/core/server/routing/targets/TargetMonitor.java
index b1865da..3abac35 100644
--- a/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/balancing/targets/TargetMonitor.java
+++ b/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/routing/targets/TargetMonitor.java
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-package org.apache.activemq.artemis.core.server.balancing.targets;
+package org.apache.activemq.artemis.core.server.routing.targets;
 
 import org.apache.activemq.artemis.core.server.ActiveMQScheduledComponent;
 import org.jboss.logging.Logger;
diff --git a/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/balancing/targets/TargetProbe.java b/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/routing/targets/TargetProbe.java
similarity index 93%
rename from artemis-server/src/main/java/org/apache/activemq/artemis/core/server/balancing/targets/TargetProbe.java
rename to artemis-server/src/main/java/org/apache/activemq/artemis/core/server/routing/targets/TargetProbe.java
index 1d80067..a030e00 100644
--- a/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/balancing/targets/TargetProbe.java
+++ b/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/routing/targets/TargetProbe.java
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-package org.apache.activemq.artemis.core.server.balancing.targets;
+package org.apache.activemq.artemis.core.server.routing.targets;
 
 public abstract class TargetProbe {
    private final String name;
diff --git a/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/balancing/targets/TargetResult.java b/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/routing/targets/TargetResult.java
similarity index 96%
rename from artemis-server/src/main/java/org/apache/activemq/artemis/core/server/balancing/targets/TargetResult.java
rename to artemis-server/src/main/java/org/apache/activemq/artemis/core/server/routing/targets/TargetResult.java
index cd161c4..7fb32e1 100644
--- a/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/balancing/targets/TargetResult.java
+++ b/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/routing/targets/TargetResult.java
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-package org.apache.activemq.artemis.core.server.balancing.targets;
+package org.apache.activemq.artemis.core.server.routing.targets;
 
 public class TargetResult {
 
diff --git a/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/balancing/transformer/ConsistentHashModulo.java b/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/routing/transformer/ConsistentHashModulo.java
similarity index 82%
rename from artemis-server/src/main/java/org/apache/activemq/artemis/core/server/balancing/transformer/ConsistentHashModulo.java
rename to artemis-server/src/main/java/org/apache/activemq/artemis/core/server/routing/transformer/ConsistentHashModulo.java
index a092e86..f2d96e2 100644
--- a/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/balancing/transformer/ConsistentHashModulo.java
+++ b/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/routing/transformer/ConsistentHashModulo.java
@@ -15,12 +15,12 @@
  * limitations under the License.
  */
 
-package org.apache.activemq.artemis.core.server.balancing.transformer;
+package org.apache.activemq.artemis.core.server.routing.transformer;
 
 import java.util.Map;
 
-import org.apache.activemq.artemis.core.server.balancing.policies.ConsistentHashPolicy;
-import org.apache.activemq.artemis.core.server.balancing.targets.TargetKeyResolver;
+import org.apache.activemq.artemis.core.server.routing.policies.ConsistentHashPolicy;
+import org.apache.activemq.artemis.core.server.routing.KeyResolver;
 
 public class ConsistentHashModulo implements KeyTransformer {
    public static final String NAME = "CONSISTENT_HASH_MODULO";
@@ -29,7 +29,7 @@ public class ConsistentHashModulo implements KeyTransformer {
 
    @Override
    public String transform(String str) {
-      if (TargetKeyResolver.DEFAULT_KEY_VALUE.equals(str)) {
+      if (KeyResolver.DEFAULT_KEY_VALUE.equals(str)) {
          // we only want to transform resolved keys
          return str;
       }
diff --git a/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/balancing/transformer/KeyTransformer.java b/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/routing/transformer/KeyTransformer.java
similarity index 93%
rename from artemis-server/src/main/java/org/apache/activemq/artemis/core/server/balancing/transformer/KeyTransformer.java
rename to artemis-server/src/main/java/org/apache/activemq/artemis/core/server/routing/transformer/KeyTransformer.java
index dc0224e..d9859ce 100644
--- a/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/balancing/transformer/KeyTransformer.java
+++ b/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/routing/transformer/KeyTransformer.java
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-package org.apache.activemq.artemis.core.server.balancing.transformer;
+package org.apache.activemq.artemis.core.server.routing.transformer;
 
 import java.util.Map;
 
diff --git a/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/balancing/transformer/TransformerFactory.java b/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/routing/transformer/TransformerFactory.java
similarity index 92%
rename from artemis-server/src/main/java/org/apache/activemq/artemis/core/server/balancing/transformer/TransformerFactory.java
rename to artemis-server/src/main/java/org/apache/activemq/artemis/core/server/routing/transformer/TransformerFactory.java
index af60fda..e347029 100644
--- a/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/balancing/transformer/TransformerFactory.java
+++ b/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/routing/transformer/TransformerFactory.java
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-package org.apache.activemq.artemis.core.server.balancing.transformer;
+package org.apache.activemq.artemis.core.server.routing.transformer;
 
 public interface TransformerFactory {
    KeyTransformer create();
diff --git a/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/balancing/transformer/TransformerFactoryResolver.java b/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/routing/transformer/TransformerFactoryResolver.java
similarity index 90%
rename from artemis-server/src/main/java/org/apache/activemq/artemis/core/server/balancing/transformer/TransformerFactoryResolver.java
rename to artemis-server/src/main/java/org/apache/activemq/artemis/core/server/routing/transformer/TransformerFactoryResolver.java
index 46dc635..75743ce 100644
--- a/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/balancing/transformer/TransformerFactoryResolver.java
+++ b/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/routing/transformer/TransformerFactoryResolver.java
@@ -15,13 +15,13 @@
  * limitations under the License.
  */
 
-package org.apache.activemq.artemis.core.server.balancing.transformer;
+package org.apache.activemq.artemis.core.server.routing.transformer;
 
 import java.util.HashMap;
 import java.util.Map;
 import java.util.ServiceLoader;
 
-import org.apache.activemq.artemis.core.server.balancing.BrokerBalancer;
+import org.apache.activemq.artemis.core.server.routing.ConnectionRouter;
 
 public class TransformerFactoryResolver {
    private static TransformerFactoryResolver instance;
@@ -50,7 +50,7 @@ public class TransformerFactoryResolver {
 
    private void loadFactories() {
       ServiceLoader<TransformerFactory> serviceLoader = ServiceLoader.load(
-         TransformerFactory.class, BrokerBalancer.class.getClassLoader());
+         TransformerFactory.class, ConnectionRouter.class.getClassLoader());
       for (TransformerFactory factory : serviceLoader) {
          factories.put(keyFromClassName(factory.getClass().getName()), factory);
       }
diff --git a/artemis-server/src/main/java/org/apache/activemq/artemis/spi/core/protocol/AbstractProtocolManager.java b/artemis-server/src/main/java/org/apache/activemq/artemis/spi/core/protocol/AbstractProtocolManager.java
index 7d540b7..a1f556e 100644
--- a/artemis-server/src/main/java/org/apache/activemq/artemis/spi/core/protocol/AbstractProtocolManager.java
+++ b/artemis-server/src/main/java/org/apache/activemq/artemis/spi/core/protocol/AbstractProtocolManager.java
@@ -27,9 +27,9 @@ import org.apache.activemq.artemis.api.core.BaseInterceptor;
 import org.apache.activemq.artemis.api.core.SimpleString;
 import org.apache.activemq.artemis.core.server.ActiveMQServerLogger;
 import org.apache.activemq.artemis.api.core.RoutingType;
-import org.apache.activemq.artemis.core.server.balancing.RedirectHandler;
+import org.apache.activemq.artemis.core.server.routing.RoutingHandler;
 
-public abstract class AbstractProtocolManager<P, I extends BaseInterceptor<P>, C extends RemotingConnection, R extends RedirectHandler> implements ProtocolManager<I, R> {
+public abstract class AbstractProtocolManager<P, I extends BaseInterceptor<P>, C extends RemotingConnection, R extends RoutingHandler> implements ProtocolManager<I, R> {
 
    private final Map<SimpleString, RoutingType> prefixes = new HashMap<>();
 
diff --git a/artemis-server/src/main/java/org/apache/activemq/artemis/spi/core/protocol/ProtocolManager.java b/artemis-server/src/main/java/org/apache/activemq/artemis/spi/core/protocol/ProtocolManager.java
index 82d5f4a..0a9e5b9 100644
--- a/artemis-server/src/main/java/org/apache/activemq/artemis/spi/core/protocol/ProtocolManager.java
+++ b/artemis-server/src/main/java/org/apache/activemq/artemis/spi/core/protocol/ProtocolManager.java
@@ -25,14 +25,14 @@ import org.apache.activemq.artemis.api.core.BaseInterceptor;
 import org.apache.activemq.artemis.api.core.RoutingType;
 import org.apache.activemq.artemis.api.core.SimpleString;
 import org.apache.activemq.artemis.core.remoting.impl.netty.NettyServerConnection;
-import org.apache.activemq.artemis.core.server.balancing.RedirectHandler;
+import org.apache.activemq.artemis.core.server.routing.RoutingHandler;
 import org.apache.activemq.artemis.spi.core.remoting.Acceptor;
 import org.apache.activemq.artemis.spi.core.remoting.Connection;
 
 /**
  * Info: ProtocolManager is loaded by {@link org.apache.activemq.artemis.core.remoting.server.impl.RemotingServiceImpl#loadProtocolManagerFactories(Iterable)}
  */
-public interface ProtocolManager<P extends BaseInterceptor, R extends RedirectHandler> {
+public interface ProtocolManager<P extends BaseInterceptor, R extends RoutingHandler> {
 
    ProtocolManagerFactory<P> getFactory();
 
@@ -82,5 +82,5 @@ public interface ProtocolManager<P extends BaseInterceptor, R extends RedirectHa
 
    String getSecurityDomain();
 
-   R getRedirectHandler();
+   R getRoutingHandler();
 }
diff --git a/artemis-server/src/main/resources/schema/artemis-configuration.xsd b/artemis-server/src/main/resources/schema/artemis-configuration.xsd
index e418d86..4117686 100644
--- a/artemis-server/src/main/resources/schema/artemis-configuration.xsd
+++ b/artemis-server/src/main/resources/schema/artemis-configuration.xsd
@@ -627,15 +627,15 @@
             </xsd:annotation>
          </xsd:element>
 
-         <xsd:element name="broker-balancers" maxOccurs="1" minOccurs="0">
+         <xsd:element name="connection-routers" maxOccurs="1" minOccurs="0">
             <xsd:annotation>
                <xsd:documentation>
-                  A list of balancers
+                  A list of connection routers
                </xsd:documentation>
             </xsd:annotation>
             <xsd:complexType>
                <xsd:sequence>
-                  <xsd:element name="broker-balancer" type="brokerBalancerType" maxOccurs="unbounded" minOccurs="0"/>
+                  <xsd:element name="connection-router" type="connectionRouterType" maxOccurs="unbounded" minOccurs="0"/>
                </xsd:sequence>
                <xsd:attributeGroup ref="xml:specialAttrs"/>
             </xsd:complexType>
@@ -2110,16 +2110,16 @@
       </xsd:sequence>
    </xsd:complexType>
 
-   <xsd:complexType name="brokerBalancerType">
+   <xsd:complexType name="connectionRouterType">
       <xsd:sequence maxOccurs="unbounded">
-         <xsd:element name="target-key" type="brokerBalancerTargetKeyType" maxOccurs="1" minOccurs="0">
+         <xsd:element name="key-type" type="connectionRouterKeyType" maxOccurs="1" minOccurs="0">
             <xsd:annotation>
                <xsd:documentation>
                   the optional target key
                </xsd:documentation>
             </xsd:annotation>
          </xsd:element>
-         <xsd:element name="target-key-filter" type="xsd:string" maxOccurs="1" minOccurs="0">
+         <xsd:element name="key-filter" type="xsd:string" maxOccurs="1" minOccurs="0">
             <xsd:annotation>
                <xsd:documentation>
                   the filter for the target key
@@ -2133,28 +2133,28 @@
                </xsd:documentation>
             </xsd:annotation>
          </xsd:element>
-         <xsd:element name="cache" type="brokerBalancerCacheType" maxOccurs="1" minOccurs="0">
+         <xsd:element name="cache" type="connectionRouterCacheType" maxOccurs="1" minOccurs="0">
             <xsd:annotation>
                <xsd:documentation>
                   the time period for a cache entry to remain active
                </xsd:documentation>
             </xsd:annotation>
          </xsd:element>
-         <xsd:element name="policy" type="brokerBalancerPolicyType" maxOccurs="1" minOccurs="0">
+         <xsd:element name="policy" type="connectionRouterPolicyType" maxOccurs="1" minOccurs="0">
             <xsd:annotation>
                <xsd:documentation>
                   the policy configuration
                </xsd:documentation>
             </xsd:annotation>
          </xsd:element>
-         <xsd:element name="pool" type="brokerBalancerPoolType" maxOccurs="1" minOccurs="0">
+         <xsd:element name="pool" type="connectionRouterPoolType" maxOccurs="1" minOccurs="0">
             <xsd:annotation>
                <xsd:documentation>
                   the pool configuration
                </xsd:documentation>
             </xsd:annotation>
          </xsd:element>
-         <xsd:element name="local-target-key-transformer" type="brokerBalancerKeyTransformerType" maxOccurs="1" minOccurs="0">
+         <xsd:element name="local-target-key-transformer" type="connectionRouterKeyTransformerType" maxOccurs="1" minOccurs="0">
             <xsd:annotation>
                <xsd:documentation>
                   the local target key transformer configuration
@@ -2165,14 +2165,14 @@
       <xsd:attribute name="name" type="xsd:string" use="required">
          <xsd:annotation>
             <xsd:documentation>
-               a unique name for the broker balancer
+               a unique name for the connection router
             </xsd:documentation>
          </xsd:annotation>
       </xsd:attribute>
       <xsd:attributeGroup ref="xml:specialAttrs"/>
    </xsd:complexType>
 
-   <xsd:simpleType name="brokerBalancerTargetKeyType">
+   <xsd:simpleType name="connectionRouterKeyType">
       <xsd:restriction base="xsd:string">
          <xsd:enumeration value="CLIENT_ID"/>
          <xsd:enumeration value="SNI_HOST"/>
@@ -2181,7 +2181,7 @@
       </xsd:restriction>
    </xsd:simpleType>
 
-   <xsd:complexType name="brokerBalancerCacheType">
+   <xsd:complexType name="connectionRouterCacheType">
       <xsd:sequence maxOccurs="unbounded">
          <xsd:element name="persisted" type="xsd:boolean" default="false" maxOccurs="1" minOccurs="0">
             <xsd:annotation>
@@ -2201,7 +2201,7 @@
       <xsd:attributeGroup ref="xml:specialAttrs"/>
    </xsd:complexType>
 
-   <xsd:complexType name="brokerBalancerPolicyType">
+   <xsd:complexType name="connectionRouterPolicyType">
       <xsd:sequence>
          <xsd:element ref="property" maxOccurs="unbounded" minOccurs="0">
             <xsd:annotation>
@@ -2221,7 +2221,7 @@
       <xsd:attributeGroup ref="xml:specialAttrs"/>
    </xsd:complexType>
 
-   <xsd:complexType name="brokerBalancerKeyTransformerType">
+   <xsd:complexType name="connectionRouterKeyTransformerType">
       <xsd:sequence>
          <xsd:element ref="property" maxOccurs="unbounded" minOccurs="0">
             <xsd:annotation>
@@ -2241,7 +2241,7 @@
       <xsd:attributeGroup ref="xml:specialAttrs"/>
    </xsd:complexType>
 
-   <xsd:complexType name="brokerBalancerPoolType">
+   <xsd:complexType name="connectionRouterPoolType">
       <xsd:sequence maxOccurs="unbounded">
          <xsd:element name="username" type="xsd:string" maxOccurs="1" minOccurs="0">
             <xsd:annotation>
diff --git a/artemis-server/src/test/java/org/apache/activemq/artemis/core/config/impl/ConfigurationImplTest.java b/artemis-server/src/test/java/org/apache/activemq/artemis/core/config/impl/ConfigurationImplTest.java
index fae3531..50c9a52 100644
--- a/artemis-server/src/test/java/org/apache/activemq/artemis/core/config/impl/ConfigurationImplTest.java
+++ b/artemis-server/src/test/java/org/apache/activemq/artemis/core/config/impl/ConfigurationImplTest.java
@@ -599,8 +599,8 @@ public class ConfigurationImplTest extends ActiveMQTestBase {
       ConfigurationImpl configuration = new ConfigurationImpl();
 
       Properties properties = new Properties();
-      properties.put("balancerConfigurations.joe.localTargetFilter", "LF");
-      properties.put("balancerConfigurations(joe).targetKeyFilter", "TF");
+      properties.put("connectionRouters.joe.localTargetFilter", "LF");
+      properties.put("connectionRouters.joe.keyFilter", "TF");
 
       properties.put("acceptorConfigurations.tcp.params.HOST", "LOCALHOST");
       properties.put("acceptorConfigurations.tcp.params.PORT", "61616");
@@ -623,9 +623,9 @@ public class ConfigurationImplTest extends ActiveMQTestBase {
 
       configuration.parsePrefixedProperties(properties, null);
 
-      Assert.assertEquals(1, configuration.getBalancerConfigurations().size());
-      Assert.assertEquals("LF", configuration.getBalancerConfigurations().get(0).getLocalTargetFilter());
-      Assert.assertEquals("TF", configuration.getBalancerConfigurations().get(0).getTargetKeyFilter());
+      Assert.assertEquals(1, configuration.getConnectionRouters().size());
+      Assert.assertEquals("LF", configuration.getConnectionRouters().get(0).getLocalTargetFilter());
+      Assert.assertEquals("TF", configuration.getConnectionRouters().get(0).getKeyFilter());
 
       Assert.assertEquals(2, configuration.getAcceptorConfigurations().size());
 
@@ -659,16 +659,22 @@ public class ConfigurationImplTest extends ActiveMQTestBase {
       ConfigurationImpl configuration = new ConfigurationImpl();
 
       Properties properties = new Properties();
-      properties.put("balancerConfigurations.joe.localTargetFilter", "LF");
+      properties.put("connectionRouters.joe.localTargetFilter", "LF");
       // does not exist, ignored
-      properties.put("balancerConfigurations(bob).targetKeyFilter", "TF");
-      properties.put("balancerConfigurations(joe).targetKeyFilter", "TF");
+      properties.put("connectionRouters(bob).keyFilter", "TF");
 
+      // apply twice b/c there is no guarantee of order, this may be a problem
       configuration.parsePrefixedProperties(properties, null);
 
-      Assert.assertEquals(1, configuration.getBalancerConfigurations().size());
-      Assert.assertEquals("LF", configuration.getBalancerConfigurations().get(0).getLocalTargetFilter());
-      Assert.assertEquals("TF", configuration.getBalancerConfigurations().get(0).getTargetKeyFilter());
+      properties = new Properties();
+      // update existing
+      properties.put("connectionRouters(joe).keyFilter", "TF");
+
+      configuration.parsePrefixedProperties(properties, null);
+
+      Assert.assertEquals(1, configuration.getConnectionRouters().size());
+      Assert.assertEquals("LF", configuration.getConnectionRouters().get(0).getLocalTargetFilter());
+      Assert.assertEquals("TF", configuration.getConnectionRouters().get(0).getKeyFilter());
    }
 
    @Test
diff --git a/artemis-server/src/test/java/org/apache/activemq/artemis/core/config/impl/FileConfigurationTest.java b/artemis-server/src/test/java/org/apache/activemq/artemis/core/config/impl/FileConfigurationTest.java
index 8834c17..7700f4d 100644
--- a/artemis-server/src/test/java/org/apache/activemq/artemis/core/config/impl/FileConfigurationTest.java
+++ b/artemis-server/src/test/java/org/apache/activemq/artemis/core/config/impl/FileConfigurationTest.java
@@ -46,7 +46,7 @@ import org.apache.activemq.artemis.core.config.DivertConfiguration;
 import org.apache.activemq.artemis.core.config.FileDeploymentManager;
 import org.apache.activemq.artemis.core.config.HAPolicyConfiguration;
 import org.apache.activemq.artemis.core.config.MetricsConfiguration;
-import org.apache.activemq.artemis.core.config.balancing.BrokerBalancerConfiguration;
+import org.apache.activemq.artemis.core.config.routing.ConnectionRouterConfiguration;
 import org.apache.activemq.artemis.core.config.ha.LiveOnlyPolicyConfiguration;
 import org.apache.activemq.artemis.core.journal.impl.JournalImpl;
 import org.apache.activemq.artemis.core.remoting.impl.netty.TransportConstants;
@@ -55,10 +55,10 @@ import org.apache.activemq.artemis.core.server.ComponentConfigurationRoutingType
 import org.apache.activemq.artemis.core.server.JournalType;
 import org.apache.activemq.artemis.core.server.Queue;
 import org.apache.activemq.artemis.core.server.SecuritySettingPlugin;
-import org.apache.activemq.artemis.core.server.balancing.policies.ConsistentHashPolicy;
-import org.apache.activemq.artemis.core.server.balancing.policies.FirstElementPolicy;
-import org.apache.activemq.artemis.core.server.balancing.policies.LeastConnectionsPolicy;
-import org.apache.activemq.artemis.core.server.balancing.targets.TargetKey;
+import org.apache.activemq.artemis.core.server.routing.policies.ConsistentHashPolicy;
+import org.apache.activemq.artemis.core.server.routing.policies.FirstElementPolicy;
+import org.apache.activemq.artemis.core.server.routing.policies.LeastConnectionsPolicy;
+import org.apache.activemq.artemis.core.server.routing.KeyType;
 import org.apache.activemq.artemis.core.server.cluster.impl.MessageLoadBalancingType;
 import org.apache.activemq.artemis.core.server.impl.ActiveMQServerImpl;
 import org.apache.activemq.artemis.core.server.impl.LegacyLDAPSecuritySettingPlugin;
@@ -76,7 +76,7 @@ import org.junit.Assert;
 import org.junit.BeforeClass;
 import org.junit.Test;
 
-import static org.apache.activemq.artemis.core.server.balancing.transformer.ConsistentHashModulo.MODULO;
+import static org.apache.activemq.artemis.core.server.routing.transformer.ConsistentHashModulo.MODULO;
 
 public class FileConfigurationTest extends ConfigurationImplTest {
 
@@ -269,30 +269,30 @@ public class FileConfigurationTest extends ConfigurationImplTest {
          }
       }
 
-      Assert.assertEquals(5, conf.getBalancerConfigurations().size());
-      for (BrokerBalancerConfiguration bc : conf.getBalancerConfigurations()) {
+      Assert.assertEquals(5, conf.getConnectionRouters().size());
+      for (ConnectionRouterConfiguration bc : conf.getConnectionRouters()) {
          if (bc.getName().equals("simple-local")) {
-            Assert.assertEquals(bc.getTargetKey(), TargetKey.CLIENT_ID);
+            Assert.assertEquals(bc.getKeyType(), KeyType.CLIENT_ID);
             Assert.assertNotNull(bc.getLocalTargetFilter());
-            Assert.assertNotNull(bc.getTargetKeyFilter());
+            Assert.assertNotNull(bc.getKeyFilter());
             Assert.assertNull(bc.getPolicyConfiguration());
          } else if (bc.getName().equals("simple-local-with-transformer")) {
-            Assert.assertEquals(bc.getTargetKey(), TargetKey.CLIENT_ID);
+            Assert.assertEquals(bc.getKeyType(), KeyType.CLIENT_ID);
             Assert.assertNotNull(bc.getLocalTargetFilter());
-            Assert.assertNotNull(bc.getTargetKeyFilter());
+            Assert.assertNotNull(bc.getKeyFilter());
             Assert.assertNull(bc.getPolicyConfiguration());
             Assert.assertNotNull(bc.getTransformerConfiguration());
             Assert.assertNotNull(bc.getTransformerConfiguration().getProperties().get(MODULO));
-         } else if (bc.getName().equals("simple-balancer")) {
-            Assert.assertEquals(bc.getTargetKey(), TargetKey.USER_NAME);
+         } else if (bc.getName().equals("simple-router")) {
+            Assert.assertEquals(bc.getKeyType(), KeyType.USER_NAME);
             Assert.assertNull(bc.getLocalTargetFilter());
             Assert.assertEquals(bc.getPolicyConfiguration().getName(), FirstElementPolicy.NAME);
             Assert.assertEquals(false, bc.getPoolConfiguration().isLocalTargetEnabled());
             Assert.assertEquals("connector1", bc.getPoolConfiguration().getStaticConnectors().get(0));
             Assert.assertEquals(null, bc.getPoolConfiguration().getDiscoveryGroupName());
-         } else if (bc.getName().equals("consistent-hash-balancer")) {
-            Assert.assertEquals(bc.getTargetKey(), TargetKey.SNI_HOST);
-            Assert.assertEquals(bc.getTargetKeyFilter(), "^[^.]+");
+         } else if (bc.getName().equals("consistent-hash-router")) {
+            Assert.assertEquals(bc.getKeyType(), KeyType.SNI_HOST);
+            Assert.assertEquals(bc.getKeyFilter(), "^[^.]+");
             Assert.assertEquals(bc.getLocalTargetFilter(), "DEFAULT");
             Assert.assertEquals(bc.getPolicyConfiguration().getName(), ConsistentHashPolicy.NAME);
             Assert.assertEquals(1000, bc.getPoolConfiguration().getCheckPeriod());
@@ -300,8 +300,8 @@ public class FileConfigurationTest extends ConfigurationImplTest {
             Assert.assertEquals(null, bc.getPoolConfiguration().getStaticConnectors());
             Assert.assertEquals("dg1", bc.getPoolConfiguration().getDiscoveryGroupName());
          } else {
-            Assert.assertEquals(bc.getTargetKey(), TargetKey.SOURCE_IP);
-            Assert.assertEquals("least-connections-balancer", bc.getName());
+            Assert.assertEquals(bc.getKeyType(), KeyType.SOURCE_IP);
+            Assert.assertEquals("least-connections-router", bc.getName());
             Assert.assertNotNull(bc.getCacheConfiguration());
             Assert.assertEquals(true, bc.getCacheConfiguration().isPersisted());
             Assert.assertEquals(60000, bc.getCacheConfiguration().getTimeout());
diff --git a/artemis-server/src/test/java/org/apache/activemq/artemis/core/server/group/impl/ClusteredResetMockTest.java b/artemis-server/src/test/java/org/apache/activemq/artemis/core/server/group/impl/ClusteredResetMockTest.java
index 2df3f61..8ef7477 100644
--- a/artemis-server/src/test/java/org/apache/activemq/artemis/core/server/group/impl/ClusteredResetMockTest.java
+++ b/artemis-server/src/test/java/org/apache/activemq/artemis/core/server/group/impl/ClusteredResetMockTest.java
@@ -45,7 +45,7 @@ import org.apache.activemq.artemis.core.server.ActiveMQServer;
 import org.apache.activemq.artemis.core.server.Divert;
 import org.apache.activemq.artemis.core.server.Queue;
 import org.apache.activemq.artemis.core.server.QueueFactory;
-import org.apache.activemq.artemis.core.server.balancing.BrokerBalancer;
+import org.apache.activemq.artemis.core.server.routing.ConnectionRouter;
 import org.apache.activemq.artemis.core.server.cluster.Bridge;
 import org.apache.activemq.artemis.core.server.cluster.BroadcastGroup;
 import org.apache.activemq.artemis.core.server.cluster.ClusterConnection;
@@ -326,12 +326,12 @@ public class ClusteredResetMockTest extends ActiveMQTestBase {
       }
 
       @Override
-      public void registerBrokerBalancer(BrokerBalancer balancer) throws Exception {
+      public void registerConnectionRouter(ConnectionRouter router) throws Exception {
 
       }
 
       @Override
-      public void unregisterBrokerBalancer(String name) throws Exception {
+      public void unregisterConnectionRouter(String name) throws Exception {
 
       }
 
diff --git a/artemis-server/src/test/java/org/apache/activemq/artemis/core/server/balancing/BrokerBalancerManagerTest.java b/artemis-server/src/test/java/org/apache/activemq/artemis/core/server/routing/ConnectionRouterManagerTest.java
similarity index 62%
rename from artemis-server/src/test/java/org/apache/activemq/artemis/core/server/balancing/BrokerBalancerManagerTest.java
rename to artemis-server/src/test/java/org/apache/activemq/artemis/core/server/routing/ConnectionRouterManagerTest.java
index a5bb93d..0a4efc3 100644
--- a/artemis-server/src/test/java/org/apache/activemq/artemis/core/server/balancing/BrokerBalancerManagerTest.java
+++ b/artemis-server/src/test/java/org/apache/activemq/artemis/core/server/routing/ConnectionRouterManagerTest.java
@@ -15,18 +15,17 @@
  * limitations under the License.
  */
 
-package org.apache.activemq.artemis.core.server.balancing;
+package org.apache.activemq.artemis.core.server.routing;
 
 import java.util.HashMap;
 
 import org.apache.activemq.artemis.api.core.SimpleString;
-import org.apache.activemq.artemis.core.config.balancing.BrokerBalancerConfiguration;
-import org.apache.activemq.artemis.core.config.balancing.NamedPropertyConfiguration;
-import org.apache.activemq.artemis.core.config.balancing.PoolConfiguration;
+import org.apache.activemq.artemis.core.config.routing.ConnectionRouterConfiguration;
+import org.apache.activemq.artemis.core.config.routing.NamedPropertyConfiguration;
+import org.apache.activemq.artemis.core.config.routing.PoolConfiguration;
 import org.apache.activemq.artemis.core.server.ActiveMQServer;
-import org.apache.activemq.artemis.core.server.balancing.policies.ConsistentHashPolicy;
-import org.apache.activemq.artemis.core.server.balancing.targets.TargetKey;
-import org.apache.activemq.artemis.core.server.balancing.transformer.ConsistentHashModulo;
+import org.apache.activemq.artemis.core.server.routing.policies.ConsistentHashPolicy;
+import org.apache.activemq.artemis.core.server.routing.transformer.ConsistentHashModulo;
 import org.apache.activemq.artemis.core.server.management.ManagementService;
 import org.junit.After;
 import org.junit.Before;
@@ -39,10 +38,10 @@ import org.mockito.Mockito;
 import org.mockito.junit.MockitoJUnitRunner;
 
 @RunWith(MockitoJUnitRunner.class)
-public class BrokerBalancerManagerTest {
+public class ConnectionRouterManagerTest {
 
    ActiveMQServer mockServer;
-   BrokerBalancerManager underTest;
+   ConnectionRouterManager underTest;
 
    @Before
    public void setUp() throws Exception {
@@ -50,7 +49,7 @@ public class BrokerBalancerManagerTest {
       mockServer = mock(ActiveMQServer.class);
       Mockito.when(mockServer.getNodeID()).thenReturn(SimpleString.toSimpleString("UUID"));
 
-      underTest = new BrokerBalancerManager(null, mockServer, null);
+      underTest = new ConnectionRouterManager(null, mockServer, null);
       underTest.start();
    }
 
@@ -64,17 +63,17 @@ public class BrokerBalancerManagerTest {
    @Test(expected = IllegalStateException.class)
    public void deployLocalOnlyPoolInvalid() throws Exception {
 
-      BrokerBalancerConfiguration brokerBalancerConfiguration = new BrokerBalancerConfiguration();
-      brokerBalancerConfiguration.setName("partition-local-pool");
+      ConnectionRouterConfiguration connectionRouterConfiguration = new ConnectionRouterConfiguration();
+      connectionRouterConfiguration.setName("partition-local-pool");
       NamedPropertyConfiguration policyConfig = new NamedPropertyConfiguration();
       policyConfig.setName(ConsistentHashPolicy.NAME);
-      brokerBalancerConfiguration.setPolicyConfiguration(policyConfig);
+      connectionRouterConfiguration.setPolicyConfiguration(policyConfig);
 
       PoolConfiguration poolConfiguration = new PoolConfiguration();
       poolConfiguration.setLocalTargetEnabled(true);
-      brokerBalancerConfiguration.setPoolConfiguration(poolConfiguration);
+      connectionRouterConfiguration.setPoolConfiguration(poolConfiguration);
 
-      underTest.deployBrokerBalancer(brokerBalancerConfiguration);
+      underTest.deployConnectionRouter(connectionRouterConfiguration);
    }
 
    @Test
@@ -83,10 +82,10 @@ public class BrokerBalancerManagerTest {
       ManagementService mockManagementService = Mockito.mock(ManagementService.class);
       Mockito.when(mockServer.getManagementService()).thenReturn(mockManagementService);
 
-      BrokerBalancerConfiguration brokerBalancerConfiguration = new BrokerBalancerConfiguration();
-      brokerBalancerConfiguration.setName("partition-local-pool");
+      ConnectionRouterConfiguration connectionRouterConfiguration = new ConnectionRouterConfiguration();
+      connectionRouterConfiguration.setName("partition-local-pool");
 
-      underTest.deployBrokerBalancer(brokerBalancerConfiguration);
+      underTest.deployConnectionRouter(connectionRouterConfiguration);
    }
 
    @Test()
@@ -95,16 +94,16 @@ public class BrokerBalancerManagerTest {
       ManagementService mockManagementService = Mockito.mock(ManagementService.class);
       Mockito.when(mockServer.getManagementService()).thenReturn(mockManagementService);
 
-      BrokerBalancerConfiguration brokerBalancerConfiguration = new BrokerBalancerConfiguration();
-      brokerBalancerConfiguration.setName("partition-local-consistent-hash").setTargetKey(TargetKey.CLIENT_ID).setLocalTargetFilter(String.valueOf(2));
+      ConnectionRouterConfiguration connectionRouterConfiguration = new ConnectionRouterConfiguration();
+      connectionRouterConfiguration.setName("partition-local-consistent-hash").setKeyType(KeyType.CLIENT_ID).setLocalTargetFilter(String.valueOf(2));
       NamedPropertyConfiguration policyConfig = new NamedPropertyConfiguration();
       policyConfig.setName(ConsistentHashModulo.NAME);
       HashMap<String, String> properties = new HashMap<>();
       properties.put(ConsistentHashModulo.MODULO, String.valueOf(2));
       policyConfig.setProperties(properties);
-      brokerBalancerConfiguration.setTransformerConfiguration(policyConfig);
+      connectionRouterConfiguration.setTransformerConfiguration(policyConfig);
 
 
-      underTest.deployBrokerBalancer(brokerBalancerConfiguration);
+      underTest.deployConnectionRouter(connectionRouterConfiguration);
    }
 }
\ No newline at end of file
diff --git a/artemis-server/src/test/java/org/apache/activemq/artemis/core/server/balancing/BrokerBalancerTest.java b/artemis-server/src/test/java/org/apache/activemq/artemis/core/server/routing/ConnectionRouterTest.java
similarity index 75%
rename from artemis-server/src/test/java/org/apache/activemq/artemis/core/server/balancing/BrokerBalancerTest.java
rename to artemis-server/src/test/java/org/apache/activemq/artemis/core/server/routing/ConnectionRouterTest.java
index fc6acc9..28d2739 100644
--- a/artemis-server/src/test/java/org/apache/activemq/artemis/core/server/balancing/BrokerBalancerTest.java
+++ b/artemis-server/src/test/java/org/apache/activemq/artemis/core/server/routing/ConnectionRouterTest.java
@@ -15,20 +15,19 @@
  * limitations under the License.
  */
 
-package org.apache.activemq.artemis.core.server.balancing;
+package org.apache.activemq.artemis.core.server.routing;
 
 import static org.junit.Assert.assertEquals;
 import static org.mockito.Mockito.mock;
 
 import org.apache.activemq.artemis.api.core.SimpleString;
 import org.apache.activemq.artemis.core.server.ActiveMQServer;
-import org.apache.activemq.artemis.core.server.balancing.policies.Policy;
-import org.apache.activemq.artemis.core.server.balancing.pools.Pool;
-import org.apache.activemq.artemis.core.server.balancing.targets.LocalTarget;
-import org.apache.activemq.artemis.core.server.balancing.targets.Target;
-import org.apache.activemq.artemis.core.server.balancing.targets.TargetKey;
-import org.apache.activemq.artemis.core.server.balancing.targets.TargetResult;
-import org.apache.activemq.artemis.core.server.balancing.transformer.KeyTransformer;
+import org.apache.activemq.artemis.core.server.routing.policies.Policy;
+import org.apache.activemq.artemis.core.server.routing.pools.Pool;
+import org.apache.activemq.artemis.core.server.routing.targets.LocalTarget;
+import org.apache.activemq.artemis.core.server.routing.targets.Target;
+import org.apache.activemq.artemis.core.server.routing.targets.TargetResult;
+import org.apache.activemq.artemis.core.server.routing.transformer.KeyTransformer;
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
@@ -36,10 +35,10 @@ import org.mockito.Mockito;
 import org.mockito.junit.MockitoJUnitRunner;
 
 @RunWith(MockitoJUnitRunner.class)
-public class BrokerBalancerTest {
+public class ConnectionRouterTest {
 
    Target localTarget;
-   BrokerBalancer underTest;
+   ConnectionRouter underTest;
 
    @Before
    public void setUp() {
@@ -52,7 +51,7 @@ public class BrokerBalancerTest {
    public void getTarget() {
       Pool pool = null;
       Policy policy = null;
-      underTest  = new BrokerBalancer("test", TargetKey.CLIENT_ID, "^.{3}",
+      underTest  = new ConnectionRouter("test", KeyType.CLIENT_ID, "^.{3}",
                                       localTarget, "^FOO.*", null, pool, policy, null);
       assertEquals( localTarget, underTest.getTarget("FOO_EE").getTarget());
       assertEquals(TargetResult.REFUSED_USE_ANOTHER_RESULT, underTest.getTarget("BAR_EE"));
@@ -68,7 +67,7 @@ public class BrokerBalancerTest {
             return key.substring("TRANSFORM_TO".length() + 1);
          }
       };
-      underTest  = new BrokerBalancer("test", TargetKey.CLIENT_ID, "^.{3}",
+      underTest  = new ConnectionRouter("test", KeyType.CLIENT_ID, "^.{3}",
                                       localTarget, "^FOO.*", null, pool, policy, keyTransformer);
       assertEquals( localTarget, underTest.getTarget("TRANSFORM_TO_FOO_EE").getTarget());
    }
diff --git a/artemis-server/src/test/java/org/apache/activemq/artemis/core/server/balancing/caches/LocalCacheTest.java b/artemis-server/src/test/java/org/apache/activemq/artemis/core/server/routing/caches/LocalCacheTest.java
similarity index 98%
rename from artemis-server/src/test/java/org/apache/activemq/artemis/core/server/balancing/caches/LocalCacheTest.java
rename to artemis-server/src/test/java/org/apache/activemq/artemis/core/server/routing/caches/LocalCacheTest.java
index 5fc3f3b..4199c1d 100644
--- a/artemis-server/src/test/java/org/apache/activemq/artemis/core/server/balancing/caches/LocalCacheTest.java
+++ b/artemis-server/src/test/java/org/apache/activemq/artemis/core/server/routing/caches/LocalCacheTest.java
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-package org.apache.activemq.artemis.core.server.balancing.caches;
+package org.apache.activemq.artemis.core.server.routing.caches;
 
 import org.apache.activemq.artemis.core.persistence.StorageManager;
 import org.apache.activemq.artemis.core.persistence.config.PersistedKeyValuePair;
diff --git a/artemis-server/src/test/java/org/apache/activemq/artemis/core/server/balancing/policies/ConsistentHashPolicyTest.java b/artemis-server/src/test/java/org/apache/activemq/artemis/core/server/routing/policies/ConsistentHashPolicyTest.java
similarity index 88%
rename from artemis-server/src/test/java/org/apache/activemq/artemis/core/server/balancing/policies/ConsistentHashPolicyTest.java
rename to artemis-server/src/test/java/org/apache/activemq/artemis/core/server/routing/policies/ConsistentHashPolicyTest.java
index d81677e..6d6a482 100644
--- a/artemis-server/src/test/java/org/apache/activemq/artemis/core/server/balancing/policies/ConsistentHashPolicyTest.java
+++ b/artemis-server/src/test/java/org/apache/activemq/artemis/core/server/routing/policies/ConsistentHashPolicyTest.java
@@ -15,10 +15,10 @@
  * limitations under the License.
  */
 
-package org.apache.activemq.artemis.core.server.balancing.policies;
+package org.apache.activemq.artemis.core.server.routing.policies;
 
-import org.apache.activemq.artemis.core.server.balancing.targets.MockTarget;
-import org.apache.activemq.artemis.core.server.balancing.targets.Target;
+import org.apache.activemq.artemis.core.server.routing.targets.MockTarget;
+import org.apache.activemq.artemis.core.server.routing.targets.Target;
 import org.junit.Assert;
 import org.junit.Test;
 
diff --git a/artemis-server/src/test/java/org/apache/activemq/artemis/core/server/balancing/policies/FirstElementPolicyTest.java b/artemis-server/src/test/java/org/apache/activemq/artemis/core/server/routing/policies/FirstElementPolicyTest.java
similarity index 86%
rename from artemis-server/src/test/java/org/apache/activemq/artemis/core/server/balancing/policies/FirstElementPolicyTest.java
rename to artemis-server/src/test/java/org/apache/activemq/artemis/core/server/routing/policies/FirstElementPolicyTest.java
index b84c8e0..5ea1a03 100644
--- a/artemis-server/src/test/java/org/apache/activemq/artemis/core/server/balancing/policies/FirstElementPolicyTest.java
+++ b/artemis-server/src/test/java/org/apache/activemq/artemis/core/server/routing/policies/FirstElementPolicyTest.java
@@ -15,10 +15,10 @@
  * limitations under the License.
  */
 
-package org.apache.activemq.artemis.core.server.balancing.policies;
+package org.apache.activemq.artemis.core.server.routing.policies;
 
-import org.apache.activemq.artemis.core.server.balancing.targets.MockTarget;
-import org.apache.activemq.artemis.core.server.balancing.targets.Target;
+import org.apache.activemq.artemis.core.server.routing.targets.MockTarget;
+import org.apache.activemq.artemis.core.server.routing.targets.Target;
 import org.junit.Assert;
 import org.junit.Test;
 
diff --git a/artemis-server/src/test/java/org/apache/activemq/artemis/core/server/balancing/policies/LeastConnectionsPolicyTest.java b/artemis-server/src/test/java/org/apache/activemq/artemis/core/server/routing/policies/LeastConnectionsPolicyTest.java
similarity index 93%
rename from artemis-server/src/test/java/org/apache/activemq/artemis/core/server/balancing/policies/LeastConnectionsPolicyTest.java
rename to artemis-server/src/test/java/org/apache/activemq/artemis/core/server/routing/policies/LeastConnectionsPolicyTest.java
index b272f49..c883e32 100644
--- a/artemis-server/src/test/java/org/apache/activemq/artemis/core/server/balancing/policies/LeastConnectionsPolicyTest.java
+++ b/artemis-server/src/test/java/org/apache/activemq/artemis/core/server/routing/policies/LeastConnectionsPolicyTest.java
@@ -15,10 +15,10 @@
  * limitations under the License.
  */
 
-package org.apache.activemq.artemis.core.server.balancing.policies;
+package org.apache.activemq.artemis.core.server.routing.policies;
 
-import org.apache.activemq.artemis.core.server.balancing.targets.MockTarget;
-import org.apache.activemq.artemis.core.server.balancing.targets.Target;
+import org.apache.activemq.artemis.core.server.routing.targets.MockTarget;
+import org.apache.activemq.artemis.core.server.routing.targets.Target;
 import org.junit.Assert;
 import org.junit.Test;
 
diff --git a/artemis-server/src/test/java/org/apache/activemq/artemis/core/server/balancing/policies/PolicyFactoryResolverTest.java b/artemis-server/src/test/java/org/apache/activemq/artemis/core/server/routing/policies/PolicyFactoryResolverTest.java
similarity index 95%
rename from artemis-server/src/test/java/org/apache/activemq/artemis/core/server/balancing/policies/PolicyFactoryResolverTest.java
rename to artemis-server/src/test/java/org/apache/activemq/artemis/core/server/routing/policies/PolicyFactoryResolverTest.java
index 0804ba4..cdd7864 100644
--- a/artemis-server/src/test/java/org/apache/activemq/artemis/core/server/balancing/policies/PolicyFactoryResolverTest.java
+++ b/artemis-server/src/test/java/org/apache/activemq/artemis/core/server/routing/policies/PolicyFactoryResolverTest.java
@@ -14,7 +14,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.activemq.artemis.core.server.balancing.policies;
+package org.apache.activemq.artemis.core.server.routing.policies;
 
 import org.junit.Test;
 
diff --git a/artemis-server/src/test/java/org/apache/activemq/artemis/core/server/balancing/policies/PolicyTestBase.java b/artemis-server/src/test/java/org/apache/activemq/artemis/core/server/routing/policies/PolicyTestBase.java
similarity index 88%
rename from artemis-server/src/test/java/org/apache/activemq/artemis/core/server/balancing/policies/PolicyTestBase.java
rename to artemis-server/src/test/java/org/apache/activemq/artemis/core/server/routing/policies/PolicyTestBase.java
index 962010b..bc12380 100644
--- a/artemis-server/src/test/java/org/apache/activemq/artemis/core/server/balancing/policies/PolicyTestBase.java
+++ b/artemis-server/src/test/java/org/apache/activemq/artemis/core/server/routing/policies/PolicyTestBase.java
@@ -15,10 +15,10 @@
  * limitations under the License.
  */
 
-package org.apache.activemq.artemis.core.server.balancing.policies;
+package org.apache.activemq.artemis.core.server.routing.policies;
 
-import org.apache.activemq.artemis.core.server.balancing.targets.MockTarget;
-import org.apache.activemq.artemis.core.server.balancing.targets.Target;
+import org.apache.activemq.artemis.core.server.routing.targets.MockTarget;
+import org.apache.activemq.artemis.core.server.routing.targets.Target;
 import org.junit.Assert;
 import org.junit.Test;
 
diff --git a/artemis-server/src/test/java/org/apache/activemq/artemis/core/server/balancing/policies/RoundRobinPolicyTest.java b/artemis-server/src/test/java/org/apache/activemq/artemis/core/server/routing/policies/RoundRobinPolicyTest.java
similarity index 89%
rename from artemis-server/src/test/java/org/apache/activemq/artemis/core/server/balancing/policies/RoundRobinPolicyTest.java
rename to artemis-server/src/test/java/org/apache/activemq/artemis/core/server/routing/policies/RoundRobinPolicyTest.java
index 70b7b74..40ea9f1 100644
--- a/artemis-server/src/test/java/org/apache/activemq/artemis/core/server/balancing/policies/RoundRobinPolicyTest.java
+++ b/artemis-server/src/test/java/org/apache/activemq/artemis/core/server/routing/policies/RoundRobinPolicyTest.java
@@ -15,10 +15,10 @@
  * limitations under the License.
  */
 
-package org.apache.activemq.artemis.core.server.balancing.policies;
+package org.apache.activemq.artemis.core.server.routing.policies;
 
-import org.apache.activemq.artemis.core.server.balancing.targets.MockTarget;
-import org.apache.activemq.artemis.core.server.balancing.targets.Target;
+import org.apache.activemq.artemis.core.server.routing.targets.MockTarget;
+import org.apache.activemq.artemis.core.server.routing.targets.Target;
 import org.junit.Assert;
 import org.junit.Test;
 
diff --git a/artemis-server/src/test/java/org/apache/activemq/artemis/core/server/balancing/pools/DiscoveryPoolTest.java b/artemis-server/src/test/java/org/apache/activemq/artemis/core/server/routing/pools/DiscoveryPoolTest.java
similarity index 96%
rename from artemis-server/src/test/java/org/apache/activemq/artemis/core/server/balancing/pools/DiscoveryPoolTest.java
rename to artemis-server/src/test/java/org/apache/activemq/artemis/core/server/routing/pools/DiscoveryPoolTest.java
index d1b331d..c737095 100644
--- a/artemis-server/src/test/java/org/apache/activemq/artemis/core/server/balancing/pools/DiscoveryPoolTest.java
+++ b/artemis-server/src/test/java/org/apache/activemq/artemis/core/server/routing/pools/DiscoveryPoolTest.java
@@ -15,11 +15,11 @@
  * limitations under the License.
  */
 
-package org.apache.activemq.artemis.core.server.balancing.pools;
+package org.apache.activemq.artemis.core.server.routing.pools;
 
-import org.apache.activemq.artemis.core.server.balancing.targets.MockTargetFactory;
-import org.apache.activemq.artemis.core.server.balancing.targets.MockTargetProbe;
-import org.apache.activemq.artemis.core.server.balancing.targets.TargetFactory;
+import org.apache.activemq.artemis.core.server.routing.targets.MockTargetFactory;
+import org.apache.activemq.artemis.core.server.routing.targets.MockTargetProbe;
+import org.apache.activemq.artemis.core.server.routing.targets.TargetFactory;
 import org.apache.activemq.artemis.utils.Wait;
 import org.junit.Assert;
 import org.junit.Test;
diff --git a/artemis-server/src/test/java/org/apache/activemq/artemis/core/server/balancing/pools/MockDiscoveryService.java b/artemis-server/src/test/java/org/apache/activemq/artemis/core/server/routing/pools/MockDiscoveryService.java
similarity index 97%
rename from artemis-server/src/test/java/org/apache/activemq/artemis/core/server/balancing/pools/MockDiscoveryService.java
rename to artemis-server/src/test/java/org/apache/activemq/artemis/core/server/routing/pools/MockDiscoveryService.java
index f9d1982..7902d18 100644
--- a/artemis-server/src/test/java/org/apache/activemq/artemis/core/server/balancing/pools/MockDiscoveryService.java
+++ b/artemis-server/src/test/java/org/apache/activemq/artemis/core/server/routing/pools/MockDiscoveryService.java
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-package org.apache.activemq.artemis.core.server.balancing.pools;
+package org.apache.activemq.artemis.core.server.routing.pools;
 
 import org.apache.activemq.artemis.api.core.TransportConfiguration;
 
diff --git a/artemis-server/src/test/java/org/apache/activemq/artemis/core/server/balancing/pools/PoolTestBase.java b/artemis-server/src/test/java/org/apache/activemq/artemis/core/server/routing/pools/PoolTestBase.java
similarity index 95%
rename from artemis-server/src/test/java/org/apache/activemq/artemis/core/server/balancing/pools/PoolTestBase.java
rename to artemis-server/src/test/java/org/apache/activemq/artemis/core/server/routing/pools/PoolTestBase.java
index 92af5c0..7068b84 100644
--- a/artemis-server/src/test/java/org/apache/activemq/artemis/core/server/balancing/pools/PoolTestBase.java
+++ b/artemis-server/src/test/java/org/apache/activemq/artemis/core/server/routing/pools/PoolTestBase.java
@@ -15,11 +15,11 @@
  * limitations under the License.
  */
 
-package org.apache.activemq.artemis.core.server.balancing.pools;
+package org.apache.activemq.artemis.core.server.routing.pools;
 
-import org.apache.activemq.artemis.core.server.balancing.targets.MockTargetFactory;
-import org.apache.activemq.artemis.core.server.balancing.targets.MockTargetProbe;
-import org.apache.activemq.artemis.core.server.balancing.targets.TargetFactory;
+import org.apache.activemq.artemis.core.server.routing.targets.MockTargetFactory;
+import org.apache.activemq.artemis.core.server.routing.targets.MockTargetProbe;
+import org.apache.activemq.artemis.core.server.routing.targets.TargetFactory;
 import org.apache.activemq.artemis.utils.Wait;
 import org.junit.Assert;
 import org.junit.Test;
diff --git a/artemis-server/src/test/java/org/apache/activemq/artemis/core/server/balancing/pools/StaticPoolTest.java b/artemis-server/src/test/java/org/apache/activemq/artemis/core/server/routing/pools/StaticPoolTest.java
similarity index 90%
rename from artemis-server/src/test/java/org/apache/activemq/artemis/core/server/balancing/pools/StaticPoolTest.java
rename to artemis-server/src/test/java/org/apache/activemq/artemis/core/server/routing/pools/StaticPoolTest.java
index 6a48907..fbefa01 100644
--- a/artemis-server/src/test/java/org/apache/activemq/artemis/core/server/balancing/pools/StaticPoolTest.java
+++ b/artemis-server/src/test/java/org/apache/activemq/artemis/core/server/routing/pools/StaticPoolTest.java
@@ -15,10 +15,10 @@
  * limitations under the License.
  */
 
-package org.apache.activemq.artemis.core.server.balancing.pools;
+package org.apache.activemq.artemis.core.server.routing.pools;
 
 import org.apache.activemq.artemis.api.core.TransportConfiguration;
-import org.apache.activemq.artemis.core.server.balancing.targets.TargetFactory;
+import org.apache.activemq.artemis.core.server.routing.targets.TargetFactory;
 
 import java.util.ArrayList;
 import java.util.List;
diff --git a/artemis-server/src/test/java/org/apache/activemq/artemis/core/server/balancing/targets/TargetKeyResolverTest.java b/artemis-server/src/test/java/org/apache/activemq/artemis/core/server/routing/targets/KeyTypeResolverTest.java
similarity index 60%
rename from artemis-server/src/test/java/org/apache/activemq/artemis/core/server/balancing/targets/TargetKeyResolverTest.java
rename to artemis-server/src/test/java/org/apache/activemq/artemis/core/server/routing/targets/KeyTypeResolverTest.java
index df741f0..77f294f 100644
--- a/artemis-server/src/test/java/org/apache/activemq/artemis/core/server/balancing/targets/TargetKeyResolverTest.java
+++ b/artemis-server/src/test/java/org/apache/activemq/artemis/core/server/routing/targets/KeyTypeResolverTest.java
@@ -15,13 +15,15 @@
  * limitations under the License.
  */
 
-package org.apache.activemq.artemis.core.server.balancing.targets;
+package org.apache.activemq.artemis.core.server.routing.targets;
 
 import javax.security.auth.Subject;
 
 import java.util.HashSet;
 import java.util.Set;
 
+import org.apache.activemq.artemis.core.server.routing.KeyResolver;
+import org.apache.activemq.artemis.core.server.routing.KeyType;
 import org.apache.activemq.artemis.spi.core.protocol.RemotingConnection;
 import org.apache.activemq.artemis.spi.core.remoting.Connection;
 import org.apache.activemq.artemis.spi.core.security.jaas.RolePrincipal;
@@ -30,7 +32,7 @@ import org.junit.Assert;
 import org.junit.Test;
 import org.mockito.Mockito;
 
-public class TargetKeyResolverTest {
+public class KeyTypeResolverTest {
 
    @Test
    public void testClientIDKey() {
@@ -43,11 +45,11 @@ public class TargetKeyResolverTest {
    }
 
    private void testClientIDKey(String expected, String clientID, String filter) {
-      TargetKeyResolver targetKeyResolver = new TargetKeyResolver(TargetKey.CLIENT_ID, filter);
+      KeyResolver keyResolver = new KeyResolver(KeyType.CLIENT_ID, filter);
 
-      Assert.assertEquals(expected, targetKeyResolver.resolve(null, clientID, null));
+      Assert.assertEquals(expected, keyResolver.resolve(null, clientID, null));
 
-      Assert.assertEquals(TargetKeyResolver.DEFAULT_KEY_VALUE, targetKeyResolver.resolve(null, null, null));
+      Assert.assertEquals(KeyResolver.DEFAULT_KEY_VALUE, keyResolver.resolve(null, null, null));
    }
 
    @Test
@@ -63,15 +65,15 @@ public class TargetKeyResolverTest {
    private void testSNIHostKey(String expected, String sniHost, String filter) {
       Connection connection = Mockito.mock(Connection.class);
 
-      TargetKeyResolver targetKeyResolver = new TargetKeyResolver(TargetKey.SNI_HOST, filter);
+      KeyResolver keyResolver = new KeyResolver(KeyType.SNI_HOST, filter);
 
       Mockito.when(connection.getSNIHostName()).thenReturn(sniHost);
-      Assert.assertEquals(expected, targetKeyResolver.resolve(connection, null, null));
+      Assert.assertEquals(expected, keyResolver.resolve(connection, null, null));
 
-      Assert.assertEquals(TargetKeyResolver.DEFAULT_KEY_VALUE, targetKeyResolver.resolve(null, null, null));
+      Assert.assertEquals(KeyResolver.DEFAULT_KEY_VALUE, keyResolver.resolve(null, null, null));
 
       Mockito.when(connection.getSNIHostName()).thenReturn(null);
-      Assert.assertEquals(TargetKeyResolver.DEFAULT_KEY_VALUE, targetKeyResolver.resolve(null, null, null));
+      Assert.assertEquals(KeyResolver.DEFAULT_KEY_VALUE, keyResolver.resolve(null, null, null));
    }
 
    @Test
@@ -87,15 +89,15 @@ public class TargetKeyResolverTest {
    private void testSourceIPKey(String expected, String remoteAddress, String filter) {
       Connection connection = Mockito.mock(Connection.class);
 
-      TargetKeyResolver targetKeyResolver = new TargetKeyResolver(TargetKey.SOURCE_IP, filter);
+      KeyResolver keyResolver = new KeyResolver(KeyType.SOURCE_IP, filter);
 
       Mockito.when(connection.getRemoteAddress()).thenReturn(remoteAddress);
-      Assert.assertEquals(expected, targetKeyResolver.resolve(connection, null, null));
+      Assert.assertEquals(expected, keyResolver.resolve(connection, null, null));
 
-      Assert.assertEquals(TargetKeyResolver.DEFAULT_KEY_VALUE, targetKeyResolver.resolve(null, null, null));
+      Assert.assertEquals(KeyResolver.DEFAULT_KEY_VALUE, keyResolver.resolve(null, null, null));
 
       Mockito.when(connection.getRemoteAddress()).thenReturn(null);
-      Assert.assertEquals(TargetKeyResolver.DEFAULT_KEY_VALUE, targetKeyResolver.resolve(null, null, null));
+      Assert.assertEquals(KeyResolver.DEFAULT_KEY_VALUE, keyResolver.resolve(null, null, null));
    }
 
    @Test
@@ -109,71 +111,71 @@ public class TargetKeyResolverTest {
    }
 
    private void testUserNameKey(String expected, String username, String filter) {
-      TargetKeyResolver targetKeyResolver = new TargetKeyResolver(TargetKey.USER_NAME, filter);
+      KeyResolver keyResolver = new KeyResolver(KeyType.USER_NAME, filter);
 
-      Assert.assertEquals(expected, targetKeyResolver.resolve(null, null, username));
+      Assert.assertEquals(expected, keyResolver.resolve(null, null, username));
 
-      Assert.assertEquals(TargetKeyResolver.DEFAULT_KEY_VALUE, targetKeyResolver.resolve(null, null, null));
+      Assert.assertEquals(KeyResolver.DEFAULT_KEY_VALUE, keyResolver.resolve(null, null, null));
    }
 
    @Test
    public void testRoleNameKeyWithFilter() throws Exception {
-      TargetKeyResolver targetKeyResolver = new TargetKeyResolver(TargetKey.ROLE_NAME, "B");
+      KeyResolver keyResolver = new KeyResolver(KeyType.ROLE_NAME, "B");
 
       Connection connection = Mockito.mock(Connection.class);
-      Assert.assertEquals(TargetKeyResolver.DEFAULT_KEY_VALUE, targetKeyResolver.resolve(connection, null, null));
+      Assert.assertEquals(KeyResolver.DEFAULT_KEY_VALUE, keyResolver.resolve(connection, null, null));
 
       RemotingConnection protocolConnection = Mockito.mock(RemotingConnection.class);
       Mockito.when(connection.getProtocolConnection()).thenReturn(protocolConnection);
       Subject subject = Mockito.mock(Subject.class);
       Mockito.when(protocolConnection.getAuditSubject()).thenReturn(subject);
 
-      Assert.assertEquals(TargetKeyResolver.DEFAULT_KEY_VALUE, targetKeyResolver.resolve(connection, null, null));
+      Assert.assertEquals(KeyResolver.DEFAULT_KEY_VALUE, keyResolver.resolve(connection, null, null));
 
       Set<RolePrincipal> rolePrincipals = new HashSet<>();
       Mockito.when(subject.getPrincipals(RolePrincipal.class)).thenReturn(rolePrincipals);
 
-      Assert.assertEquals(TargetKeyResolver.DEFAULT_KEY_VALUE, targetKeyResolver.resolve(connection, null, null));
+      Assert.assertEquals(KeyResolver.DEFAULT_KEY_VALUE, keyResolver.resolve(connection, null, null));
 
       rolePrincipals.add(new RolePrincipal("A"));
 
-      Assert.assertEquals(TargetKeyResolver.DEFAULT_KEY_VALUE, targetKeyResolver.resolve(connection, null, null));
+      Assert.assertEquals(KeyResolver.DEFAULT_KEY_VALUE, keyResolver.resolve(connection, null, null));
 
       rolePrincipals.add(new RolePrincipal("B"));
 
-      Assert.assertEquals("B", targetKeyResolver.resolve(connection, null, null));
+      Assert.assertEquals("B", keyResolver.resolve(connection, null, null));
    }
 
    @Test
    public void testRoleNameKeyWithoutFilter() throws Exception {
-      TargetKeyResolver targetKeyResolver = new TargetKeyResolver(TargetKey.ROLE_NAME, null);
+      KeyResolver keyResolver = new KeyResolver(KeyType.ROLE_NAME, null);
 
       Connection connection = Mockito.mock(Connection.class);
-      Assert.assertEquals(TargetKeyResolver.DEFAULT_KEY_VALUE, targetKeyResolver.resolve(connection, null, null));
+      Assert.assertEquals(KeyResolver.DEFAULT_KEY_VALUE, keyResolver.resolve(connection, null, null));
 
       RemotingConnection protocolConnection = Mockito.mock(RemotingConnection.class);
       Mockito.when(connection.getProtocolConnection()).thenReturn(protocolConnection);
       Subject subject = Mockito.mock(Subject.class);
       Mockito.when(protocolConnection.getAuditSubject()).thenReturn(subject);
 
-      Assert.assertEquals(TargetKeyResolver.DEFAULT_KEY_VALUE, targetKeyResolver.resolve(connection, null, null));
+      Assert.assertEquals(KeyResolver.DEFAULT_KEY_VALUE, keyResolver.resolve(connection, null, null));
 
       Set<RolePrincipal> rolePrincipals = new ListOrderedSet();
       Mockito.when(subject.getPrincipals(RolePrincipal.class)).thenReturn(rolePrincipals);
 
-      Assert.assertEquals(TargetKeyResolver.DEFAULT_KEY_VALUE, targetKeyResolver.resolve(connection, null, null));
+      Assert.assertEquals(KeyResolver.DEFAULT_KEY_VALUE, keyResolver.resolve(connection, null, null));
 
       final RolePrincipal roleA = new RolePrincipal("A");
       rolePrincipals.add(roleA);
 
-      Assert.assertEquals("A", targetKeyResolver.resolve(connection, null, null));
+      Assert.assertEquals("A", keyResolver.resolve(connection, null, null));
 
       rolePrincipals.add(new RolePrincipal("B"));
 
-      Assert.assertEquals("A", targetKeyResolver.resolve(connection, null, null));
+      Assert.assertEquals("A", keyResolver.resolve(connection, null, null));
 
       rolePrincipals.remove(roleA);
       // with no filter, the first entry matches
-      Assert.assertEquals("B", targetKeyResolver.resolve(connection, null, null));
+      Assert.assertEquals("B", keyResolver.resolve(connection, null, null));
    }
 }
diff --git a/artemis-server/src/test/java/org/apache/activemq/artemis/core/server/balancing/targets/MockTarget.java b/artemis-server/src/test/java/org/apache/activemq/artemis/core/server/routing/targets/MockTarget.java
similarity index 98%
rename from artemis-server/src/test/java/org/apache/activemq/artemis/core/server/balancing/targets/MockTarget.java
rename to artemis-server/src/test/java/org/apache/activemq/artemis/core/server/routing/targets/MockTarget.java
index 972c878..0d2df3c 100644
--- a/artemis-server/src/test/java/org/apache/activemq/artemis/core/server/balancing/targets/MockTarget.java
+++ b/artemis-server/src/test/java/org/apache/activemq/artemis/core/server/routing/targets/MockTarget.java
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-package org.apache.activemq.artemis.core.server.balancing.targets;
+package org.apache.activemq.artemis.core.server.routing.targets;
 
 import org.apache.activemq.artemis.api.core.TransportConfiguration;
 
diff --git a/artemis-server/src/test/java/org/apache/activemq/artemis/core/server/balancing/targets/MockTargetFactory.java b/artemis-server/src/test/java/org/apache/activemq/artemis/core/server/routing/targets/MockTargetFactory.java
similarity index 97%
rename from artemis-server/src/test/java/org/apache/activemq/artemis/core/server/balancing/targets/MockTargetFactory.java
rename to artemis-server/src/test/java/org/apache/activemq/artemis/core/server/routing/targets/MockTargetFactory.java
index e0e0933..8a1f537 100644
--- a/artemis-server/src/test/java/org/apache/activemq/artemis/core/server/balancing/targets/MockTargetFactory.java
+++ b/artemis-server/src/test/java/org/apache/activemq/artemis/core/server/routing/targets/MockTargetFactory.java
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-package org.apache.activemq.artemis.core.server.balancing.targets;
+package org.apache.activemq.artemis.core.server.routing.targets;
 
 import org.apache.activemq.artemis.api.core.TransportConfiguration;
 
diff --git a/artemis-server/src/test/java/org/apache/activemq/artemis/core/server/balancing/targets/MockTargetProbe.java b/artemis-server/src/test/java/org/apache/activemq/artemis/core/server/routing/targets/MockTargetProbe.java
similarity index 96%
rename from artemis-server/src/test/java/org/apache/activemq/artemis/core/server/balancing/targets/MockTargetProbe.java
rename to artemis-server/src/test/java/org/apache/activemq/artemis/core/server/routing/targets/MockTargetProbe.java
index e429259..f227080 100644
--- a/artemis-server/src/test/java/org/apache/activemq/artemis/core/server/balancing/targets/MockTargetProbe.java
+++ b/artemis-server/src/test/java/org/apache/activemq/artemis/core/server/routing/targets/MockTargetProbe.java
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-package org.apache.activemq.artemis.core.server.balancing.targets;
+package org.apache.activemq.artemis.core.server.routing.targets;
 
 import java.util.Map;
 import java.util.concurrent.ConcurrentHashMap;
diff --git a/artemis-server/src/test/java/org/apache/activemq/artemis/core/server/balancing/transformer/ConsistentHashModuloTest.java b/artemis-server/src/test/java/org/apache/activemq/artemis/core/server/routing/transformer/ConsistentHashModuloTest.java
similarity index 86%
rename from artemis-server/src/test/java/org/apache/activemq/artemis/core/server/balancing/transformer/ConsistentHashModuloTest.java
rename to artemis-server/src/test/java/org/apache/activemq/artemis/core/server/routing/transformer/ConsistentHashModuloTest.java
index 137181b..9eb1696 100644
--- a/artemis-server/src/test/java/org/apache/activemq/artemis/core/server/balancing/transformer/ConsistentHashModuloTest.java
+++ b/artemis-server/src/test/java/org/apache/activemq/artemis/core/server/routing/transformer/ConsistentHashModuloTest.java
@@ -15,11 +15,11 @@
  * limitations under the License.
  */
 
-package org.apache.activemq.artemis.core.server.balancing.transformer;
+package org.apache.activemq.artemis.core.server.routing.transformer;
 
 import java.util.HashMap;
 
-import org.apache.activemq.artemis.core.server.balancing.targets.TargetKeyResolver;
+import org.apache.activemq.artemis.core.server.routing.KeyResolver;
 import org.junit.Test;
 
 import static org.junit.Assert.assertEquals;
@@ -32,7 +32,7 @@ public class ConsistentHashModuloTest {
    public void transform() {
       ConsistentHashModulo underTest = new ConsistentHashModulo();
 
-      assertEquals(TargetKeyResolver.DEFAULT_KEY_VALUE, underTest.transform(TargetKeyResolver.DEFAULT_KEY_VALUE));
+      assertEquals(KeyResolver.DEFAULT_KEY_VALUE, underTest.transform(KeyResolver.DEFAULT_KEY_VALUE));
 
       assertEquals("AA", underTest.transform("AA")); // default modulo 0 does nothing
 
diff --git a/artemis-server/src/test/java/org/apache/activemq/artemis/core/server/balancing/transformer/TransformerFactoryResolverTest.java b/artemis-server/src/test/java/org/apache/activemq/artemis/core/server/routing/transformer/TransformerFactoryResolverTest.java
similarity index 95%
rename from artemis-server/src/test/java/org/apache/activemq/artemis/core/server/balancing/transformer/TransformerFactoryResolverTest.java
rename to artemis-server/src/test/java/org/apache/activemq/artemis/core/server/routing/transformer/TransformerFactoryResolverTest.java
index d102da1..d157ee1 100644
--- a/artemis-server/src/test/java/org/apache/activemq/artemis/core/server/balancing/transformer/TransformerFactoryResolverTest.java
+++ b/artemis-server/src/test/java/org/apache/activemq/artemis/core/server/routing/transformer/TransformerFactoryResolverTest.java
@@ -14,7 +14,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.activemq.artemis.core.server.balancing.transformer;
+package org.apache.activemq.artemis.core.server.routing.transformer;
 
 import org.junit.Test;
 
diff --git a/artemis-server/src/test/resources/ConfigurationTest-full-config.xml b/artemis-server/src/test/resources/ConfigurationTest-full-config.xml
index c2abdc8..1c991ee 100644
--- a/artemis-server/src/test/resources/ConfigurationTest-full-config.xml
+++ b/artemis-server/src/test/resources/ConfigurationTest-full-config.xml
@@ -154,32 +154,32 @@
             <exclusive>false</exclusive>
          </divert>
       </diverts>
-      <broker-balancers>
-         <broker-balancer name="simple-local">
-            <target-key>CLIENT_ID</target-key>
-            <target-key-filter>^[^.]+</target-key-filter>
+      <connection-routers>
+         <connection-router name="simple-local">
+            <key-type>CLIENT_ID</key-type>
+            <key-filter>^[^.]+</key-filter>
             <local-target-filter>DEFAULT</local-target-filter>
-         </broker-balancer>
-         <broker-balancer name="simple-local-with-transformer">
-            <target-key>CLIENT_ID</target-key>
-            <target-key-filter>^[^.]+</target-key-filter>
+         </connection-router>
+         <connection-router name="simple-local-with-transformer">
+            <key-type>CLIENT_ID</key-type>
+            <key-filter>^[^.]+</key-filter>
             <local-target-filter>DEFAULT</local-target-filter>
             <local-target-key-transformer name="CONSISTENT_HASH_MODULO">
                <property key="modulo" value="2"></property>
             </local-target-key-transformer>
-         </broker-balancer>
-         <broker-balancer name="simple-balancer">
-            <target-key>USER_NAME</target-key>
+         </connection-router>
+         <connection-router name="simple-router">
+            <key-type>USER_NAME</key-type>
             <policy name="FIRST_ELEMENT"/>
             <pool>
                <static-connectors>
                   <connector-ref>connector1</connector-ref>
                </static-connectors>
             </pool>
-         </broker-balancer>
-         <broker-balancer name="consistent-hash-balancer">
-            <target-key>SNI_HOST</target-key>
-            <target-key-filter>^[^.]+</target-key-filter>
+         </connection-router>
+         <connection-router name="consistent-hash-router">
+            <key-type>SNI_HOST</key-type>
+            <key-filter>^[^.]+</key-filter>
             <local-target-filter>DEFAULT</local-target-filter>
             <policy name="CONSISTENT_HASH"/>
             <pool>
@@ -187,8 +187,8 @@
                <local-target-enabled>true</local-target-enabled>
                <discovery-group-ref discovery-group-name="dg1"/>
             </pool>
-         </broker-balancer>
-         <broker-balancer name="least-connections-balancer">
+         </connection-router>
+         <connection-router name="least-connections-router">
             <cache>
                <persisted>true</persisted>
                <timeout>60000</timeout>
@@ -200,8 +200,8 @@
                <quorum-timeout>1000</quorum-timeout>
                <discovery-group-ref discovery-group-name="dg2"/>
             </pool>
-         </broker-balancer>
-      </broker-balancers>
+         </connection-router>
+      </connection-routers>
       <amqp-use-core-subscription-naming>true</amqp-use-core-subscription-naming>
       <queues>
          <queue name="queue1">
diff --git a/artemis-server/src/test/resources/ConfigurationTest-xinclude-config.xml b/artemis-server/src/test/resources/ConfigurationTest-xinclude-config.xml
index 70cdde0..c45a003 100644
--- a/artemis-server/src/test/resources/ConfigurationTest-xinclude-config.xml
+++ b/artemis-server/src/test/resources/ConfigurationTest-xinclude-config.xml
@@ -144,32 +144,32 @@
             <exclusive>false</exclusive>
          </divert>
       </diverts>
-      <broker-balancers>
-         <broker-balancer name="simple-local">
-            <target-key>CLIENT_ID</target-key>
-            <target-key-filter>^[^.]+</target-key-filter>
+      <connection-routers>
+         <connection-router name="simple-local">
+            <key-type>CLIENT_ID</key-type>
+            <key-filter>^[^.]+</key-filter>
             <local-target-filter>DEFAULT</local-target-filter>
-         </broker-balancer>
-         <broker-balancer name="simple-local-with-transformer">
-            <target-key>CLIENT_ID</target-key>
-            <target-key-filter>^[^.]+</target-key-filter>
+         </connection-router>
+         <connection-router name="simple-local-with-transformer">
+            <key-type>CLIENT_ID</key-type>
+            <key-filter>^[^.]+</key-filter>
             <local-target-filter>DEFAULT</local-target-filter>
             <local-target-key-transformer name="CONSISTENT_HASH_MODULO">
                <property key="modulo" value="2"></property>
             </local-target-key-transformer>
-         </broker-balancer>
-         <broker-balancer name="simple-balancer">
-            <target-key>USER_NAME</target-key>
+         </connection-router>
+         <connection-router name="simple-router">
+            <key-type>USER_NAME</key-type>
             <policy name="FIRST_ELEMENT"/>
             <pool>
                <static-connectors>
                   <connector-ref>connector1</connector-ref>
                </static-connectors>
             </pool>
-         </broker-balancer>
-         <broker-balancer name="consistent-hash-balancer">
-            <target-key>SNI_HOST</target-key>
-            <target-key-filter>^[^.]+</target-key-filter>
+         </connection-router>
+         <connection-router name="consistent-hash-router">
+            <key-type>SNI_HOST</key-type>
+            <key-filter>^[^.]+</key-filter>
             <local-target-filter>DEFAULT</local-target-filter>
             <policy name="CONSISTENT_HASH"/>
             <pool>
@@ -177,8 +177,8 @@
                <local-target-enabled>true</local-target-enabled>
                <discovery-group-ref discovery-group-name="dg1"/>
             </pool>
-         </broker-balancer>
-         <broker-balancer name="least-connections-balancer">
+         </connection-router>
+         <connection-router name="least-connections-router">
             <cache>
                <persisted>true</persisted>
                <timeout>60000</timeout>
@@ -190,8 +190,8 @@
                <quorum-timeout>1000</quorum-timeout>
                <discovery-group-ref discovery-group-name="dg2"/>
             </pool>
-         </broker-balancer>
-      </broker-balancers>
+         </connection-router>
+      </connection-routers>
       <amqp-use-core-subscription-naming>true</amqp-use-core-subscription-naming>
       <queues>
          <queue name="queue1">
diff --git a/docs/user-manual/en/SUMMARY.md b/docs/user-manual/en/SUMMARY.md
index 3b87630..45607d6 100644
--- a/docs/user-manual/en/SUMMARY.md
+++ b/docs/user-manual/en/SUMMARY.md
@@ -67,7 +67,7 @@
     * [Address Federation](federation-address.md)
     * [Queue Federation](federation-queue.md)
 * [High Availability and Failover](ha.md)
-* [Broker Balancers](broker-balancers.md)
+* [Connection Routers](connection-routers.md)
 * [Graceful Server Shutdown](graceful-shutdown.md)
 * [Libaio Native Libraries](libaio.md)
 * [Thread management](thread-pooling.md)
diff --git a/docs/user-manual/en/broker-balancers.md b/docs/user-manual/en/connection-routers.md
similarity index 75%
rename from docs/user-manual/en/broker-balancers.md
rename to docs/user-manual/en/connection-routers.md
index 4fbc0a6..839f46e 100644
--- a/docs/user-manual/en/broker-balancers.md
+++ b/docs/user-manual/en/connection-routers.md
@@ -1,18 +1,16 @@
-# Broker Balancers
-Apache ActiveMQ Artemis broker balancers allow incoming client connections to be distributed across multiple [target brokers](target-brokers).
-The target brokers are grouped in [pools](#pools) and the broker balancers use a [target key](#target-key)
+# Connection Routers
+Apache ActiveMQ Artemis connection routers allow incoming client connections to be distributed across multiple [target brokers](target-brokers).
+The target brokers are grouped in [pools](#pools) and the connection routers use a [key](#keys)
 to select a target broker from a pool of brokers according to a [policy](#policies).
 
-### This feature is still **EXPERIMENTAL** and not meant to be run in production yet. Furthermore, its configuration can change until declared as **officially stable**.
-
 ## Target Broker
 Target broker is a broker that can accept incoming client connections and is local or remote.
-The local target is a special target that represents the same broker hosting the broker balancer.
+The local target is a special target that represents the same broker hosting the connection router.
 The remote target is another reachable broker.
 
-## Target Key
-The broker balancer uses a target key to select a target broker.
-It is a string retrieved from an incoming client connection, the supported values are:
+## Keys
+The connection router uses a key to select a target broker.
+It is a string retrieved from an incoming client connection, the supported key types are:
 * `CLIENT_ID` is the JMS client ID.
 * `SNI_HOST` is the hostname indicated by the client in the SNI extension of the TLS protocol.
 * `SOURCE_IP` is the source IP address of the client.
@@ -24,7 +22,7 @@ The pool is a group of target brokers with periodic checks on their state.
 It provides a list of ready target brokers to distribute incoming client connections only when it is active.
 A pool becomes active when the minimum number of target brokers, as defined by the `quorum-size` parameter, become ready.
 When it is not active, it doesn't provide any target avoiding weird distribution at startup or after a restart.
-Including the local broker in the target pool allows broker hosting the balancer to accept incoming client connections as well.
+Including the local broker in the target pool allows broker hosting the router to accept incoming client connections as well.
 By default, a pool doesn't include the local broker, to include it as a target the `local-target-enabled` parameter must be `true`.
 There are three pool types: [cluster pool](#cluster-pool), [discovery pool](#discovery-pool) and [static pool](#static-pool).
 
@@ -100,9 +98,9 @@ A policy is defined by the `policy` element. Let's take a look at a policy examp
 ```
 
 ## Cache
-The broker balancer provides a cache with a timeout to improve the stickiness of the target broker selected,
-returning the same target broker for a target key as long as it is present in the cache and is ready.
-So a broker balancer with the cache enabled doesn't strictly follow the configured policy.
+The connection router provides a cache with a timeout to improve the stickiness of the target broker selected,
+returning the same target broker for a key value as long as it is present in the cache and is ready.
+So a connection router with the cache enabled doesn't strictly follow the configured policy.
 By default, the cache is not enabled.
 
 A cache is defined by the `cache` element that includes the following items:
@@ -118,30 +116,30 @@ Let's take a look at a cache example from broker.xml:
 ```
 
 ## Key transformers
-A `local-target-key-transformer` allows target key transformation before matching against any local-target-filter. One use case is
+A `local-target-key-transformer` allows key value transformation before matching against any local-target-filter. One use case is
 CLIENT_ID sharding across a cluster of N brokers. With a consistent hash % N transformation, each client id
 can map exclusively to just one of the brokers. The included transformers are:
 * `CONSISTENT_HASH_MODULO` that takes a single `modulo` property to configure the bound.
 
-## Defining broker balancers
-A broker balancer is defined by the `broker-balancer` element, it includes the following items:
-* the `name` attribute defines the name of the broker balancer and is used to reference the balancer from an acceptor;
-* the `target-key` element defines what key to select a target broker, the supported values are: `CLIENT_ID`, `SNI_HOST`, `SOURCE_IP`, `USER_NAME`, `ROLE_NAME`, default is `SOURCE_IP`, see [target key](#target-key) for further details;
-* the `target-key-filter` element defines a regular expression to filter the resolved keys;
+## Defining connection routers
+A connection router is defined by the `connection-router` element, it includes the following items:
+* the `name` attribute defines the name of the connection router and is used to reference the router from an acceptor;
+* the `key-type` element defines what type of key to select a target broker, the supported values are: `CLIENT_ID`, `SNI_HOST`, `SOURCE_IP`, `USER_NAME`, `ROLE_NAME`, default is `SOURCE_IP`, see [Keys](#keys) for further details;
+* the `key-filter` element defines a regular expression to filter the resolved keys;
 * the `local-target-filter` element defines a regular expression to match the keys that have to return a local target;
 * the `local-target-key-transformer` element defines a key transformer, see [key transformers](#key-transformers);
 * the `pool` element defines the pool to group the target brokers, see [pools](#pools);
 * the `policy` element defines the policy used to select the target brokers from the pool, see [policies](#policies).
 
-Let's take a look at some broker balancer examples from broker.xml:
+Let's take a look at some connection router examples from broker.xml:
 ```xml
-<broker-balancers>
-    <broker-balancer name="local-partition">
-         <target-key>CLIENT_ID</target-key>
-         <target-key-filter>^.{3}</target-key-filter>
+<connection-routers>
+    <connection-router name="local-partition">
+         <key-type>CLIENT_ID</key-type>
+         <key-filter>^.{3}</key-filter>
          <local-target-filter>^FOO.*</local-target-filter>
-    </broker-balancer>
-    <broker-balancer name="simple-balancer">
+    </connection-router>
+    <connection-router name="simple-router">
         <policy name="FIRST_ELEMENT"/>
         <pool>
             <static-connectors>
@@ -150,9 +148,9 @@ Let's take a look at some broker balancer examples from broker.xml:
                 <connector-ref>connector3</connector-ref>
             </static-connectors>
         </pool>
-    </broker-balancer>
-    <broker-balancer name="consistent-hash-balancer">
-        <target-key>USER_NAME</target-key>
+    </connection-router>
+    <connection-router name="consistent-hash-router">
+        <key-type>USER_NAME</key-type>
         <local-target-filter>admin</local-target-filter>
         <policy name="CONSISTENT_HASH"/>
         <pool>
@@ -160,24 +158,24 @@ Let's take a look at some broker balancer examples from broker.xml:
             <discovery-group-ref discovery-group-name="dg1"/>
         </pool>
     <policy name="CONSISTENT_HASH"/>
-    </broker-balancer>
-    <broker-balancer name="evenly-balancer">
-      <target-key>CLIENT_ID</target-key>
-      <target-key-filter>^.{3}</target-key-filter>
+    </connection-router>
+    <connection-router name="evenly-balance">
+      <key-type>CLIENT_ID</key-type>
+      <key-filter>^.{3}</key-filter>
       <policy name="LEAST_CONNECTIONS"/>
       <pool>
         <username>guest</username>
         <password>guest</password>
         <discovery-group-ref discovery-group-name="dg2"/>
       </pool>
-    </broker-balancer>
-</broker-balancers>
+    </connection-router>
+</connection-routers>
 ```
 
-## Broker Balancer Workflow
-The broker balancer workflow include the following steps:
-* Retrieve the target key from the incoming connection;
-* Return the local target broker if the target key matches the local filter;
+## Connection Router Workflow
+The connection router workflow include the following steps:
+* Retrieve the key value from the incoming connection;
+* Return the local target broker if the key value matches the local filter;
 * Delegate to the pool:
 * Return the cached target broker if it is ready;
 * Get ready/active target brokers from the pool;
@@ -185,18 +183,18 @@ The broker balancer workflow include the following steps:
 * Add the selected broker in the cache;
 * Return the selected broker.
 
-Let's take a look at flowchart of the broker balancer workflow:
-![Broker Balancer Workflow](images/broker_balancer_workflow.png)
+Let's take a look at flowchart of the connection router workflow:
+![Connection Router Workflow](images/connection_router_workflow.png)
 
 ## Data gravity
-The first balancer configuration: `local-partition`, demonstrates the simplest use case,
+The first router configuration: `local-partition`, demonstrates the simplest use case,
 that of preserving `data gravity` by confining a subset of application data to a given broker.
 Each broker is given a subset of keys that it will exclusively service or reject.
 If brokers are behind a round-robin load-balancer or have full knowledge of the broker
 urls, `their` broker will eventually respond. The `local-target-filter` regular expression
 determines the granularity of partition that is best for preserving `data gravity` for your applications.
 
-The challenge is in providing a consistent [key](#Target_Key) in all related application connections.
+The challenge is in providing a consistent [key](#Keys) in all related application connections.
 
 Note: the concept of `data gravity` tries to capture the reality that while addresses are shared by multiple
 applications, it is best to keep related addresses and their data co-located on a single broker. Typically,
@@ -209,12 +207,12 @@ applications and the addresses they need to interact with.
 ## Redirection
 Apache ActiveMQ Artemis provides a native redirection for supported clients and a new management API for other clients.
 The native redirection can be enabled per acceptor and is supported only for AMQP, CORE and OPENWIRE clients.
-The acceptor with the `redirect-to` url parameter will redirect the incoming connections.
-The `redirect-to` url parameter specifies the name of the broker balancer to use,
-ie the following acceptor will redirect the incoming CORE client connections using the broker balancer with the name `simple-balancer`:
+The acceptor with the `router` url parameter will redirect the incoming connections.
+The `router` url parameter specifies the name of the connection router to use,
+ie the following acceptor will redirect the incoming CORE client connections using the connection router with the name `simple-router`:
 
 ```xml
-<acceptor name="artemis">tcp://0.0.0.0:61616?redirect-to=simple-balancer;protocols=CORE</acceptor>
+<acceptor name="artemis">tcp://0.0.0.0:61616?router=simple-router;protocols=CORE</acceptor>
 ```
 ### Native Redirect Sequence
 
@@ -226,7 +224,7 @@ otherwise it connected again to the acceptor with the redirection enabled.
 ![Native Redirect Sequence](images/native_redirect_sequence.png)
 
 ### Management API Redirect Sequence
-The clients not supporting the native redirection queries the management API of broker balancer
+The clients not supporting the native redirection queries the management API of connection router
 to get the target broker to redirect. If the API returns a target broker the client connects to it
 otherwise the client queries again the API.
 
diff --git a/docs/user-manual/en/images/broker_balancer_workflow.png b/docs/user-manual/en/images/connection_router_workflow.png
similarity index 100%
rename from docs/user-manual/en/images/broker_balancer_workflow.png
rename to docs/user-manual/en/images/connection_router_workflow.png
diff --git a/docs/user-manual/en/versions.md b/docs/user-manual/en/versions.md
index a6c17b2..8140c42 100644
--- a/docs/user-manual/en/versions.md
+++ b/docs/user-manual/en/versions.md
@@ -37,7 +37,7 @@ Highlights:
   support improving capabilities on AMQP Mirror for Disaster Recovery
 - [Journal Retention](persistence.md#journal-retention)
 - [Replication integrated with Zookeeper](ha.md#pluggable-quorum-vote-replication-configurations)
-- [Broker load balancer](broker-balancers.md)
+- [Connection Routers](connection-routers.md)
 - [Concurrency](core-bridges.md#configuring-bridges) configuration for core
   bridges.
 - [XPath filter expressions](filter-expressions.md#xpath) (for parity with
diff --git a/examples/features/broker-balancer/evenly-redirect/pom.xml b/examples/features/connection-router/evenly-redirect/pom.xml
similarity index 99%
rename from examples/features/broker-balancer/evenly-redirect/pom.xml
rename to examples/features/connection-router/evenly-redirect/pom.xml
index 71260ad..0e877ee 100644
--- a/examples/features/broker-balancer/evenly-redirect/pom.xml
+++ b/examples/features/connection-router/evenly-redirect/pom.xml
@@ -23,7 +23,7 @@ under the License.
 
    <parent>
       <groupId>org.apache.activemq.examples</groupId>
-      <artifactId>broker-balancer</artifactId>
+      <artifactId>connection-router</artifactId>
       <version>2.21.0-SNAPSHOT</version>
    </parent>
 
diff --git a/examples/features/broker-balancer/evenly-redirect/readme.md b/examples/features/connection-router/evenly-redirect/readme.md
similarity index 81%
rename from examples/features/broker-balancer/evenly-redirect/readme.md
rename to examples/features/connection-router/evenly-redirect/readme.md
index 05011d9..03e3589 100644
--- a/examples/features/broker-balancer/evenly-redirect/readme.md
+++ b/examples/features/connection-router/evenly-redirect/readme.md
@@ -3,6 +3,6 @@
 To run the example, simply type **mvn verify** from this directory, or **mvn -PnoServer verify** if you want to create and start the broker manually.
 
 This example demonstrates how incoming client connections are evenly redirected across two brokers
-using a third broker with a balancer to redirect incoming client connections,
+using a third broker with a connection router to redirect incoming client connections,
 based on a least-connections policy and caching on a filtered prefix of the connection ClientID.
 
diff --git a/examples/features/broker-balancer/evenly-redirect/src/main/java/org/apache/activemq/artemis/jms/example/EvenlyRedirectExample.java b/examples/features/connection-router/evenly-redirect/src/main/java/org/apache/activemq/artemis/jms/example/EvenlyRedirectExample.java
similarity index 95%
rename from examples/features/broker-balancer/evenly-redirect/src/main/java/org/apache/activemq/artemis/jms/example/EvenlyRedirectExample.java
rename to examples/features/connection-router/evenly-redirect/src/main/java/org/apache/activemq/artemis/jms/example/EvenlyRedirectExample.java
index 40a8706..de3c5aa 100644
--- a/examples/features/broker-balancer/evenly-redirect/src/main/java/org/apache/activemq/artemis/jms/example/EvenlyRedirectExample.java
+++ b/examples/features/connection-router/evenly-redirect/src/main/java/org/apache/activemq/artemis/jms/example/EvenlyRedirectExample.java
@@ -28,7 +28,7 @@ import org.apache.activemq.artemis.jms.client.ActiveMQConnectionFactory;
 
 /**
  * This example demonstrates how incoming client connections are evenly redirected across two brokers
- * using a third broker with a broker balancer to redirect incoming client connections.
+ * using a third broker with a connection router to redirect incoming client connections.
  */
 public class EvenlyRedirectExample {
 
@@ -71,7 +71,7 @@ public class EvenlyRedirectExample {
        * Step 2. create a connection for consumer0 and consumer1, and receive a few messages.
        * the server0 will redirect the connection to the same target broker of the respective producer
        * because the consumer and the producer connections have the same clientID prefix, which
-       * the balancer configuration filters the target key on and caches the target broker the policy selects.
+       * the router configuration filters the target key on and caches the target broker the policy selects.
        */
       ConnectionFactory connectionFactoryConsumer0 = new ActiveMQConnectionFactory("tcp://localhost:61616?ha=true&reconnectAttempts=30&clientID=BAR_CONSUMER");
       ConnectionFactory connectionFactoryConsumer1 = new ActiveMQConnectionFactory("tcp://localhost:61616?ha=true&reconnectAttempts=30&clientID=FOO_CONSUMER");
diff --git a/examples/features/broker-balancer/evenly-redirect/src/main/resources/activemq/server0/broker.xml b/examples/features/connection-router/evenly-redirect/src/main/resources/activemq/server0/broker.xml
similarity index 90%
rename from examples/features/broker-balancer/evenly-redirect/src/main/resources/activemq/server0/broker.xml
rename to examples/features/connection-router/evenly-redirect/src/main/resources/activemq/server0/broker.xml
index 4924982..3767bb8 100644
--- a/examples/features/broker-balancer/evenly-redirect/src/main/resources/activemq/server0/broker.xml
+++ b/examples/features/connection-router/evenly-redirect/src/main/resources/activemq/server0/broker.xml
@@ -46,7 +46,7 @@ under the License.
 
       <acceptors>
          <!-- Acceptor for every supported protocol -->
-         <acceptor name="artemis">tcp://0.0.0.0:61616?redirect-to=evenly-balancer;tcpSendBufferSize=1048576;tcpReceiveBufferSize=1048576;amqpMinLargeMessageSize=102400;protocols=CORE,AMQP,STOMP,HORNETQ,MQTT,OPENWIRE;useEpoll=true;amqpCredits=1000;amqpLowCredits=300;amqpDuplicateDetection=true</acceptor>
+         <acceptor name="artemis">tcp://0.0.0.0:61616?router=evenly-balance;tcpSendBufferSize=1048576;tcpReceiveBufferSize=1048576;amqpMinLargeMessageSize=102400;protocols=CORE,AMQP,STOMP,HORNETQ,MQTT,OPENWIRE;useEpoll=true;amqpCredits=1000;amqpLowCredits=300;amqpDuplicateDetection=true</acceptor>
       </acceptors>
 
       <connectors>
@@ -54,11 +54,12 @@ under the License.
          <connector name="server2">tcp://localhost:61618</connector>
       </connectors>
 
-      <broker-balancers>
-         <broker-balancer name="evenly-balancer">
-            <target-key>CLIENT_ID</target-key>
-            <target-key-filter>^.{3}</target-key-filter>
+      <connection-routers>
+         <connection-router name="evenly-balance">
+            <key-type>CLIENT_ID</key-type>
+            <key-filter>^.{3}</key-filter>
             <local-target-filter>DEFAULT</local-target-filter>
+            <cache/>
             <policy name="LEAST_CONNECTIONS"/>
             <pool>
                <username>guest</username>
@@ -68,8 +69,8 @@ under the License.
                   <connector-ref>server2</connector-ref>
                </static-connectors>
             </pool>
-         </broker-balancer>
-      </broker-balancers>
+         </connection-router>
+      </connection-routers>
 
       <security-settings>
          <security-setting match="#">
diff --git a/examples/features/broker-balancer/evenly-redirect/src/main/resources/activemq/server1/broker.xml b/examples/features/connection-router/evenly-redirect/src/main/resources/activemq/server1/broker.xml
similarity index 100%
rename from examples/features/broker-balancer/evenly-redirect/src/main/resources/activemq/server1/broker.xml
rename to examples/features/connection-router/evenly-redirect/src/main/resources/activemq/server1/broker.xml
diff --git a/examples/features/broker-balancer/evenly-redirect/src/main/resources/activemq/server2/broker.xml b/examples/features/connection-router/evenly-redirect/src/main/resources/activemq/server2/broker.xml
similarity index 100%
rename from examples/features/broker-balancer/evenly-redirect/src/main/resources/activemq/server2/broker.xml
rename to examples/features/connection-router/evenly-redirect/src/main/resources/activemq/server2/broker.xml
diff --git a/examples/features/broker-balancer/pom.xml b/examples/features/connection-router/pom.xml
similarity index 94%
rename from examples/features/broker-balancer/pom.xml
rename to examples/features/connection-router/pom.xml
index 3aa1e15..be839ab 100644
--- a/examples/features/broker-balancer/pom.xml
+++ b/examples/features/connection-router/pom.xml
@@ -28,9 +28,9 @@ under the License.
    </parent>
 
    <groupId>org.apache.activemq.examples</groupId>
-   <artifactId>broker-balancer</artifactId>
+   <artifactId>connection-router</artifactId>
    <packaging>pom</packaging>
-   <name>ActiveMQ Artemis Broker Balancer Examples</name>
+   <name>ActiveMQ Artemis Connection Routers Examples</name>
 
    <!-- Properties -->
    <properties>
diff --git a/examples/features/broker-balancer/symmetric-redirect/pom.xml b/examples/features/connection-router/symmetric-redirect/pom.xml
similarity index 99%
rename from examples/features/broker-balancer/symmetric-redirect/pom.xml
rename to examples/features/connection-router/symmetric-redirect/pom.xml
index f4bcb23..86dc3ff 100644
--- a/examples/features/broker-balancer/symmetric-redirect/pom.xml
+++ b/examples/features/connection-router/symmetric-redirect/pom.xml
@@ -23,7 +23,7 @@ under the License.
 
    <parent>
       <groupId>org.apache.activemq.examples</groupId>
-      <artifactId>broker-balancer</artifactId>
+      <artifactId>connection-router</artifactId>
       <version>2.21.0-SNAPSHOT</version>
    </parent>
 
diff --git a/examples/features/broker-balancer/symmetric-redirect/readme.md b/examples/features/connection-router/symmetric-redirect/readme.md
similarity index 89%
rename from examples/features/broker-balancer/symmetric-redirect/readme.md
rename to examples/features/connection-router/symmetric-redirect/readme.md
index 616dd8b..ee75faa 100644
--- a/examples/features/broker-balancer/symmetric-redirect/readme.md
+++ b/examples/features/connection-router/symmetric-redirect/readme.md
@@ -3,7 +3,7 @@
 To run the example, simply type **mvn verify** from this directory, or **mvn -PnoServer verify** if you want to create and start the broker manually.
 
 This example demonstrates how incoming client connections are distributed across two brokers
-using a symmetric architecture. In this architecture both brokers have two roles: balancer and target.
+using a symmetric architecture. In this architecture both brokers have two roles: router and target.
 So they can redirect or accept the incoming client connection according to the consistent hash algorithm.
 Both brokers use the same consistent hash algorithm to select the target broker so for the same key
 if the first broker redirects an incoming client connection the second accepts it and vice versa.
\ No newline at end of file
diff --git a/examples/features/broker-balancer/symmetric-redirect/src/main/java/org/apache/activemq/artemis/jms/example/SymmetricRedirectExample.java b/examples/features/connection-router/symmetric-redirect/src/main/java/org/apache/activemq/artemis/jms/example/SymmetricRedirectExample.java
similarity index 100%
rename from examples/features/broker-balancer/symmetric-redirect/src/main/java/org/apache/activemq/artemis/jms/example/SymmetricRedirectExample.java
rename to examples/features/connection-router/symmetric-redirect/src/main/java/org/apache/activemq/artemis/jms/example/SymmetricRedirectExample.java
diff --git a/examples/features/broker-balancer/symmetric-redirect/src/main/resources/activemq/server0/broker.xml b/examples/features/connection-router/symmetric-redirect/src/main/resources/activemq/server0/broker.xml
similarity index 90%
rename from examples/features/broker-balancer/symmetric-redirect/src/main/resources/activemq/server0/broker.xml
rename to examples/features/connection-router/symmetric-redirect/src/main/resources/activemq/server0/broker.xml
index ee44289..0f39ba0 100644
--- a/examples/features/broker-balancer/symmetric-redirect/src/main/resources/activemq/server0/broker.xml
+++ b/examples/features/connection-router/symmetric-redirect/src/main/resources/activemq/server0/broker.xml
@@ -46,7 +46,7 @@ under the License.
 
       <acceptors>
          <!-- Acceptor for every supported protocol -->
-         <acceptor name="artemis">tcp://0.0.0.0:61616?redirect-to=symmetric-balancer;tcpSendBufferSize=1048576;tcpReceiveBufferSize=1048576;amqpMinLargeMessageSize=102400;protocols=CORE,AMQP,STOMP,HORNETQ,MQTT,OPENWIRE;useEpoll=true;amqpCredits=1000;amqpLowCredits=300;amqpDuplicateDetection=true</acceptor>
+         <acceptor name="artemis">tcp://0.0.0.0:61616?router=symmetric-router;tcpSendBufferSize=1048576;tcpReceiveBufferSize=1048576;amqpMinLargeMessageSize=102400;protocols=CORE,AMQP,STOMP,HORNETQ,MQTT,OPENWIRE;useEpoll=true;amqpCredits=1000;amqpLowCredits=300;amqpDuplicateDetection=true</acceptor>
       </acceptors>
 
       <connectors>
@@ -70,10 +70,10 @@ under the License.
          </discovery-group>
       </discovery-groups>
 
-      <broker-balancers>
-         <broker-balancer name="symmetric-balancer">
-            <target-key>CLIENT_ID</target-key>
-            <target-key-filter>^.{3}</target-key-filter>
+      <connection-routers>
+         <connection-router name="symmetric-router">
+            <key-type>CLIENT_ID</key-type>
+            <key-filter>^.{3}</key-filter>
             <local-target-filter>DEFAULT</local-target-filter>
             <policy name="CONSISTENT_HASH"/>
             <pool>
@@ -83,8 +83,8 @@ under the License.
                <local-target-enabled>true</local-target-enabled>
                <discovery-group-ref discovery-group-name="discovery-group-1"/>
             </pool>
-         </broker-balancer>
-      </broker-balancers>
+         </connection-router>
+      </connection-routers>
 
       <security-settings>
          <security-setting match="#">
diff --git a/examples/features/broker-balancer/symmetric-redirect/src/main/resources/activemq/server1/broker.xml b/examples/features/connection-router/symmetric-redirect/src/main/resources/activemq/server1/broker.xml
similarity index 90%
rename from examples/features/broker-balancer/symmetric-redirect/src/main/resources/activemq/server1/broker.xml
rename to examples/features/connection-router/symmetric-redirect/src/main/resources/activemq/server1/broker.xml
index ac82fbf..16c7067 100644
--- a/examples/features/broker-balancer/symmetric-redirect/src/main/resources/activemq/server1/broker.xml
+++ b/examples/features/connection-router/symmetric-redirect/src/main/resources/activemq/server1/broker.xml
@@ -46,7 +46,7 @@ under the License.
 
       <acceptors>
          <!-- Acceptor for every supported protocol -->
-         <acceptor name="artemis">tcp://0.0.0.0:61617?redirect-to=symmetric-balancer;tcpSendBufferSize=1048576;tcpReceiveBufferSize=1048576;amqpMinLargeMessageSize=102400;protocols=CORE,AMQP,STOMP,HORNETQ,MQTT,OPENWIRE;useEpoll=true;amqpCredits=1000;amqpLowCredits=300;amqpDuplicateDetection=true</acceptor>
+         <acceptor name="artemis">tcp://0.0.0.0:61617?router=symmetric-router;tcpSendBufferSize=1048576;tcpReceiveBufferSize=1048576;amqpMinLargeMessageSize=102400;protocols=CORE,AMQP,STOMP,HORNETQ,MQTT,OPENWIRE;useEpoll=true;amqpCredits=1000;amqpLowCredits=300;amqpDuplicateDetection=true</acceptor>
       </acceptors>
 
       <connectors>
@@ -70,10 +70,10 @@ under the License.
          </discovery-group>
       </discovery-groups>
 
-      <broker-balancers>
-         <broker-balancer name="symmetric-balancer">
-            <target-key>CLIENT_ID</target-key>
-            <target-key-filter>^.{3}</target-key-filter>
+      <connection-routers>
+         <connection-router name="symmetric-router">
+            <key-type>CLIENT_ID</key-type>
+            <key-filter>^.{3}</key-filter>
             <local-target-filter>DEFAULT</local-target-filter>
             <policy name="CONSISTENT_HASH"/>
             <pool>
@@ -83,8 +83,8 @@ under the License.
                <local-target-enabled>true</local-target-enabled>
                <discovery-group-ref discovery-group-name="discovery-group-1"/>
             </pool>
-         </broker-balancer>
-      </broker-balancers>
+         </connection-router>
+      </connection-routers>
 
       <security-settings>
          <security-setting match="#">
diff --git a/examples/features/broker-balancer/symmetric-simple/pom.xml b/examples/features/connection-router/symmetric-simple/pom.xml
similarity index 99%
rename from examples/features/broker-balancer/symmetric-simple/pom.xml
rename to examples/features/connection-router/symmetric-simple/pom.xml
index 7d74f99..5287b80 100644
--- a/examples/features/broker-balancer/symmetric-simple/pom.xml
+++ b/examples/features/connection-router/symmetric-simple/pom.xml
@@ -23,7 +23,7 @@ under the License.
 
    <parent>
       <groupId>org.apache.activemq.examples</groupId>
-      <artifactId>broker-balancer</artifactId>
+      <artifactId>connection-router</artifactId>
       <version>2.21.0-SNAPSHOT</version>
    </parent>
 
diff --git a/examples/features/broker-balancer/symmetric-simple/readme.md b/examples/features/connection-router/symmetric-simple/readme.md
similarity index 87%
rename from examples/features/broker-balancer/symmetric-simple/readme.md
rename to examples/features/connection-router/symmetric-simple/readme.md
index cf18e91..da7c5bb 100644
--- a/examples/features/broker-balancer/symmetric-simple/readme.md
+++ b/examples/features/connection-router/symmetric-simple/readme.md
@@ -21,11 +21,11 @@ The job of application developers in this scenario is to provide a key that can
 expression that can capture an appropriate 'center of data gravity' for a broker.
 
 In configuration, the `local-target-filter` provides the regular expression that controls what keys are mapped to a broker.
-`Broker0` takes clientIDs with prefix FOO and `Broker1` takes prefix BAR. The `target-key-filter` specifies how the key is extracted,
+`Broker0` takes clientIDs with prefix FOO and `Broker1` takes prefix BAR. The `key-filter` specifies how the key is extracted,
 we care about the first 3 characters, from the user supplied clientId.
 
-      <broker-balancer name="symmetric-simple">
-            <target-key>CLIENT_ID</target-key>
-            <target-key-filter>^.{3}</target-key-filter>
+      <connection-router name="symmetric-simple">
+            <key-type>CLIENT_ID</key-type>
+            <key-filter>^.{3}</key-filter>
             <local-target-filter>^FOO.*</local-target-filter>
-      </broker-balancer>
+      </connection-router>
diff --git a/examples/features/broker-balancer/symmetric-simple/src/main/java/org/apache/activemq/artemis/jms/example/SymmetricSimpleExample.java b/examples/features/connection-router/symmetric-simple/src/main/java/org/apache/activemq/artemis/jms/example/SymmetricSimpleExample.java
similarity index 100%
rename from examples/features/broker-balancer/symmetric-simple/src/main/java/org/apache/activemq/artemis/jms/example/SymmetricSimpleExample.java
rename to examples/features/connection-router/symmetric-simple/src/main/java/org/apache/activemq/artemis/jms/example/SymmetricSimpleExample.java
diff --git a/examples/features/broker-balancer/symmetric-simple/src/main/resources/activemq/server0/broker.xml b/examples/features/connection-router/symmetric-simple/src/main/resources/activemq/server0/broker.xml
similarity index 88%
rename from examples/features/broker-balancer/symmetric-simple/src/main/resources/activemq/server0/broker.xml
rename to examples/features/connection-router/symmetric-simple/src/main/resources/activemq/server0/broker.xml
index 206c131..3e1cc86 100644
--- a/examples/features/broker-balancer/symmetric-simple/src/main/resources/activemq/server0/broker.xml
+++ b/examples/features/connection-router/symmetric-simple/src/main/resources/activemq/server0/broker.xml
@@ -46,16 +46,16 @@ under the License.
 
       <acceptors>
          <!-- Acceptor for every supported protocol -->
-         <acceptor name="artemis">tcp://0.0.0.0:61616?redirect-to=symmetric-simple;tcpSendBufferSize=1048576;tcpReceiveBufferSize=1048576;amqpMinLargeMessageSize=102400;protocols=CORE,AMQP,STOMP,HORNETQ,MQTT,OPENWIRE;useEpoll=true;amqpCredits=1000;amqpLowCredits=300;amqpDuplicateDetection=true</acceptor>
+         <acceptor name="artemis">tcp://0.0.0.0:61616?router=symmetric-simple;tcpSendBufferSize=1048576;tcpReceiveBufferSize=1048576;amqpMinLargeMessageSize=102400;protocols=CORE,AMQP,STOMP,HORNETQ,MQTT,OPENWIRE;useEpoll=true;amqpCredits=1000;amqpLowCredits=300;amqpDuplicateDetection=true</acceptor>
       </acceptors>
 
-      <broker-balancers>
-         <broker-balancer name="symmetric-simple">
-            <target-key>CLIENT_ID</target-key>
-            <target-key-filter>^.{3}</target-key-filter>
+      <connection-routers>
+         <connection-router name="symmetric-simple">
+            <key-type>CLIENT_ID</key-type>
+            <key-filter>^.{3}</key-filter>
             <local-target-filter>^FOO.*</local-target-filter>
-         </broker-balancer>
-      </broker-balancers>
+         </connection-router>
+      </connection-routers>
 
       <security-settings>
          <security-setting match="#">
diff --git a/examples/features/broker-balancer/symmetric-simple/src/main/resources/activemq/server1/broker.xml b/examples/features/connection-router/symmetric-simple/src/main/resources/activemq/server1/broker.xml
similarity index 88%
rename from examples/features/broker-balancer/symmetric-simple/src/main/resources/activemq/server1/broker.xml
rename to examples/features/connection-router/symmetric-simple/src/main/resources/activemq/server1/broker.xml
index 739f398..e7d8ff4 100644
--- a/examples/features/broker-balancer/symmetric-simple/src/main/resources/activemq/server1/broker.xml
+++ b/examples/features/connection-router/symmetric-simple/src/main/resources/activemq/server1/broker.xml
@@ -46,16 +46,16 @@ under the License.
 
       <acceptors>
          <!-- Acceptor for every supported protocol -->
-         <acceptor name="artemis">tcp://0.0.0.0:61617?redirect-to=symmetric-simple;tcpSendBufferSize=1048576;tcpReceiveBufferSize=1048576;amqpMinLargeMessageSize=102400;protocols=CORE,AMQP,STOMP,HORNETQ,MQTT,OPENWIRE;useEpoll=true;amqpCredits=1000;amqpLowCredits=300;amqpDuplicateDetection=true</acceptor>
+         <acceptor name="artemis">tcp://0.0.0.0:61617?router=symmetric-simple;tcpSendBufferSize=1048576;tcpReceiveBufferSize=1048576;amqpMinLargeMessageSize=102400;protocols=CORE,AMQP,STOMP,HORNETQ,MQTT,OPENWIRE;useEpoll=true;amqpCredits=1000;amqpLowCredits=300;amqpDuplicateDetection=true</acceptor>
       </acceptors>
 
-      <broker-balancers>
-         <broker-balancer name="symmetric-simple">
-            <target-key>CLIENT_ID</target-key>
-            <target-key-filter>^.{3}</target-key-filter>
+      <connection-routers>
+         <connection-router name="symmetric-simple">
+            <key-type>CLIENT_ID</key-type>
+            <key-filter>^.{3}</key-filter>
             <local-target-filter>^BAR.*</local-target-filter>
-         </broker-balancer>
-      </broker-balancers>
+         </connection-router>
+      </connection-routers>
 
 
       <security-settings>
diff --git a/examples/features/pom.xml b/examples/features/pom.xml
index c5e8225..cdfaf61 100644
--- a/examples/features/pom.xml
+++ b/examples/features/pom.xml
@@ -49,7 +49,7 @@ under the License.
          <modules>
             <module>clustered</module>
             <module>broker-connection</module>
-            <module>broker-balancer</module>
+            <module>connection-router</module>
             <module>federation</module>
             <module>ha</module>
             <module>standard</module>
@@ -62,7 +62,7 @@ under the License.
          <modules>
             <module>clustered</module>
             <module>broker-connection</module>
-            <module>broker-balancer</module>
+            <module>connection-router</module>
             <module>federation</module>
             <module>ha</module>
             <module>standard</module>
diff --git a/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/management/BrokerBalancerControlTest.java b/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/management/ConnectionRouterControlTest.java
similarity index 68%
rename from tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/management/BrokerBalancerControlTest.java
rename to tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/management/ConnectionRouterControlTest.java
index 2469a50..689d2ca 100644
--- a/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/management/BrokerBalancerControlTest.java
+++ b/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/management/ConnectionRouterControlTest.java
@@ -19,10 +19,10 @@ package org.apache.activemq.artemis.tests.integration.management;
 
 import org.apache.activemq.artemis.api.core.JsonUtil;
 import org.apache.activemq.artemis.api.core.TransportConfiguration;
-import org.apache.activemq.artemis.api.core.management.BrokerBalancerControl;
-import org.apache.activemq.artemis.core.server.balancing.policies.FirstElementPolicy;
-import org.apache.activemq.artemis.core.server.balancing.targets.TargetKey;
-import org.apache.activemq.artemis.tests.integration.balancing.BalancingTestBase;
+import org.apache.activemq.artemis.api.core.management.ConnectionRouterControl;
+import org.apache.activemq.artemis.core.server.routing.policies.FirstElementPolicy;
+import org.apache.activemq.artemis.core.server.routing.KeyType;
+import org.apache.activemq.artemis.tests.integration.routing.RoutingTestBase;
 import org.junit.After;
 import org.junit.Assert;
 import org.junit.Before;
@@ -36,7 +36,7 @@ import javax.management.openmbean.CompositeData;
 import javax.management.openmbean.TabularData;
 import java.util.Map;
 
-public class BrokerBalancerControlTest extends BalancingTestBase {
+public class ConnectionRouterControlTest extends RoutingTestBase {
 
    private MBeanServer mbeanServer;
 
@@ -59,9 +59,9 @@ public class BrokerBalancerControlTest extends BalancingTestBase {
 
    @Test
    public void testGetTarget() throws Exception {
-      BrokerBalancerControl brokerBalancerControl = getBrokerBalancerControlForTarget();
+      ConnectionRouterControl connectionRouterControl = getConnectionRouterControlForTarget();
 
-      CompositeData targetData = brokerBalancerControl.getTarget("admin");
+      CompositeData targetData = connectionRouterControl.getTarget("admin");
       Assert.assertNotNull(targetData);
 
       String nodeID = (String)targetData.get("nodeID");
@@ -91,9 +91,9 @@ public class BrokerBalancerControlTest extends BalancingTestBase {
    }
    @Test
    public void testGetTargetAsJSON() throws Exception {
-      BrokerBalancerControl brokerBalancerControl = getBrokerBalancerControlForTarget();
+      ConnectionRouterControl connectionRouterControl = getConnectionRouterControlForTarget();
 
-      String targetJSON = brokerBalancerControl.getTargetAsJSON("admin");
+      String targetJSON = connectionRouterControl.getTargetAsJSON("admin");
       Assert.assertNotNull(targetJSON);
 
       JsonObject targetData = JsonUtil.readJsonObject(targetJSON);
@@ -128,9 +128,9 @@ public class BrokerBalancerControlTest extends BalancingTestBase {
 
    @Test
    public void testGetLocalTarget() throws Exception {
-      BrokerBalancerControl brokerBalancerControl = getBrokerBalancerControlForLocalTarget();
+      ConnectionRouterControl connectionRouterControl = getConnectionRouterControlForLocalTarget();
 
-      CompositeData targetData = brokerBalancerControl.getTarget("admin");
+      CompositeData targetData = connectionRouterControl.getTarget("admin");
       Assert.assertNotNull(targetData);
 
       String nodeID = (String)targetData.get("nodeID");
@@ -145,34 +145,34 @@ public class BrokerBalancerControlTest extends BalancingTestBase {
 
    @Test
    public void testLocalTargetAccessors() throws Exception {
-      BrokerBalancerControl brokerBalancerControl = getBrokerBalancerControlForLocalTarget();
+      ConnectionRouterControl connectionRouterControl = getConnectionRouterControlForLocalTarget();
 
-      assertNull(brokerBalancerControl.getLocalTargetFilter());
+      assertNull(connectionRouterControl.getLocalTargetFilter());
       final String v = "EQ";
-      brokerBalancerControl.setLocalTargetFilter(v);
-      assertEquals(v, brokerBalancerControl.getLocalTargetFilter());
+      connectionRouterControl.setLocalTargetFilter(v);
+      assertEquals(v, connectionRouterControl.getLocalTargetFilter());
 
-      brokerBalancerControl.setLocalTargetFilter("");
-      assertNull(brokerBalancerControl.getLocalTargetFilter());
+      connectionRouterControl.setLocalTargetFilter("");
+      assertNull(connectionRouterControl.getLocalTargetFilter());
 
-      brokerBalancerControl.setLocalTargetFilter(null);
-      assertNull(brokerBalancerControl.getLocalTargetFilter());
+      connectionRouterControl.setLocalTargetFilter(null);
+      assertNull(connectionRouterControl.getLocalTargetFilter());
 
-      assertNull(brokerBalancerControl.getTargetKeyFilter());
-      brokerBalancerControl.setTargetKeyFilter(v);
-      assertEquals(v, brokerBalancerControl.getTargetKeyFilter());
-      brokerBalancerControl.setTargetKeyFilter("");
-      assertNull(brokerBalancerControl.getTargetKeyFilter());
+      assertNull(connectionRouterControl.getTargetKeyFilter());
+      connectionRouterControl.setTargetKeyFilter(v);
+      assertEquals(v, connectionRouterControl.getTargetKeyFilter());
+      connectionRouterControl.setTargetKeyFilter("");
+      assertNull(connectionRouterControl.getTargetKeyFilter());
 
-      brokerBalancerControl.setTargetKeyFilter(null);
-      assertNull(brokerBalancerControl.getTargetKeyFilter());
+      connectionRouterControl.setTargetKeyFilter(null);
+      assertNull(connectionRouterControl.getTargetKeyFilter());
    }
 
    @Test
    public void testGetLocalTargetAsJSON() throws Exception {
-      BrokerBalancerControl brokerBalancerControl = getBrokerBalancerControlForLocalTarget();
+      ConnectionRouterControl connectionRouterControl = getConnectionRouterControlForLocalTarget();
 
-      String targetJSON = brokerBalancerControl.getTargetAsJSON("admin");
+      String targetJSON = connectionRouterControl.getTargetAsJSON("admin");
       Assert.assertNotNull(targetJSON);
 
       JsonObject targetData = JsonUtil.readJsonObject(targetJSON);
@@ -187,25 +187,25 @@ public class BrokerBalancerControlTest extends BalancingTestBase {
       Assert.assertTrue(targetData.isNull("connector"));
    }
 
-   private BrokerBalancerControl getBrokerBalancerControlForTarget() throws Exception {
+   private ConnectionRouterControl getConnectionRouterControlForTarget() throws Exception {
       setupLiveServerWithDiscovery(0, GROUP_ADDRESS, GROUP_PORT, true, true, false);
-      setupBalancerServerWithDiscovery(0, TargetKey.USER_NAME, FirstElementPolicy.NAME, null, false, null, 1);
+      setupRouterServerWithDiscovery(0, KeyType.USER_NAME, FirstElementPolicy.NAME, null, false, null, 1);
       getServer(0).setMBeanServer(mbeanServer);
 
       setupLiveServerWithDiscovery(1, GROUP_ADDRESS, GROUP_PORT, true, true, false);
 
       startServers(0, 1);
 
-      return ManagementControlHelper.createBrokerBalancerControl(BROKER_BALANCER_NAME, mbeanServer);
+      return ManagementControlHelper.createConnectionRouterControl(CONNECTION_ROUTER_NAME, mbeanServer);
    }
 
-   private BrokerBalancerControl getBrokerBalancerControlForLocalTarget() throws Exception {
+   private ConnectionRouterControl getConnectionRouterControlForLocalTarget() throws Exception {
       setupLiveServerWithDiscovery(0, GROUP_ADDRESS, GROUP_PORT, true, true, false);
-      setupBalancerServerWithDiscovery(0, TargetKey.USER_NAME, FirstElementPolicy.NAME, null, true, null, 1);
+      setupRouterServerWithDiscovery(0, KeyType.USER_NAME, FirstElementPolicy.NAME, null, true, null, 1);
       getServer(0).setMBeanServer(mbeanServer);
 
       startServers(0);
 
-      return ManagementControlHelper.createBrokerBalancerControl(BROKER_BALANCER_NAME, mbeanServer);
+      return ManagementControlHelper.createConnectionRouterControl(CONNECTION_ROUTER_NAME, mbeanServer);
    }
 }
diff --git a/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/management/ManagementControlHelper.java b/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/management/ManagementControlHelper.java
index 905d579..30450ab 100644
--- a/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/management/ManagementControlHelper.java
+++ b/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/management/ManagementControlHelper.java
@@ -27,14 +27,14 @@ import org.apache.activemq.artemis.api.core.management.ActiveMQServerControl;
 import org.apache.activemq.artemis.api.core.management.AddressControl;
 import org.apache.activemq.artemis.api.core.management.BridgeControl;
 import org.apache.activemq.artemis.api.core.management.BroadcastGroupControl;
-import org.apache.activemq.artemis.api.core.management.BrokerBalancerControl;
 import org.apache.activemq.artemis.api.core.management.ClusterConnectionControl;
+import org.apache.activemq.artemis.api.core.management.ConnectionRouterControl;
+import org.apache.activemq.artemis.api.core.RoutingType;
 import org.apache.activemq.artemis.api.core.management.DivertControl;
 import org.apache.activemq.artemis.api.core.management.JGroupsChannelBroadcastGroupControl;
 import org.apache.activemq.artemis.api.core.management.JGroupsFileBroadcastGroupControl;
 import org.apache.activemq.artemis.api.core.management.ObjectNameBuilder;
 import org.apache.activemq.artemis.api.core.management.QueueControl;
-import org.apache.activemq.artemis.api.core.RoutingType;
 
 public class ManagementControlHelper {
 
@@ -96,9 +96,9 @@ public class ManagementControlHelper {
    }
 
 
-   public static BrokerBalancerControl createBrokerBalancerControl(final String name,
-                                                                   final MBeanServer mbeanServer) throws Exception {
-      return (BrokerBalancerControl) ManagementControlHelper.createProxy(ObjectNameBuilder.DEFAULT.getBrokerBalancerObjectName(name), BrokerBalancerControl.class, mbeanServer);
+   public static ConnectionRouterControl createConnectionRouterControl(final String name,
+                                                                       final MBeanServer mbeanServer) throws Exception {
+      return (ConnectionRouterControl) ManagementControlHelper.createProxy(ObjectNameBuilder.DEFAULT.getConnectionRouterObjectName(name), ConnectionRouterControl.class, mbeanServer);
    }
 
 
diff --git a/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/balancing/AmqpRedirectTest.java b/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/routing/AmqpRedirectTest.java
similarity index 86%
rename from tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/balancing/AmqpRedirectTest.java
rename to tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/routing/AmqpRedirectTest.java
index 03b4101..ce4bd85 100644
--- a/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/balancing/AmqpRedirectTest.java
+++ b/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/routing/AmqpRedirectTest.java
@@ -15,14 +15,14 @@
  * limitations under the License.
  */
 
-package org.apache.activemq.artemis.tests.integration.balancing;
+package org.apache.activemq.artemis.tests.integration.routing;
 
 import java.net.URI;
 import java.util.Map;
 
 import org.apache.activemq.artemis.core.remoting.impl.netty.TransportConstants;
-import org.apache.activemq.artemis.core.server.balancing.policies.FirstElementPolicy;
-import org.apache.activemq.artemis.core.server.balancing.targets.TargetKey;
+import org.apache.activemq.artemis.core.server.routing.policies.FirstElementPolicy;
+import org.apache.activemq.artemis.core.server.routing.KeyType;
 import org.apache.activemq.artemis.protocol.amqp.proton.AmqpSupport;
 import org.apache.activemq.transport.amqp.client.AmqpClient;
 import org.apache.activemq.transport.amqp.client.AmqpConnection;
@@ -33,21 +33,21 @@ import org.apache.qpid.proton.engine.Connection;
 import org.junit.Test;
 
 /**
- * Note: The primary balancer tests for AMQP clients are in e.g {@link RedirectTest} along with those for other protocols.
+ * Note: The primary routing tests for AMQP clients are in e.g {@link RedirectTest} along with those for other protocols.
  *
  * This class only adds some additional validations that are AMQP-specific.
  */
-public class AmqpRedirectTest extends BalancingTestBase {
+public class AmqpRedirectTest extends RoutingTestBase {
 
    @Test
-   public void testBalancerRejectionDueToOfflineTargetPool() throws Exception {
+   public void testRouterRejectionDueToOfflineTargetPool() throws Exception {
       setupLiveServerWithDiscovery(0, GROUP_ADDRESS, GROUP_PORT, true, true, false);
       setupLiveServerWithDiscovery(1, GROUP_ADDRESS, GROUP_PORT, true, true, false);
 
       // Zero quorum size to avoid the quorum delay, given it will never be satisfied
-      setupBalancerServerWithStaticConnectors(0, TargetKey.USER_NAME, FirstElementPolicy.NAME, null, false, null, 0, 1);
+      setupRouterServerWithStaticConnectors(0, KeyType.USER_NAME, FirstElementPolicy.NAME, null, false, null, 0, 1);
 
-      // Only start the balancer, so it can never become ready to redirect.
+      // Only start the broker with the router, so it can never become ready to redirect.
       startServers(0);
 
       URI uri = new URI("tcp://localhost:" + TransportConstants.DEFAULT_PORT);
@@ -78,7 +78,7 @@ public class AmqpRedirectTest extends BalancingTestBase {
                return;
             }
 
-            String expectedDescription = "Broker balancer " + BROKER_BALANCER_NAME + " is not ready to redirect";
+            String expectedDescription = "Connection router " + CONNECTION_ROUTER_NAME + " is not ready";
             String actualDescription = remoteError.getDescription();
             if (!expectedDescription.equals(actualDescription)) {
                markAsInvalid("Broker did not set description as expected, was: " + actualDescription);
@@ -101,11 +101,11 @@ public class AmqpRedirectTest extends BalancingTestBase {
    }
 
    @Test
-   public void testBalancerRedirectDetails() throws Exception {
+   public void testRouterRedirectDetails() throws Exception {
       setupLiveServerWithDiscovery(0, GROUP_ADDRESS, GROUP_PORT, true, true, false);
       setupLiveServerWithDiscovery(1, GROUP_ADDRESS, GROUP_PORT, true, true, false);
 
-      setupBalancerServerWithStaticConnectors(0, TargetKey.USER_NAME, FirstElementPolicy.NAME, null, false, null, 1, 1);
+      setupRouterServerWithStaticConnectors(0, KeyType.USER_NAME, FirstElementPolicy.NAME, null, false, null, 1, 1);
 
       startServers(0, 1);
 
@@ -139,7 +139,7 @@ public class AmqpRedirectTest extends BalancingTestBase {
 
             Integer redirectPort = TransportConstants.DEFAULT_PORT + 1;
 
-            String expectedDescription = "Connection redirected to localhost:" + redirectPort + " by broker balancer " + BROKER_BALANCER_NAME;
+            String expectedDescription = "Connection router " + CONNECTION_ROUTER_NAME + " redirected this connection to localhost:" + redirectPort;
             String actualDescription = remoteError.getDescription();
             if (!expectedDescription.equals(actualDescription)) {
                markAsInvalid("Broker did not set description as expected, was: " + actualDescription);
@@ -191,11 +191,11 @@ public class AmqpRedirectTest extends BalancingTestBase {
    }
 
    @Test
-   public void testBalancerRejectionUseAnother() throws Exception {
+   public void testRouterRejectionUseAnother() throws Exception {
       setupLiveServerWithDiscovery(0, GROUP_ADDRESS, GROUP_PORT, true, true, false);
 
       // only accepts users with RoleName==B so will reject
-      setupBalancerServerWithLocalTarget(0, TargetKey.ROLE_NAME, "B", null);
+      setupRouterServerWithLocalTarget(0, KeyType.ROLE_NAME, "B", null);
 
       startServers(0);
 
@@ -226,7 +226,7 @@ public class AmqpRedirectTest extends BalancingTestBase {
                markAsInvalid("Broker did not set condition to " + ConnectionError.CONNECTION_FORCED);
                return;
             }
-            String expectedDescription = "Broker balancer " + BROKER_BALANCER_NAME + ", rejected this connection";
+            String expectedDescription = "Connection router " + CONNECTION_ROUTER_NAME + " rejected this connection";
             String actualDescription = remoteError.getDescription();
             if (!expectedDescription.equals(actualDescription)) {
                markAsInvalid("Broker did not set description as expected, was: " + actualDescription);
diff --git a/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/balancing/AutoClientIDShardClusterTest.java b/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/routing/AutoClientIDShardClusterTest.java
similarity index 91%
rename from tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/balancing/AutoClientIDShardClusterTest.java
rename to tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/routing/AutoClientIDShardClusterTest.java
index 18b605f..e8b4f30 100644
--- a/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/balancing/AutoClientIDShardClusterTest.java
+++ b/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/routing/AutoClientIDShardClusterTest.java
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-package org.apache.activemq.artemis.tests.integration.balancing;
+package org.apache.activemq.artemis.tests.integration.routing;
 
 import javax.jms.Connection;
 import javax.jms.ConnectionFactory;
@@ -36,12 +36,12 @@ import java.util.concurrent.atomic.AtomicInteger;
 
 import org.apache.activemq.artemis.api.core.TransportConfiguration;
 import org.apache.activemq.artemis.core.config.Configuration;
-import org.apache.activemq.artemis.core.config.balancing.BrokerBalancerConfiguration;
-import org.apache.activemq.artemis.core.config.balancing.NamedPropertyConfiguration;
+import org.apache.activemq.artemis.core.config.routing.ConnectionRouterConfiguration;
+import org.apache.activemq.artemis.core.config.routing.NamedPropertyConfiguration;
 import org.apache.activemq.artemis.core.protocol.openwire.OpenWireProtocolManagerFactory;
-import org.apache.activemq.artemis.core.server.balancing.targets.TargetKey;
-import org.apache.activemq.artemis.core.server.balancing.targets.TargetKeyResolver;
-import org.apache.activemq.artemis.core.server.balancing.transformer.ConsistentHashModulo;
+import org.apache.activemq.artemis.core.server.routing.KeyType;
+import org.apache.activemq.artemis.core.server.routing.KeyResolver;
+import org.apache.activemq.artemis.core.server.routing.transformer.ConsistentHashModulo;
 import org.apache.activemq.artemis.core.server.cluster.impl.MessageLoadBalancingType;
 import org.apache.activemq.artemis.jms.client.ActiveMQConnectionFactory;
 import org.apache.activemq.artemis.protocol.amqp.broker.ProtonProtocolManagerFactory;
@@ -53,7 +53,7 @@ import org.junit.runner.RunWith;
 import org.junit.runners.Parameterized;
 
 @RunWith(Parameterized.class)
-public class AutoClientIDShardClusterTest extends BalancingTestBase {
+public class AutoClientIDShardClusterTest extends RoutingTestBase {
 
    @Parameterized.Parameters(name = "protocol: {0}")
    public static Collection<Object[]> data() {
@@ -226,7 +226,7 @@ public class AutoClientIDShardClusterTest extends BalancingTestBase {
    public void testWithConsistentHashClientIDModTwo() throws Exception {
       setupServers();
 
-      addBalancerWithClientIdConsistentHashMod();
+      addRouterWithClientIdConsistentHashMod();
 
       startServers(0, 1);
 
@@ -270,23 +270,23 @@ public class AutoClientIDShardClusterTest extends BalancingTestBase {
       }
    }
 
-   private void addBalancerWithClientIdConsistentHashMod() {
+   private void addRouterWithClientIdConsistentHashMod() {
       final int numberOfNodes = 2;
       for (int node = 0; node < numberOfNodes; node++) {
          Configuration configuration = servers[node].getConfiguration();
-         BrokerBalancerConfiguration brokerBalancerConfiguration = new BrokerBalancerConfiguration().setName(BROKER_BALANCER_NAME);
-         brokerBalancerConfiguration.setTargetKey(TargetKey.CLIENT_ID).setLocalTargetFilter(TargetKeyResolver.DEFAULT_KEY_VALUE + "|" + node);
+         ConnectionRouterConfiguration connectionRouterConfiguration = new ConnectionRouterConfiguration().setName(CONNECTION_ROUTER_NAME);
+         connectionRouterConfiguration.setKeyType(KeyType.CLIENT_ID).setLocalTargetFilter(KeyResolver.DEFAULT_KEY_VALUE + "|" + node);
          NamedPropertyConfiguration transformerConfig = new NamedPropertyConfiguration();
          transformerConfig.setName(ConsistentHashModulo.NAME);
          HashMap<String, String> properties = new HashMap<>();
          properties.put(ConsistentHashModulo.MODULO, String.valueOf(numberOfNodes));
          transformerConfig.setProperties(properties);
-         brokerBalancerConfiguration.setTransformerConfiguration(transformerConfig);
+         connectionRouterConfiguration.setTransformerConfiguration(transformerConfig);
 
-         configuration.setBalancerConfigurations(Collections.singletonList(brokerBalancerConfiguration));
+         configuration.setConnectionRouters(Collections.singletonList(connectionRouterConfiguration));
 
          TransportConfiguration acceptor = getDefaultServerAcceptor(node);
-         acceptor.getParams().put("redirect-to", BROKER_BALANCER_NAME);
+         acceptor.getParams().put("router", CONNECTION_ROUTER_NAME);
       }
    }
 
diff --git a/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/balancing/ElasticQueueTest.java b/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/routing/ElasticQueueTest.java
similarity index 89%
rename from tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/balancing/ElasticQueueTest.java
rename to tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/routing/ElasticQueueTest.java
index a71a26a..87eae8e 100644
--- a/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/balancing/ElasticQueueTest.java
+++ b/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/routing/ElasticQueueTest.java
@@ -14,7 +14,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.activemq.artemis.tests.integration.balancing;
+package org.apache.activemq.artemis.tests.integration.routing;
 
 import javax.jms.BytesMessage;
 import javax.jms.JMSException;
@@ -41,15 +41,15 @@ import org.apache.activemq.artemis.api.core.QueueConfiguration;
 import org.apache.activemq.artemis.api.core.RoutingType;
 import org.apache.activemq.artemis.api.core.SimpleString;
 import org.apache.activemq.artemis.api.core.management.AddressControl;
-import org.apache.activemq.artemis.api.core.management.BrokerBalancerControl;
+import org.apache.activemq.artemis.api.core.management.ConnectionRouterControl;
 import org.apache.activemq.artemis.api.core.management.ObjectNameBuilder;
 import org.apache.activemq.artemis.core.config.Configuration;
 import org.apache.activemq.artemis.core.config.CoreAddressConfiguration;
-import org.apache.activemq.artemis.core.config.balancing.BrokerBalancerConfiguration;
+import org.apache.activemq.artemis.core.config.routing.ConnectionRouterConfiguration;
 import org.apache.activemq.artemis.core.config.impl.ConfigurationImpl;
 import org.apache.activemq.artemis.core.security.CheckType;
 import org.apache.activemq.artemis.core.security.Role;
-import org.apache.activemq.artemis.core.server.balancing.targets.TargetKey;
+import org.apache.activemq.artemis.core.server.routing.KeyType;
 import org.apache.activemq.artemis.core.server.embedded.EmbeddedActiveMQ;
 import org.apache.activemq.artemis.core.settings.impl.AddressFullMessagePolicy;
 import org.apache.activemq.artemis.core.settings.impl.AddressSettings;
@@ -76,7 +76,7 @@ public class ElasticQueueTest extends ActiveMQTestBase {
    final int base_port = 61616;
    final Stack<Worker> workers = new Stack<>();
    final Stack<EmbeddedActiveMQ> nodes = new Stack<>();
-   private final String balancerConfigName = "role_name_sharder";
+   private final String roleNameSharder = "role_name_sharder";
 
    private final ExecutorService executorService = Executors.newFixedThreadPool(3);
    @After
@@ -427,23 +427,23 @@ public class ElasticQueueTest extends ActiveMQTestBase {
       Configuration baseConfig = new ConfigurationImpl();
       baseConfig.getAddressesSettings().put(qName, blockingQueue);
 
-      BrokerBalancerConfiguration balancerConfiguration = new BrokerBalancerConfiguration();
-      balancerConfiguration.setName(balancerConfigName).setTargetKey(TargetKey.ROLE_NAME).setTargetKeyFilter("(?<=^EQ_).*"); // strip EQ_ prefix
-      baseConfig.addBalancerConfiguration(balancerConfiguration);
+      ConnectionRouterConfiguration connectionRouterConfiguration = new ConnectionRouterConfiguration();
+      connectionRouterConfiguration.setName(roleNameSharder).setKeyType(KeyType.ROLE_NAME).setKeyFilter("(?<=^EQ_).*"); // strip EQ_ prefix
+      baseConfig.addConnectionRouter(connectionRouterConfiguration);
 
       // prepare two nodes
       for (int nodeId = 0; nodeId < 2; nodeId++) {
          Configuration configuration = baseConfig.copy();
          configuration.setName("Node" + nodeId);
          configuration.setBrokerInstance(new File(getTestDirfile(), configuration.getName()));
-         configuration.addAcceptorConfiguration("tcp", "tcp://localhost:" + (base_port + (nodeId)) + "?redirect-to=" + balancerConfigName + ";amqpCredits=1000;amqpMinCredits=300");
+         configuration.addAcceptorConfiguration("tcp", "tcp://localhost:" + (base_port + (nodeId)) + "?router=" + roleNameSharder + ";amqpCredits=1000;amqpMinCredits=300");
          nodes.add(new EmbeddedActiveMQ().setConfiguration(configuration));
          nodes.get(nodeId).setSecurityManager(customSecurityManager);
          nodes.get(nodeId).setMbeanServer(mBeanServer);
       }
 
       // node0 initially handles both producer & consumer (head & tail)
-      nodes.get(0).getConfiguration().getBalancerConfigurations().get(0).setLocalTargetFilter("PRODUCER|CONSUMER");
+      nodes.get(0).getConfiguration().getConnectionRouters().get(0).setLocalTargetFilter("PRODUCER|CONSUMER");
       nodes.get(0).start();
    }
 
@@ -475,11 +475,11 @@ public class ElasticQueueTest extends ActiveMQTestBase {
       },10000, 500));
 
       // stop producer on Node0, only accept consumers
-      BrokerBalancerControl balancerControl0 = (BrokerBalancerControl) ManagementControlHelper.createProxy(node0NameBuilder.getBrokerBalancerObjectName(balancerConfigName), BrokerBalancerControl.class, mBeanServer);
-      balancerControl0.setLocalTargetFilter("CONSUMER");
+      ConnectionRouterControl routerControl0 = (ConnectionRouterControl) ManagementControlHelper.createProxy(node0NameBuilder.getConnectionRouterObjectName(roleNameSharder), ConnectionRouterControl.class, mBeanServer);
+      routerControl0.setLocalTargetFilter("CONSUMER");
 
       // start node1 exclusively for Producer
-      nodes.get(1).getConfiguration().getBalancerConfigurations().get(0).setLocalTargetFilter("PRODUCER");
+      nodes.get(1).getConfiguration().getConnectionRouters().get(0).setLocalTargetFilter("PRODUCER");
       nodes.get(1).start();
 
       // auto created address when producer connects
@@ -501,10 +501,10 @@ public class ElasticQueueTest extends ActiveMQTestBase {
          System.out.println("Want 0, Node0 (tail) usage % " + usage);
          return usage == 0;
       },20000, 500));
-      balancerControl0.setLocalTargetFilter(""); // Node0 is out of service, Node1 (new head&tail) is where it is all at going forward!
+      routerControl0.setLocalTargetFilter(""); // Node0 is out of service, Node1 (new head&tail) is where it is all at going forward!
 
-      BrokerBalancerControl balancerControl1 = (BrokerBalancerControl) ManagementControlHelper.createProxy(node1NameBuilder.getBrokerBalancerObjectName(balancerConfigName), BrokerBalancerControl.class, mBeanServer);
-      balancerControl1.setLocalTargetFilter("CONSUMER|PRODUCER"); // Node1 is serving (head & tail)
+      ConnectionRouterControl routerControl0Control1 = (ConnectionRouterControl) ManagementControlHelper.createProxy(node1NameBuilder.getConnectionRouterObjectName(roleNameSharder), ConnectionRouterControl.class, mBeanServer);
+      routerControl0Control1.setLocalTargetFilter("CONSUMER|PRODUCER"); // Node1 is serving (head & tail)
 
       // back to one element in the chain
       nodes.get(0).stop();
@@ -566,11 +566,11 @@ public class ElasticQueueTest extends ActiveMQTestBase {
       long lastProducedToHeadTail = eqProducerConsumer.getLastProduced();
 
       // stop producer on Node0, only accept consumers. make it a tail broker
-      BrokerBalancerControl balancerControl0 = (BrokerBalancerControl) ManagementControlHelper.createProxy(node0NameBuilder.getBrokerBalancerObjectName(balancerConfigName), BrokerBalancerControl.class, mBeanServer);
-      balancerControl0.setLocalTargetFilter("CONSUMER");
+      ConnectionRouterControl routerControl0 = (ConnectionRouterControl) ManagementControlHelper.createProxy(node0NameBuilder.getConnectionRouterObjectName(roleNameSharder), ConnectionRouterControl.class, mBeanServer);
+      routerControl0.setLocalTargetFilter("CONSUMER");
 
       // start new head exclusively for Producer
-      nodes.get(1).getConfiguration().getBalancerConfigurations().get(0).setLocalTargetFilter("PRODUCER");
+      nodes.get(1).getConfiguration().getConnectionRouters().get(0).setLocalTargetFilter("PRODUCER");
       nodes.get(1).start();
 
       // ensure nothing can be consumed from the head
@@ -602,8 +602,8 @@ public class ElasticQueueTest extends ActiveMQTestBase {
 
       eqConsumer.done.set(true);
 
-      balancerControl0 = (BrokerBalancerControl) ManagementControlHelper.createProxy(node0NameBuilder.getBrokerBalancerObjectName(balancerConfigName), BrokerBalancerControl.class, mBeanServer);
-      balancerControl0.setLocalTargetFilter(""); // out of service
+      routerControl0 = (ConnectionRouterControl) ManagementControlHelper.createProxy(node0NameBuilder.getConnectionRouterObjectName(roleNameSharder), ConnectionRouterControl.class, mBeanServer);
+      routerControl0.setLocalTargetFilter(""); // out of service
 
       nodes.get(0).stop();
 
@@ -662,17 +662,17 @@ public class ElasticQueueTest extends ActiveMQTestBase {
       assertTrue("producer got full error and reconnected", Wait.waitFor(() -> eqProducerConsumer.connectionCount.get() > 0));
 
       // stop producer on Node0, only accept consumers. make it a tail broker
-      BrokerBalancerControl balancerControl0 = (BrokerBalancerControl) ManagementControlHelper.createProxy(node0NameBuilder.getBrokerBalancerObjectName(balancerConfigName), BrokerBalancerControl.class, mBeanServer);
-      balancerControl0.setTargetKeyFilter("(?<=^EQ_)CONSUMER");  // because both roles present, we need to filter the roles with an exact match, otherwise we get the first one!
+      ConnectionRouterControl routerControl0 = (ConnectionRouterControl) ManagementControlHelper.createProxy(node0NameBuilder.getConnectionRouterObjectName(roleNameSharder), ConnectionRouterControl.class, mBeanServer);
+      routerControl0.setTargetKeyFilter("(?<=^EQ_)CONSUMER");  // because both roles present, we need to filter the roles with an exact match, otherwise we get the first one!
       // ensure nothing more can be produced
       addressControl0.block();
       System.out.println("Tail blocked!");
 
       // start new head exclusively for Producer
-      nodes.get(1).getConfiguration().getBalancerConfigurations().get(0).setTargetKeyFilter("(?<=^EQ_)PRODUCER"); // just accept the producer role as key
-      nodes.get(1).getConfiguration().getBalancerConfigurations().get(0).setLocalTargetFilter(null); // initially won't accept any till we pause
+      nodes.get(1).getConfiguration().getConnectionRouters().get(0).setKeyFilter("(?<=^EQ_)PRODUCER"); // just accept the producer role as key
+      nodes.get(1).getConfiguration().getConnectionRouters().get(0).setLocalTargetFilter(null); // initially won't accept any till we pause
 
-      // new Head needs the address configured, such that we can start the balancer with the address paused
+      // new Head needs the address configured, such that we can start the routerControl0 with the address paused
       nodes.get(1).getConfiguration().getAddressConfigurations().add(new CoreAddressConfiguration().setName(qName).addRoutingType(RoutingType.ANYCAST).addQueueConfiguration(new QueueConfiguration(qName).setRoutingType(RoutingType.ANYCAST)));
       nodes.get(1).start();
 
@@ -686,8 +686,8 @@ public class ElasticQueueTest extends ActiveMQTestBase {
          }
          return false;
       }, 5000, 100));
-      BrokerBalancerControl balancerControl1 = (BrokerBalancerControl) ManagementControlHelper.createProxy(node1NameBuilder.getBrokerBalancerObjectName(balancerConfigName), BrokerBalancerControl.class, mBeanServer);
-      balancerControl1.setLocalTargetFilter("PRODUCER");
+      ConnectionRouterControl routerControl0Control1 = (ConnectionRouterControl) ManagementControlHelper.createProxy(node1NameBuilder.getConnectionRouterObjectName(roleNameSharder), ConnectionRouterControl.class, mBeanServer);
+      routerControl0Control1.setLocalTargetFilter("PRODUCER");
       System.out.println("Head enabled for producers... limit: " + addressControl1.getAddressLimitPercent());
 
       // let the consumer run as fast as possible
@@ -701,7 +701,7 @@ public class ElasticQueueTest extends ActiveMQTestBase {
       }, 20000, 200));
 
       System.out.println("Tail drained!");
-      balancerControl0.setLocalTargetFilter(null); // out of service
+      routerControl0.setLocalTargetFilter(null); // out of service
 
       // resume consumers on the new head&tail
       addressControl1.resume();
diff --git a/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/balancing/TargetKeyTest.java b/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/routing/KeyTypeTest.java
similarity index 87%
rename from tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/balancing/TargetKeyTest.java
rename to tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/routing/KeyTypeTest.java
index 446156d..da2d439 100644
--- a/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/balancing/TargetKeyTest.java
+++ b/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/routing/KeyTypeTest.java
@@ -15,17 +15,17 @@
  * limitations under the License.
  */
 
-package org.apache.activemq.artemis.tests.integration.balancing;
+package org.apache.activemq.artemis.tests.integration.routing;
 
 import org.apache.activemq.artemis.core.remoting.impl.netty.TransportConstants;
 import org.apache.activemq.artemis.core.security.Role;
 import org.apache.activemq.artemis.core.server.ActiveMQServers;
-import org.apache.activemq.artemis.core.server.balancing.policies.FirstElementPolicy;
-import org.apache.activemq.artemis.core.server.balancing.policies.Policy;
-import org.apache.activemq.artemis.core.server.balancing.policies.PolicyFactory;
-import org.apache.activemq.artemis.core.server.balancing.policies.PolicyFactoryResolver;
-import org.apache.activemq.artemis.core.server.balancing.targets.Target;
-import org.apache.activemq.artemis.core.server.balancing.targets.TargetKey;
+import org.apache.activemq.artemis.core.server.routing.policies.FirstElementPolicy;
+import org.apache.activemq.artemis.core.server.routing.policies.Policy;
+import org.apache.activemq.artemis.core.server.routing.policies.PolicyFactory;
+import org.apache.activemq.artemis.core.server.routing.policies.PolicyFactoryResolver;
+import org.apache.activemq.artemis.core.server.routing.targets.Target;
+import org.apache.activemq.artemis.core.server.routing.KeyType;
 import org.apache.activemq.artemis.core.settings.HierarchicalRepository;
 import org.apache.activemq.artemis.spi.core.security.ActiveMQJAASSecurityManager;
 import org.apache.activemq.artemis.tests.integration.security.SecurityTest;
@@ -50,7 +50,7 @@ import java.util.List;
 import java.util.Set;
 
 @RunWith(Parameterized.class)
-public class TargetKeyTest extends BalancingTestBase {
+public class KeyTypeTest extends RoutingTestBase {
 
    private static final String MOCK_POLICY_NAME = "MOCK_POLICY";
 
@@ -82,7 +82,7 @@ public class TargetKeyTest extends BalancingTestBase {
    private final List<String> keys = new ArrayList<>();
 
 
-   public TargetKeyTest(String protocol) {
+   public KeyTypeTest(String protocol) {
       this.protocol = protocol;
    }
 
@@ -106,7 +106,7 @@ public class TargetKeyTest extends BalancingTestBase {
    @Test
    public void testClientIDKey() throws Exception {
       setupLiveServerWithDiscovery(0, GROUP_ADDRESS, GROUP_PORT, true, true, false);
-      setupBalancerServerWithDiscovery(0, TargetKey.CLIENT_ID, MOCK_POLICY_NAME, null, true, null, 1);
+      setupRouterServerWithDiscovery(0, KeyType.CLIENT_ID, MOCK_POLICY_NAME, null, true, null, 1);
       startServers(0);
 
       ConnectionFactory connectionFactory = createFactory(protocol, false, TransportConstants.DEFAULT_HOST,
@@ -141,7 +141,7 @@ public class TargetKeyTest extends BalancingTestBase {
       getDefaultServerAcceptor(0).getParams().put(TransportConstants.KEYSTORE_PATH_PROP_NAME, "server-keystore.jks");
       getDefaultServerAcceptor(0).getParams().put(TransportConstants.KEYSTORE_PASSWORD_PROP_NAME, "securepass");
 
-      setupBalancerServerWithDiscovery(0, TargetKey.SNI_HOST, MOCK_POLICY_NAME, null, true, null, 1);
+      setupRouterServerWithDiscovery(0, KeyType.SNI_HOST, MOCK_POLICY_NAME, null, true, null, 1);
       startServers(0);
 
       ConnectionFactory connectionFactory = createFactory(protocol, true, localHostname,
@@ -158,7 +158,7 @@ public class TargetKeyTest extends BalancingTestBase {
    @Test
    public void testSourceIPKey() throws Exception {
       setupLiveServerWithDiscovery(0, GROUP_ADDRESS, GROUP_PORT, true, true, false);
-      setupBalancerServerWithDiscovery(0, TargetKey.SOURCE_IP, MOCK_POLICY_NAME, null, true, null, 1);
+      setupRouterServerWithDiscovery(0, KeyType.SOURCE_IP, MOCK_POLICY_NAME, null, true, null, 1);
       startServers(0);
 
       ConnectionFactory connectionFactory = createFactory(protocol, false, TransportConstants.DEFAULT_HOST,
@@ -175,7 +175,7 @@ public class TargetKeyTest extends BalancingTestBase {
    @Test
    public void testUserNameKey() throws Exception {
       setupLiveServerWithDiscovery(0, GROUP_ADDRESS, GROUP_PORT, true, true, false);
-      setupBalancerServerWithDiscovery(0, TargetKey.USER_NAME, MOCK_POLICY_NAME, null, true, null, 1);
+      setupRouterServerWithDiscovery(0, KeyType.USER_NAME, MOCK_POLICY_NAME, null, true, null, 1);
       startServers(0);
 
       ConnectionFactory connectionFactory = createFactory(protocol, false, TransportConstants.DEFAULT_HOST,
@@ -194,7 +194,7 @@ public class TargetKeyTest extends BalancingTestBase {
 
       ActiveMQJAASSecurityManager securityManager = new ActiveMQJAASSecurityManager("PropertiesLogin");
       servers[0] = addServer(ActiveMQServers.newActiveMQServer(createDefaultConfig(true).setSecurityEnabled(true), ManagementFactory.getPlatformMBeanServer(), securityManager, false));
-      setupBalancerServerWithLocalTarget(0, TargetKey.ROLE_NAME, "b", "b");
+      setupRouterServerWithLocalTarget(0, KeyType.ROLE_NAME, "b", "b");
 
       // ensure advisory permission is present for openwire connection creation by 'b'
       HierarchicalRepository<Set<Role>> securityRepository = servers[0].getSecurityRepository();
diff --git a/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/balancing/MQTTRedirectTest.java b/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/routing/MQTTRedirectTest.java
similarity index 89%
rename from tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/balancing/MQTTRedirectTest.java
rename to tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/routing/MQTTRedirectTest.java
index 3883cd0..5ac9bab 100644
--- a/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/balancing/MQTTRedirectTest.java
+++ b/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/routing/MQTTRedirectTest.java
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-package org.apache.activemq.artemis.tests.integration.balancing;
+package org.apache.activemq.artemis.tests.integration.routing;
 
 import javax.management.openmbean.CompositeData;
 import javax.management.openmbean.TabularData;
@@ -28,14 +28,14 @@ import java.util.concurrent.TimeUnit;
 
 import org.apache.activemq.artemis.api.core.QueueConfiguration;
 import org.apache.activemq.artemis.api.core.RoutingType;
-import org.apache.activemq.artemis.api.core.management.BrokerBalancerControl;
+import org.apache.activemq.artemis.api.core.management.ConnectionRouterControl;
 import org.apache.activemq.artemis.api.core.management.QueueControl;
 import org.apache.activemq.artemis.api.core.management.ResourceNames;
 import org.apache.activemq.artemis.core.protocol.mqtt.MQTTReasonCodes;
 import org.apache.activemq.artemis.core.remoting.impl.netty.TransportConstants;
 import org.apache.activemq.artemis.core.server.ActiveMQServers;
-import org.apache.activemq.artemis.core.server.balancing.policies.FirstElementPolicy;
-import org.apache.activemq.artemis.core.server.balancing.targets.TargetKey;
+import org.apache.activemq.artemis.core.server.routing.policies.FirstElementPolicy;
+import org.apache.activemq.artemis.core.server.routing.KeyType;
 import org.apache.activemq.artemis.spi.core.security.ActiveMQJAASSecurityManager;
 import org.apache.activemq.artemis.tests.integration.security.SecurityTest;
 import org.apache.activemq.artemis.utils.Wait;
@@ -47,7 +47,7 @@ import org.eclipse.paho.client.mqttv3.persist.MemoryPersistence;
 import org.junit.Assert;
 import org.junit.Test;
 
-public class MQTTRedirectTest extends BalancingTestBase {
+public class MQTTRedirectTest extends RoutingTestBase {
 
    static {
       String path = System.getProperty("java.security.auth.login.config");
@@ -66,7 +66,7 @@ public class MQTTRedirectTest extends BalancingTestBase {
 
       setupLiveServerWithDiscovery(0, GROUP_ADDRESS, GROUP_PORT, true, true, false);
       setupLiveServerWithDiscovery(1, GROUP_ADDRESS, GROUP_PORT, true, true, false);
-      setupBalancerServerWithDiscovery(0, TargetKey.USER_NAME, FirstElementPolicy.NAME, null, false, null, 1);
+      setupRouterServerWithDiscovery(0, KeyType.USER_NAME, FirstElementPolicy.NAME, null, false, null, 1);
 
       startServers(0, 1);
 
@@ -95,10 +95,10 @@ public class MQTTRedirectTest extends BalancingTestBase {
       }
       client0.close();
 
-      BrokerBalancerControl brokerBalancerControl = (BrokerBalancerControl)getServer(0).getManagementService()
-         .getResource(ResourceNames.BROKER_BALANCER + BROKER_BALANCER_NAME);
+      ConnectionRouterControl connectionRouterControl = (ConnectionRouterControl)getServer(0).getManagementService()
+         .getResource(ResourceNames.CONNECTION_ROUTER + CONNECTION_ROUTER_NAME);
 
-      CompositeData targetData = brokerBalancerControl.getTarget("admin");
+      CompositeData targetData = connectionRouterControl.getTarget("admin");
       CompositeData targetConnectorData = (CompositeData)targetData.get("connector");
       TabularData targetConnectorParams = (TabularData)targetConnectorData.get("params");
       CompositeData hostData = targetConnectorParams.get(new Object[]{TransportConstants.HOST_PROP_NAME});
@@ -137,7 +137,7 @@ public class MQTTRedirectTest extends BalancingTestBase {
 
       ActiveMQJAASSecurityManager securityManager = new ActiveMQJAASSecurityManager("PropertiesLogin");
       servers[0] = addServer(ActiveMQServers.newActiveMQServer(createDefaultConfig(true).setSecurityEnabled(true), ManagementFactory.getPlatformMBeanServer(), securityManager, false));
-      setupBalancerServerWithLocalTarget(0, TargetKey.ROLE_NAME, "b", "b");
+      setupRouterServerWithLocalTarget(0, KeyType.ROLE_NAME, "b", "b");
 
       startServers(0);
 
diff --git a/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/balancing/RedirectTest.java b/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/routing/RedirectTest.java
similarity index 86%
rename from tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/balancing/RedirectTest.java
rename to tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/routing/RedirectTest.java
index 3b7b786..a5587d6 100644
--- a/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/balancing/RedirectTest.java
+++ b/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/routing/RedirectTest.java
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-package org.apache.activemq.artemis.tests.integration.balancing;
+package org.apache.activemq.artemis.tests.integration.routing;
 
 import javax.jms.Connection;
 import javax.jms.ConnectionFactory;
@@ -34,11 +34,11 @@ import org.apache.activemq.artemis.api.core.RoutingType;
 import org.apache.activemq.artemis.api.core.management.QueueControl;
 import org.apache.activemq.artemis.api.core.management.ResourceNames;
 import org.apache.activemq.artemis.core.remoting.impl.netty.TransportConstants;
-import org.apache.activemq.artemis.core.server.balancing.policies.ConsistentHashPolicy;
-import org.apache.activemq.artemis.core.server.balancing.policies.FirstElementPolicy;
-import org.apache.activemq.artemis.core.server.balancing.policies.LeastConnectionsPolicy;
-import org.apache.activemq.artemis.core.server.balancing.policies.RoundRobinPolicy;
-import org.apache.activemq.artemis.core.server.balancing.targets.TargetKey;
+import org.apache.activemq.artemis.core.server.routing.policies.ConsistentHashPolicy;
+import org.apache.activemq.artemis.core.server.routing.policies.FirstElementPolicy;
+import org.apache.activemq.artemis.core.server.routing.policies.LeastConnectionsPolicy;
+import org.apache.activemq.artemis.core.server.routing.policies.RoundRobinPolicy;
+import org.apache.activemq.artemis.core.server.routing.KeyType;
 import org.apache.activemq.artemis.core.server.cluster.impl.MessageLoadBalancingType;
 import org.junit.Assert;
 import org.junit.Test;
@@ -46,7 +46,7 @@ import org.junit.runner.RunWith;
 import org.junit.runners.Parameterized;
 
 @RunWith(Parameterized.class)
-public class RedirectTest extends BalancingTestBase {
+public class RedirectTest extends RoutingTestBase {
 
    @Parameterized.Parameters(name = "protocol: {0}, pool: {1}")
    public static Collection<Object[]> data() {
@@ -84,11 +84,11 @@ public class RedirectTest extends BalancingTestBase {
       if (CLUSTER_POOL.equals(pool)) {
          setupDiscoveryClusterConnection("cluster0", 0, "dg1", "queues", MessageLoadBalancingType.OFF, 1, true);
          setupDiscoveryClusterConnection("cluster1", 1, "dg1", "queues", MessageLoadBalancingType.OFF, 1, true);
-         setupBalancerServerWithCluster(0, TargetKey.USER_NAME, FirstElementPolicy.NAME, null, false, "ACTIVEMQ.CLUSTER.ADMIN.USER", 1, "cluster0");
+         setupRouterServerWithCluster(0, KeyType.USER_NAME, FirstElementPolicy.NAME, null, false, "ACTIVEMQ.CLUSTER.ADMIN.USER", 1, "cluster0");
       } else if (DISCOVERY_POOL.equals(pool)) {
-         setupBalancerServerWithDiscovery(0, TargetKey.USER_NAME, FirstElementPolicy.NAME, null, false, null, 1);
+         setupRouterServerWithDiscovery(0, KeyType.USER_NAME, FirstElementPolicy.NAME, null, false, null, 1);
       } else {
-         setupBalancerServerWithStaticConnectors(0, TargetKey.USER_NAME, FirstElementPolicy.NAME, null, false, null, 1, 1);
+         setupRouterServerWithStaticConnectors(0, KeyType.USER_NAME, FirstElementPolicy.NAME, null, false, null, 1, 1);
       }
 
       startServers(0, 1);
@@ -179,15 +179,15 @@ public class RedirectTest extends BalancingTestBase {
          for (int node : nodes) {
             setupDiscoveryClusterConnection("cluster" + node, node, "dg1", "queues", MessageLoadBalancingType.OFF, 1, true);
          }
-         setupBalancerServerWithCluster(0, TargetKey.USER_NAME, policyName, properties, false, "ACTIVEMQ.CLUSTER.ADMIN.USER", targets, "cluster0");
+         setupRouterServerWithCluster(0, KeyType.USER_NAME, policyName, properties, false, "ACTIVEMQ.CLUSTER.ADMIN.USER", targets, "cluster0");
       } else if (DISCOVERY_POOL.equals(pool)) {
-         setupBalancerServerWithDiscovery(0, TargetKey.USER_NAME, policyName, properties, false, null, targets);
+         setupRouterServerWithDiscovery(0, KeyType.USER_NAME, policyName, properties, false, null, targets);
       } else {
-         setupBalancerServerWithStaticConnectors(0, TargetKey.USER_NAME, policyName, properties, false, null, targets, 1, 2, 3);
+         setupRouterServerWithStaticConnectors(0, KeyType.USER_NAME, policyName, properties, false, null, targets, 1, 2, 3);
       }
 
       if (withFailure) {
-         setupBalancerLocalCache(0, true, 0);
+         setupRouterLocalCache(0, true, 0);
       }
 
       startServers(nodes);
@@ -265,14 +265,14 @@ public class RedirectTest extends BalancingTestBase {
       if (CLUSTER_POOL.equals(pool)) {
          setupDiscoveryClusterConnection("cluster0", 0, "dg1", "queues", MessageLoadBalancingType.OFF, 1, true);
          setupDiscoveryClusterConnection("cluster1", 1, "dg1", "queues", MessageLoadBalancingType.OFF, 1, true);
-         setupBalancerServerWithCluster(0, TargetKey.USER_NAME, ConsistentHashPolicy.NAME, null, true, "ACTIVEMQ.CLUSTER.ADMIN.USER", 2, "cluster0");
-         setupBalancerServerWithCluster(1, TargetKey.USER_NAME, ConsistentHashPolicy.NAME, null, true, "ACTIVEMQ.CLUSTER.ADMIN.USER", 2, "cluster1");
+         setupRouterServerWithCluster(0, KeyType.USER_NAME, ConsistentHashPolicy.NAME, null, true, "ACTIVEMQ.CLUSTER.ADMIN.USER", 2, "cluster0");
+         setupRouterServerWithCluster(1, KeyType.USER_NAME, ConsistentHashPolicy.NAME, null, true, "ACTIVEMQ.CLUSTER.ADMIN.USER", 2, "cluster1");
       } else if (DISCOVERY_POOL.equals(pool)) {
-         setupBalancerServerWithDiscovery(0, TargetKey.USER_NAME, ConsistentHashPolicy.NAME, null, true, null, 2);
-         setupBalancerServerWithDiscovery(1, TargetKey.USER_NAME, ConsistentHashPolicy.NAME, null, true, null, 2);
+         setupRouterServerWithDiscovery(0, KeyType.USER_NAME, ConsistentHashPolicy.NAME, null, true, null, 2);
+         setupRouterServerWithDiscovery(1, KeyType.USER_NAME, ConsistentHashPolicy.NAME, null, true, null, 2);
       } else {
-         setupBalancerServerWithStaticConnectors(0, TargetKey.USER_NAME, ConsistentHashPolicy.NAME, null, true, null, 2, 1);
-         setupBalancerServerWithStaticConnectors(1, TargetKey.USER_NAME, ConsistentHashPolicy.NAME, null, true, null, 2, 0);
+         setupRouterServerWithStaticConnectors(0, KeyType.USER_NAME, ConsistentHashPolicy.NAME, null, true, null, 2, 1);
+         setupRouterServerWithStaticConnectors(1, KeyType.USER_NAME, ConsistentHashPolicy.NAME, null, true, null, 2, 0);
       }
 
       startServers(0, 1);
@@ -340,11 +340,11 @@ public class RedirectTest extends BalancingTestBase {
          setupDiscoveryClusterConnection("cluster0", 0, "dg1", "queues", MessageLoadBalancingType.OFF, 1, true);
          setupDiscoveryClusterConnection("cluster1", 1, "dg1", "queues", MessageLoadBalancingType.OFF, 1, true);
          setupDiscoveryClusterConnection("cluster2", 2, "dg1", "queues", MessageLoadBalancingType.OFF, 1, true);
-         setupBalancerServerWithCluster(0, TargetKey.USER_NAME, FirstElementPolicy.NAME, null, false, "ACTIVEMQ.CLUSTER.ADMIN.USER", 1, "cluster0");
+         setupRouterServerWithCluster(0, KeyType.USER_NAME, FirstElementPolicy.NAME, null, false, "ACTIVEMQ.CLUSTER.ADMIN.USER", 1, "cluster0");
       } else if (DISCOVERY_POOL.equals(pool)) {
-         setupBalancerServerWithDiscovery(0, TargetKey.USER_NAME, FirstElementPolicy.NAME, null, false, null, 1);
+         setupRouterServerWithDiscovery(0, KeyType.USER_NAME, FirstElementPolicy.NAME, null, false, null, 1);
       } else {
-         setupBalancerServerWithStaticConnectors(0, TargetKey.USER_NAME, FirstElementPolicy.NAME, null, false, null, 1, 1, 2);
+         setupRouterServerWithStaticConnectors(0, KeyType.USER_NAME, FirstElementPolicy.NAME, null, false, null, 1, 1, 2);
       }
 
       startServers(0, 1, 2);
diff --git a/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/balancing/BalancingTestBase.java b/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/routing/RoutingTestBase.java
similarity index 73%
rename from tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/balancing/BalancingTestBase.java
rename to tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/routing/RoutingTestBase.java
index 3a82854..ec4427c 100644
--- a/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/balancing/BalancingTestBase.java
+++ b/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/routing/RoutingTestBase.java
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-package org.apache.activemq.artemis.tests.integration.balancing;
+package org.apache.activemq.artemis.tests.integration.routing;
 
 import javax.jms.ConnectionFactory;
 
@@ -26,18 +26,18 @@ import java.util.Map;
 
 import org.apache.activemq.artemis.api.core.TransportConfiguration;
 import org.apache.activemq.artemis.core.config.Configuration;
-import org.apache.activemq.artemis.core.config.balancing.BrokerBalancerConfiguration;
-import org.apache.activemq.artemis.core.config.balancing.CacheConfiguration;
-import org.apache.activemq.artemis.core.config.balancing.NamedPropertyConfiguration;
-import org.apache.activemq.artemis.core.config.balancing.PoolConfiguration;
+import org.apache.activemq.artemis.core.config.routing.ConnectionRouterConfiguration;
+import org.apache.activemq.artemis.core.config.routing.CacheConfiguration;
+import org.apache.activemq.artemis.core.config.routing.NamedPropertyConfiguration;
+import org.apache.activemq.artemis.core.config.routing.PoolConfiguration;
 import org.apache.activemq.artemis.core.remoting.impl.netty.TransportConstants;
-import org.apache.activemq.artemis.core.server.balancing.targets.TargetKey;
+import org.apache.activemq.artemis.core.server.routing.KeyType;
 import org.apache.activemq.artemis.jms.client.ActiveMQConnectionFactory;
 import org.apache.activemq.artemis.tests.integration.cluster.distribution.ClusterTestBase;
 import org.apache.activemq.artemis.tests.util.ActiveMQTestBase;
 import org.apache.qpid.jms.JmsConnectionFactory;
 
-public class BalancingTestBase extends ClusterTestBase {
+public class RoutingTestBase extends ClusterTestBase {
    protected static final String AMQP_PROTOCOL = "AMQP";
    protected static final String CORE_PROTOCOL = "CORE";
    protected static final String OPENWIRE_PROTOCOL = "OPENWIRE";
@@ -46,7 +46,7 @@ public class BalancingTestBase extends ClusterTestBase {
    protected static final String DISCOVERY_POOL = "DISCOVERY";
    protected static final String STATIC_POOL = "STATIC";
 
-   protected static final String BROKER_BALANCER_NAME = "bb1";
+   protected static final String CONNECTION_ROUTER_NAME = "bb1";
 
    protected static final String DEFAULT_CONNECTOR_NAME = "DEFAULT";
 
@@ -80,43 +80,43 @@ public class BalancingTestBase extends ClusterTestBase {
       return defaultServerConnector;
    }
 
-   protected void setupBalancerServerWithCluster(final int node, final TargetKey targetKey, final String policyName, final Map<String, String> properties, final boolean localTargetEnabled, final String localTargetFilter, final int quorumSize, String clusterConnection) {
+   protected void setupRouterServerWithCluster(final int node, final KeyType keyType, final String policyName, final Map<String, String> properties, final boolean localTargetEnabled, final String localTargetFilter, final int quorumSize, String clusterConnection) {
       Configuration configuration = getServer(node).getConfiguration();
-      BrokerBalancerConfiguration brokerBalancerConfiguration = new BrokerBalancerConfiguration().setName(BROKER_BALANCER_NAME);
+      ConnectionRouterConfiguration connectionRouterConfiguration = new ConnectionRouterConfiguration().setName(CONNECTION_ROUTER_NAME);
 
       setupDefaultServerConnector(node);
 
-      brokerBalancerConfiguration.setTargetKey(targetKey).setLocalTargetFilter(localTargetFilter)
+      connectionRouterConfiguration.setKeyType(keyType).setLocalTargetFilter(localTargetFilter)
          .setPoolConfiguration(new PoolConfiguration().setCheckPeriod(1000).setQuorumSize(quorumSize)
             .setLocalTargetEnabled(localTargetEnabled).setClusterConnection(clusterConnection))
          .setPolicyConfiguration(new NamedPropertyConfiguration().setName(policyName).setProperties(properties));
 
-      configuration.setBalancerConfigurations(Collections.singletonList(brokerBalancerConfiguration));
+      configuration.setConnectionRouters(Collections.singletonList(connectionRouterConfiguration));
 
       TransportConfiguration acceptor = getDefaultServerAcceptor(node);
-      acceptor.getParams().put("redirect-to", BROKER_BALANCER_NAME);
+      acceptor.getParams().put("router", CONNECTION_ROUTER_NAME);
    }
 
-   protected void setupBalancerServerWithDiscovery(final int node, final TargetKey targetKey, final String policyName, final Map<String, String> properties, final boolean localTargetEnabled, final String localTargetFilter, final int quorumSize) {
+   protected void setupRouterServerWithDiscovery(final int node, final KeyType keyType, final String policyName, final Map<String, String> properties, final boolean localTargetEnabled, final String localTargetFilter, final int quorumSize) {
       Configuration configuration = getServer(node).getConfiguration();
-      BrokerBalancerConfiguration brokerBalancerConfiguration = new BrokerBalancerConfiguration().setName(BROKER_BALANCER_NAME);
+      ConnectionRouterConfiguration connectionRouterConfiguration = new ConnectionRouterConfiguration().setName(CONNECTION_ROUTER_NAME);
 
       setupDefaultServerConnector(node);
 
-      brokerBalancerConfiguration.setTargetKey(targetKey).setLocalTargetFilter(localTargetFilter)
+      connectionRouterConfiguration.setKeyType(keyType).setLocalTargetFilter(localTargetFilter)
          .setPoolConfiguration(new PoolConfiguration().setCheckPeriod(1000).setQuorumSize(quorumSize)
             .setLocalTargetEnabled(localTargetEnabled).setDiscoveryGroupName("dg1"))
          .setPolicyConfiguration(new NamedPropertyConfiguration().setName(policyName).setProperties(properties));
 
-      configuration.setBalancerConfigurations(Collections.singletonList(brokerBalancerConfiguration));
+      configuration.setConnectionRouters(Collections.singletonList(connectionRouterConfiguration));
 
       TransportConfiguration acceptor = getDefaultServerAcceptor(node);
-      acceptor.getParams().put("redirect-to", BROKER_BALANCER_NAME);
+      acceptor.getParams().put("router", CONNECTION_ROUTER_NAME);
    }
 
-   protected void setupBalancerServerWithStaticConnectors(final int node, final TargetKey targetKey, final String policyName, final Map<String, String> properties, final boolean localTargetEnabled, final String localTargetFilter, final int quorumSize, final int... targetNodes) {
+   protected void setupRouterServerWithStaticConnectors(final int node, final KeyType keyType, final String policyName, final Map<String, String> properties, final boolean localTargetEnabled, final String localTargetFilter, final int quorumSize, final int... targetNodes) {
       Configuration configuration = getServer(node).getConfiguration();
-      BrokerBalancerConfiguration brokerBalancerConfiguration = new BrokerBalancerConfiguration().setName(BROKER_BALANCER_NAME);
+      ConnectionRouterConfiguration connectionRouterConfiguration = new ConnectionRouterConfiguration().setName(CONNECTION_ROUTER_NAME);
 
       setupDefaultServerConnector(node);
 
@@ -127,38 +127,38 @@ public class BalancingTestBase extends ClusterTestBase {
          staticConnectors.add(connector.getName());
       }
 
-      brokerBalancerConfiguration.setTargetKey(targetKey).setLocalTargetFilter(localTargetFilter)
+      connectionRouterConfiguration.setKeyType(keyType).setLocalTargetFilter(localTargetFilter)
          .setPoolConfiguration(new PoolConfiguration().setCheckPeriod(1000).setQuorumSize(quorumSize)
             .setLocalTargetEnabled(localTargetEnabled).setStaticConnectors(staticConnectors))
          .setPolicyConfiguration(new NamedPropertyConfiguration().setName(policyName).setProperties(properties));
 
-      configuration.setBalancerConfigurations(Collections.singletonList(brokerBalancerConfiguration));
+      configuration.setConnectionRouters(Collections.singletonList(connectionRouterConfiguration));
 
       TransportConfiguration acceptor = getDefaultServerAcceptor(node);
-      acceptor.getParams().put("redirect-to", BROKER_BALANCER_NAME);
+      acceptor.getParams().put("router", CONNECTION_ROUTER_NAME);
    }
 
 
-   protected void setupBalancerServerWithLocalTarget(final int node, final TargetKey targetKey, final String targetKeyFilter, final String localTargetFilter) {
+   protected void setupRouterServerWithLocalTarget(final int node, final KeyType keyType, final String targetKeyFilter, final String localTargetFilter) {
 
       Configuration configuration = getServer(node).getConfiguration();
-      BrokerBalancerConfiguration brokerBalancerConfiguration = new BrokerBalancerConfiguration().setName(BROKER_BALANCER_NAME);
-      brokerBalancerConfiguration.setTargetKey(targetKey).setLocalTargetFilter(localTargetFilter).setTargetKeyFilter(targetKeyFilter);
+      ConnectionRouterConfiguration connectionRouterConfiguration = new ConnectionRouterConfiguration().setName(CONNECTION_ROUTER_NAME);
+      connectionRouterConfiguration.setKeyType(keyType).setLocalTargetFilter(localTargetFilter).setKeyFilter(targetKeyFilter);
 
-      configuration.setBalancerConfigurations(Collections.singletonList(brokerBalancerConfiguration));
+      configuration.setConnectionRouters(Collections.singletonList(connectionRouterConfiguration));
 
       TransportConfiguration acceptor = getDefaultServerAcceptor(node);
-      acceptor.getParams().put("redirect-to", BROKER_BALANCER_NAME);
+      acceptor.getParams().put("router", CONNECTION_ROUTER_NAME);
 
    }
 
-   protected void setupBalancerLocalCache(final int node, boolean persisted, int timeout) {
+   protected void setupRouterLocalCache(final int node, boolean persisted, int timeout) {
 
       Configuration configuration = getServer(node).getConfiguration();
-      BrokerBalancerConfiguration brokerBalancerConfiguration = configuration.getBalancerConfigurations().stream()
-         .filter(brokerBalancerConfiguration1 -> brokerBalancerConfiguration1.getName().equals(BROKER_BALANCER_NAME)).findFirst().get();
+      ConnectionRouterConfiguration connectionRouterConfiguration = configuration.getConnectionRouters().stream()
+         .filter(config -> config.getName().equals(CONNECTION_ROUTER_NAME)).findFirst().get();
 
-      brokerBalancerConfiguration.setCacheConfiguration(
+      connectionRouterConfiguration.setCacheConfiguration(
          new CacheConfiguration().setPersisted(persisted).setTimeout(timeout));
    }