diff --git a/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/BDBCacheSizeSetter.java b/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/BDBCacheSizeSetter.java
index 394d498..3c25474 100644
--- a/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/BDBCacheSizeSetter.java
+++ b/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/BDBCacheSizeSetter.java
@@ -28,14 +28,14 @@
 
 import org.apache.qpid.server.model.Broker;
 import org.apache.qpid.server.model.ConfiguredObject;
-import org.apache.qpid.server.model.NoopConfigurationChangeListener;
+import org.apache.qpid.server.model.AbstractConfigurationChangeListener;
 import org.apache.qpid.server.model.State;
 import org.apache.qpid.server.model.VirtualHost;
 import org.apache.qpid.server.model.VirtualHostNode;
 import org.apache.qpid.server.util.ServerScopedRuntimeException;
 import org.apache.qpid.server.virtualhost.berkeleydb.BDBVirtualHost;
 
-public class BDBCacheSizeSetter extends NoopConfigurationChangeListener
+public class BDBCacheSizeSetter extends AbstractConfigurationChangeListener
 {
     private static final Logger LOGGER = LoggerFactory.getLogger(BDBCacheSizeSetter.class);
 
diff --git a/bdbstore/src/main/java/org/apache/qpid/server/virtualhost/berkeleydb/BDBHAReplicaVirtualHostImpl.java b/bdbstore/src/main/java/org/apache/qpid/server/virtualhost/berkeleydb/BDBHAReplicaVirtualHostImpl.java
index 957fee6..ed0d367 100644
--- a/bdbstore/src/main/java/org/apache/qpid/server/virtualhost/berkeleydb/BDBHAReplicaVirtualHostImpl.java
+++ b/bdbstore/src/main/java/org/apache/qpid/server/virtualhost/berkeleydb/BDBHAReplicaVirtualHostImpl.java
@@ -45,6 +45,7 @@
 import org.apache.qpid.server.model.ManagedObject;
 import org.apache.qpid.server.model.ManagedObjectFactoryConstructor;
 import org.apache.qpid.server.model.Queue;
+import org.apache.qpid.server.model.RemoteHostAddress;
 import org.apache.qpid.server.model.State;
 import org.apache.qpid.server.model.VirtualHostNode;
 import org.apache.qpid.server.model.port.AmqpPort;
@@ -53,8 +54,10 @@
 import org.apache.qpid.server.stats.StatisticsCounter;
 import org.apache.qpid.server.store.DurableConfigurationStore;
 import org.apache.qpid.server.store.MessageStore;
+import org.apache.qpid.server.transfer.TransferQueue;
 import org.apache.qpid.server.transport.AMQPConnection;
 import org.apache.qpid.server.txn.DtxRegistry;
+import org.apache.qpid.server.util.Action;
 import org.apache.qpid.server.virtualhost.HouseKeepingTask;
 import org.apache.qpid.server.virtualhost.NodeAutoCreationPolicy;
 import org.apache.qpid.server.virtualhost.VirtualHostPrincipal;
@@ -511,6 +514,12 @@
     }
 
     @Override
+    public TransferQueue getTransferQueue()
+    {
+        throw new UnsupportedOperationException();
+    }
+
+    @Override
     public Principal getPrincipal()
     {
         return _principal;
@@ -541,6 +550,13 @@
     }
 
     @Override
+    public boolean makeConnection(final RemoteHostAddress<?> address, final Action<Boolean> onConnectionLoss)
+    {
+        throwUnsupportedForReplica();
+        return false;
+    }
+
+    @Override
     public UserPreferences createUserPreferences(final ConfiguredObject<?> object)
     {
         throwUnsupportedForReplica();
diff --git a/bdbstore/src/test/java/org/apache/qpid/server/store/berkeleydb/BDBHAVirtualHostNodeTest.java b/bdbstore/src/test/java/org/apache/qpid/server/store/berkeleydb/BDBHAVirtualHostNodeTest.java
index be5ef9a..48b14e0 100644
--- a/bdbstore/src/test/java/org/apache/qpid/server/store/berkeleydb/BDBHAVirtualHostNodeTest.java
+++ b/bdbstore/src/test/java/org/apache/qpid/server/store/berkeleydb/BDBHAVirtualHostNodeTest.java
@@ -45,6 +45,7 @@
 import org.slf4j.LoggerFactory;
 
 import org.apache.qpid.server.configuration.IllegalConfigurationException;
+import org.apache.qpid.server.model.AbstractConfigurationChangeListener;
 import org.apache.qpid.server.model.ConfigurationChangeListener;
 import org.apache.qpid.server.model.ConfiguredObject;
 import org.apache.qpid.server.model.RemoteReplicationNode;
@@ -269,7 +270,7 @@
 
         final AtomicReference<RemoteReplicationNode<?>> lastSeenReplica = new AtomicReference<>();
         final CountDownLatch remoteNodeLatch = new CountDownLatch(2);
-        node1.addChangeListener(new NoopConfigurationChangeListener()
+        node1.addChangeListener(new AbstractConfigurationChangeListener()
         {
             @Override
             public void childAdded(ConfiguredObject<?> object, ConfiguredObject<?> child)
@@ -557,7 +558,7 @@
         Map<String, Object> node1Attributes = _helper.createNodeAttributes(nodeName, groupName, helperAddress, helperAddress, nodeName, nodePortNumber);
         BDBHAVirtualHostNode<?> node = _helper.createAndStartHaVHN(node1Attributes);
         final CountDownLatch stopLatch = new CountDownLatch(1);
-        ConfigurationChangeListener listener = new NoopConfigurationChangeListener()
+        ConfigurationChangeListener listener = new AbstractConfigurationChangeListener()
         {
             @Override
             public void stateChanged(ConfiguredObject<?> object, State oldState, State newState)
@@ -578,7 +579,7 @@
 
         final CountDownLatch stateChangeLatch = new CountDownLatch(1);
         final CountDownLatch roleChangeLatch = new CountDownLatch(1);
-        node.addChangeListener(new NoopConfigurationChangeListener()
+        node.addChangeListener(new AbstractConfigurationChangeListener()
         {
             @Override
             public void stateChanged(final ConfiguredObject<?> object, final State oldState, final State newState)
@@ -637,7 +638,7 @@
         BDBHAVirtualHostNode<?> node = _helper.createAndStartHaVHN(nodeAttributes);
 
         final CountDownLatch stopLatch = new CountDownLatch(1);
-        ConfigurationChangeListener listener = new NoopConfigurationChangeListener()
+        ConfigurationChangeListener listener = new AbstractConfigurationChangeListener()
         {
             @Override
             public void stateChanged(ConfiguredObject<?> object, State oldState, State newState)
@@ -666,7 +667,7 @@
 
         final CountDownLatch stateChangeLatch = new CountDownLatch(1);
         final CountDownLatch roleChangeLatch = new CountDownLatch(1);
-        node.addChangeListener(new NoopConfigurationChangeListener()
+        node.addChangeListener(new AbstractConfigurationChangeListener()
         {
             @Override
             public void stateChanged(final ConfiguredObject<?> object, final State oldState, final State newState)
@@ -719,7 +720,7 @@
 
         final AtomicInteger permittedNodesChangeCounter = new AtomicInteger();
         final CountDownLatch _permittedNodesLatch = new CountDownLatch(1);
-        node2.addChangeListener(new NoopConfigurationChangeListener()
+        node2.addChangeListener(new AbstractConfigurationChangeListener()
         {
             @Override
             public void attributeSet(ConfiguredObject<?> object, String attributeName, Object oldAttributeValue, Object newAttributeValue)
@@ -776,7 +777,7 @@
         BDBHAVirtualHostNode<?> node1 = _helper.createAndStartHaVHN(node1Attributes);
 
         final CountDownLatch stopLatch = new CountDownLatch(1);
-        ConfigurationChangeListener listener = new NoopConfigurationChangeListener()
+        ConfigurationChangeListener listener = new AbstractConfigurationChangeListener()
         {
             @Override
             public void stateChanged(ConfiguredObject<?> object, State oldState, State newState)
diff --git a/bdbstore/src/test/java/org/apache/qpid/server/store/berkeleydb/NoopConfigurationChangeListener.java b/bdbstore/src/test/java/org/apache/qpid/server/store/berkeleydb/NoopConfigurationChangeListener.java
deleted file mode 100644
index d157204..0000000
--- a/bdbstore/src/test/java/org/apache/qpid/server/store/berkeleydb/NoopConfigurationChangeListener.java
+++ /dev/null
@@ -1,65 +0,0 @@
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- */
-package org.apache.qpid.server.store.berkeleydb;
-
-import org.apache.qpid.server.model.ConfigurationChangeListener;
-import org.apache.qpid.server.model.ConfiguredObject;
-import org.apache.qpid.server.model.State;
-
-public class NoopConfigurationChangeListener implements ConfigurationChangeListener
-{
-
-    public NoopConfigurationChangeListener() {
-    }
-
-    @Override
-    public void stateChanged(ConfiguredObject<?> object, State oldState, State newState)
-    {
-    }
-
-    @Override
-    public void childAdded(ConfiguredObject<?> object, ConfiguredObject<?> child)
-    {
-    }
-
-    @Override
-    public void childRemoved(ConfiguredObject<?> object, ConfiguredObject<?> child)
-    {
-    }
-
-    @Override
-    public void attributeSet(ConfiguredObject<?> object, String attributeName, Object oldAttributeValue,
-                             Object newAttributeValue)
-    {
-    }
-
-    @Override
-    public void bulkChangeStart(final ConfiguredObject<?> object)
-    {
-
-    }
-
-    @Override
-    public void bulkChangeEnd(final ConfiguredObject<?> object)
-    {
-
-    }
-}
diff --git a/bdbstore/src/test/java/org/apache/qpid/server/virtualhostnode/berkeleydb/BDBHAVirtualHostNodeOperationalLoggingTest.java b/bdbstore/src/test/java/org/apache/qpid/server/virtualhostnode/berkeleydb/BDBHAVirtualHostNodeOperationalLoggingTest.java
index 2d94df1..207b720 100644
--- a/bdbstore/src/test/java/org/apache/qpid/server/virtualhostnode/berkeleydb/BDBHAVirtualHostNodeOperationalLoggingTest.java
+++ b/bdbstore/src/test/java/org/apache/qpid/server/virtualhostnode/berkeleydb/BDBHAVirtualHostNodeOperationalLoggingTest.java
@@ -20,7 +20,11 @@
  */
 package org.apache.qpid.server.virtualhostnode.berkeleydb;
 
-import static org.mockito.Mockito.*;
+import static org.mockito.Mockito.argThat;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.reset;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
 
 import java.util.Collections;
 import java.util.EnumSet;
@@ -28,17 +32,18 @@
 import java.util.concurrent.CountDownLatch;
 import java.util.concurrent.TimeUnit;
 
+import org.hamcrest.Description;
+import org.mockito.ArgumentMatcher;
+
 import org.apache.qpid.server.logging.EventLogger;
 import org.apache.qpid.server.logging.LogMessage;
 import org.apache.qpid.server.logging.LogSubject;
 import org.apache.qpid.server.logging.messages.HighAvailabilityMessages;
+import org.apache.qpid.server.model.AbstractConfigurationChangeListener;
 import org.apache.qpid.server.model.ConfiguredObject;
 import org.apache.qpid.server.model.SystemConfig;
-import org.apache.qpid.server.store.berkeleydb.NoopConfigurationChangeListener;
 import org.apache.qpid.test.utils.PortHelper;
 import org.apache.qpid.test.utils.QpidTestCase;
-import org.hamcrest.Description;
-import org.mockito.ArgumentMatcher;
 
 /**
  * Class to test that specific VHN operations result in the expected Operational Log message(s) being performed.
@@ -264,7 +269,7 @@
         BDBHAVirtualHostNodeImpl node1 = (BDBHAVirtualHostNodeImpl)_helper.createHaVHN(node1Attributes);
 
         final CountDownLatch remoteNodeAdded = new CountDownLatch(1);
-        node1.addChangeListener(new NoopConfigurationChangeListener()
+        node1.addChangeListener(new AbstractConfigurationChangeListener()
         {
             @Override
             public void childAdded(ConfiguredObject<?> object, ConfiguredObject<?> child)
diff --git a/broker-core/src/main/java/org/apache/qpid/server/consumer/AbstractConsumerTarget.java b/broker-core/src/main/java/org/apache/qpid/server/consumer/AbstractConsumerTarget.java
index b936b52..b21f948 100644
--- a/broker-core/src/main/java/org/apache/qpid/server/consumer/AbstractConsumerTarget.java
+++ b/broker-core/src/main/java/org/apache/qpid/server/consumer/AbstractConsumerTarget.java
@@ -38,6 +38,7 @@
 import org.apache.qpid.server.logging.LogSubject;
 import org.apache.qpid.server.logging.messages.SubscriptionMessages;
 import org.apache.qpid.server.message.MessageInstance;
+import org.apache.qpid.server.message.MessageInstanceConsumer;
 import org.apache.qpid.server.model.Consumer;
 import org.apache.qpid.server.queue.SuspendedConsumerLoggingTicker;
 import org.apache.qpid.server.transport.AMQPConnection;
@@ -57,10 +58,10 @@
     private final boolean _isMultiQueue;
     private final SuspendedConsumerLoggingTicker _suspendedConsumerLoggingTicker;
     private ConcurrentLinkedQueue<ConsumerMessageInstancePair> _queue = new ConcurrentLinkedQueue();
-    private final List<ConsumerImpl> _consumers = new CopyOnWriteArrayList<>();
+    private final List<MessageInstanceConsumer> _consumers = new CopyOnWriteArrayList<>();
 
     private final boolean _isPullOnly;
-    private Iterator<ConsumerImpl> _pullIterator;
+    private Iterator<MessageInstanceConsumer> _pullIterator;
 
 
     protected AbstractConsumerTarget(final State initialState,
@@ -123,13 +124,13 @@
     protected abstract void processClosed();
 
     @Override
-    public void consumerAdded(final ConsumerImpl sub)
+    public void consumerAdded(final MessageInstanceConsumer sub)
     {
         _consumers.add(sub);
     }
 
     @Override
-    public void consumerRemoved(final ConsumerImpl sub)
+    public void consumerRemoved(final MessageInstanceConsumer sub)
     {
         _consumers.remove(sub);
         if(_consumers.isEmpty())
@@ -138,7 +139,7 @@
         }
     }
 
-    public List<ConsumerImpl> getConsumers()
+    public List<MessageInstanceConsumer> getConsumers()
     {
         return _consumers;
     }
@@ -246,6 +247,11 @@
         _stateChangeListeners.remove(listener);
     }
 
+    public boolean isPullOnly()
+    {
+        return _isPullOnly;
+    }
+
     public final boolean trySendLock()
     {
         return _stateChangeLock.tryLock();
@@ -262,13 +268,7 @@
     }
 
     @Override
-    public boolean isPullOnly()
-    {
-        return _isPullOnly;
-    }
-
-    @Override
-    public final long send(final ConsumerImpl consumer, MessageInstance entry, boolean batch)
+    public final long send(final MessageInstanceConsumer consumer, MessageInstance entry, boolean batch)
     {
         AMQPConnection<?> amqpConnection = getSessionModel().getAMQPConnection();
         amqpConnection.reserveOutboundMessageSpace(entry.getMessage().getSize());
@@ -277,7 +277,7 @@
         return entry.getMessage().getSize();
     }
 
-    protected abstract void doSend(final ConsumerImpl consumer, MessageInstance entry, boolean batch);
+    protected abstract void doSend(final MessageInstanceConsumer consumer, MessageInstance entry, boolean batch);
 
     @Override
     public boolean hasMessagesToSend()
@@ -289,7 +289,7 @@
     {
         if(hasCredit())
         {
-            for (ConsumerImpl consumer : _consumers)
+            for (MessageInstanceConsumer consumer : _consumers)
             {
                 if (consumer.hasAvailableMessages())
                 {
@@ -311,7 +311,7 @@
             }
             if(_pullIterator.hasNext())
             {
-                ConsumerImpl consumer = _pullIterator.next();
+                MessageInstanceConsumer consumer = _pullIterator.next();
                 consumer.pullMessage();
             }
         }
@@ -321,7 +321,7 @@
             try
             {
 
-                ConsumerImpl consumer = consumerMessage.getConsumer();
+                MessageInstanceConsumer consumer = consumerMessage.getConsumer();
                 MessageInstance entry = consumerMessage.getEntry();
                 boolean batch = consumerMessage.isBatch();
                 doSend(consumer, entry, batch);
@@ -375,7 +375,7 @@
             releaseSendLock();
         }
 
-        for (ConsumerImpl consumer : _consumers)
+        for (MessageInstanceConsumer consumer : _consumers)
         {
             consumer.close();
         }
diff --git a/broker-core/src/main/java/org/apache/qpid/server/consumer/ConsumerImpl.java b/broker-core/src/main/java/org/apache/qpid/server/consumer/ConsumerImpl.java
deleted file mode 100644
index cf91f75..0000000
--- a/broker-core/src/main/java/org/apache/qpid/server/consumer/ConsumerImpl.java
+++ /dev/null
@@ -1,86 +0,0 @@
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- */
-package org.apache.qpid.server.consumer;
-
-import java.util.concurrent.atomic.AtomicLong;
-
-import org.apache.qpid.server.message.MessageSource;
-import org.apache.qpid.server.protocol.AMQSessionModel;
-
-public interface ConsumerImpl
-{
-    AtomicLong CONSUMER_NUMBER_GENERATOR = new AtomicLong(0);
-
-    void externalStateChange();
-
-    ConsumerTarget getTarget();
-
-    boolean hasAvailableMessages();
-
-    void pullMessage();
-
-    enum Option
-    {
-        ACQUIRES,
-        SEES_REQUEUES,
-        TRANSIENT,
-        EXCLUSIVE,
-        NO_LOCAL,
-        DURABLE
-    }
-
-    long getBytesOut();
-
-    long getMessagesOut();
-
-    long getUnacknowledgedBytes();
-
-    long getUnacknowledgedMessages();
-
-    AMQSessionModel getSessionModel();
-
-    MessageSource getMessageSource();
-
-    long getConsumerNumber();
-
-    boolean isSuspended();
-
-    boolean isClosed();
-
-    boolean acquires();
-
-    boolean seesRequeues();
-
-    void close();
-
-    boolean trySendLock();
-
-
-    void getSendLock();
-
-    void releaseSendLock();
-
-    boolean isActive();
-
-    String getName();
-
-    void flush();
-}
diff --git a/broker-core/src/main/java/org/apache/qpid/server/consumer/ConsumerMessageInstancePair.java b/broker-core/src/main/java/org/apache/qpid/server/consumer/ConsumerMessageInstancePair.java
index 9b5f9c9..ad85529 100644
--- a/broker-core/src/main/java/org/apache/qpid/server/consumer/ConsumerMessageInstancePair.java
+++ b/broker-core/src/main/java/org/apache/qpid/server/consumer/ConsumerMessageInstancePair.java
@@ -20,16 +20,17 @@
 package org.apache.qpid.server.consumer;
 
 import org.apache.qpid.server.message.MessageInstance;
+import org.apache.qpid.server.message.MessageInstanceConsumer;
 import org.apache.qpid.server.message.MessageReference;
 
 public class ConsumerMessageInstancePair
 {
-    private final ConsumerImpl _consumer;
+    private final MessageInstanceConsumer _consumer;
     private final MessageInstance _entry;
     private final boolean _batch;
     private final MessageReference _reference;
 
-    public ConsumerMessageInstancePair(final ConsumerImpl consumer, final MessageInstance entry, final boolean batch)
+    public ConsumerMessageInstancePair(final MessageInstanceConsumer consumer, final MessageInstance entry, final boolean batch)
     {
         _consumer = consumer;
         _entry = entry;
@@ -38,7 +39,7 @@
 
     }
 
-    public ConsumerImpl getConsumer()
+    public MessageInstanceConsumer getConsumer()
     {
         return _consumer;
     }
diff --git a/broker-core/src/main/java/org/apache/qpid/server/consumer/ConsumerTarget.java b/broker-core/src/main/java/org/apache/qpid/server/consumer/ConsumerTarget.java
index 7b9ac65..9d76a39 100644
--- a/broker-core/src/main/java/org/apache/qpid/server/consumer/ConsumerTarget.java
+++ b/broker-core/src/main/java/org/apache/qpid/server/consumer/ConsumerTarget.java
@@ -21,6 +21,7 @@
 package org.apache.qpid.server.consumer;
 
 import org.apache.qpid.server.message.MessageInstance;
+import org.apache.qpid.server.message.MessageInstanceConsumer;
 import org.apache.qpid.server.message.ServerMessage;
 import org.apache.qpid.server.protocol.AMQSessionModel;
 import org.apache.qpid.server.util.StateChangeListener;
@@ -50,9 +51,9 @@
 
     State getState();
 
-    void consumerAdded(ConsumerImpl sub);
+    void consumerAdded(MessageInstanceConsumer consumer);
 
-    void consumerRemoved(ConsumerImpl sub);
+    void consumerRemoved(MessageInstanceConsumer consumer);
 
     void notifyCurrentState();
 
@@ -64,7 +65,7 @@
 
     AMQSessionModel getSessionModel();
 
-    long send(final ConsumerImpl consumer, MessageInstance entry, boolean batch);
+    long send(final MessageInstanceConsumer consumer, MessageInstance entry, boolean batch);
 
     boolean hasMessagesToSend();
 
diff --git a/broker-core/src/main/java/org/apache/qpid/server/exchange/AbstractExchange.java b/broker-core/src/main/java/org/apache/qpid/server/exchange/AbstractExchange.java
index 879ea17..8169b94 100644
--- a/broker-core/src/main/java/org/apache/qpid/server/exchange/AbstractExchange.java
+++ b/broker-core/src/main/java/org/apache/qpid/server/exchange/AbstractExchange.java
@@ -50,8 +50,8 @@
 import org.apache.qpid.server.logging.LogSubject;
 import org.apache.qpid.server.logging.messages.ExchangeMessages;
 import org.apache.qpid.server.logging.subjects.ExchangeLogSubject;
+import org.apache.qpid.server.message.BaseMessageInstance;
 import org.apache.qpid.server.message.InstanceProperties;
-import org.apache.qpid.server.message.MessageInstance;
 import org.apache.qpid.server.message.MessageReference;
 import org.apache.qpid.server.message.ServerMessage;
 import org.apache.qpid.server.model.AbstractConfiguredObject;
@@ -446,7 +446,7 @@
                                                                                         final String routingAddress,
                                                                                         final InstanceProperties instanceProperties,
                                                                                         final ServerTransaction txn,
-                                                                                        final Action<? super MessageInstance> postEnqueueAction)
+                                                                                        final Action<? super BaseMessageInstance> postEnqueueAction)
     {
         if (_virtualHost.getState() != State.ACTIVE)
         {
diff --git a/broker-core/src/main/java/org/apache/qpid/server/exchange/DefaultDestination.java b/broker-core/src/main/java/org/apache/qpid/server/exchange/DefaultDestination.java
index 9e8ba67..71e1ec9 100644
--- a/broker-core/src/main/java/org/apache/qpid/server/exchange/DefaultDestination.java
+++ b/broker-core/src/main/java/org/apache/qpid/server/exchange/DefaultDestination.java
@@ -22,9 +22,9 @@
 import java.util.Map;
 
 import org.apache.qpid.exchange.ExchangeDefaults;
+import org.apache.qpid.server.message.BaseMessageInstance;
 import org.apache.qpid.server.message.InstanceProperties;
 import org.apache.qpid.server.message.MessageDestination;
-import org.apache.qpid.server.message.MessageInstance;
 import org.apache.qpid.server.message.ServerMessage;
 import org.apache.qpid.server.model.ConfiguredObject;
 import org.apache.qpid.server.model.Exchange;
@@ -96,13 +96,13 @@
                                                                                         String routingAddress,
                                                                                         final InstanceProperties instanceProperties,
                                                                                         final ServerTransaction txn,
-                                                                                        final Action<? super MessageInstance> postEnqueueAction)
+                                                                                        final Action<? super BaseMessageInstance> postEnqueueAction)
     {
         if(routingAddress == null || routingAddress.trim().equals(""))
         {
             return 0;
         }
-        final MessageDestination dest = _virtualHost.getAttainedMessageDestination(routingAddress);
+        MessageDestination dest = _virtualHost.getAttainedMessageDestination(routingAddress);
         if(dest == null)
         {
             routingAddress = _virtualHost.getLocalAddress(routingAddress);
@@ -117,10 +117,10 @@
             }
             else if(!routingAddress.contains("/"))
             {
-                Exchange<?> exchange = _virtualHost.getAttainedChildFromAddress(Exchange.class, routingAddress);
-                if(exchange != null)
+                dest = _virtualHost.getAttainedMessageDestination(routingAddress);
+                if(dest != null)
                 {
-                    return exchange.send(message, "", instanceProperties, txn, postEnqueueAction);
+                    return dest.send(message, dest instanceof Exchange ? "" : routingAddress, instanceProperties, txn, postEnqueueAction);
                 }
             }
             return 0;
diff --git a/broker-core/src/main/java/org/apache/qpid/server/queue/QueueEntryListBase.java b/broker-core/src/main/java/org/apache/qpid/server/federation/OutboundProtocolEngine.java
similarity index 67%
copy from broker-core/src/main/java/org/apache/qpid/server/queue/QueueEntryListBase.java
copy to broker-core/src/main/java/org/apache/qpid/server/federation/OutboundProtocolEngine.java
index d2aff53..0397040 100644
--- a/broker-core/src/main/java/org/apache/qpid/server/queue/QueueEntryListBase.java
+++ b/broker-core/src/main/java/org/apache/qpid/server/federation/OutboundProtocolEngine.java
@@ -18,8 +18,15 @@
  * under the License.
  *
  */
-package org.apache.qpid.server.queue;
+package org.apache.qpid.server.federation;
 
-public interface QueueEntryListBase extends QueueEntryList
+import org.apache.qpid.server.transport.ProtocolEngine;
+import org.apache.qpid.server.transport.SchedulableConnection;
+import org.apache.qpid.server.util.Action;
+
+public interface OutboundProtocolEngine extends ProtocolEngine
 {
+    void setConnection(SchedulableConnection connection);
+
+    void setOnClosedTask(Action<Boolean> onConnectionLoss);
 }
diff --git a/broker-core/src/main/java/org/apache/qpid/server/federation/RemoteHostAddressImpl.java b/broker-core/src/main/java/org/apache/qpid/server/federation/RemoteHostAddressImpl.java
new file mode 100644
index 0000000..a437d73
--- /dev/null
+++ b/broker-core/src/main/java/org/apache/qpid/server/federation/RemoteHostAddressImpl.java
@@ -0,0 +1,179 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.server.federation;
+
+import java.util.Collection;
+import java.util.List;
+import java.util.Map;
+
+import com.google.common.util.concurrent.Futures;
+import com.google.common.util.concurrent.ListenableFuture;
+
+import org.apache.qpid.configuration.CommonProperties;
+import org.apache.qpid.server.configuration.IllegalConfigurationException;
+import org.apache.qpid.server.model.AbstractConfiguredObject;
+import org.apache.qpid.server.model.KeyStore;
+import org.apache.qpid.server.model.ManagedAttributeField;
+import org.apache.qpid.server.model.ManagedObject;
+import org.apache.qpid.server.model.ManagedObjectFactoryConstructor;
+import org.apache.qpid.server.model.Protocol;
+import org.apache.qpid.server.model.RemoteHost;
+import org.apache.qpid.server.model.RemoteHostAddress;
+import org.apache.qpid.server.model.State;
+import org.apache.qpid.server.model.StateTransition;
+import org.apache.qpid.server.model.Transport;
+import org.apache.qpid.server.model.TrustStore;
+import org.apache.qpid.server.util.ParameterizedTypes;
+
+@ManagedObject( category = false, type = RemoteHostAddress.REMOTE_HOST_ADDRESS_TYPE )
+class RemoteHostAddressImpl extends AbstractConfiguredObject<RemoteHostAddressImpl> implements RemoteHostAddress<RemoteHostAddressImpl>
+{
+    @ManagedAttributeField
+    private String _address;
+    @ManagedAttributeField
+    private int _port;
+    @ManagedAttributeField
+    private String _hostName;
+    @ManagedAttributeField
+    private Protocol _protocol;
+    @ManagedAttributeField
+    private Transport _transport;
+    @ManagedAttributeField
+    private KeyStore _keyStore;
+    @ManagedAttributeField
+    private Collection<TrustStore> _trustStores;
+    @ManagedAttributeField
+    private int _desiredHeartbeatInterval;
+
+    private List<String> _tlsProtocolBlackList;
+    private List<String> _tlsProtocolWhiteList;
+
+    private List<String> _tlsCipherSuiteWhiteList;
+    private List<String> _tlsCipherSuiteBlackList;
+
+
+    @ManagedObjectFactoryConstructor
+    public RemoteHostAddressImpl(Map<String, Object> attributes, RemoteHost<?> remoteHost)
+    {
+        super(parentsMap(remoteHost), attributes);
+    }
+
+
+    @Override
+    protected void onOpen()
+    {
+        super.onOpen();
+        _tlsProtocolWhiteList = getContextValue(List.class, ParameterizedTypes.LIST_OF_STRINGS, CommonProperties.QPID_SECURITY_TLS_PROTOCOL_WHITE_LIST);
+        _tlsProtocolBlackList = getContextValue(List.class, ParameterizedTypes.LIST_OF_STRINGS, CommonProperties.QPID_SECURITY_TLS_PROTOCOL_BLACK_LIST);
+        _tlsCipherSuiteWhiteList = getContextValue(List.class, ParameterizedTypes.LIST_OF_STRINGS, CommonProperties.QPID_SECURITY_TLS_CIPHER_SUITE_WHITE_LIST);
+        _tlsCipherSuiteBlackList = getContextValue(List.class, ParameterizedTypes.LIST_OF_STRINGS, CommonProperties.QPID_SECURITY_TLS_CIPHER_SUITE_BLACK_LIST);
+    }
+
+
+    @Override
+    public String getAddress()
+    {
+        return _address;
+    }
+
+    @Override
+    public int getPort()
+    {
+        return _port;
+    }
+
+    @Override
+    public String getHostName()
+    {
+        return _hostName;
+    }
+
+    @Override
+    public Protocol getProtocol()
+    {
+        return _protocol;
+    }
+
+    @Override
+    public Transport getTransport()
+    {
+        return _transport;
+    }
+
+    @Override
+    public KeyStore getKeyStore()
+    {
+        return _keyStore;
+    }
+
+    @Override
+    public Collection<TrustStore> getTrustStores()
+    {
+        return _trustStores;
+    }
+
+    @Override
+    public int getDesiredHeartbeatInterval()
+    {
+        return _desiredHeartbeatInterval;
+    }
+
+    @Override
+    public List<String> getTlsProtocolWhiteList()
+    {
+        return _tlsProtocolWhiteList;
+    }
+
+    @Override
+    public List<String> getTlsProtocolBlackList()
+    {
+        return _tlsProtocolBlackList;
+    }
+
+    @Override
+    public List<String> getTlsCipherSuiteWhiteList()
+    {
+        return _tlsCipherSuiteWhiteList;
+    }
+
+    @Override
+    public List<String> getTlsCipherSuiteBlackList()
+    {
+        return _tlsCipherSuiteBlackList;
+    }
+
+    @StateTransition( currentState = {State.UNINITIALIZED, State.QUIESCED, State.ERRORED}, desiredState = State.ACTIVE )
+    protected ListenableFuture<Void> activate()
+    {
+        try
+        {
+            setState(State.ACTIVE);
+        }
+        catch (RuntimeException e)
+        {
+            setState(State.ERRORED);
+            throw new IllegalConfigurationException("Unable to active remote host address '" + getName() + "'", e);
+        }
+        return Futures.immediateFuture(null);
+    }
+
+
+}
diff --git a/broker-core/src/main/java/org/apache/qpid/server/federation/RemoteHostImpl.java b/broker-core/src/main/java/org/apache/qpid/server/federation/RemoteHostImpl.java
new file mode 100644
index 0000000..cd369b9
--- /dev/null
+++ b/broker-core/src/main/java/org/apache/qpid/server/federation/RemoteHostImpl.java
@@ -0,0 +1,233 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.server.federation;
+
+import java.security.AccessControlContext;
+import java.util.Collection;
+import java.util.EnumSet;
+import java.util.Iterator;
+import java.util.Map;
+import java.util.concurrent.atomic.AtomicBoolean;
+
+import com.google.common.util.concurrent.Futures;
+import com.google.common.util.concurrent.ListenableFuture;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import org.apache.qpid.server.model.AbstractConfigurationChangeListener;
+import org.apache.qpid.server.model.AbstractConfiguredObject;
+import org.apache.qpid.server.model.ConfiguredObject;
+import org.apache.qpid.server.model.ManagedAttributeField;
+import org.apache.qpid.server.model.ManagedObject;
+import org.apache.qpid.server.model.ManagedObjectFactoryConstructor;
+import org.apache.qpid.server.model.RemoteHost;
+import org.apache.qpid.server.model.RemoteHostAddress;
+import org.apache.qpid.server.model.State;
+import org.apache.qpid.server.model.StateTransition;
+import org.apache.qpid.server.model.VirtualHost;
+import org.apache.qpid.server.util.Action;
+import org.apache.qpid.server.virtualhost.HouseKeepingTask;
+
+@ManagedObject( category = false, type = RemoteHost.REMOTE_HOST_TYPE )
+class RemoteHostImpl extends AbstractConfiguredObject<RemoteHostImpl> implements RemoteHost<RemoteHostImpl>
+{
+    private static final Logger LOGGER = LoggerFactory.getLogger(RemoteHostImpl.class);
+
+    private final VirtualHost<?> _virtualHost;
+    @ManagedAttributeField
+    private int _retryPeriod;
+
+    @ManagedAttributeField
+    private boolean _redirectFollowed;
+
+    @ManagedAttributeField
+    private Collection<String> _routableAddresses;
+
+    private final AccessControlContext _createConnectionContext;
+    private final CreateConnectionTask _createConnectionTask;
+
+    enum ConnectionState
+    {
+        DISCONNECTED,
+        CONNECTING,
+        CONNECTED,
+        STOPPED
+    }
+
+    private ConnectionState _connectionState = ConnectionState.STOPPED;
+
+    @ManagedObjectFactoryConstructor
+    public RemoteHostImpl(Map<String, Object> attributes, VirtualHost<?> virtualHost)
+    {
+        super(parentsMap(virtualHost), attributes);
+        _virtualHost = virtualHost;
+        _createConnectionContext =
+                getSystemTaskControllerContext("Create connection " + getName(), _virtualHost.getPrincipal());
+        _createConnectionTask = new CreateConnectionTask();
+    }
+
+    @Override
+    public int getRetryPeriod()
+    {
+        return _retryPeriod;
+    }
+
+    @Override
+    public boolean isRedirectFollowed()
+    {
+        return _redirectFollowed;
+    }
+
+    @Override
+    public Collection<String> getRoutableAddresses()
+    {
+        return _routableAddresses;
+    }
+
+    @StateTransition(currentState = {State.UNINITIALIZED, State.ERRORED, State.STOPPED}, desiredState = State.ACTIVE)
+    private ListenableFuture<Void> onActivate()
+    {
+        setState(State.ACTIVE);
+        _failoverIterator = null;
+        if (_virtualHost.getState() == State.ACTIVE)
+        {
+            _createConnectionTask.scheduleNow();
+        }
+        else if (_virtualHost.getDesiredState() == State.ACTIVE)
+        {
+            _virtualHost.addChangeListener(new AbstractConfigurationChangeListener()
+            {
+                @Override
+                public void stateChanged(final ConfiguredObject<?> object, final State oldState, final State newState)
+                {
+                    if (newState == State.ACTIVE)
+                    {
+
+                        _createConnectionTask.scheduleNow();
+
+                        _virtualHost.removeChangeListener(this);
+                    }
+                    else if (object.getDesiredState() != State.ACTIVE)
+                    {
+                        _virtualHost.removeChangeListener(this);
+                    }
+                }
+            });
+        }
+        return Futures.immediateFuture(null);
+    }
+
+    private Iterator<RemoteHostAddress> _failoverIterator;
+
+
+    private void setConnectionState(ConnectionState connectionState)
+    {
+        _connectionState = connectionState;
+    }
+
+    private synchronized void makeConnection()
+    {
+        LOGGER.debug("makeConnection called with state: {}, connectionState: {}", getState(), _connectionState);
+        if(getState() == State.ACTIVE && !EnumSet.of(ConnectionState.CONNECTED, ConnectionState.CONNECTING).contains(_connectionState))
+        {
+            if (_failoverIterator == null || !_failoverIterator.hasNext())
+            {
+                _failoverIterator = getChildren(RemoteHostAddress.class).iterator();
+            }
+            if (_failoverIterator.hasNext())
+            {
+                RemoteHostAddress<?> address = _failoverIterator.next();
+                setConnectionState(ConnectionState.CONNECTING);
+                boolean connected = _virtualHost.makeConnection(address, new Action<Boolean>()
+                {
+
+                    @Override
+                    public void performAction(final Boolean wasConnected)
+                    {
+                        setConnectionState(ConnectionState.DISCONNECTED);
+                        if (wasConnected)
+                        {
+                            _failoverIterator = null;
+                            _createConnectionTask.scheduleNow();
+                        }
+                        else if (_failoverIterator.hasNext())
+                        {
+                            _createConnectionTask.scheduleNow();
+                        }
+                        else
+                        {
+                            _createConnectionTask.schedule(1000L * _retryPeriod);
+                        }
+                    }
+                });
+
+                if (connected)
+                {
+                    setConnectionState(ConnectionState.CONNECTED);
+                }
+                else
+                {
+                    setConnectionState(ConnectionState.DISCONNECTED);
+                    if (_failoverIterator.hasNext())
+                    {
+                        _createConnectionTask.scheduleNow();
+                    }
+                    else
+                    {
+                        _createConnectionTask.schedule(1000L * _retryPeriod);
+                    }
+                }
+            }
+        }
+
+    }
+
+    private class CreateConnectionTask extends HouseKeepingTask
+    {
+
+        private final AtomicBoolean _scheduled = new AtomicBoolean();
+
+        public CreateConnectionTask()
+        {
+            super("Create connection: " + RemoteHostImpl.this.getName(), _virtualHost, _createConnectionContext);
+        }
+
+        @Override
+        public void execute()
+        {
+            _scheduled.set(false);
+            makeConnection();
+        }
+
+        public void schedule(long delay)
+        {
+            if(_scheduled.compareAndSet(false, true))
+            {
+                _virtualHost.scheduleTask(delay, this);
+            }
+        }
+
+        public void scheduleNow()
+        {
+            schedule(0L);
+        }
+    }
+}
diff --git a/broker-core/src/main/java/org/apache/qpid/server/federation/UsernamePasswordCredentialImpl.java b/broker-core/src/main/java/org/apache/qpid/server/federation/UsernamePasswordCredentialImpl.java
new file mode 100644
index 0000000..ecf1f67
--- /dev/null
+++ b/broker-core/src/main/java/org/apache/qpid/server/federation/UsernamePasswordCredentialImpl.java
@@ -0,0 +1,88 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.server.federation;
+
+import java.util.List;
+import java.util.Map;
+
+import javax.security.sasl.SaslClient;
+
+import com.google.common.util.concurrent.Futures;
+import com.google.common.util.concurrent.ListenableFuture;
+
+import org.apache.qpid.server.federation.sasl.ScramSHA1SaslClient;
+import org.apache.qpid.server.federation.sasl.ScramSHA256SaslClient;
+import org.apache.qpid.server.model.AbstractConfiguredObject;
+import org.apache.qpid.server.model.ManagedAttributeField;
+import org.apache.qpid.server.model.ManagedObjectFactoryConstructor;
+import org.apache.qpid.server.model.RemoteHost;
+import org.apache.qpid.server.model.State;
+import org.apache.qpid.server.model.StateTransition;
+import org.apache.qpid.server.model.UsernamePasswordCredential;
+
+class UsernamePasswordCredentialImpl extends AbstractConfiguredObject<UsernamePasswordCredentialImpl>
+        implements UsernamePasswordCredential<UsernamePasswordCredentialImpl>
+{
+    @ManagedAttributeField
+    private String _username;
+    @ManagedAttributeField
+    private String _password;
+
+    @ManagedObjectFactoryConstructor
+    UsernamePasswordCredentialImpl(Map<String, Object> attributes, RemoteHost<?> host)
+    {
+        super(parentsMap(host), attributes);
+    }
+
+        @Override
+    public SaslClient getSaslClient(final List<String> mechanisms)
+    {
+        if(mechanisms.contains(ScramSHA256SaslClient.MECHANISM))
+        {
+            return new ScramSHA256SaslClient(this);
+        }
+        else if(mechanisms.contains(ScramSHA1SaslClient.MECHANISM))
+        {
+            return new ScramSHA1SaslClient(this);
+        }
+        return null;
+    }
+
+    @Override
+    public String getUsername()
+    {
+        return _username;
+    }
+
+    @Override
+    public String getPassword()
+    {
+        return _password;
+    }
+
+    @StateTransition( currentState = {State.UNINITIALIZED, State.QUIESCED, State.ERRORED}, desiredState = State.ACTIVE )
+    protected ListenableFuture<Void> activate()
+    {
+        setState(State.ACTIVE);
+        return Futures.immediateFuture(null);
+    }
+
+}
diff --git a/broker-core/src/main/java/org/apache/qpid/server/federation/sasl/AbstractScramSaslClient.java b/broker-core/src/main/java/org/apache/qpid/server/federation/sasl/AbstractScramSaslClient.java
new file mode 100644
index 0000000..ac7d9ef
--- /dev/null
+++ b/broker-core/src/main/java/org/apache/qpid/server/federation/sasl/AbstractScramSaslClient.java
@@ -0,0 +1,323 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.server.federation.sasl;
+
+import java.io.IOException;
+import java.io.UnsupportedEncodingException;
+import java.nio.charset.Charset;
+import java.security.InvalidKeyException;
+import java.security.MessageDigest;
+import java.security.NoSuchAlgorithmException;
+import java.util.Arrays;
+import java.util.UUID;
+
+import javax.crypto.Mac;
+import javax.crypto.spec.SecretKeySpec;
+import javax.security.sasl.SaslClient;
+import javax.security.sasl.SaslException;
+import javax.xml.bind.DatatypeConverter;
+
+import org.apache.qpid.server.model.UsernamePasswordCredential;
+
+public abstract class AbstractScramSaslClient implements SaslClient
+{
+
+    private static final byte[] INT_1 = new byte[]{0, 0, 0, 1};
+    private static final String GS2_HEADER = "n,,";
+    private static final Charset ASCII = Charset.forName("ASCII");
+
+    private final String _digestName;
+    private final String _hmacName;
+
+    private String _username;
+    private final String _clientNonce = UUID.randomUUID().toString();
+    private String _serverNonce;
+    private byte[] _salt;
+    private int _iterationCount;
+    private String _clientFirstMessageBare;
+    private byte[] _serverSignature;
+
+    enum State
+    {
+        INITIAL,
+        CLIENT_FIRST_SENT,
+        CLIENT_PROOF_SENT,
+        COMPLETE
+    }
+
+    public final String _mechanism;
+
+    private final UsernamePasswordCredential<?> _credentials;
+
+    private State _state = State.INITIAL;
+
+    public AbstractScramSaslClient(final UsernamePasswordCredential credentials,
+                                   final String mechanism,
+                                   final String digestName,
+                                   final String hmacName)
+    {
+        _mechanism = mechanism;
+        _digestName = digestName;
+        _hmacName = hmacName;
+        _credentials = credentials;
+
+    }
+
+    @Override
+    public String getMechanismName()
+    {
+        return _mechanism;
+    }
+
+    @Override
+    public boolean hasInitialResponse()
+    {
+        return true;
+    }
+
+    @Override
+    public byte[] evaluateChallenge(final byte[] challenge) throws SaslException
+    {
+        byte[] response;
+        switch(_state)
+        {
+            case INITIAL:
+                response = initialResponse();
+                _state = State.CLIENT_FIRST_SENT;
+                break;
+            case CLIENT_FIRST_SENT:
+                response = calculateClientProof(challenge);
+                _state = State.CLIENT_PROOF_SENT;
+                break;
+            case CLIENT_PROOF_SENT:
+                evaluateOutcome(challenge);
+                response = new byte[0];
+                _state = State.COMPLETE;
+                break;
+            default:
+                throw new SaslException("No challenge expected in state " + _state);
+        }
+        return response;
+    }
+
+    private void evaluateOutcome(final byte[] challenge) throws SaslException
+    {
+        String serverFinalMessage = new String(challenge, ASCII);
+        String[] parts = serverFinalMessage.split(",");
+        if(!parts[0].startsWith("v="))
+        {
+            throw new SaslException("Server final message did not contain verifier");
+        }
+        byte[] serverSignature = DatatypeConverter.parseBase64Binary(parts[0].substring(2));
+        if(!Arrays.equals(_serverSignature, serverSignature))
+        {
+            throw new SaslException("Server signature did not match");
+        }
+    }
+
+    private byte[] calculateClientProof(final byte[] challenge) throws SaslException
+    {
+        try
+        {
+            String serverFirstMessage = new String(challenge, ASCII);
+            String[] parts = serverFirstMessage.split(",");
+            if(parts.length < 3)
+            {
+                throw new SaslException("Server challenge '" + serverFirstMessage + "' cannot be parsed");
+            }
+            else if(parts[0].startsWith("m="))
+            {
+                throw new SaslException("Server requires mandatory extension which is not supported: " + parts[0]);
+            }
+            else if(!parts[0].startsWith("r="))
+            {
+                throw new SaslException("Server challenge '" + serverFirstMessage + "' cannot be parsed, cannot find nonce");
+            }
+            String nonce = parts[0].substring(2);
+            if(!nonce.startsWith(_clientNonce))
+            {
+                throw new SaslException("Server challenge did not use correct client nonce");
+            }
+            _serverNonce = nonce;
+            if(!parts[1].startsWith("s="))
+            {
+                throw new SaslException("Server challenge '" + serverFirstMessage + "' cannot be parsed, cannot find salt");
+            }
+            String base64Salt = parts[1].substring(2);
+            _salt = DatatypeConverter.parseBase64Binary(base64Salt);
+            if(!parts[2].startsWith("i="))
+            {
+                throw new SaslException("Server challenge '" + serverFirstMessage + "' cannot be parsed, cannot find iteration count");
+            }
+            String iterCountString = parts[2].substring(2);
+            _iterationCount = Integer.parseInt(iterCountString);
+            if(_iterationCount <= 0)
+            {
+                throw new SaslException("Iteration count " + _iterationCount + " is not a positive integer");
+            }
+            byte[] passwordBytes = saslPrep(_credentials.getPassword()).getBytes("UTF-8");
+
+            byte[] saltedPassword = generateSaltedPassword(passwordBytes);
+
+
+            String clientFinalMessageWithoutProof =
+                    "c=" + DatatypeConverter.printBase64Binary(GS2_HEADER.getBytes(ASCII))
+                    + ",r=" + _serverNonce;
+
+            String authMessage = _clientFirstMessageBare + "," + serverFirstMessage + "," + clientFinalMessageWithoutProof;
+
+            byte[] clientKey = computeHmac(saltedPassword, "Client Key");
+            byte[] storedKey = MessageDigest.getInstance(_digestName).digest(clientKey);
+
+            byte[] clientSignature = computeHmac(storedKey, authMessage);
+
+            byte[] clientProof = clientKey.clone();
+            for(int i = 0 ; i < clientProof.length; i++)
+            {
+                clientProof[i] ^= clientSignature[i];
+            }
+            byte[] serverKey = computeHmac(saltedPassword, "Server Key");
+            _serverSignature = computeHmac(serverKey, authMessage);
+
+            String finalMessageWithProof = clientFinalMessageWithoutProof
+                                           + ",p=" + DatatypeConverter.printBase64Binary(clientProof);
+            return finalMessageWithProof.getBytes();
+        }
+        catch (IllegalArgumentException | NoSuchAlgorithmException | IOException e)
+        {
+            throw new SaslException(e.getMessage(), e);
+        }
+    }
+
+    private byte[] computeHmac(final byte[] key, final String string)
+            throws SaslException, UnsupportedEncodingException
+    {
+        Mac mac = createHmac(key);
+        mac.update(string.getBytes(ASCII));
+        return mac.doFinal();
+    }
+
+    private byte[] generateSaltedPassword(final byte[] passwordBytes) throws SaslException
+    {
+        Mac mac = createHmac(passwordBytes);
+
+        mac.update(_salt);
+        mac.update(INT_1);
+        byte[] result = mac.doFinal();
+
+        byte[] previous = null;
+        for(int i = 1; i < _iterationCount; i++)
+        {
+            mac.update(previous != null? previous: result);
+            previous = mac.doFinal();
+            for(int x = 0; x < result.length; x++)
+            {
+                result[x] ^= previous[x];
+            }
+        }
+
+        return result;
+    }
+
+    private Mac createHmac(final byte[] keyBytes)
+            throws SaslException
+    {
+        try
+        {
+            SecretKeySpec key = new SecretKeySpec(keyBytes, _hmacName);
+            Mac mac = Mac.getInstance(_hmacName);
+            mac.init(key);
+            return mac;
+        }
+        catch (NoSuchAlgorithmException e)
+        {
+            throw new SaslException(e.getMessage(), e);
+        }
+        catch (InvalidKeyException e)
+        {
+            throw new SaslException(e.getMessage(), e);
+        }
+    }
+
+
+    private byte[] initialResponse() throws SaslException
+    {
+        try
+        {
+            StringBuffer buf = new StringBuffer("n=");
+            _username = _credentials.getUsername();
+            buf.append(saslPrep(_username));
+            buf.append(",r=");
+            buf.append(_clientNonce);
+            _clientFirstMessageBare = buf.toString();
+            return (GS2_HEADER + _clientFirstMessageBare).getBytes(ASCII);
+        }
+        catch (IOException e)
+        {
+            throw new SaslException(e.getMessage(), e);
+        }
+    }
+
+    private String saslPrep(String name) throws SaslException
+    {
+        // TODO - a real implementation of SaslPrep
+
+        if(!ASCII.newEncoder().canEncode(name))
+        {
+            throw new SaslException("Can only encode names and passwords which are restricted to ASCII characters");
+        }
+
+        name = name.replace("=", "=3D");
+        name = name.replace(",", "=2C");
+        return name;
+    }
+
+    @Override
+    public boolean isComplete()
+    {
+        return _state == State.COMPLETE;
+    }
+
+    @Override
+    public byte[] unwrap(final byte[] incoming, final int offset, final int len) throws SaslException
+    {
+        throw new IllegalStateException("No security layer supported");
+    }
+
+    @Override
+    public byte[] wrap(final byte[] outgoing, final int offset, final int len) throws SaslException
+    {
+        throw new IllegalStateException("No security layer supported");
+    }
+
+    @Override
+    public Object getNegotiatedProperty(final String propName)
+    {
+        return null;
+    }
+
+    @Override
+    public void dispose() throws SaslException
+    {
+
+    }
+
+}
diff --git a/broker-core/src/main/java/org/apache/qpid/server/queue/QueueEntryListBase.java b/broker-core/src/main/java/org/apache/qpid/server/federation/sasl/ScramSHA1SaslClient.java
similarity index 67%
copy from broker-core/src/main/java/org/apache/qpid/server/queue/QueueEntryListBase.java
copy to broker-core/src/main/java/org/apache/qpid/server/federation/sasl/ScramSHA1SaslClient.java
index d2aff53..8a2297d 100644
--- a/broker-core/src/main/java/org/apache/qpid/server/queue/QueueEntryListBase.java
+++ b/broker-core/src/main/java/org/apache/qpid/server/federation/sasl/ScramSHA1SaslClient.java
@@ -18,8 +18,17 @@
  * under the License.
  *
  */
-package org.apache.qpid.server.queue;
+package org.apache.qpid.server.federation.sasl;
 
-public interface QueueEntryListBase extends QueueEntryList
+import org.apache.qpid.server.model.UsernamePasswordCredential;
+
+public class ScramSHA1SaslClient extends AbstractScramSaslClient
 {
+
+    public static final String MECHANISM = "SCRAM-SHA-1";
+
+    public ScramSHA1SaslClient(final UsernamePasswordCredential<?> credentials)
+    {
+        super(credentials, MECHANISM, "SHA-1", "HmacSHA1");
+    }
 }
diff --git a/broker-core/src/main/java/org/apache/qpid/server/queue/QueueEntryListBase.java b/broker-core/src/main/java/org/apache/qpid/server/federation/sasl/ScramSHA256SaslClient.java
similarity index 66%
copy from broker-core/src/main/java/org/apache/qpid/server/queue/QueueEntryListBase.java
copy to broker-core/src/main/java/org/apache/qpid/server/federation/sasl/ScramSHA256SaslClient.java
index d2aff53..40b4872 100644
--- a/broker-core/src/main/java/org/apache/qpid/server/queue/QueueEntryListBase.java
+++ b/broker-core/src/main/java/org/apache/qpid/server/federation/sasl/ScramSHA256SaslClient.java
@@ -18,8 +18,17 @@
  * under the License.
  *
  */
-package org.apache.qpid.server.queue;
+package org.apache.qpid.server.federation.sasl;
 
-public interface QueueEntryListBase extends QueueEntryList
+import org.apache.qpid.server.model.UsernamePasswordCredential;
+
+public class ScramSHA256SaslClient extends AbstractScramSaslClient
 {
+
+    public static final String MECHANISM = "SCRAM-SHA-256";
+
+    public ScramSHA256SaslClient(final UsernamePasswordCredential<?> credentials)
+    {
+        super(credentials, MECHANISM, "SHA-256", "HmacSHA256");
+    }
 }
diff --git a/broker-core/src/main/java/org/apache/qpid/server/filter/FilterSupport.java b/broker-core/src/main/java/org/apache/qpid/server/filter/FilterSupport.java
index ba724d8..b570a6a 100644
--- a/broker-core/src/main/java/org/apache/qpid/server/filter/FilterSupport.java
+++ b/broker-core/src/main/java/org/apache/qpid/server/filter/FilterSupport.java
@@ -31,10 +31,9 @@
 import org.apache.qpid.filter.SelectorParsingException;
 import org.apache.qpid.filter.selector.ParseException;
 import org.apache.qpid.filter.selector.TokenMgrError;
-import org.apache.qpid.server.consumer.ConsumerImpl;
-import org.apache.qpid.server.message.MessageSource;
 import org.apache.qpid.server.model.Queue;
 import org.apache.qpid.server.plugin.PluggableService;
+import org.apache.qpid.server.queue.QueueConsumer;
 
 public class FilterSupport
 {
@@ -119,9 +118,9 @@
     @PluggableService
     public static final class NoLocalFilter implements MessageFilter
     {
-        private final MessageSource _queue;
+        private final Queue<?> _queue;
 
-        private NoLocalFilter(MessageSource queue)
+        private NoLocalFilter(Queue<?> queue)
         {
             _queue = queue;
         }
@@ -135,8 +134,8 @@
         public boolean matches(Filterable message)
         {
 
-            final Collection<? extends ConsumerImpl> consumers = _queue.getConsumers();
-            for(ConsumerImpl c : consumers)
+            final Collection<QueueConsumer<?>> consumers = _queue.getConsumers();
+            for(QueueConsumer<?> c : consumers)
             {
                 if(c.getSessionModel().getConnectionReference() == message.getConnectionReference())
                 {
diff --git a/broker-core/src/main/java/org/apache/qpid/server/message/MessageSourceConsumer.java b/broker-core/src/main/java/org/apache/qpid/server/message/AcquiringMessageInstanceConsumer.java
similarity index 68%
copy from broker-core/src/main/java/org/apache/qpid/server/message/MessageSourceConsumer.java
copy to broker-core/src/main/java/org/apache/qpid/server/message/AcquiringMessageInstanceConsumer.java
index 7ca5c6d..1249127 100644
--- a/broker-core/src/main/java/org/apache/qpid/server/message/MessageSourceConsumer.java
+++ b/broker-core/src/main/java/org/apache/qpid/server/message/AcquiringMessageInstanceConsumer.java
@@ -20,9 +20,17 @@
  */
 package org.apache.qpid.server.message;
 
-import org.apache.qpid.server.consumer.ConsumerImpl;
-import org.apache.qpid.server.model.Consumer;
+import org.apache.qpid.server.queue.QueueEntry;
 
-public interface MessageSourceConsumer<X extends MessageSourceConsumer<X>> extends ConsumerImpl, Consumer<MessageSourceConsumer<X>>
+public interface AcquiringMessageInstanceConsumer<X extends AcquiringMessageInstanceConsumer<X, T>, T> extends MessageInstanceConsumer
 {
+    MessageInstance.StealableConsumerAcquiredState<X> getOwningState();
+
+    T getTarget();
+
+    void acquisitionRemoved(QueueEntry queueEntry);
+
+    long getConsumerNumber();
+
+    boolean resend(QueueEntry queueEntry);
 }
diff --git a/broker-core/src/main/java/org/apache/qpid/server/message/MessageSourceConsumer.java b/broker-core/src/main/java/org/apache/qpid/server/message/BaseMessageInstance.java
similarity index 70%
copy from broker-core/src/main/java/org/apache/qpid/server/message/MessageSourceConsumer.java
copy to broker-core/src/main/java/org/apache/qpid/server/message/BaseMessageInstance.java
index 7ca5c6d..f9a9e74 100644
--- a/broker-core/src/main/java/org/apache/qpid/server/message/MessageSourceConsumer.java
+++ b/broker-core/src/main/java/org/apache/qpid/server/message/BaseMessageInstance.java
@@ -20,9 +20,20 @@
  */
 package org.apache.qpid.server.message;
 
-import org.apache.qpid.server.consumer.ConsumerImpl;
-import org.apache.qpid.server.model.Consumer;
+import org.apache.qpid.server.store.MessageEnqueueRecord;
+import org.apache.qpid.server.store.TransactionLogResource;
 
-public interface MessageSourceConsumer<X extends MessageSourceConsumer<X>> extends ConsumerImpl, Consumer<MessageSourceConsumer<X>>
+public interface BaseMessageInstance
 {
+    boolean getDeliveredToConsumer();
+
+    ServerMessage getMessage();
+
+    TransactionLogResource getOwningResource();
+
+    MessageEnqueueRecord getEnqueueRecord();
+
+    boolean acquire();
+
+    void delete();
 }
diff --git a/broker-core/src/main/java/org/apache/qpid/server/queue/QueueEntryListBase.java b/broker-core/src/main/java/org/apache/qpid/server/message/ConsumerOption.java
similarity index 83%
rename from broker-core/src/main/java/org/apache/qpid/server/queue/QueueEntryListBase.java
rename to broker-core/src/main/java/org/apache/qpid/server/message/ConsumerOption.java
index d2aff53..7bbcf15 100644
--- a/broker-core/src/main/java/org/apache/qpid/server/queue/QueueEntryListBase.java
+++ b/broker-core/src/main/java/org/apache/qpid/server/message/ConsumerOption.java
@@ -18,8 +18,14 @@
  * under the License.
  *
  */
-package org.apache.qpid.server.queue;
+package org.apache.qpid.server.message;
 
-public interface QueueEntryListBase extends QueueEntryList
+public enum ConsumerOption
 {
+    ACQUIRES,
+    SEES_REQUEUES,
+    TRANSIENT,
+    EXCLUSIVE,
+    NO_LOCAL,
+    DURABLE
 }
diff --git a/broker-core/src/main/java/org/apache/qpid/server/message/MessageDestination.java b/broker-core/src/main/java/org/apache/qpid/server/message/MessageDestination.java
index 91035be..9034fc4 100644
--- a/broker-core/src/main/java/org/apache/qpid/server/message/MessageDestination.java
+++ b/broker-core/src/main/java/org/apache/qpid/server/message/MessageDestination.java
@@ -53,5 +53,5 @@
                                                                           final String routingAddress,
                                                                           InstanceProperties instanceProperties,
                                                                           ServerTransaction txn,
-                                                                          Action<? super MessageInstance> postEnqueueAction);
+                                                                          Action<? super BaseMessageInstance> postEnqueueAction);
 }
diff --git a/broker-core/src/main/java/org/apache/qpid/server/message/MessageInfoImpl.java b/broker-core/src/main/java/org/apache/qpid/server/message/MessageInfoImpl.java
index 3750711..2cafde9 100644
--- a/broker-core/src/main/java/org/apache/qpid/server/message/MessageInfoImpl.java
+++ b/broker-core/src/main/java/org/apache/qpid/server/message/MessageInfoImpl.java
@@ -55,7 +55,7 @@
         final AMQMessageHeader messageHeader = message.getMessageHeader();
 
         _deliveredTo = instance.getDeliveredConsumer() == null ? null : String.valueOf(instance.getDeliveredConsumer()
-                                                                                                .getConsumerNumber());
+                                                                                                .getIdentifier());
         _arrivalTime = message.getArrivalTime() == 0L ? null : new Date(message.getArrivalTime());
         _persistent = message.isPersistent();
         _messageId = messageHeader.getMessageId();
diff --git a/broker-core/src/main/java/org/apache/qpid/server/message/MessageInstance.java b/broker-core/src/main/java/org/apache/qpid/server/message/MessageInstance.java
index ed6724e..cec2f83 100644
--- a/broker-core/src/main/java/org/apache/qpid/server/message/MessageInstance.java
+++ b/broker-core/src/main/java/org/apache/qpid/server/message/MessageInstance.java
@@ -21,15 +21,12 @@
 package org.apache.qpid.server.message;
 
 
-import org.apache.qpid.server.consumer.ConsumerImpl;
 import org.apache.qpid.server.filter.Filterable;
-import org.apache.qpid.server.store.MessageEnqueueRecord;
-import org.apache.qpid.server.store.TransactionLogResource;
 import org.apache.qpid.server.txn.ServerTransaction;
 import org.apache.qpid.server.util.Action;
 import org.apache.qpid.server.util.StateChangeListener;
 
-public interface MessageInstance
+public interface MessageInstance extends BaseMessageInstance
 {
 
 
@@ -50,39 +47,37 @@
 
     boolean acquiredByConsumer();
 
-    boolean isAcquiredBy(ConsumerImpl consumer);
+    boolean isAcquiredBy(MessageInstanceConsumer consumer);
 
-    boolean removeAcquisitionFromConsumer(ConsumerImpl consumer);
+    boolean removeAcquisitionFromConsumer(MessageInstanceConsumer consumer);
 
     void setRedelivered();
 
     boolean isRedelivered();
 
-    ConsumerImpl getDeliveredConsumer();
+    MessageInstanceConsumer getDeliveredConsumer();
 
     void reject();
 
-    boolean isRejectedBy(ConsumerImpl consumer);
-
-    boolean getDeliveredToConsumer();
+    boolean isRejectedBy(MessageInstanceConsumer consumer);
 
     boolean expired();
 
-    boolean acquire(ConsumerImpl sub);
+    boolean acquire(MessageInstanceConsumer sub);
 
-    boolean makeAcquisitionUnstealable(final ConsumerImpl consumer);
+    boolean makeAcquisitionUnstealable(final MessageInstanceConsumer consumer);
 
     boolean makeAcquisitionStealable();
 
     int getMaximumDeliveryCount();
 
-    int routeToAlternate(Action<? super MessageInstance> action, ServerTransaction txn);
+    int routeToAlternate(Action<? super BaseMessageInstance> action, ServerTransaction txn);
 
     Filterable asFilterable();
 
-    ConsumerImpl getAcquiringConsumer();
+    MessageInstanceConsumer getAcquiringConsumer();
 
-    MessageEnqueueRecord getEnqueueRecord();
+    InstanceProperties getInstanceProperties();
 
     enum State
     {
@@ -171,7 +166,7 @@
         }
     }
 
-    abstract class ConsumerAcquiredState<C extends ConsumerImpl> extends EntryState
+    abstract class ConsumerAcquiredState<C extends AcquiringMessageInstanceConsumer<C,?>> extends EntryState
     {
         public abstract C getConsumer();
 
@@ -188,7 +183,7 @@
         }
     }
 
-    final class StealableConsumerAcquiredState<C extends ConsumerImpl> extends ConsumerAcquiredState
+    final class StealableConsumerAcquiredState<C extends AcquiringMessageInstanceConsumer<C,?>> extends ConsumerAcquiredState
     {
         private final C _consumer;
         private final UnstealableConsumerAcquiredState<C> _unstealableState;
@@ -211,7 +206,7 @@
         }
     }
 
-    final class UnstealableConsumerAcquiredState<C extends ConsumerImpl> extends ConsumerAcquiredState
+    final class UnstealableConsumerAcquiredState<C extends AcquiringMessageInstanceConsumer<C,?>> extends ConsumerAcquiredState
     {
         private final StealableConsumerAcquiredState<C> _stealableState;
 
@@ -240,25 +235,15 @@
 
     boolean isAvailable();
 
-    boolean acquire();
-
     boolean isAcquired();
 
     void release();
 
-    void release(ConsumerImpl release);
+    void release(MessageInstanceConsumer release);
 
     boolean resend();
 
-    void delete();
-
     boolean isDeleted();
 
     boolean isHeld();
-
-    ServerMessage getMessage();
-
-    InstanceProperties getInstanceProperties();
-
-    TransactionLogResource getOwningResource();
 }
diff --git a/broker-core/src/main/java/org/apache/qpid/server/message/MessageSourceConsumer.java b/broker-core/src/main/java/org/apache/qpid/server/message/MessageInstanceConsumer.java
similarity index 75%
rename from broker-core/src/main/java/org/apache/qpid/server/message/MessageSourceConsumer.java
rename to broker-core/src/main/java/org/apache/qpid/server/message/MessageInstanceConsumer.java
index 7ca5c6d..4d645d4 100644
--- a/broker-core/src/main/java/org/apache/qpid/server/message/MessageSourceConsumer.java
+++ b/broker-core/src/main/java/org/apache/qpid/server/message/MessageInstanceConsumer.java
@@ -20,9 +20,24 @@
  */
 package org.apache.qpid.server.message;
 
-import org.apache.qpid.server.consumer.ConsumerImpl;
-import org.apache.qpid.server.model.Consumer;
-
-public interface MessageSourceConsumer<X extends MessageSourceConsumer<X>> extends ConsumerImpl, Consumer<MessageSourceConsumer<X>>
+public interface MessageInstanceConsumer
 {
+
+    boolean isClosed();
+
+    boolean acquires();
+
+    String getName();
+
+    void close();
+
+    void flush();
+
+    void externalStateChange();
+
+    Object getIdentifier();
+
+    boolean hasAvailableMessages();
+
+    void pullMessage();
 }
diff --git a/broker-core/src/main/java/org/apache/qpid/server/message/MessageSource.java b/broker-core/src/main/java/org/apache/qpid/server/message/MessageSource.java
index 3812474..f1c79d4 100644
--- a/broker-core/src/main/java/org/apache/qpid/server/message/MessageSource.java
+++ b/broker-core/src/main/java/org/apache/qpid/server/message/MessageSource.java
@@ -23,23 +23,22 @@
 import java.util.Collection;
 import java.util.EnumSet;
 
-import org.apache.qpid.server.consumer.ConsumerImpl;
 import org.apache.qpid.server.consumer.ConsumerTarget;
 import org.apache.qpid.server.filter.FilterManager;
 import org.apache.qpid.server.protocol.AMQSessionModel;
 import org.apache.qpid.server.store.TransactionLogResource;
 
-public interface MessageSource extends TransactionLogResource, MessageNode
+public interface MessageSource<X extends MessageInstanceConsumer> extends TransactionLogResource, MessageNode
 {
-     ConsumerImpl addConsumer(ConsumerTarget target, FilterManager filters,
-                              Class<? extends ServerMessage> messageClass,
-                              String consumerName,
-                              EnumSet<ConsumerImpl.Option> options,
-                              Integer priority)
-            throws ExistingExclusiveConsumer, ExistingConsumerPreventsExclusive,
-                   ConsumerAccessRefused;
+    X addConsumer(ConsumerTarget target,
+                  FilterManager filters,
+                  Class<? extends ServerMessage> messageClass,
+                  String consumerName,
+                  EnumSet<ConsumerOption> options,
+                  Integer priority)
+            throws ExistingExclusiveConsumer, ExistingConsumerPreventsExclusive, ConsumerAccessRefused;
 
-    Collection<? extends ConsumerImpl> getConsumers();
+    Collection<X> getConsumers();
 
     boolean verifySessionAccess(AMQSessionModel<?> session);
 
diff --git a/broker-core/src/main/java/org/apache/qpid/server/model/NoopConfigurationChangeListener.java b/broker-core/src/main/java/org/apache/qpid/server/model/AbstractConfigurationChangeListener.java
similarity index 93%
rename from broker-core/src/main/java/org/apache/qpid/server/model/NoopConfigurationChangeListener.java
rename to broker-core/src/main/java/org/apache/qpid/server/model/AbstractConfigurationChangeListener.java
index 4c22583..a722edb 100644
--- a/broker-core/src/main/java/org/apache/qpid/server/model/NoopConfigurationChangeListener.java
+++ b/broker-core/src/main/java/org/apache/qpid/server/model/AbstractConfigurationChangeListener.java
@@ -20,7 +20,7 @@
  */
 package org.apache.qpid.server.model;
 
-public class NoopConfigurationChangeListener implements ConfigurationChangeListener
+public abstract class AbstractConfigurationChangeListener implements ConfigurationChangeListener
 {
     @Override
     public void stateChanged(ConfiguredObject<?> object, State oldState, State newState)
diff --git a/broker-core/src/main/java/org/apache/qpid/server/model/AbstractConfiguredObject.java b/broker-core/src/main/java/org/apache/qpid/server/model/AbstractConfiguredObject.java
index 2b16dd8..7e219f3 100644
--- a/broker-core/src/main/java/org/apache/qpid/server/model/AbstractConfiguredObject.java
+++ b/broker-core/src/main/java/org/apache/qpid/server/model/AbstractConfiguredObject.java
@@ -2596,11 +2596,11 @@
     public ListenableFuture<Void> setAttributesAsync(final Map<String, Object> attributes) throws IllegalStateException, AccessControlException, IllegalArgumentException
     {
         final Map<String,Object> updateAttributes = new HashMap<>(attributes);
-        Object desiredState = updateAttributes.remove(ConfiguredObject.DESIRED_STATE);
-        runTask(new Task<Void, RuntimeException>()
+        final Object desiredState = updateAttributes.remove(ConfiguredObject.DESIRED_STATE);
+        return doOnConfigThread(new Task<ListenableFuture<Void>, RuntimeException>()
         {
             @Override
-            public Void execute()
+            public ListenableFuture<Void> execute()
             {
                 authoriseSetAttributes(createProxyForValidation(attributes), attributes.keySet());
                 if (!isSystemProcess())
@@ -2609,7 +2609,29 @@
                 }
 
                 changeAttributes(updateAttributes);
-                return null;
+                if(desiredState != null)
+                {
+                    State state;
+                    if(desiredState instanceof State)
+                    {
+                        state = (State)desiredState;
+                    }
+                    else if(desiredState instanceof String)
+                    {
+                        state = State.valueOf((String)desiredState);
+                    }
+                    else
+                    {
+                        throw new IllegalArgumentException("Cannot convert an object of type " + desiredState.getClass().getName() + " to a State");
+                    }
+                    return setDesiredState(state);
+                }
+                else
+                {
+                    return Futures.immediateFuture(null);
+                }
+
+
             }
 
             @Override
@@ -2630,27 +2652,6 @@
                 return "attributes number=" + attributes.size();
             }
         });
-        if(desiredState != null)
-        {
-            State state;
-            if(desiredState instanceof State)
-            {
-                state = (State)desiredState;
-            }
-            else if(desiredState instanceof String)
-            {
-                state = State.valueOf((String)desiredState);
-            }
-            else
-            {
-                throw new IllegalArgumentException("Cannot convert an object of type " + desiredState.getClass().getName() + " to a State");
-            }
-            return setDesiredState(state);
-        }
-        else
-        {
-            return Futures.immediateFuture(null);
-        }
     }
 
     public void forceUpdateAllSecureAttributes()
diff --git a/broker-core/src/main/java/org/apache/qpid/server/model/AbstractSystemConfig.java b/broker-core/src/main/java/org/apache/qpid/server/model/AbstractSystemConfig.java
index 8411476..f84f9c7 100644
--- a/broker-core/src/main/java/org/apache/qpid/server/model/AbstractSystemConfig.java
+++ b/broker-core/src/main/java/org/apache/qpid/server/model/AbstractSystemConfig.java
@@ -469,11 +469,13 @@
         return preferenceStoreFactory.createInstance(this, attributes);
     }
 
+    @Override
     protected final Principal getSystemPrincipal()
     {
         return _systemPrincipal;
     }
 
+    @Override
     public Runnable getOnContainerResolveTask()
     {
         return _onContainerResolveTask;
@@ -485,11 +487,13 @@
         _onContainerResolveTask = onContainerResolveTask;
     }
 
+    @Override
     public Runnable getOnContainerCloseTask()
     {
         return _onContainerCloseTask;
     }
 
+    @Override
     public void setOnContainerCloseTask(final Runnable onContainerCloseTask)
     {
         _onContainerCloseTask = onContainerCloseTask;
@@ -497,6 +501,7 @@
 
     private class ShutdownService implements Runnable
     {
+        @Override
         public void run()
         {
             Subject.doAs(getSystemTaskSubject("Shutdown"),
diff --git a/broker-core/src/main/java/org/apache/qpid/server/queue/QueueEntryListBase.java b/broker-core/src/main/java/org/apache/qpid/server/model/AnonymousCredential.java
similarity index 76%
copy from broker-core/src/main/java/org/apache/qpid/server/queue/QueueEntryListBase.java
copy to broker-core/src/main/java/org/apache/qpid/server/model/AnonymousCredential.java
index d2aff53..2955103 100644
--- a/broker-core/src/main/java/org/apache/qpid/server/queue/QueueEntryListBase.java
+++ b/broker-core/src/main/java/org/apache/qpid/server/model/AnonymousCredential.java
@@ -18,8 +18,12 @@
  * under the License.
  *
  */
-package org.apache.qpid.server.queue;
+package org.apache.qpid.server.model;
 
-public interface QueueEntryListBase extends QueueEntryList
+@ManagedObject(category = false, type = AnonymousCredential.ANONYMOUS)
+public interface AnonymousCredential<X extends AnonymousCredential<X>> extends Credential<X>
 {
+    String ANONYMOUS = "Anonymous";
+
+
 }
diff --git a/broker-core/src/main/java/org/apache/qpid/server/model/BrokerImpl.java b/broker-core/src/main/java/org/apache/qpid/server/model/BrokerImpl.java
index 452e260..226ba15 100644
--- a/broker-core/src/main/java/org/apache/qpid/server/model/BrokerImpl.java
+++ b/broker-core/src/main/java/org/apache/qpid/server/model/BrokerImpl.java
@@ -1105,17 +1105,11 @@
     }
 
 
-    private final class AccessControlProviderListener implements ConfigurationChangeListener
+    private final class AccessControlProviderListener extends AbstractConfigurationChangeListener
     {
         private final Set<ConfiguredObject<?>> _bulkChanges = new HashSet<>();
 
         @Override
-        public void stateChanged(final ConfiguredObject<?> object, final State oldState, final State newState)
-        {
-
-        }
-
-        @Override
         public void childAdded(final ConfiguredObject<?> object, final ConfiguredObject<?> child)
         {
             if(object.getCategoryClass() == Broker.class && child.getCategoryClass() == AccessControlProvider.class)
diff --git a/broker-core/src/main/java/org/apache/qpid/server/model/BrokerModel.java b/broker-core/src/main/java/org/apache/qpid/server/model/BrokerModel.java
index bc57081..c347723 100644
--- a/broker-core/src/main/java/org/apache/qpid/server/model/BrokerModel.java
+++ b/broker-core/src/main/java/org/apache/qpid/server/model/BrokerModel.java
@@ -96,6 +96,11 @@
         addRelationship(VirtualHost.class, VirtualHostAccessControlProvider.class);
         addRelationship(VirtualHost.class, Exchange.class);
         addRelationship(VirtualHost.class, Queue.class);
+        addRelationship(VirtualHost.class, RemoteHost.class);
+
+
+        addRelationship(RemoteHost.class, RemoteHostAddress.class);
+        addRelationship(RemoteHost.class, Credential.class);
 
         addRelationship(VirtualHostLogger.class, VirtualHostLogInclusionRule.class);
 
diff --git a/broker-core/src/main/java/org/apache/qpid/server/model/ConfiguredObject.java b/broker-core/src/main/java/org/apache/qpid/server/model/ConfiguredObject.java
index 8a54297..1866d5d 100644
--- a/broker-core/src/main/java/org/apache/qpid/server/model/ConfiguredObject.java
+++ b/broker-core/src/main/java/org/apache/qpid/server/model/ConfiguredObject.java
@@ -40,7 +40,8 @@
 /**
  * An object that can be "managed" (eg via the web interface) and usually read from configuration.
  */
-public interface ConfiguredObject<X extends ConfiguredObject<X>> extends ContextProvider, TaskExecutorProvider, PermissionedObject
+public interface ConfiguredObject<X extends ConfiguredObject<X>> extends ContextProvider, TaskExecutorProvider,
+                                                                         PermissionedObject
 {
     String OVER_SIZED_ATTRIBUTE_ALTERNATIVE_TEXT = "Value is too long to display";
 
diff --git a/broker-core/src/main/java/org/apache/qpid/server/model/Consumer.java b/broker-core/src/main/java/org/apache/qpid/server/model/Consumer.java
index 3244cdd..a1df8b4 100644
--- a/broker-core/src/main/java/org/apache/qpid/server/model/Consumer.java
+++ b/broker-core/src/main/java/org/apache/qpid/server/model/Consumer.java
@@ -20,10 +20,12 @@
  */
 package org.apache.qpid.server.model;
 
-import org.apache.qpid.server.consumer.ConsumerImpl;
+import java.util.concurrent.atomic.AtomicLong;
+
+import org.apache.qpid.server.protocol.AMQSessionModel;
 
 @ManagedObject
-public interface Consumer<X extends Consumer<X>> extends ConfiguredObject<X>, ConsumerImpl
+public interface Consumer<X extends Consumer<X>> extends ConfiguredObject<X>
 {
     String DISTRIBUTION_MODE = "distributionMode";
     String EXCLUSIVE = "exclusive";
@@ -36,7 +38,7 @@
     String SUSPEND_NOTIFICATION_PERIOD = "consumer.suspendNotificationPeriod";
 
     @ManagedContextDefault( name = SUSPEND_NOTIFICATION_PERIOD)
-    long SUSPEND_NOTIFICATION_PERIOD_DEFAULT = 10000;
+    long SUSPEND_NOTIFICATION_PERIOD_DEFAULT = 10000;AtomicLong CONSUMER_NUMBER_GENERATOR = new AtomicLong(0);
 
     @ManagedAttribute
     String getDistributionMode();
@@ -70,4 +72,21 @@
     @ManagedStatistic(statisticType = StatisticType.POINT_IN_TIME, units = StatisticUnit.MESSAGES, label = "Prefetch")
     long getUnacknowledgedMessages();
 
+
+    AMQSessionModel getSessionModel();
+
+    long getConsumerNumber();
+
+    boolean isSuspended();
+
+    boolean seesRequeues();
+
+    boolean trySendLock();
+
+
+    void getSendLock();
+
+    void releaseSendLock();
+
+    boolean isActive();
 }
diff --git a/broker-core/src/main/java/org/apache/qpid/server/queue/QueueEntryListBase.java b/broker-core/src/main/java/org/apache/qpid/server/model/Credential.java
similarity index 74%
copy from broker-core/src/main/java/org/apache/qpid/server/queue/QueueEntryListBase.java
copy to broker-core/src/main/java/org/apache/qpid/server/model/Credential.java
index d2aff53..0b9d405 100644
--- a/broker-core/src/main/java/org/apache/qpid/server/queue/QueueEntryListBase.java
+++ b/broker-core/src/main/java/org/apache/qpid/server/model/Credential.java
@@ -18,8 +18,15 @@
  * under the License.
  *
  */
-package org.apache.qpid.server.queue;
+package org.apache.qpid.server.model;
 
-public interface QueueEntryListBase extends QueueEntryList
+import java.util.List;
+
+import javax.security.sasl.SaslClient;
+
+@ManagedObject(creatable = false)
+public interface Credential<X extends Credential<X>> extends ConfiguredObject<X>
 {
+
+    SaslClient getSaslClient(List<String> mechanisms);
 }
diff --git a/broker-core/src/main/java/org/apache/qpid/server/message/MessageSourceConsumer.java b/broker-core/src/main/java/org/apache/qpid/server/model/ExternalCredential.java
similarity index 74%
copy from broker-core/src/main/java/org/apache/qpid/server/message/MessageSourceConsumer.java
copy to broker-core/src/main/java/org/apache/qpid/server/model/ExternalCredential.java
index 7ca5c6d..bf4dbff 100644
--- a/broker-core/src/main/java/org/apache/qpid/server/message/MessageSourceConsumer.java
+++ b/broker-core/src/main/java/org/apache/qpid/server/model/ExternalCredential.java
@@ -18,11 +18,14 @@
  * under the License.
  *
  */
-package org.apache.qpid.server.message;
+package org.apache.qpid.server.model;
 
-import org.apache.qpid.server.consumer.ConsumerImpl;
-import org.apache.qpid.server.model.Consumer;
-
-public interface MessageSourceConsumer<X extends MessageSourceConsumer<X>> extends ConsumerImpl, Consumer<MessageSourceConsumer<X>>
+@ManagedObject(category = false, type = ExternalCredential.EXTERNAL)
+public interface ExternalCredential<X extends ExternalCredential<X>> extends Credential<X>
 {
+    String EXTERNAL = "External";
+
+    @ManagedAttribute
+    String getUsername();
+
 }
diff --git a/broker-core/src/main/java/org/apache/qpid/server/model/Queue.java b/broker-core/src/main/java/org/apache/qpid/server/model/Queue.java
index e1651e9..83e6c72 100644
--- a/broker-core/src/main/java/org/apache/qpid/server/model/Queue.java
+++ b/broker-core/src/main/java/org/apache/qpid/server/model/Queue.java
@@ -34,11 +34,11 @@
 import org.apache.qpid.server.message.MessageSource;
 import org.apache.qpid.server.message.ServerMessage;
 import org.apache.qpid.server.protocol.CapacityChecker;
-import org.apache.qpid.server.queue.BaseQueue;
 import org.apache.qpid.server.queue.NotificationCheck;
 import org.apache.qpid.server.queue.QueueConsumer;
 import org.apache.qpid.server.queue.QueueEntry;
 import org.apache.qpid.server.queue.QueueEntryVisitor;
+import org.apache.qpid.server.queue.RecoverableBaseQueue;
 import org.apache.qpid.server.store.MessageDurability;
 import org.apache.qpid.server.store.MessageEnqueueRecord;
 import org.apache.qpid.server.util.Deletable;
@@ -46,8 +46,8 @@
 @ManagedObject( defaultType = "standard", description = Queue.CLASS_DESCRIPTION )
 public interface Queue<X extends Queue<X>> extends ConfiguredObject<X>,
                                                    Comparable<X>, ExchangeReferrer,
-                                                   BaseQueue,
-                                                   MessageSource,
+                                                   RecoverableBaseQueue,
+                                                   MessageSource<QueueConsumer<?>>,
                                                    CapacityChecker,
                                                    MessageDestination,
                                                    Deletable<X>
@@ -237,7 +237,7 @@
     Collection<? extends Binding<?>> getBindings();
 
 
-    Collection<? extends Consumer<?>> getConsumers();
+    Collection<QueueConsumer<?>> getConsumers();
 
     //operations
 
diff --git a/broker-core/src/main/java/org/apache/qpid/server/queue/QueueEntryListBase.java b/broker-core/src/main/java/org/apache/qpid/server/model/RemoteHost.java
similarity index 62%
copy from broker-core/src/main/java/org/apache/qpid/server/queue/QueueEntryListBase.java
copy to broker-core/src/main/java/org/apache/qpid/server/model/RemoteHost.java
index d2aff53..a376837 100644
--- a/broker-core/src/main/java/org/apache/qpid/server/queue/QueueEntryListBase.java
+++ b/broker-core/src/main/java/org/apache/qpid/server/model/RemoteHost.java
@@ -18,8 +18,23 @@
  * under the License.
  *
  */
-package org.apache.qpid.server.queue;
+package org.apache.qpid.server.model;
 
-public interface QueueEntryListBase extends QueueEntryList
+import java.util.Collection;
+
+@ManagedObject(defaultType = RemoteHost.REMOTE_HOST_TYPE)
+public interface RemoteHost<X extends RemoteHost<X>> extends ConfiguredObject<X>
 {
+
+    String REMOTE_HOST_TYPE = "Standard";
+
+    @ManagedAttribute(defaultValue = "10")
+    int getRetryPeriod();
+
+    @ManagedAttribute(defaultValue = "true")
+    boolean isRedirectFollowed();
+
+    @ManagedAttribute(defaultValue = "[]")
+    Collection<String> getRoutableAddresses();
+
 }
diff --git a/broker-core/src/main/java/org/apache/qpid/server/model/RemoteHostAddress.java b/broker-core/src/main/java/org/apache/qpid/server/model/RemoteHostAddress.java
new file mode 100644
index 0000000..c017e81
--- /dev/null
+++ b/broker-core/src/main/java/org/apache/qpid/server/model/RemoteHostAddress.java
@@ -0,0 +1,69 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.server.model;
+
+import java.util.Collection;
+import java.util.List;
+
+@ManagedObject( defaultType = RemoteHostAddress.REMOTE_HOST_ADDRESS_TYPE)
+public interface RemoteHostAddress<X extends RemoteHostAddress<X>> extends ConfiguredObject<X>
+{
+
+    String REMOTE_HOST_ADDRESS_TYPE = "Standard";
+
+    @ManagedAttribute(mandatory = true)
+    String getAddress();
+
+    @ManagedAttribute(mandatory = true)
+    int getPort();
+
+    @ManagedAttribute
+    String getHostName();
+
+    @ManagedAttribute
+    Protocol getProtocol();
+
+    @ManagedAttribute( defaultValue = "TCP" )
+    Transport getTransport();
+
+    @ManagedAttribute
+    KeyStore getKeyStore();
+
+    @ManagedAttribute
+    Collection<TrustStore> getTrustStores();
+
+    @ManagedAttribute(defaultValue = "0")
+    int getDesiredHeartbeatInterval();
+
+
+    @DerivedAttribute
+    List<String> getTlsProtocolWhiteList();
+
+    @DerivedAttribute
+    List<String> getTlsProtocolBlackList();
+
+    @DerivedAttribute
+    List<String> getTlsCipherSuiteWhiteList();
+
+    @DerivedAttribute
+    List<String> getTlsCipherSuiteBlackList();
+
+}
diff --git a/broker-core/src/main/java/org/apache/qpid/server/queue/QueueEntryListBase.java b/broker-core/src/main/java/org/apache/qpid/server/model/UsernamePasswordCredential.java
similarity index 67%
copy from broker-core/src/main/java/org/apache/qpid/server/queue/QueueEntryListBase.java
copy to broker-core/src/main/java/org/apache/qpid/server/model/UsernamePasswordCredential.java
index d2aff53..dbb59da 100644
--- a/broker-core/src/main/java/org/apache/qpid/server/queue/QueueEntryListBase.java
+++ b/broker-core/src/main/java/org/apache/qpid/server/model/UsernamePasswordCredential.java
@@ -18,8 +18,16 @@
  * under the License.
  *
  */
-package org.apache.qpid.server.queue;
+package org.apache.qpid.server.model;
 
-public interface QueueEntryListBase extends QueueEntryList
+@ManagedObject(category = false, type = UsernamePasswordCredential.USERNAME_PASSWORD)
+public interface UsernamePasswordCredential<X extends UsernamePasswordCredential<X>> extends Credential<X>
 {
+    String USERNAME_PASSWORD = "UsernamePassword";
+
+    @ManagedAttribute
+    String getUsername();
+
+    @ManagedAttribute(secure = true)
+    String getPassword();
 }
diff --git a/broker-core/src/main/java/org/apache/qpid/server/model/VirtualHost.java b/broker-core/src/main/java/org/apache/qpid/server/model/VirtualHost.java
index 720f96a..b0996f9 100644
--- a/broker-core/src/main/java/org/apache/qpid/server/model/VirtualHost.java
+++ b/broker-core/src/main/java/org/apache/qpid/server/model/VirtualHost.java
@@ -37,7 +37,9 @@
 import org.apache.qpid.server.store.DurableConfigurationStore;
 import org.apache.qpid.server.store.MessageStore;
 import org.apache.qpid.server.store.preferences.UserPreferencesCreator;
+import org.apache.qpid.server.transfer.TransferQueue;
 import org.apache.qpid.server.transport.AMQPConnection;
+import org.apache.qpid.server.util.Action;
 import org.apache.qpid.server.virtualhost.HouseKeepingTask;
 import org.apache.qpid.server.virtualhost.NodeAutoCreationPolicy;
 
@@ -261,8 +263,12 @@
 
     String getLocalAddress(String routingAddress);
 
+    TransferQueue getTransferQueue();
+
     void setFirstOpening(boolean firstOpening);
 
+    boolean makeConnection(RemoteHostAddress<?> address, final Action<Boolean> onConnectionLoss);
+
     interface Transaction
     {
         void dequeue(QueueEntry entry);
diff --git a/broker-core/src/main/java/org/apache/qpid/server/queue/QueueEntryListBase.java b/broker-core/src/main/java/org/apache/qpid/server/plugin/OutboundProtocolEngineCreator.java
similarity index 61%
copy from broker-core/src/main/java/org/apache/qpid/server/queue/QueueEntryListBase.java
copy to broker-core/src/main/java/org/apache/qpid/server/plugin/OutboundProtocolEngineCreator.java
index d2aff53..8cd11e8 100644
--- a/broker-core/src/main/java/org/apache/qpid/server/queue/QueueEntryListBase.java
+++ b/broker-core/src/main/java/org/apache/qpid/server/plugin/OutboundProtocolEngineCreator.java
@@ -1,4 +1,4 @@
-/*
+package org.apache.qpid.server.plugin;/*
  *
  * Licensed to the Apache Software Foundation (ASF) under one
  * or more contributor license agreements.  See the NOTICE file
@@ -18,8 +18,17 @@
  * under the License.
  *
  */
-package org.apache.qpid.server.queue;
 
-public interface QueueEntryListBase extends QueueEntryList
+import org.apache.qpid.server.federation.OutboundProtocolEngine;
+import org.apache.qpid.server.model.Protocol;
+import org.apache.qpid.server.model.RemoteHostAddress;
+import org.apache.qpid.server.model.VirtualHost;
+
+public interface OutboundProtocolEngineCreator extends Pluggable
 {
+    Protocol getVersion();
+    OutboundProtocolEngine newProtocolEngine(RemoteHostAddress<?> address,
+                                             VirtualHost<?> virtualHost);
+
 }
+
diff --git a/broker-core/src/main/java/org/apache/qpid/server/queue/AbstractQueue.java b/broker-core/src/main/java/org/apache/qpid/server/queue/AbstractQueue.java
index 49e2fab..9ce9eb2 100644
--- a/broker-core/src/main/java/org/apache/qpid/server/queue/AbstractQueue.java
+++ b/broker-core/src/main/java/org/apache/qpid/server/queue/AbstractQueue.java
@@ -72,7 +72,6 @@
 import org.apache.qpid.server.configuration.IllegalConfigurationException;
 import org.apache.qpid.server.configuration.updater.Task;
 import org.apache.qpid.server.connection.SessionPrincipal;
-import org.apache.qpid.server.consumer.ConsumerImpl;
 import org.apache.qpid.server.consumer.ConsumerTarget;
 import org.apache.qpid.server.filter.FilterManager;
 import org.apache.qpid.server.filter.JMSSelectorFilter;
@@ -82,6 +81,8 @@
 import org.apache.qpid.server.logging.LogSubject;
 import org.apache.qpid.server.logging.messages.QueueMessages;
 import org.apache.qpid.server.logging.subjects.QueueLogSubject;
+import org.apache.qpid.server.message.BaseMessageInstance;
+import org.apache.qpid.server.message.ConsumerOption;
 import org.apache.qpid.server.message.InstanceProperties;
 import org.apache.qpid.server.message.MessageDeletedException;
 import org.apache.qpid.server.message.MessageInfo;
@@ -726,7 +727,7 @@
                                          final FilterManager filters,
                                          final Class<? extends ServerMessage> messageClass,
                                          final String consumerName,
-                                         final EnumSet<ConsumerImpl.Option> optionSet,
+                                         final EnumSet<ConsumerOption> optionSet,
                                          final Integer priority)
             throws ExistingExclusiveConsumer, ExistingConsumerPreventsExclusive,
                    ConsumerAccessRefused
@@ -779,7 +780,7 @@
                                                   FilterManager filters,
                                                   final Class<? extends ServerMessage> messageClass,
                                                   final String consumerName,
-                                                  EnumSet<ConsumerImpl.Option> optionSet,
+                                                  EnumSet<ConsumerOption> optionSet,
                                                   final Integer priority)
             throws ExistingExclusiveConsumer, ConsumerAccessRefused,
                    ExistingConsumerPreventsExclusive
@@ -789,6 +790,136 @@
             throw new ExistingExclusiveConsumer();
         }
 
+        if(_noLocal && !optionSet.contains(ConsumerOption.NO_LOCAL))
+        {
+            optionSet = EnumSet.copyOf(optionSet);
+            optionSet.add(ConsumerOption.NO_LOCAL);
+        }
+
+        if(_ensureNondestructiveConsumers)
+        {
+            optionSet = EnumSet.copyOf(optionSet);
+            optionSet.removeAll(EnumSet.of(ConsumerOption.SEES_REQUEUES, ConsumerOption.ACQUIRES));
+        }
+
+
+
+        boolean exclusive =  optionSet.contains(ConsumerOption.EXCLUSIVE);
+        boolean isTransient =  optionSet.contains(ConsumerOption.TRANSIENT);
+
+
+
+        if(exclusive && getConsumerCount() != 0)
+        {
+            throw new ExistingConsumerPreventsExclusive();
+        }
+
+        if(!_defaultFiltersMap.isEmpty())
+        {
+            if(filters == null)
+            {
+                filters = new FilterManager();
+            }
+            for (Map.Entry<String,Callable<MessageFilter>> filter : _defaultFiltersMap.entrySet())
+            {
+                if(!filters.hasFilter(filter.getKey()))
+                {
+                    MessageFilter f;
+                    try
+                    {
+                        f = filter.getValue().call();
+                    }
+                    catch (Exception e)
+                    {
+                        if (e instanceof RuntimeException)
+                        {
+                            throw (RuntimeException) e;
+                        }
+                        else
+                        {
+                            // Should never happen
+                            throw new ServerScopedRuntimeException(e);
+                        }
+                    }
+                    filters.add(filter.getKey(), f);
+                }
+            }
+        }
+
+
+        QueueConsumerImpl consumer = new QueueConsumerImpl(this,
+                                                           target,
+                                                           consumerName,
+                                                           filters,
+                                                           messageClass,
+                                                           optionSet,
+                                                           priority);
+
+        checkExclusivity(target);
+
+
+        consumer.open();
+
+        target.consumerAdded(consumer);
+
+
+        if (exclusive && !isTransient)
+        {
+            _exclusiveSubscriber = consumer;
+        }
+
+        if(consumer.isActive())
+        {
+            _activeSubscriberCount.incrementAndGet();
+        }
+
+        consumer.setStateListener(this);
+        QueueContext queueContext;
+        if(filters == null || !filters.startAtTail())
+        {
+            queueContext = new QueueContext(getEntries().getHead());
+        }
+        else
+        {
+            queueContext = new QueueContext(getEntries().getTail());
+        }
+        consumer.setQueueContext(queueContext);
+
+        if (!isDeleted())
+        {
+            if(consumer.isPullOnly())
+            {
+                _hasPullOnlyConsumers = true;
+            }
+            _consumerList.add(consumer);
+
+            if (isDeleted())
+            {
+                consumer.queueDeleted();
+            }
+        }
+        else
+        {
+            // TODO
+        }
+
+        childAdded(consumer);
+        consumer.addChangeListener(_deletedChildListener);
+
+        if(consumer.isPullOnly())
+        {
+            consumer.getSessionModel().getAMQPConnection().notifyWork();
+        }
+        else
+        {
+            deliverAsync();
+        }
+
+        return consumer;
+    }
+
+    private void checkExclusivity(final ConsumerTarget target) throws ConsumerAccessRefused
+    {
         Object exclusiveOwner = _exclusiveOwner;
         switch(_exclusive)
         {
@@ -858,123 +989,7 @@
             default:
                 throw new ServerScopedRuntimeException("Unknown exclusivity policy " + _exclusive);
         }
-
-        boolean exclusive =  optionSet.contains(ConsumerImpl.Option.EXCLUSIVE);
-        boolean isTransient =  optionSet.contains(ConsumerImpl.Option.TRANSIENT);
-
-        if(_noLocal && !optionSet.contains(ConsumerImpl.Option.NO_LOCAL))
-        {
-            optionSet = EnumSet.copyOf(optionSet);
-            optionSet.add(ConsumerImpl.Option.NO_LOCAL);
-        }
-
-        if(exclusive && getConsumerCount() != 0)
-        {
-            throw new ExistingConsumerPreventsExclusive();
-        }
-        if(!_defaultFiltersMap.isEmpty())
-        {
-            if(filters == null)
-            {
-                filters = new FilterManager();
-            }
-            for (Map.Entry<String,Callable<MessageFilter>> filter : _defaultFiltersMap.entrySet())
-            {
-                if(!filters.hasFilter(filter.getKey()))
-                {
-                    MessageFilter f;
-                    try
-                    {
-                        f = filter.getValue().call();
-                    }
-                    catch (Exception e)
-                    {
-                        if (e instanceof RuntimeException)
-                        {
-                            throw (RuntimeException) e;
-                        }
-                        else
-                        {
-                            // Should never happen
-                            throw new ServerScopedRuntimeException(e);
-                        }
-                    }
-                    filters.add(filter.getKey(), f);
-                }
-            }
-        }
-
-        if(_ensureNondestructiveConsumers)
-        {
-            optionSet = EnumSet.copyOf(optionSet);
-            optionSet.removeAll(EnumSet.of(ConsumerImpl.Option.SEES_REQUEUES, ConsumerImpl.Option.ACQUIRES));
-        }
-
-        QueueConsumerImpl consumer = new QueueConsumerImpl(this,
-                                                           target,
-                                                           consumerName,
-                                                           filters,
-                                                           messageClass,
-                                                           optionSet,
-                                                           priority);
-
         _exclusiveOwner = exclusiveOwner;
-        target.consumerAdded(consumer);
-
-
-        if (exclusive && !isTransient)
-        {
-            _exclusiveSubscriber = consumer;
-        }
-
-        if(consumer.isActive())
-        {
-            _activeSubscriberCount.incrementAndGet();
-        }
-
-        consumer.setStateListener(this);
-        QueueContext queueContext;
-        if(filters == null || !filters.startAtTail())
-        {
-            queueContext = new QueueContext(getEntries().getHead());
-        }
-        else
-        {
-            queueContext = new QueueContext(getEntries().getTail());
-        }
-        consumer.setQueueContext(queueContext);
-
-        if (!isDeleted())
-        {
-            if(consumer.isPullOnly())
-            {
-                _hasPullOnlyConsumers = true;
-            }
-            _consumerList.add(consumer);
-
-            if (isDeleted())
-            {
-                consumer.queueDeleted();
-            }
-        }
-        else
-        {
-            // TODO
-        }
-
-        childAdded(consumer);
-        consumer.addChangeListener(_deletedChildListener);
-
-        if(consumer.isPullOnly())
-        {
-            consumer.getSessionModel().getAMQPConnection().notifyWork();
-        }
-        else
-        {
-            deliverAsync();
-        }
-
-        return consumer;
     }
 
     @Override
@@ -1137,7 +1152,7 @@
 
     // ------ Enqueue / Dequeue
 
-    public final void enqueue(ServerMessage message, Action<? super MessageInstance> action, MessageEnqueueRecord enqueueRecord)
+    public final void enqueue(ServerMessage message, Action<? super BaseMessageInstance> action, MessageEnqueueRecord enqueueRecord)
     {
         incrementQueueCount();
         incrementQueueSize(message);
@@ -2089,6 +2104,57 @@
         txn.commit();
     }
 
+    int routeToAlternate(final QueueEntry queueEntry, final Action<? super BaseMessageInstance> action, ServerTransaction txn)
+    {
+        if (!queueEntry.isAcquired())
+        {
+            throw new IllegalStateException("Illegal queue entry state. " + this + " is not acquired.");
+        }
+
+        Exchange<?> alternateExchange = getAlternateExchange();
+        boolean autocommit =  txn == null;
+        int enqueues;
+
+        if(autocommit)
+        {
+            txn = new LocalTransaction(getVirtualHost().getMessageStore());
+        }
+
+        if (alternateExchange != null)
+        {
+            enqueues = alternateExchange.send(queueEntry.getMessage(),
+                                              queueEntry.getMessage().getInitialRoutingAddress(),
+                                              queueEntry.getInstanceProperties(),
+                                              txn,
+                                              action);
+        }
+        else
+        {
+            enqueues = 0;
+        }
+
+        txn.dequeue(queueEntry.getEnqueueRecord(), new ServerTransaction.Action()
+        {
+            public void postCommit()
+            {
+                queueEntry.delete();
+            }
+
+            public void onRollback()
+            {
+
+            }
+        });
+
+        if(autocommit)
+        {
+            txn.commit();
+        }
+
+        return enqueues;
+    }
+
+
     private void performQueueDeleteTasks()
     {
         for (Action<? super X> task : _deleteTaskList)
@@ -3095,7 +3161,7 @@
                                                                                         final String routingAddress,
                                                                                         final InstanceProperties instanceProperties,
                                                                                         final ServerTransaction txn,
-                                                                                        final Action<? super MessageInstance> postEnqueueAction)
+                                                                                        final Action<? super BaseMessageInstance> postEnqueueAction)
     {
         if (_virtualHost.getState() != State.ACTIVE)
         {
@@ -3226,7 +3292,7 @@
             case CONTAINER:
             case CONNECTION:
                 AMQSessionModel session = null;
-                for(ConsumerImpl c : getConsumers())
+                for(QueueConsumer c : getConsumers())
                 {
                     if(session == null)
                     {
@@ -3252,7 +3318,7 @@
             case CONTAINER:
             case PRINCIPAL:
                 AMQPConnection con = null;
-                for(ConsumerImpl c : getConsumers())
+                for(QueueConsumer c : getConsumers())
                 {
                     if(con == null)
                     {
@@ -3280,7 +3346,7 @@
             case NONE:
             case PRINCIPAL:
                 String containerID = null;
-                for(ConsumerImpl c : getConsumers())
+                for(QueueConsumer c : getConsumers())
                 {
                     if(containerID == null)
                     {
@@ -3311,7 +3377,7 @@
             case NONE:
             case CONTAINER:
                 Principal principal = null;
-                for(ConsumerImpl c : getConsumers())
+                for(QueueConsumer c : getConsumers())
                 {
                     if(principal == null)
                     {
@@ -3565,7 +3631,7 @@
         authorise(token, PUBLISH_ACTION, arguments);
     }
 
-    private class DeletedChildListener implements ConfigurationChangeListener
+    private class DeletedChildListener extends AbstractConfigurationChangeListener
     {
         @Override
         public void stateChanged(final ConfiguredObject object, final State oldState, final State newState)
@@ -3575,39 +3641,6 @@
                 AbstractQueue.this.childRemoved(object);
             }
         }
-
-        @Override
-        public void childAdded(final ConfiguredObject object, final ConfiguredObject child)
-        {
-
-        }
-
-        @Override
-        public void childRemoved(final ConfiguredObject object, final ConfiguredObject child)
-        {
-
-        }
-
-        @Override
-        public void attributeSet(final ConfiguredObject object,
-                                 final String attributeName,
-                                 final Object oldAttributeValue,
-                                 final Object newAttributeValue)
-        {
-
-        }
-
-        @Override
-        public void bulkChangeStart(final ConfiguredObject<?> object)
-        {
-
-        }
-
-        @Override
-        public void bulkChangeEnd(final ConfiguredObject<?> object)
-        {
-
-        }
     }
 
     private static class EnqueueRequest
diff --git a/broker-core/src/main/java/org/apache/qpid/server/queue/BaseQueue.java b/broker-core/src/main/java/org/apache/qpid/server/queue/BaseQueue.java
index dc2f45a..174a77b 100644
--- a/broker-core/src/main/java/org/apache/qpid/server/queue/BaseQueue.java
+++ b/broker-core/src/main/java/org/apache/qpid/server/queue/BaseQueue.java
@@ -21,7 +21,7 @@
 
 package org.apache.qpid.server.queue;
 
-import org.apache.qpid.server.message.MessageInstance;
+import org.apache.qpid.server.message.BaseMessageInstance;
 import org.apache.qpid.server.message.ServerMessage;
 import org.apache.qpid.server.store.MessageEnqueueRecord;
 import org.apache.qpid.server.store.TransactionLogResource;
@@ -29,7 +29,7 @@
 
 public interface BaseQueue extends TransactionLogResource
 {
-    void enqueue(ServerMessage message, Action<? super MessageInstance> action, MessageEnqueueRecord record);
+    void enqueue(ServerMessage message, Action<? super BaseMessageInstance> action, MessageEnqueueRecord record);
 
     boolean isDurable();
     boolean isDeleted();
diff --git a/broker-core/src/main/java/org/apache/qpid/server/queue/DefinedGroupMessageGroupManager.java b/broker-core/src/main/java/org/apache/qpid/server/queue/DefinedGroupMessageGroupManager.java
index e19af3d..be951f8 100644
--- a/broker-core/src/main/java/org/apache/qpid/server/queue/DefinedGroupMessageGroupManager.java
+++ b/broker-core/src/main/java/org/apache/qpid/server/queue/DefinedGroupMessageGroupManager.java
@@ -20,22 +20,21 @@
  */
 package org.apache.qpid.server.queue;
 
-import org.apache.qpid.server.consumer.ConsumerImpl;
-import org.apache.qpid.server.message.MessageInstance;
-import org.apache.qpid.server.message.MessageInstance.ConsumerAcquiredState;
-import org.apache.qpid.server.message.MessageInstance.EntryState;
-import org.apache.qpid.server.util.StateChangeListener;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import org.apache.qpid.server.message.AMQMessageHeader;
-import org.apache.qpid.server.message.ServerMessage;
-
 import java.util.HashMap;
 import java.util.Map;
 import java.util.SortedSet;
 import java.util.TreeSet;
 
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import org.apache.qpid.server.message.AMQMessageHeader;
+import org.apache.qpid.server.message.MessageInstance;
+import org.apache.qpid.server.message.MessageInstance.ConsumerAcquiredState;
+import org.apache.qpid.server.message.MessageInstance.EntryState;
+import org.apache.qpid.server.message.ServerMessage;
+import org.apache.qpid.server.util.StateChangeListener;
+
 public class DefinedGroupMessageGroupManager implements MessageGroupManager
 {
     private static final Logger _logger = LoggerFactory.getLogger(DefinedGroupMessageGroupManager.class);
@@ -183,7 +182,7 @@
             }
         }
 
-        ConsumerImpl assignedSub = group.getConsumer();
+        QueueConsumer<?> assignedSub = group.getConsumer();
 
         if(assignedSub == sub)
         {
diff --git a/broker-core/src/main/java/org/apache/qpid/server/queue/LastValueQueueList.java b/broker-core/src/main/java/org/apache/qpid/server/queue/LastValueQueueList.java
index c2ad41e..98c6598 100644
--- a/broker-core/src/main/java/org/apache/qpid/server/queue/LastValueQueueList.java
+++ b/broker-core/src/main/java/org/apache/qpid/server/queue/LastValueQueueList.java
@@ -30,7 +30,7 @@
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import org.apache.qpid.server.consumer.ConsumerImpl;
+import org.apache.qpid.server.message.MessageInstanceConsumer;
 import org.apache.qpid.server.message.ServerMessage;
 import org.apache.qpid.server.store.MessageEnqueueRecord;
 import org.apache.qpid.server.txn.AutoCommitTransaction;
@@ -220,7 +220,7 @@
         }
 
         @Override
-        public void release(ConsumerImpl consumer)
+        public void release(MessageInstanceConsumer consumer)
         {
             super.release(consumer);
 
diff --git a/broker-core/src/main/java/org/apache/qpid/server/queue/OrderedBaseQueueEntryList.java b/broker-core/src/main/java/org/apache/qpid/server/queue/OrderedBaseQueueEntryList.java
new file mode 100644
index 0000000..ad0ed0b
--- /dev/null
+++ b/broker-core/src/main/java/org/apache/qpid/server/queue/OrderedBaseQueueEntryList.java
@@ -0,0 +1,212 @@
+/*
+*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*
+*/
+package org.apache.qpid.server.queue;
+
+import java.util.concurrent.atomic.AtomicLong;
+import java.util.concurrent.atomic.AtomicReference;
+import java.util.concurrent.atomic.AtomicReferenceFieldUpdater;
+
+import org.apache.qpid.server.message.ServerMessage;
+import org.apache.qpid.server.store.MessageEnqueueRecord;
+
+public abstract class OrderedBaseQueueEntryList<T extends RecoverableBaseQueue> implements QueueEntryList
+{
+
+    private final OrderedQueueEntry _head;
+
+    private volatile OrderedQueueEntry _tail;
+
+    static final AtomicReferenceFieldUpdater<OrderedBaseQueueEntryList, OrderedQueueEntry>
+            _tailUpdater =
+        AtomicReferenceFieldUpdater.newUpdater
+                (OrderedBaseQueueEntryList.class, OrderedQueueEntry.class, "_tail");
+
+
+    private final T _queue;
+
+    static final AtomicReferenceFieldUpdater<OrderedQueueEntry, OrderedQueueEntry>
+                _nextUpdater = OrderedQueueEntry._nextUpdater;
+
+    private AtomicLong _scavenges = new AtomicLong(0L);
+    private final long _scavengeCount = Integer.getInteger("qpid.queue.scavenge_count", 50);
+    private final AtomicReference<QueueEntry> _unscavengedHWM = new AtomicReference<QueueEntry>();
+
+
+    public OrderedBaseQueueEntryList(T queue, HeadCreator headCreator)
+    {
+        _queue = queue;
+        _head = headCreator.createHead(this);
+        _tail = _head;
+    }
+
+    void scavenge()
+    {
+        QueueEntry hwm = _unscavengedHWM.getAndSet(null);
+        QueueEntry next = _head.getNextValidEntry();
+
+        if(hwm != null)
+        {
+            while (next != null && hwm.compareTo(next)>0)
+            {
+                next = next.getNextValidEntry();
+            }
+        }
+    }
+
+
+    public T getQueue()
+    {
+        return _queue;
+    }
+
+
+    public QueueEntry add(ServerMessage message, final MessageEnqueueRecord enqueueRecord)
+    {
+        OrderedQueueEntry node = createQueueEntry(message, enqueueRecord);
+        for (;;)
+        {
+            OrderedQueueEntry tail = _tail;
+            OrderedQueueEntry next = tail.getNextNode();
+            if (tail == _tail)
+            {
+                if (next == null)
+                {
+                    node.setEntryId(tail.getEntryId()+1);
+                    if (_nextUpdater.compareAndSet(tail, null, node))
+                    {
+                        _tailUpdater.compareAndSet(this, tail, node);
+
+                        return node;
+                    }
+                }
+                else
+                {
+                    _tailUpdater.compareAndSet(this,tail, next);
+                }
+            }
+        }
+    }
+
+    abstract protected OrderedQueueEntry createQueueEntry(ServerMessage<?> message,
+                                                          final MessageEnqueueRecord enqueueRecord);
+
+    @Override
+    public QueueEntry next(QueueEntry node)
+    {
+        return node.getNextValidEntry();
+    }
+
+    public static interface HeadCreator
+    {
+        OrderedQueueEntry createHead(QueueEntryList list);
+    }
+
+    public static class QueueEntryIteratorImpl implements QueueEntryIterator
+    {
+        private QueueEntry _lastNode;
+
+        QueueEntryIteratorImpl(QueueEntry startNode)
+        {
+            _lastNode = startNode;
+        }
+
+        public boolean atTail()
+        {
+            return _lastNode.getNextValidEntry() == null;
+        }
+
+        public QueueEntry getNode()
+        {
+            return _lastNode;
+        }
+
+        public boolean advance()
+        {
+            QueueEntry nextValidNode = _lastNode.getNextValidEntry();
+
+            if(nextValidNode != null)
+            {
+                _lastNode = nextValidNode;
+            }
+
+            return nextValidNode != null;
+        }
+    }
+
+    public QueueEntryIterator iterator()
+    {
+        return new QueueEntryIteratorImpl(_head);
+    }
+
+
+    public QueueEntry getHead()
+    {
+        return _head;
+    }
+
+    @Override
+    public QueueEntry getTail()
+    {
+        return _tail;
+    }
+
+    public void entryDeleted(QueueEntry queueEntry)
+    {
+        QueueEntry next = _head.getNextNode();
+        QueueEntry newNext = _head.getNextValidEntry();
+
+        // the head of the queue has not been deleted, hence the deletion must have been mid queue.
+        if (next == newNext)
+        {
+            QueueEntry unscavengedHWM = _unscavengedHWM.get();
+            while(unscavengedHWM == null || unscavengedHWM.compareTo(queueEntry)<0)
+            {
+                _unscavengedHWM.compareAndSet(unscavengedHWM, queueEntry);
+                unscavengedHWM = _unscavengedHWM.get();
+            }
+            if (_scavenges.incrementAndGet() > _scavengeCount)
+            {
+                _scavenges.set(0L);
+                scavenge();
+            }
+        }
+        else
+        {
+            QueueEntry unscavengedHWM = _unscavengedHWM.get();
+            if(unscavengedHWM != null && (next == null || unscavengedHWM.compareTo(next) < 0))
+            {
+                _unscavengedHWM.compareAndSet(unscavengedHWM, null);
+            }
+        }
+    }
+
+    public int getPriorities()
+    {
+        return 0;
+    }
+
+    @Override
+    public QueueEntry getOldestEntry()
+    {
+        return next(getHead());
+    }
+
+}
diff --git a/broker-core/src/main/java/org/apache/qpid/server/queue/OrderedQueueEntry.java b/broker-core/src/main/java/org/apache/qpid/server/queue/OrderedQueueEntry.java
index d45dceb..9cc5496 100644
--- a/broker-core/src/main/java/org/apache/qpid/server/queue/OrderedQueueEntry.java
+++ b/broker-core/src/main/java/org/apache/qpid/server/queue/OrderedQueueEntry.java
@@ -34,12 +34,12 @@
 
     private volatile OrderedQueueEntry _next;
 
-    public OrderedQueueEntry(OrderedQueueEntryList queueEntryList)
+    public OrderedQueueEntry(OrderedBaseQueueEntryList queueEntryList)
     {
         super(queueEntryList);
     }
 
-    public OrderedQueueEntry(OrderedQueueEntryList queueEntryList,
+    public OrderedQueueEntry(OrderedBaseQueueEntryList queueEntryList,
                              ServerMessage message,
                              final MessageEnqueueRecord messageEnqueueRecord)
     {
@@ -63,7 +63,7 @@
             final OrderedQueueEntry newNext = next.getNextNode();
             if(newNext != null)
             {
-                OrderedQueueEntryList._nextUpdater.compareAndSet(this,next, newNext);
+                OrderedBaseQueueEntryList._nextUpdater.compareAndSet(this, next, newNext);
                 next = getNextNode();
             }
             else
diff --git a/broker-core/src/main/java/org/apache/qpid/server/queue/OrderedQueueEntryList.java b/broker-core/src/main/java/org/apache/qpid/server/queue/OrderedQueueEntryList.java
index 1283530..9fb3321 100644
--- a/broker-core/src/main/java/org/apache/qpid/server/queue/OrderedQueueEntryList.java
+++ b/broker-core/src/main/java/org/apache/qpid/server/queue/OrderedQueueEntryList.java
@@ -1,213 +1,80 @@
 /*
-*
-* Licensed to the Apache Software Foundation (ASF) under one
-* or more contributor license agreements.  See the NOTICE file
-* distributed with this work for additional information
-* regarding copyright ownership.  The ASF licenses this file
-* to you under the Apache License, Version 2.0 (the
-* "License"); you may not use this file except in compliance
-* with the License.  You may obtain a copy of the License at
-*
-*   http://www.apache.org/licenses/LICENSE-2.0
-*
-* Unless required by applicable law or agreed to in writing,
-* software distributed under the License is distributed on an
-* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-* KIND, either express or implied.  See the License for the
-* specific language governing permissions and limitations
-* under the License.
-*
-*/
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
 package org.apache.qpid.server.queue;
 
-import java.util.concurrent.atomic.AtomicLong;
-import java.util.concurrent.atomic.AtomicReference;
-import java.util.concurrent.atomic.AtomicReferenceFieldUpdater;
-
-import org.apache.qpid.server.message.ServerMessage;
+import org.apache.qpid.server.message.BaseMessageInstance;
+import org.apache.qpid.server.message.MessageInstanceConsumer;
+import org.apache.qpid.server.model.Exchange;
 import org.apache.qpid.server.model.Queue;
-import org.apache.qpid.server.store.MessageEnqueueRecord;
+import org.apache.qpid.server.txn.LocalTransaction;
+import org.apache.qpid.server.txn.ServerTransaction;
+import org.apache.qpid.server.util.Action;
 
-public abstract class OrderedQueueEntryList implements QueueEntryList
+public abstract class OrderedQueueEntryList extends OrderedBaseQueueEntryList<AbstractQueue<?>>
 {
-
-    private final OrderedQueueEntry _head;
-
-    private volatile OrderedQueueEntry _tail;
-
-    static final AtomicReferenceFieldUpdater<OrderedQueueEntryList, OrderedQueueEntry>
-            _tailUpdater =
-        AtomicReferenceFieldUpdater.newUpdater
-        (OrderedQueueEntryList.class, OrderedQueueEntry.class, "_tail");
-
-
-    private final Queue<?> _queue;
-
-    static final AtomicReferenceFieldUpdater<OrderedQueueEntry, OrderedQueueEntry>
-                _nextUpdater = OrderedQueueEntry._nextUpdater;
-
-    private AtomicLong _scavenges = new AtomicLong(0L);
-    private final long _scavengeCount = Integer.getInteger("qpid.queue.scavenge_count", 50);
-    private final AtomicReference<QueueEntry> _unscavengedHWM = new AtomicReference<QueueEntry>();
-
-
-    public OrderedQueueEntryList(Queue<?> queue, HeadCreator headCreator)
+    public OrderedQueueEntryList(final AbstractQueue<?> queue,
+                                 final HeadCreator headCreator)
     {
-        _queue = queue;
-        _head = headCreator.createHead(this);
-        _tail = _head;
-    }
-
-    void scavenge()
-    {
-        QueueEntry hwm = _unscavengedHWM.getAndSet(null);
-        QueueEntry next = _head.getNextValidEntry();
-
-        if(hwm != null)
-        {
-            while (next != null && hwm.compareTo(next)>0)
-            {
-                next = next.getNextValidEntry();
-            }
-        }
-    }
-
-
-    public Queue<?> getQueue()
-    {
-        return _queue;
-    }
-
-
-    public QueueEntry add(ServerMessage message, final MessageEnqueueRecord enqueueRecord)
-    {
-        OrderedQueueEntry node = createQueueEntry(message, enqueueRecord);
-        for (;;)
-        {
-            OrderedQueueEntry tail = _tail;
-            OrderedQueueEntry next = tail.getNextNode();
-            if (tail == _tail)
-            {
-                if (next == null)
-                {
-                    node.setEntryId(tail.getEntryId()+1);
-                    if (_nextUpdater.compareAndSet(tail, null, node))
-                    {
-                        _tailUpdater.compareAndSet(this, tail, node);
-
-                        return node;
-                    }
-                }
-                else
-                {
-                    _tailUpdater.compareAndSet(this,tail, next);
-                }
-            }
-        }
-    }
-
-    abstract protected OrderedQueueEntry createQueueEntry(ServerMessage<?> message,
-                                                          final MessageEnqueueRecord enqueueRecord);
-
-    @Override
-    public QueueEntry next(QueueEntry node)
-    {
-        return node.getNextValidEntry();
-    }
-
-    public static interface HeadCreator
-    {
-        OrderedQueueEntry createHead(QueueEntryList list);
-    }
-
-    public static class QueueEntryIteratorImpl implements QueueEntryIterator
-    {
-        private QueueEntry _lastNode;
-
-        QueueEntryIteratorImpl(QueueEntry startNode)
-        {
-            _lastNode = startNode;
-        }
-
-        public boolean atTail()
-        {
-            return _lastNode.getNextValidEntry() == null;
-        }
-
-        public QueueEntry getNode()
-        {
-            return _lastNode;
-        }
-
-        public boolean advance()
-        {
-            QueueEntry nextValidNode = _lastNode.getNextValidEntry();
-
-            if(nextValidNode != null)
-            {
-                _lastNode = nextValidNode;
-            }
-
-            return nextValidNode != null;
-        }
-    }
-
-    public QueueEntryIterator iterator()
-    {
-        return new QueueEntryIteratorImpl(_head);
-    }
-
-
-    public QueueEntry getHead()
-    {
-        return _head;
+        super(queue, headCreator);
     }
 
     @Override
-    public QueueEntry getTail()
+    public void onAcquiredByConsumer(final QueueEntry queueEntry, final MessageInstanceConsumer consumer)
     {
-        return _tail;
-    }
-
-    public void entryDeleted(QueueEntry queueEntry)
-    {
-        QueueEntry next = _head.getNextNode();
-        QueueEntry newNext = _head.getNextValidEntry();
-
-        // the head of the queue has not been deleted, hence the deletion must have been mid queue.
-        if (next == newNext)
-        {
-            QueueEntry unscavengedHWM = _unscavengedHWM.get();
-            while(unscavengedHWM == null || unscavengedHWM.compareTo(queueEntry)<0)
-            {
-                _unscavengedHWM.compareAndSet(unscavengedHWM, queueEntry);
-                unscavengedHWM = _unscavengedHWM.get();
-            }
-            if (_scavenges.incrementAndGet() > _scavengeCount)
-            {
-                _scavenges.set(0L);
-                scavenge();
-            }
-        }
-        else
-        {
-            QueueEntry unscavengedHWM = _unscavengedHWM.get();
-            if(unscavengedHWM != null && (next == null || unscavengedHWM.compareTo(next) < 0))
-            {
-                _unscavengedHWM.compareAndSet(unscavengedHWM, null);
-            }
-        }
-    }
-
-    public int getPriorities()
-    {
-        return 0;
+        getQueue().incrementUnackedMsgCount(queueEntry);
     }
 
     @Override
-    public QueueEntry getOldestEntry()
+    public void onNoLongerAcquiredByConsumer(final QueueEntry queueEntry)
     {
-        return next(getHead());
+        getQueue().decrementUnackedMsgCount(queueEntry);
     }
 
+    @Override
+    public void requeue(final QueueEntry queueEntry)
+    {
+        getQueue().requeue(queueEntry);
+    }
+
+    @Override
+    public boolean isHeld(final QueueEntry queueEntry, final long evaluationTime)
+    {
+        return getQueue().isHeld(queueEntry, evaluationTime);
+    }
+
+    @Override
+    public void dequeue(final QueueEntry queueEntry)
+    {
+        getQueue().dequeue(queueEntry);
+    }
+
+    @Override
+    public int routeToAlternate(final QueueEntry queueEntry, final Action<? super BaseMessageInstance> action, ServerTransaction txn)
+    {
+        return getQueue().routeToAlternate(queueEntry, action, txn);
+    }
+
+    @Override
+    public int getMaximumDeliveryAttempts()
+    {
+        return getQueue().getMaximumDeliveryAttempts();
+    }
 }
diff --git a/broker-core/src/main/java/org/apache/qpid/server/queue/QueueConsumer.java b/broker-core/src/main/java/org/apache/qpid/server/queue/QueueConsumer.java
index 771097a..d8d959e 100644
--- a/broker-core/src/main/java/org/apache/qpid/server/queue/QueueConsumer.java
+++ b/broker-core/src/main/java/org/apache/qpid/server/queue/QueueConsumer.java
@@ -20,11 +20,13 @@
  */
 package org.apache.qpid.server.queue;
 
+import org.apache.qpid.server.consumer.ConsumerTarget;
+import org.apache.qpid.server.message.AcquiringMessageInstanceConsumer;
 import org.apache.qpid.server.message.MessageInstance;
 import org.apache.qpid.server.model.Consumer;
 import org.apache.qpid.server.model.Queue;
 
-public interface QueueConsumer<X extends QueueConsumer<X>> extends Consumer<X>
+public interface QueueConsumer<X extends QueueConsumer<X>> extends Consumer<X>, AcquiringMessageInstanceConsumer<X, ConsumerTarget>
 {
     void flushBatched();
 
diff --git a/broker-core/src/main/java/org/apache/qpid/server/queue/QueueConsumerImpl.java b/broker-core/src/main/java/org/apache/qpid/server/queue/QueueConsumerImpl.java
index 804bde1..d13f1a3 100644
--- a/broker-core/src/main/java/org/apache/qpid/server/queue/QueueConsumerImpl.java
+++ b/broker-core/src/main/java/org/apache/qpid/server/queue/QueueConsumerImpl.java
@@ -46,9 +46,9 @@
 import org.apache.qpid.server.logging.LogSubject;
 import org.apache.qpid.server.logging.messages.SubscriptionMessages;
 import org.apache.qpid.server.logging.subjects.QueueLogSubject;
+import org.apache.qpid.server.message.ConsumerOption;
 import org.apache.qpid.server.message.MessageInstance;
 import org.apache.qpid.server.message.MessageReference;
-import org.apache.qpid.server.message.MessageSource;
 import org.apache.qpid.server.message.ServerMessage;
 import org.apache.qpid.server.model.AbstractConfiguredObject;
 import org.apache.qpid.server.model.Consumer;
@@ -124,7 +124,7 @@
                       final String consumerName,
                       final FilterManager filters,
                       final Class<? extends ServerMessage> messageClass,
-                      EnumSet<Option> optionSet,
+                      EnumSet<ConsumerOption> optionSet,
                       final Integer priority)
     {
         super(parentsMap(queue, target.getSessionModel().getModelObject()),
@@ -133,18 +133,16 @@
         _sessionReference = target.getSessionModel().getConnectionReference();
         _consumerNumber = CONSUMER_NUMBER_GENERATOR.getAndIncrement();
         _filters = filters;
-        _acquires = optionSet.contains(Option.ACQUIRES);
-        _seesRequeues = optionSet.contains(Option.SEES_REQUEUES);
-        _isTransient = optionSet.contains(Option.TRANSIENT);
+        _acquires = optionSet.contains(ConsumerOption.ACQUIRES);
+        _seesRequeues = optionSet.contains(ConsumerOption.SEES_REQUEUES);
+        _isTransient = optionSet.contains(ConsumerOption.TRANSIENT);
         _target = target;
         _queue = queue;
 
         // Access control
         authorise(Operation.CREATE);
 
-        open();
 
-        setupLogging();
 
         _listener = new StateChangeListener<ConsumerTarget, ConsumerTarget.State>()
         {
@@ -168,20 +166,29 @@
                             getEventLogger().message(getLogSubject(), SubscriptionMessages.STATE(period));
                         }
                     };
+
+
+    }
+
+    @Override
+    protected void onOpen()
+    {
+        super.onOpen();
+        setupLogging();
     }
 
     private static Map<String, Object> createAttributeMap(String name,
                                                           FilterManager filters,
-                                                          EnumSet<Option> optionSet,
+                                                          EnumSet<ConsumerOption> optionSet,
                                                           Integer priority)
     {
         Map<String,Object> attributes = new HashMap<String, Object>();
         attributes.put(ID, UUID.randomUUID());
         attributes.put(NAME, name);
-        attributes.put(EXCLUSIVE, optionSet.contains(Option.EXCLUSIVE));
-        attributes.put(NO_LOCAL, optionSet.contains(Option.NO_LOCAL));
-        attributes.put(DISTRIBUTION_MODE, optionSet.contains(Option.ACQUIRES) ? "MOVE" : "COPY");
-        attributes.put(DURABLE,optionSet.contains(Option.DURABLE));
+        attributes.put(EXCLUSIVE, optionSet.contains(ConsumerOption.EXCLUSIVE));
+        attributes.put(NO_LOCAL, optionSet.contains(ConsumerOption.NO_LOCAL));
+        attributes.put(DISTRIBUTION_MODE, optionSet.contains(ConsumerOption.ACQUIRES) ? "MOVE" : "COPY");
+        attributes.put(DURABLE,optionSet.contains(ConsumerOption.DURABLE));
         attributes.put(LIFETIME_POLICY, LifetimePolicy.DELETE_ON_SESSION_END);
         if(priority != null)
         {
@@ -297,9 +304,9 @@
     }
 
     @Override
-    public MessageSource getMessageSource()
+    public Object getIdentifier()
     {
-        return _queue;
+        return getConsumerNumber();
     }
 
     @Override
diff --git a/broker-core/src/main/java/org/apache/qpid/server/queue/QueueEntry.java b/broker-core/src/main/java/org/apache/qpid/server/queue/QueueEntry.java
index b723f05..8270e34 100644
--- a/broker-core/src/main/java/org/apache/qpid/server/queue/QueueEntry.java
+++ b/broker-core/src/main/java/org/apache/qpid/server/queue/QueueEntry.java
@@ -20,20 +20,20 @@
 */
 package org.apache.qpid.server.queue;
 
+import org.apache.qpid.server.message.AcquiringMessageInstanceConsumer;
 import org.apache.qpid.server.message.MessageInstance;
 import org.apache.qpid.server.message.MessageReference;
-import org.apache.qpid.server.model.Queue;
 
 public interface QueueEntry extends MessageInstance, Comparable<QueueEntry>
 {
 
-    Queue<?> getQueue();
+    RecoverableBaseQueue getQueue();
 
     long getSize();
 
     boolean acquireOrSteal(final Runnable delayedAcquisitionTask);
 
-    QueueConsumer getDeliveredConsumer();
+    AcquiringMessageInstanceConsumer<?,?> getDeliveredConsumer();
 
     boolean isQueueDeleted();
 
diff --git a/broker-core/src/main/java/org/apache/qpid/server/queue/QueueEntryImpl.java b/broker-core/src/main/java/org/apache/qpid/server/queue/QueueEntryImpl.java
index a658a21..aeb84ef 100644
--- a/broker-core/src/main/java/org/apache/qpid/server/queue/QueueEntryImpl.java
+++ b/broker-core/src/main/java/org/apache/qpid/server/queue/QueueEntryImpl.java
@@ -30,15 +30,16 @@
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import org.apache.qpid.server.consumer.ConsumerImpl;
 import org.apache.qpid.server.filter.Filterable;
+import org.apache.qpid.server.message.AcquiringMessageInstanceConsumer;
+import org.apache.qpid.server.message.BaseMessageInstance;
 import org.apache.qpid.server.message.InstanceProperties;
 import org.apache.qpid.server.message.MessageDeletedException;
 import org.apache.qpid.server.message.MessageInstance;
+import org.apache.qpid.server.message.MessageInstanceConsumer;
 import org.apache.qpid.server.message.MessageReference;
 import org.apache.qpid.server.message.ServerMessage;
 import org.apache.qpid.server.model.Exchange;
-import org.apache.qpid.server.model.Queue;
 import org.apache.qpid.server.store.MessageEnqueueRecord;
 import org.apache.qpid.server.store.TransactionLogResource;
 import org.apache.qpid.server.txn.LocalTransaction;
@@ -55,7 +56,7 @@
 
     private final MessageReference _message;
 
-    private Set<Long> _rejectedBy = null;
+    private Set<Object> _rejectedBy = null;
 
     private static final EntryState HELD_STATE = new EntryState()
     {
@@ -177,7 +178,7 @@
         return _entryId;
     }
 
-    public Queue<?> getQueue()
+    public RecoverableBaseQueue getQueue()
     {
         return _queueEntryList.getQueue();
     }
@@ -263,7 +264,7 @@
         boolean acquired = acquire();
         if(!acquired)
         {
-            QueueConsumer consumer = getDeliveredConsumer();
+            AcquiringMessageInstanceConsumer<?,?> consumer = getDeliveredConsumer();
             acquired = removeAcquisitionFromConsumer(consumer);
             if(acquired)
             {
@@ -304,19 +305,19 @@
         return acquired;
     }
 
-    public boolean acquire(ConsumerImpl sub)
+    public boolean acquire(MessageInstanceConsumer sub)
     {
-        final boolean acquired = acquire(((QueueConsumer<?>) sub).getOwningState().getUnstealableState());
+        final boolean acquired = acquire(((AcquiringMessageInstanceConsumer<?,?>) sub).getOwningState().getUnstealableState());
         if(acquired)
         {
             _deliveryCountUpdater.compareAndSet(this,-1,0);
-            getQueue().incrementUnackedMsgCount(this);
+            _queueEntryList.onAcquiredByConsumer(this, sub);
         }
         return acquired;
     }
 
     @Override
-    public boolean makeAcquisitionUnstealable(final ConsumerImpl consumer)
+    public boolean makeAcquisitionUnstealable(final MessageInstanceConsumer consumer)
     {
         EntryState state = _state;
         if(state instanceof StealableConsumerAcquiredState
@@ -357,9 +358,9 @@
     }
 
     @Override
-    public ConsumerImpl getAcquiringConsumer()
+    public MessageInstanceConsumer getAcquiringConsumer()
     {
-        ConsumerImpl consumer;
+        AcquiringMessageInstanceConsumer<?,?> consumer;
         EntryState state = _state;
         if (state instanceof ConsumerAcquiredState)
         {
@@ -373,14 +374,14 @@
     }
 
     @Override
-    public boolean isAcquiredBy(ConsumerImpl consumer)
+    public boolean isAcquiredBy(MessageInstanceConsumer consumer)
     {
         EntryState state = _state;
         return (state instanceof ConsumerAcquiredState && ((ConsumerAcquiredState)state).getConsumer() == consumer);
     }
 
     @Override
-    public boolean removeAcquisitionFromConsumer(ConsumerImpl consumer)
+    public boolean removeAcquisitionFromConsumer(MessageInstanceConsumer consumer)
     {
         EntryState state = _state;
         if(state instanceof StealableConsumerAcquiredState
@@ -411,7 +412,7 @@
     }
 
     @Override
-    public void release(ConsumerImpl consumer)
+    public void release(MessageInstanceConsumer consumer)
     {
         EntryState state = _state;
         if(isAcquiredBy(consumer) && _stateUpdater.compareAndSet(this, state, AVAILABLE_STATE))
@@ -424,12 +425,12 @@
     {
         if (previousState instanceof ConsumerAcquiredState)
         {
-            getQueue().decrementUnackedMsgCount(this);
+            _queueEntryList.onNoLongerAcquiredByConsumer(this);
         }
 
         if(!getQueue().isDeleted())
         {
-            getQueue().requeue(this);
+            _queueEntryList.requeue(this);
             if (_stateChangeListeners != null && previousState.getState() == State.ACQUIRED)
             {
                 notifyStateChange(previousState, AVAILABLE_STATE);
@@ -448,7 +449,7 @@
         EntryState state;
         while((state = _state).getState() == State.AVAILABLE)
         {
-            boolean isHeld = getQueue().isHeld(this, evaluationTime);
+            boolean isHeld = _queueEntryList.isHeld(this, evaluationTime);
             if(state == AVAILABLE_STATE && isHeld)
             {
                 if(!_stateUpdater.compareAndSet(this, state, HELD_STATE))
@@ -475,20 +476,20 @@
     }
 
     @Override
-    public QueueConsumer getDeliveredConsumer()
+    public AcquiringMessageInstanceConsumer getDeliveredConsumer()
     {
-        return (QueueConsumer) getAcquiringConsumer();
+        return (AcquiringMessageInstanceConsumer) getAcquiringConsumer();
     }
 
     public void reject()
     {
-        QueueConsumer consumer = getDeliveredConsumer();
+        AcquiringMessageInstanceConsumer<?,?> consumer = getDeliveredConsumer();
 
         if (consumer != null)
         {
             if (_rejectedBy == null)
             {
-                _rejectedBy = new HashSet<Long>();
+                _rejectedBy = new HashSet<>();
             }
 
             _rejectedBy.add(consumer.getConsumerNumber());
@@ -499,12 +500,12 @@
         }
     }
 
-    public boolean isRejectedBy(ConsumerImpl consumer)
+    public boolean isRejectedBy(MessageInstanceConsumer consumer)
     {
 
         if (_rejectedBy != null) // We have consumers that rejected this message
         {
-            return _rejectedBy.contains(consumer.getConsumerNumber());
+            return _rejectedBy.contains(consumer.getIdentifier());
         }
         else // This message hasn't been rejected yet.
         {
@@ -525,10 +526,10 @@
         {
             if (state instanceof ConsumerAcquiredState)
             {
-                getQueue().decrementUnackedMsgCount(this);
+                _queueEntryList.onNoLongerAcquiredByConsumer(this);
             }
 
-            getQueue().dequeue(this);
+            _queueEntryList.dequeue(this);
             if(_stateChangeListeners != null)
             {
                 notifyStateChange(state, DEQUEUED_STATE);
@@ -582,55 +583,10 @@
         }
     }
 
-    public int routeToAlternate(final Action<? super MessageInstance> action, ServerTransaction txn)
+    public int routeToAlternate(final Action<? super BaseMessageInstance> action, ServerTransaction txn)
     {
-        if (!isAcquired())
-        {
-            throw new IllegalStateException("Illegal queue entry state. " + this + " is not acquired.");
-        }
+        return _queueEntryList.routeToAlternate(this, action, txn);
 
-        final Queue<?> currentQueue = getQueue();
-        Exchange<?> alternateExchange = currentQueue.getAlternateExchange();
-        boolean autocommit =  txn == null;
-        int enqueues;
-
-        if(autocommit)
-        {
-            txn = new LocalTransaction(getQueue().getVirtualHost().getMessageStore());
-        }
-
-        if (alternateExchange != null)
-        {
-            enqueues = alternateExchange.send(getMessage(),
-                                              getMessage().getInitialRoutingAddress(),
-                                              getInstanceProperties(),
-                                              txn,
-                                              action);
-        }
-        else
-        {
-            enqueues = 0;
-        }
-
-        txn.dequeue(getEnqueueRecord(), new ServerTransaction.Action()
-        {
-            public void postCommit()
-            {
-                delete();
-            }
-
-            public void onRollback()
-            {
-
-            }
-        });
-
-        if(autocommit)
-        {
-            txn.commit();
-        }
-
-        return enqueues;
     }
 
     public boolean isQueueDeleted()
@@ -692,7 +648,7 @@
     @Override
     public int getMaximumDeliveryCount()
     {
-        return getQueue().getMaximumDeliveryAttempts();
+        return _queueEntryList.getMaximumDeliveryAttempts();
     }
 
     public void incrementDeliveryCount()
@@ -723,7 +679,7 @@
     @Override
     public boolean resend()
     {
-        QueueConsumer sub = getDeliveredConsumer();
+        AcquiringMessageInstanceConsumer<?,?> sub = getDeliveredConsumer();
         if(sub != null)
         {
             return sub.resend(this);
@@ -734,7 +690,7 @@
     @Override
     public TransactionLogResource getOwningResource()
     {
-        return getQueue();
+        return _queueEntryList.getQueue();
     }
 
     public void setRedelivered()
diff --git a/broker-core/src/main/java/org/apache/qpid/server/queue/QueueEntryList.java b/broker-core/src/main/java/org/apache/qpid/server/queue/QueueEntryList.java
index c97e58b..37e0868 100644
--- a/broker-core/src/main/java/org/apache/qpid/server/queue/QueueEntryList.java
+++ b/broker-core/src/main/java/org/apache/qpid/server/queue/QueueEntryList.java
@@ -20,13 +20,16 @@
 */
 package org.apache.qpid.server.queue;
 
+import org.apache.qpid.server.message.BaseMessageInstance;
+import org.apache.qpid.server.message.MessageInstanceConsumer;
 import org.apache.qpid.server.message.ServerMessage;
-import org.apache.qpid.server.model.Queue;
 import org.apache.qpid.server.store.MessageEnqueueRecord;
+import org.apache.qpid.server.txn.ServerTransaction;
+import org.apache.qpid.server.util.Action;
 
 public interface QueueEntryList
 {
-    Queue<?> getQueue();
+    RecoverableBaseQueue getQueue();
 
     QueueEntry add(ServerMessage message, final MessageEnqueueRecord enqueueRecord);
 
@@ -44,4 +47,17 @@
     
     int getPriorities();
 
+    void onAcquiredByConsumer(QueueEntry queueEntry, final MessageInstanceConsumer consumer);
+
+    void onNoLongerAcquiredByConsumer(QueueEntry queueEntry);
+
+    void requeue(QueueEntry queueEntry);
+
+    boolean isHeld(QueueEntry queueEntry, long evaluationTime);
+
+    void dequeue(QueueEntry queueEntry);
+
+    int routeToAlternate(QueueEntry queueEntry, Action<? super BaseMessageInstance> action, ServerTransaction txn);
+
+    int getMaximumDeliveryAttempts();
 }
diff --git a/broker-core/src/main/java/org/apache/qpid/server/queue/QueueEntryListBase.java b/broker-core/src/main/java/org/apache/qpid/server/queue/RecoverableBaseQueue.java
similarity index 70%
copy from broker-core/src/main/java/org/apache/qpid/server/queue/QueueEntryListBase.java
copy to broker-core/src/main/java/org/apache/qpid/server/queue/RecoverableBaseQueue.java
index d2aff53..53a9e67 100644
--- a/broker-core/src/main/java/org/apache/qpid/server/queue/QueueEntryListBase.java
+++ b/broker-core/src/main/java/org/apache/qpid/server/queue/RecoverableBaseQueue.java
@@ -20,6 +20,15 @@
  */
 package org.apache.qpid.server.queue;
 
-public interface QueueEntryListBase extends QueueEntryList
+import org.apache.qpid.server.message.ServerMessage;
+import org.apache.qpid.server.model.VirtualHost;
+import org.apache.qpid.server.store.MessageEnqueueRecord;
+
+public interface RecoverableBaseQueue extends BaseQueue
 {
+    void recover(ServerMessage<?> message, MessageEnqueueRecord record);
+
+    void completeRecovery();
+
+    VirtualHost<?> getVirtualHost();
 }
diff --git a/broker-core/src/main/java/org/apache/qpid/server/queue/SortedQueueEntryList.java b/broker-core/src/main/java/org/apache/qpid/server/queue/SortedQueueEntryList.java
index 0c8f541..4a1e81d 100644
--- a/broker-core/src/main/java/org/apache/qpid/server/queue/SortedQueueEntryList.java
+++ b/broker-core/src/main/java/org/apache/qpid/server/queue/SortedQueueEntryList.java
@@ -20,9 +20,13 @@
  */
 package org.apache.qpid.server.queue;
 
+import org.apache.qpid.server.message.BaseMessageInstance;
+import org.apache.qpid.server.message.MessageInstanceConsumer;
 import org.apache.qpid.server.message.ServerMessage;
 import org.apache.qpid.server.queue.SortedQueueEntry.Colour;
 import org.apache.qpid.server.store.MessageEnqueueRecord;
+import org.apache.qpid.server.txn.ServerTransaction;
+import org.apache.qpid.server.util.Action;
 
 /**
  * A sorted implementation of QueueEntryList.
@@ -52,6 +56,50 @@
         return _queue;
     }
 
+
+    @Override
+    public void onAcquiredByConsumer(final QueueEntry queueEntry, final MessageInstanceConsumer consumer)
+    {
+        getQueue().incrementUnackedMsgCount(queueEntry);
+    }
+
+    @Override
+    public void onNoLongerAcquiredByConsumer(final QueueEntry queueEntry)
+    {
+        getQueue().decrementUnackedMsgCount(queueEntry);
+    }
+
+    @Override
+    public void requeue(final QueueEntry queueEntry)
+    {
+        getQueue().requeue(queueEntry);
+    }
+
+    @Override
+    public boolean isHeld(final QueueEntry queueEntry, final long evaluationTime)
+    {
+        return getQueue().isHeld(queueEntry, evaluationTime);
+    }
+
+    @Override
+    public void dequeue(final QueueEntry queueEntry)
+    {
+        getQueue().dequeue(queueEntry);
+    }
+
+    @Override
+    public int routeToAlternate(final QueueEntry queueEntry, final Action<? super BaseMessageInstance> action, ServerTransaction txn)
+    {
+        return getQueue().routeToAlternate(queueEntry, action, txn);
+    }
+
+    @Override
+    public int getMaximumDeliveryAttempts()
+    {
+        return getQueue().getMaximumDeliveryAttempts();
+    }
+
+
     public SortedQueueEntry add(final ServerMessage message, final MessageEnqueueRecord enqueueRecord)
     {
         synchronized(_lock)
diff --git a/broker-core/src/main/java/org/apache/qpid/server/security/AbstractKeyStore.java b/broker-core/src/main/java/org/apache/qpid/server/security/AbstractKeyStore.java
index bff091f..9a952e3 100644
--- a/broker-core/src/main/java/org/apache/qpid/server/security/AbstractKeyStore.java
+++ b/broker-core/src/main/java/org/apache/qpid/server/security/AbstractKeyStore.java
@@ -37,9 +37,9 @@
 
 import org.apache.qpid.server.logging.EventLogger;
 import org.apache.qpid.server.logging.messages.KeyStoreMessages;
+import org.apache.qpid.server.model.AbstractConfigurationChangeListener;
 import org.apache.qpid.server.model.AbstractConfiguredObject;
 import org.apache.qpid.server.model.Broker;
-import org.apache.qpid.server.model.ConfigurationChangeListener;
 import org.apache.qpid.server.model.ConfiguredObject;
 import org.apache.qpid.server.model.IntegrityViolationException;
 import org.apache.qpid.server.model.KeyStore;
@@ -115,7 +115,7 @@
         else
         {
             final int frequency = checkFrequency;
-            getBroker().addChangeListener(new ConfigurationChangeListener()
+            getBroker().addChangeListener(new AbstractConfigurationChangeListener()
             {
                 @Override
                 public void stateChanged(final ConfiguredObject<?> object, final State oldState, final State newState)
@@ -135,38 +135,6 @@
                     }
                 }
 
-                @Override
-                public void childAdded(final ConfiguredObject<?> object, final ConfiguredObject<?> child)
-                {
-
-                }
-
-                @Override
-                public void childRemoved(final ConfiguredObject<?> object, final ConfiguredObject<?> child)
-                {
-
-                }
-
-                @Override
-                public void attributeSet(final ConfiguredObject<?> object,
-                                         final String attributeName,
-                                         final Object oldAttributeValue,
-                                         final Object newAttributeValue)
-                {
-
-                }
-
-                @Override
-                public void bulkChangeStart(final ConfiguredObject<?> object)
-                {
-
-                }
-
-                @Override
-                public void bulkChangeEnd(final ConfiguredObject<?> object)
-                {
-
-                }
             });
         }
     }
diff --git a/broker-core/src/main/java/org/apache/qpid/server/security/TrustStoreMessageSource.java b/broker-core/src/main/java/org/apache/qpid/server/security/TrustStoreMessageSource.java
index 82f3702..3da95f6 100644
--- a/broker-core/src/main/java/org/apache/qpid/server/security/TrustStoreMessageSource.java
+++ b/broker-core/src/main/java/org/apache/qpid/server/security/TrustStoreMessageSource.java
@@ -35,21 +35,20 @@
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import org.apache.qpid.server.consumer.ConsumerImpl;
 import org.apache.qpid.server.consumer.ConsumerTarget;
 import org.apache.qpid.server.filter.FilterManager;
-import org.apache.qpid.server.message.MessageSource;
+import org.apache.qpid.server.message.ConsumerOption;
 import org.apache.qpid.server.message.ServerMessage;
 import org.apache.qpid.server.message.internal.InternalMessage;
 import org.apache.qpid.server.message.internal.InternalMessageHeader;
-import org.apache.qpid.server.model.ConfigurationChangeListener;
+import org.apache.qpid.server.model.AbstractConfigurationChangeListener;
 import org.apache.qpid.server.model.ConfiguredObject;
 import org.apache.qpid.server.model.State;
 import org.apache.qpid.server.model.TrustStore;
 import org.apache.qpid.server.model.VirtualHost;
 import org.apache.qpid.server.virtualhost.AbstractSystemMessageSource;
 
-public class TrustStoreMessageSource extends AbstractSystemMessageSource implements MessageSource
+public class TrustStoreMessageSource extends AbstractSystemMessageSource
 {
     private static final Logger LOGGER = LoggerFactory.getLogger(TrustStoreMessageSource.class);
 
@@ -63,7 +62,7 @@
         super(getSourceNameFromTrustStore(trustStore), virtualHost);
         _virtualHost = virtualHost;
         _trustStore = trustStore;
-        _trustStore.addChangeListener(new ConfigurationChangeListener()
+        _trustStore.addChangeListener(new AbstractConfigurationChangeListener()
         {
             @Override
             public void stateChanged(final ConfiguredObject<?> object, final State oldState, final State newState)
@@ -75,18 +74,6 @@
             }
 
             @Override
-            public void childAdded(final ConfiguredObject<?> object, final ConfiguredObject<?> child)
-            {
-
-            }
-
-            @Override
-            public void childRemoved(final ConfiguredObject<?> object, final ConfiguredObject<?> child)
-            {
-
-            }
-
-            @Override
             public void attributeSet(final ConfiguredObject<?> object,
                                      final String attributeName,
                                      final Object oldAttributeValue,
@@ -95,17 +82,7 @@
                 updateCertCache();
             }
 
-            @Override
-            public void bulkChangeStart(final ConfiguredObject<?> object)
-            {
 
-            }
-
-            @Override
-            public void bulkChangeEnd(final ConfiguredObject<?> object)
-            {
-
-            }
         });
         if(_trustStore.getState() == State.ACTIVE)
         {
@@ -114,15 +91,16 @@
     }
 
     @Override
-    public Consumer addConsumer(final ConsumerTarget target,
-                                final FilterManager filters,
-                                final Class<? extends ServerMessage> messageClass,
-                                final String consumerName,
-                                final EnumSet<ConsumerImpl.Option> options, final Integer priority)
+    public SystemMessageSourceConsumer addConsumer(final ConsumerTarget target,
+                                                   final FilterManager filters,
+                                                   final Class<? extends ServerMessage> messageClass,
+                                                   final String consumerName,
+                                                   final EnumSet<ConsumerOption> options, final Integer priority)
             throws ExistingExclusiveConsumer, ExistingConsumerPreventsExclusive,
                    ConsumerAccessRefused
     {
-        final Consumer consumer = super.addConsumer(target, filters, messageClass, consumerName, options, priority);
+        final SystemMessageSourceConsumer
+                consumer = super.addConsumer(target, filters, messageClass, consumerName, options, priority);
         consumer.send(createMessage());
         target.queueEmpty();
         return consumer;
@@ -141,7 +119,7 @@
     {
         InternalMessage message = createMessage();
 
-        for(Consumer c : new ArrayList<>(getConsumers()))
+        for(SystemMessageSourceConsumer c : new ArrayList<>(getConsumers()))
         {
             c.send(message);
         }
diff --git a/broker-core/src/main/java/org/apache/qpid/server/security/TrustStoreMessageSourceCreator.java b/broker-core/src/main/java/org/apache/qpid/server/security/TrustStoreMessageSourceCreator.java
index c81d19e..d05f9cd 100644
--- a/broker-core/src/main/java/org/apache/qpid/server/security/TrustStoreMessageSourceCreator.java
+++ b/broker-core/src/main/java/org/apache/qpid/server/security/TrustStoreMessageSourceCreator.java
@@ -22,8 +22,8 @@
 
 import java.util.Collection;
 
+import org.apache.qpid.server.model.AbstractConfigurationChangeListener;
 import org.apache.qpid.server.model.Broker;
-import org.apache.qpid.server.model.ConfigurationChangeListener;
 import org.apache.qpid.server.model.ConfiguredObject;
 import org.apache.qpid.server.model.State;
 import org.apache.qpid.server.model.TrustStore;
@@ -58,12 +58,8 @@
             updateTrustStoreSourceRegistration(registry, trustStore);
             trustStore.addChangeListener(trustStoreChangeListener);
         }
-        broker.addChangeListener(new ConfigurationChangeListener()
+        broker.addChangeListener(new AbstractConfigurationChangeListener()
         {
-            @Override
-            public void stateChanged(final ConfiguredObject<?> object, final State oldState, final State newState)
-            {
-            }
 
             @Override
             public void childAdded(final ConfiguredObject<?> object, final ConfiguredObject<?> child)
@@ -90,26 +86,6 @@
                 }
             }
 
-            @Override
-            public void attributeSet(final ConfiguredObject<?> object,
-                                     final String attributeName,
-                                     final Object oldAttributeValue,
-                                     final Object newAttributeValue)
-            {
-
-            }
-
-            @Override
-            public void bulkChangeStart(final ConfiguredObject<?> object)
-            {
-
-            }
-
-            @Override
-            public void bulkChangeEnd(final ConfiguredObject<?> object)
-            {
-
-            }
         });
     }
 
@@ -141,7 +117,7 @@
         }
     }
 
-    private class TrustStoreChangeListener implements ConfigurationChangeListener
+    private class TrustStoreChangeListener extends AbstractConfigurationChangeListener
     {
 
         private final SystemNodeRegistry _registry;
@@ -159,19 +135,6 @@
             updateTrustStoreSourceRegistration(_registry, (TrustStore<?>)object);
         }
 
-
-        @Override
-        public void childAdded(final ConfiguredObject<?> object, final ConfiguredObject<?> child)
-        {
-
-        }
-
-        @Override
-        public void childRemoved(final ConfiguredObject<?> object, final ConfiguredObject<?> child)
-        {
-
-        }
-
         @Override
         public void attributeSet(final ConfiguredObject<?> object,
                                  final String attributeName,
@@ -181,16 +144,5 @@
             updateTrustStoreSourceRegistration(_registry, (TrustStore<?>)object);
         }
 
-        @Override
-        public void bulkChangeStart(final ConfiguredObject<?> object)
-        {
-
-        }
-
-        @Override
-        public void bulkChangeEnd(final ConfiguredObject<?> object)
-        {
-
-        }
     }
 }
diff --git a/broker-core/src/main/java/org/apache/qpid/server/store/VirtualHostStoreUpgraderAndRecoverer.java b/broker-core/src/main/java/org/apache/qpid/server/store/VirtualHostStoreUpgraderAndRecoverer.java
index d5cd49d..e596ab9 100644
--- a/broker-core/src/main/java/org/apache/qpid/server/store/VirtualHostStoreUpgraderAndRecoverer.java
+++ b/broker-core/src/main/java/org/apache/qpid/server/store/VirtualHostStoreUpgraderAndRecoverer.java
@@ -36,13 +36,12 @@
 import org.apache.qpid.server.configuration.IllegalConfigurationException;
 import org.apache.qpid.server.configuration.store.StoreConfigurationChangeListener;
 import org.apache.qpid.server.filter.FilterSupport;
+import org.apache.qpid.server.model.AbstractConfigurationChangeListener;
 import org.apache.qpid.server.model.AbstractConfiguredObject;
 import org.apache.qpid.server.model.Binding;
-import org.apache.qpid.server.model.ConfigurationChangeListener;
 import org.apache.qpid.server.model.ConfiguredObject;
 import org.apache.qpid.server.model.Exchange;
 import org.apache.qpid.server.model.Queue;
-import org.apache.qpid.server.model.State;
 import org.apache.qpid.server.model.UUIDGenerator;
 import org.apache.qpid.server.model.VirtualHost;
 import org.apache.qpid.server.model.VirtualHostNode;
@@ -627,13 +626,8 @@
                 }
             });
         }
-        _virtualHostNode.addChangeListener(new ConfigurationChangeListener()
+        _virtualHostNode.addChangeListener(new AbstractConfigurationChangeListener()
         {
-            @Override
-            public void stateChanged(final ConfiguredObject<?> object, final State oldState, final State newState)
-            {
-
-            }
 
             @Override
             public void childAdded(final ConfiguredObject<?> object, final ConfiguredObject<?> child)
@@ -665,26 +659,6 @@
                 }
             }
 
-            @Override
-            public void attributeSet(final ConfiguredObject<?> object,
-                                     final String attributeName,
-                                     final Object oldAttributeValue,
-                                     final Object newAttributeValue)
-            {
-
-            }
-
-            @Override
-            public void bulkChangeStart(final ConfiguredObject<?> object)
-            {
-
-            }
-
-            @Override
-            public void bulkChangeEnd(final ConfiguredObject<?> object)
-            {
-
-            }
         });
         if(isNew)
         {
diff --git a/broker-core/src/main/java/org/apache/qpid/server/transfer/OutboundTransferDestination.java b/broker-core/src/main/java/org/apache/qpid/server/transfer/OutboundTransferDestination.java
new file mode 100644
index 0000000..96e5918
--- /dev/null
+++ b/broker-core/src/main/java/org/apache/qpid/server/transfer/OutboundTransferDestination.java
@@ -0,0 +1,112 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.server.transfer;
+
+import java.security.AccessControlException;
+import java.util.Map;
+
+import org.apache.qpid.server.message.BaseMessageInstance;
+import org.apache.qpid.server.message.InstanceProperties;
+import org.apache.qpid.server.message.MessageDestination;
+import org.apache.qpid.server.message.MessageReference;
+import org.apache.qpid.server.message.ServerMessage;
+import org.apache.qpid.server.model.NamedAddressSpace;
+import org.apache.qpid.server.model.State;
+import org.apache.qpid.server.model.VirtualHost;
+import org.apache.qpid.server.security.SecurityToken;
+import org.apache.qpid.server.store.MessageEnqueueRecord;
+import org.apache.qpid.server.store.StorableMessageMetaData;
+import org.apache.qpid.server.txn.ServerTransaction;
+import org.apache.qpid.server.util.Action;
+import org.apache.qpid.server.virtualhost.VirtualHostUnavailableException;
+
+public class OutboundTransferDestination implements MessageDestination
+{
+    private final VirtualHost<?> _virtualHost;
+    private final String _address;
+
+    public OutboundTransferDestination(final VirtualHost<?> virtualHost, final String address)
+    {
+        _virtualHost = virtualHost;
+        _address = address;
+    }
+
+    @Override
+    public String getName()
+    {
+        return "$transfer";
+    }
+
+    @Override
+    public NamedAddressSpace getAddressSpace()
+    {
+        return _virtualHost;
+    }
+
+    @Override
+    public void authorisePublish(final SecurityToken token, final Map<String, Object> arguments)
+            throws AccessControlException
+    {
+
+    }
+
+    @Override
+    public <M extends ServerMessage<? extends StorableMessageMetaData>> int send(final M message,
+                                                                                 final String routingAddress,
+                                                                                 final InstanceProperties instanceProperties,
+                                                                                 final ServerTransaction txn,
+                                                                                 final Action<? super BaseMessageInstance> postEnqueueAction)
+    {
+        if (_virtualHost.getState() != State.ACTIVE)
+        {
+            throw new VirtualHostUnavailableException(this._virtualHost);
+        }
+
+
+        final TransferQueue transferQueue = _virtualHost.getTransferQueue();
+        txn.enqueue(transferQueue, message, new ServerTransaction.EnqueueAction()
+        {
+            MessageReference _reference = message.newReference();
+
+            public void postCommit(MessageEnqueueRecord... records)
+            {
+                try
+                {
+                    for (final MessageEnqueueRecord record : records)
+                    {
+                        transferQueue.enqueue(message, postEnqueueAction, record);
+                    }
+                }
+                finally
+                {
+                    _reference.release();
+                }
+            }
+
+            public void onRollback()
+            {
+                _reference.release();
+            }
+        });
+        return 1;
+
+    }
+}
diff --git a/broker-core/src/main/java/org/apache/qpid/server/transfer/QueueContext.java b/broker-core/src/main/java/org/apache/qpid/server/transfer/QueueContext.java
new file mode 100755
index 0000000..183b4e3
--- /dev/null
+++ b/broker-core/src/main/java/org/apache/qpid/server/transfer/QueueContext.java
@@ -0,0 +1,66 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+
+package org.apache.qpid.server.transfer;
+
+import java.util.concurrent.atomic.AtomicReferenceFieldUpdater;
+
+import org.apache.qpid.server.queue.QueueEntry;
+
+final class QueueContext
+{
+    private volatile QueueEntry _lastSeenEntry;
+    private volatile QueueEntry _releasedEntry;
+
+    static final AtomicReferenceFieldUpdater<QueueContext, QueueEntry>
+            _lastSeenUpdater =
+        AtomicReferenceFieldUpdater.newUpdater
+                (QueueContext.class, QueueEntry.class, "_lastSeenEntry");
+    static final AtomicReferenceFieldUpdater<QueueContext, QueueEntry>
+            _releasedUpdater =
+        AtomicReferenceFieldUpdater.newUpdater
+                (QueueContext.class, QueueEntry.class, "_releasedEntry");
+
+    public QueueContext(QueueEntry head)
+    {
+        _lastSeenEntry = head;
+    }
+
+    public QueueEntry getLastSeenEntry()
+    {
+        return _lastSeenEntry;
+    }
+
+
+    QueueEntry getReleasedEntry()
+    {
+        return _releasedEntry;
+    }
+
+    @Override
+    public String toString()
+    {
+        return "QueueContext{" +
+               "_lastSeenEntry=" + _lastSeenEntry +
+               ", _releasedEntry=" + _releasedEntry +
+               '}';
+    }
+}
diff --git a/broker-core/src/main/java/org/apache/qpid/server/queue/QueueEntryListBase.java b/broker-core/src/main/java/org/apache/qpid/server/transfer/TransferQueue.java
similarity index 69%
copy from broker-core/src/main/java/org/apache/qpid/server/queue/QueueEntryListBase.java
copy to broker-core/src/main/java/org/apache/qpid/server/transfer/TransferQueue.java
index d2aff53..cce739b 100644
--- a/broker-core/src/main/java/org/apache/qpid/server/queue/QueueEntryListBase.java
+++ b/broker-core/src/main/java/org/apache/qpid/server/transfer/TransferQueue.java
@@ -18,8 +18,13 @@
  * under the License.
  *
  */
-package org.apache.qpid.server.queue;
+package org.apache.qpid.server.transfer;
 
-public interface QueueEntryListBase extends QueueEntryList
+import org.apache.qpid.server.message.MessageDestination;
+import org.apache.qpid.server.queue.RecoverableBaseQueue;
+
+public interface TransferQueue extends RecoverableBaseQueue, MessageDestination
 {
+    TransferQueueConsumer addConsumer(TransferTarget target,
+                                      String consumerName);
 }
diff --git a/broker-core/src/main/java/org/apache/qpid/server/transfer/TransferQueueConsumer.java b/broker-core/src/main/java/org/apache/qpid/server/transfer/TransferQueueConsumer.java
new file mode 100644
index 0000000..0547fee
--- /dev/null
+++ b/broker-core/src/main/java/org/apache/qpid/server/transfer/TransferQueueConsumer.java
@@ -0,0 +1,225 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.server.transfer;
+
+import java.util.Collection;
+import java.util.concurrent.ConcurrentLinkedQueue;
+import java.util.regex.Pattern;
+
+import org.apache.qpid.server.message.AcquiringMessageInstanceConsumer;
+import org.apache.qpid.server.message.MessageInstance;
+import org.apache.qpid.server.queue.QueueEntry;
+
+public class TransferQueueConsumer implements AcquiringMessageInstanceConsumer<TransferQueueConsumer, TransferTarget>
+{
+    private final TransferQueueImpl _transferQueue;
+    private final TransferTarget _target;
+    private final String _name;
+
+    private final ConcurrentLinkedQueue<TransferQueueEntry> _entries = new ConcurrentLinkedQueue<>();
+    private final Pattern _matchPattern;
+    private volatile QueueContext _queueContext;
+
+
+    private final MessageInstance.StealableConsumerAcquiredState<TransferQueueConsumer>
+            _owningState = new MessageInstance.StealableConsumerAcquiredState<>(this);
+    private final Object _identifier = new Object();
+
+
+    TransferQueueConsumer(final TransferQueueImpl transferQueue,
+                          final TransferTarget target,
+                          final String consumerName)
+    {
+        _transferQueue = transferQueue;
+        _target = target;
+        _name = consumerName;
+
+        Collection<String> globalAddressDomains = _target.getGlobalAddressDomains();
+        StringBuilder matchPattern = new StringBuilder();
+        boolean isFirst = true;
+        for(String domain : globalAddressDomains)
+        {
+            if(isFirst)
+            {
+                isFirst = false;
+            }
+            else
+            {
+                matchPattern.append('|');
+            }
+            matchPattern.append('(');
+            matchPattern.append(Pattern.quote(domain.endsWith("/") ? domain : (domain + "/")));
+            matchPattern.append(".*)");
+        }
+        _matchPattern = Pattern.compile(matchPattern.toString());
+    }
+
+    boolean hasInterest(final QueueEntry entry)
+    {
+        String initialRoutingAddress = entry.getMessage().getInitialRoutingAddress();
+        boolean matches = _matchPattern.matcher(initialRoutingAddress).matches();
+        return matches;
+    }
+
+    public boolean processPending()
+    {
+        if(!isSuspended())
+        {
+            TransferQueueEntry entry = _transferQueue.getNextAvailableEntry(this);
+            if(entry != null && !wouldSuspend(entry))
+            {
+                if (!entry.acquire(this))
+                {
+                    // restore credit here that would have been taken away by wouldSuspend since we didn't manage
+                    // to acquire the entry for this consumer
+                    restoreCredit(entry);
+                }
+                else
+                {
+                    _transferQueue.setLastSeenEntry(this, entry);
+
+                    send(entry);
+                    return true;
+                }
+            }
+
+        }
+        return false;
+    }
+
+    void setQueueContext(final QueueContext queueContext)
+    {
+        _queueContext = queueContext;
+    }
+
+    QueueContext getQueueContext()
+    {
+        return _queueContext;
+    }
+
+    @Override
+    public MessageInstance.StealableConsumerAcquiredState<TransferQueueConsumer> getOwningState()
+    {
+        return _owningState;
+    }
+
+    public boolean isSuspended()
+    {
+        return _target.isSuspended();
+    }
+
+    boolean wouldSuspend(final TransferQueueEntry entry)
+    {
+        return _target.wouldSuspend(entry);
+    }
+
+    public TransferTarget getTarget()
+    {
+        return _target;
+    }
+
+    @Override
+    public void acquisitionRemoved(final QueueEntry queueEntry)
+    {
+
+    }
+
+    @Override
+    public long getConsumerNumber()
+    {
+        return 0;
+    }
+
+    @Override
+    public boolean resend(final QueueEntry queueEntry)
+    {
+        return false;
+    }
+
+    @Override
+    public boolean isClosed()
+    {
+        return false;
+    }
+
+    @Override
+    public boolean acquires()
+    {
+        return true;
+    }
+
+    @Override
+    public String getName()
+    {
+        return "$transfer";
+    }
+
+    @Override
+    public void close()
+    {
+
+    }
+
+    @Override
+    public void flush()
+    {
+
+    }
+
+    @Override
+    public void externalStateChange()
+    {
+
+    }
+
+    @Override
+    public Object getIdentifier()
+    {
+        return _identifier;
+    }
+
+    @Override
+    public boolean hasAvailableMessages()
+    {
+        return _transferQueue.hasAvailableMessages(this);
+    }
+
+    @Override
+    public void pullMessage()
+    {
+
+    }
+
+    public void send(final TransferQueueEntry entry)
+    {
+        _target.send(entry);
+    }
+
+    public void restoreCredit(final TransferQueueEntry entry)
+    {
+        _target.restoreCredit(entry.getMessage());
+    }
+
+    public void notifyWork()
+    {
+        _target.notifyWork();
+    }
+}
diff --git a/broker-core/src/main/java/org/apache/qpid/server/transfer/TransferQueueEntry.java b/broker-core/src/main/java/org/apache/qpid/server/transfer/TransferQueueEntry.java
new file mode 100644
index 0000000..8931bd4
--- /dev/null
+++ b/broker-core/src/main/java/org/apache/qpid/server/transfer/TransferQueueEntry.java
@@ -0,0 +1,41 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.server.transfer;
+
+import org.apache.qpid.server.message.ServerMessage;
+import org.apache.qpid.server.queue.OrderedQueueEntry;
+import org.apache.qpid.server.store.MessageEnqueueRecord;
+
+public class TransferQueueEntry extends OrderedQueueEntry
+{
+
+    protected TransferQueueEntry(final TransferQueueEntryList queueEntryList)
+    {
+        super(queueEntryList);
+    }
+
+    public TransferQueueEntry(final TransferQueueEntryList queueEntryList,
+                              final ServerMessage message,
+                              final MessageEnqueueRecord messageEnqueueRecord)
+    {
+        super(queueEntryList, message, messageEnqueueRecord);
+    }
+}
diff --git a/broker-core/src/main/java/org/apache/qpid/server/transfer/TransferQueueEntryList.java b/broker-core/src/main/java/org/apache/qpid/server/transfer/TransferQueueEntryList.java
new file mode 100644
index 0000000..c8c632e
--- /dev/null
+++ b/broker-core/src/main/java/org/apache/qpid/server/transfer/TransferQueueEntryList.java
@@ -0,0 +1,102 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.server.transfer;
+
+import org.apache.qpid.server.message.BaseMessageInstance;
+import org.apache.qpid.server.message.MessageInstanceConsumer;
+import org.apache.qpid.server.message.ServerMessage;
+import org.apache.qpid.server.queue.OrderedBaseQueueEntryList;
+import org.apache.qpid.server.queue.OrderedQueueEntry;
+import org.apache.qpid.server.queue.QueueEntry;
+import org.apache.qpid.server.queue.QueueEntryList;
+import org.apache.qpid.server.store.MessageEnqueueRecord;
+import org.apache.qpid.server.txn.ServerTransaction;
+import org.apache.qpid.server.util.Action;
+
+public class TransferQueueEntryList extends OrderedBaseQueueEntryList<TransferQueue>
+{
+
+    private static final HeadCreator HEAD_CREATOR = new HeadCreator()
+    {
+        @Override
+        public TransferQueueEntry createHead(final QueueEntryList list)
+        {
+            return new TransferQueueEntry((TransferQueueEntryList) list);
+        }
+    };
+
+    public TransferQueueEntryList(final TransferQueue queue)
+    {
+        super(queue, HEAD_CREATOR);
+    }
+
+
+    @Override
+    protected OrderedQueueEntry createQueueEntry(final ServerMessage<?> message,
+                                                 final MessageEnqueueRecord enqueueRecord)
+    {
+        return new TransferQueueEntry(this, message, enqueueRecord);
+    }
+
+    @Override
+    public void onAcquiredByConsumer(final QueueEntry queueEntry, final MessageInstanceConsumer consumer)
+    {
+
+    }
+
+    @Override
+    public void onNoLongerAcquiredByConsumer(final QueueEntry queueEntry)
+    {
+
+    }
+
+    @Override
+    public void requeue(final QueueEntry queueEntry)
+    {
+
+    }
+
+    @Override
+    public boolean isHeld(final QueueEntry queueEntry, final long evaluationTime)
+    {
+        return false;
+    }
+
+    @Override
+    public void dequeue(final QueueEntry queueEntry)
+    {
+
+    }
+
+    @Override
+    public int routeToAlternate(final QueueEntry queueEntry,
+                                final Action<? super BaseMessageInstance> action,
+                                final ServerTransaction txn)
+    {
+        return 0;
+    }
+
+    @Override
+    public int getMaximumDeliveryAttempts()
+    {
+        return 0;
+    }
+}
diff --git a/broker-core/src/main/java/org/apache/qpid/server/transfer/TransferQueueImpl.java b/broker-core/src/main/java/org/apache/qpid/server/transfer/TransferQueueImpl.java
new file mode 100644
index 0000000..ce81bb7
--- /dev/null
+++ b/broker-core/src/main/java/org/apache/qpid/server/transfer/TransferQueueImpl.java
@@ -0,0 +1,409 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.server.transfer;
+
+import java.nio.charset.StandardCharsets;
+import java.security.AccessControlException;
+import java.util.Collection;
+import java.util.Map;
+import java.util.UUID;
+import java.util.concurrent.ConcurrentLinkedQueue;
+import java.util.concurrent.CopyOnWriteArrayList;
+import java.util.concurrent.atomic.AtomicInteger;
+
+import org.apache.qpid.server.message.BaseMessageInstance;
+import org.apache.qpid.server.message.InstanceProperties;
+import org.apache.qpid.server.message.MessageReference;
+import org.apache.qpid.server.message.ServerMessage;
+import org.apache.qpid.server.model.NamedAddressSpace;
+import org.apache.qpid.server.model.State;
+import org.apache.qpid.server.model.VirtualHost;
+import org.apache.qpid.server.queue.QueueEntry;
+import org.apache.qpid.server.security.SecurityToken;
+import org.apache.qpid.server.store.MessageDurability;
+import org.apache.qpid.server.store.MessageEnqueueRecord;
+import org.apache.qpid.server.store.StorableMessageMetaData;
+import org.apache.qpid.server.txn.AutoCommitTransaction;
+import org.apache.qpid.server.txn.ServerTransaction;
+import org.apache.qpid.server.util.Action;
+import org.apache.qpid.server.virtualhost.VirtualHostUnavailableException;
+
+public class TransferQueueImpl implements TransferQueue
+{
+    private static final UUID TRANSFER_QUEUE_ID = UUID.nameUUIDFromBytes("$transfer".getBytes(StandardCharsets.UTF_8));
+
+    private static final int RECOVERING = 1;
+    private static final int COMPLETING_RECOVERY = 2;
+    private static final int RECOVERED = 3;
+
+    private final AtomicInteger _recovering = new AtomicInteger(RECOVERING);
+    private final AtomicInteger _enqueuingWhileRecovering = new AtomicInteger(0);
+
+    private final ConcurrentLinkedQueue<EnqueueRequest> _postRecoveryQueue = new ConcurrentLinkedQueue<>();
+
+    private final VirtualHost<?> _virtualHost;
+
+    private final TransferQueueEntryList _queueEntryList;
+    private Collection<TransferQueueConsumer> _consumers = new CopyOnWriteArrayList<>();
+
+
+    public TransferQueueImpl(final VirtualHost<?> virtualHost)
+    {
+        _virtualHost = virtualHost;
+        _queueEntryList = new TransferQueueEntryList(this);
+    }
+
+    @Override
+    public void enqueue(final ServerMessage message,
+                        final Action<? super BaseMessageInstance> action,
+                        final MessageEnqueueRecord enqueueRecord)
+    {
+        if(_recovering.get() != RECOVERED)
+        {
+            _enqueuingWhileRecovering.incrementAndGet();
+
+            boolean addedToRecoveryQueue;
+            try
+            {
+                if(addedToRecoveryQueue = (_recovering.get() == RECOVERING))
+                {
+                    _postRecoveryQueue.add(new EnqueueRequest(message, action, enqueueRecord));
+                }
+            }
+            finally
+            {
+                _enqueuingWhileRecovering.decrementAndGet();
+            }
+
+            if(!addedToRecoveryQueue)
+            {
+                while(_recovering.get() != RECOVERED)
+                {
+                    Thread.yield();
+                }
+                doEnqueue(message, action, enqueueRecord);
+            }
+        }
+        else
+        {
+            doEnqueue(message, action, enqueueRecord);
+        }
+
+
+    }
+
+    @Override
+    public void recover(final ServerMessage<?> message, final MessageEnqueueRecord enqueueRecord)
+    {
+        doEnqueue(message, null, enqueueRecord);
+    }
+
+    @Override
+    public final void completeRecovery()
+    {
+        if(_recovering.compareAndSet(RECOVERING, COMPLETING_RECOVERY))
+        {
+            while(_enqueuingWhileRecovering.get() != 0)
+            {
+                Thread.yield();
+            }
+
+            // at this point we can assert that any new enqueue to the queue will not try to put into the post recovery
+            // queue (because the state is no longer RECOVERING, but also no threads are currently trying to enqueue
+            // because the _enqueuingWhileRecovering count is 0.
+
+            enqueueFromPostRecoveryQueue();
+
+            _recovering.set(RECOVERED);
+
+        }
+    }
+
+    @Override
+    public VirtualHost<?> getVirtualHost()
+    {
+        return _virtualHost;
+    }
+
+    private void enqueueFromPostRecoveryQueue()
+    {
+        while(!_postRecoveryQueue.isEmpty())
+        {
+            EnqueueRequest request = _postRecoveryQueue.poll();
+            MessageReference<?> messageReference = request.getMessage();
+            doEnqueue(messageReference.getMessage(), request.getAction(), request.getEnqueueRecord());
+            messageReference.release();
+        }
+    }
+
+
+
+    protected void doEnqueue(final ServerMessage message, final Action<? super BaseMessageInstance> action, MessageEnqueueRecord enqueueRecord)
+    {
+        final TransferQueueEntry entry = (TransferQueueEntry) _queueEntryList.add(message, enqueueRecord);
+        for (TransferQueueConsumer consumer : getConsumers())
+        {
+            if (consumer.hasInterest(entry))
+            {
+                consumer.notifyWork();
+            }
+        }
+    }
+
+    private Collection<TransferQueueConsumer> getConsumers()
+    {
+        return _consumers;
+    }
+
+    @Override
+    public TransferQueueConsumer addConsumer(final TransferTarget target,
+                                             final String consumerName)
+    {
+
+
+
+        TransferQueueConsumer consumer = new TransferQueueConsumer(this,
+                                                                   target,
+                                                                   consumerName);
+
+        QueueContext queueContext = new QueueContext(_queueEntryList.getHead());
+        consumer.setQueueContext(queueContext);
+        _consumers.add(consumer);
+        consumer.notifyWork();
+
+        return consumer;
+    }
+
+    boolean hasAvailableMessages(final TransferQueueConsumer queueConsumer)
+    {
+        return getNextAvailableEntry(queueConsumer) != null;
+    }
+
+
+    void setLastSeenEntry(final TransferQueueConsumer sub, final TransferQueueEntry entry)
+    {
+        QueueContext subContext = sub.getQueueContext();
+        if (subContext != null)
+        {
+            QueueEntry releasedEntry = subContext.getReleasedEntry();
+
+            QueueContext._lastSeenUpdater.set(subContext, entry);
+            if(releasedEntry == entry)
+            {
+                QueueContext._releasedUpdater.compareAndSet(subContext, releasedEntry, null);
+            }
+        }
+    }
+
+    TransferQueueEntry getNextAvailableEntry(final TransferQueueConsumer sub)
+    {
+        QueueContext context = sub.getQueueContext();
+        if(context != null)
+        {
+            QueueEntry lastSeen = context.getLastSeenEntry();
+            QueueEntry releasedNode = context.getReleasedEntry();
+
+            TransferQueueEntry node =
+                    (TransferQueueEntry) ((releasedNode != null && lastSeen.compareTo(releasedNode) >= 0)
+                                        ? releasedNode : _queueEntryList.next(lastSeen));
+
+            boolean expired = false;
+            while (node != null
+                   && (!node.isAvailable()
+                       || (expired = node.expired())
+                       || !sub.hasInterest(node)))
+            {
+                if (expired)
+                {
+                    expired = false;
+                    if (node.acquire())
+                    {
+                        dequeueEntry(node);
+                    }
+                }
+
+                if(QueueContext._lastSeenUpdater.compareAndSet(context, lastSeen, node))
+                {
+                    QueueContext._releasedUpdater.compareAndSet(context, releasedNode, null);
+                }
+
+                lastSeen = context.getLastSeenEntry();
+                releasedNode = context.getReleasedEntry();
+                node = (TransferQueueEntry) ((releasedNode != null && lastSeen.compareTo(releasedNode) >= 0)
+                                        ? releasedNode
+                                        : _queueEntryList.next(lastSeen));
+            }
+            return node;
+        }
+        else
+        {
+            return null;
+        }
+    }
+
+    private void dequeueEntry(final QueueEntry node)
+    {
+        ServerTransaction txn = new AutoCommitTransaction(_virtualHost.getMessageStore());
+        dequeueEntry(node, txn);
+    }
+
+    private void dequeueEntry(final QueueEntry node, ServerTransaction txn)
+    {
+        txn.dequeue(node.getEnqueueRecord(),
+                    new ServerTransaction.Action()
+                    {
+
+                        public void postCommit()
+                        {
+                            node.delete();
+                        }
+
+                        public void onRollback()
+                        {
+
+                        }
+                    });
+    }
+
+    @Override
+    public boolean isDurable()
+    {
+        return true;
+    }
+
+    @Override
+    public boolean isDeleted()
+    {
+        return false;
+    }
+
+    @Override
+    public String getName()
+    {
+        return "$transfer";
+    }
+
+    @Override
+    public NamedAddressSpace getAddressSpace()
+    {
+        return _virtualHost;
+    }
+
+    @Override
+    public void authorisePublish(final SecurityToken token, final Map<String, Object> arguments)
+            throws AccessControlException
+    {
+        // TODO
+    }
+
+    @Override
+    public <M extends ServerMessage<? extends StorableMessageMetaData>> int send(final M message,
+                                                                                 final String routingAddress,
+                                                                                 final InstanceProperties instanceProperties,
+                                                                                 final ServerTransaction txn,
+                                                                                 final Action<? super BaseMessageInstance> postEnqueueAction)
+    {
+        if (_virtualHost.getState() != State.ACTIVE)
+        {
+            throw new VirtualHostUnavailableException(this._virtualHost);
+        }
+
+        if(!message.isReferenced(this))
+        {
+            txn.enqueue(this, message, new ServerTransaction.EnqueueAction()
+            {
+                MessageReference _reference = message.newReference();
+
+                public void postCommit(MessageEnqueueRecord... records)
+                {
+                    try
+                    {
+                        TransferQueueImpl.this.enqueue(message, postEnqueueAction, records[0]);
+                    }
+                    finally
+                    {
+                        _reference.release();
+                    }
+                }
+
+                public void onRollback()
+                {
+                    _reference.release();
+                }
+            });
+            return 1;
+        }
+        else
+        {
+            return 0;
+        }
+
+    }
+
+    @Override
+    public UUID getId()
+    {
+        return TRANSFER_QUEUE_ID;
+    }
+
+    @Override
+    public MessageDurability getMessageDurability()
+    {
+        return MessageDurability.DEFAULT;
+    }
+
+    public void flushConsumer(final TransferQueueConsumer consumer, final int count)
+    {
+
+    }
+
+    private static class EnqueueRequest
+    {
+        private final MessageReference<?> _message;
+        private final Action<? super BaseMessageInstance> _action;
+        private final MessageEnqueueRecord _enqueueRecord;
+
+        public EnqueueRequest(final ServerMessage message,
+                              final Action<? super BaseMessageInstance> action,
+                              final MessageEnqueueRecord enqueueRecord)
+        {
+            _enqueueRecord = enqueueRecord;
+            _message = message.newReference();
+            _action = action;
+        }
+
+        public MessageReference<?> getMessage()
+        {
+            return _message;
+        }
+
+        public Action<? super BaseMessageInstance> getAction()
+        {
+            return _action;
+        }
+
+        public MessageEnqueueRecord getEnqueueRecord()
+        {
+            return _enqueueRecord;
+        }
+    }
+
+}
diff --git a/broker-core/src/main/java/org/apache/qpid/server/queue/QueueEntryListBase.java b/broker-core/src/main/java/org/apache/qpid/server/transfer/TransferTarget.java
similarity index 66%
copy from broker-core/src/main/java/org/apache/qpid/server/queue/QueueEntryListBase.java
copy to broker-core/src/main/java/org/apache/qpid/server/transfer/TransferTarget.java
index d2aff53..7539dd5 100644
--- a/broker-core/src/main/java/org/apache/qpid/server/queue/QueueEntryListBase.java
+++ b/broker-core/src/main/java/org/apache/qpid/server/transfer/TransferTarget.java
@@ -18,8 +18,24 @@
  * under the License.
  *
  */
-package org.apache.qpid.server.queue;
+package org.apache.qpid.server.transfer;
 
-public interface QueueEntryListBase extends QueueEntryList
+import java.util.Collection;
+
+import org.apache.qpid.server.message.ServerMessage;
+
+public interface TransferTarget
 {
+
+    void notifyWork();
+
+    Collection<String> getGlobalAddressDomains();
+
+    void send(TransferQueueEntry entry);
+
+    void restoreCredit(ServerMessage message);
+
+    boolean wouldSuspend(TransferQueueEntry entry);
+
+    boolean isSuspended();
 }
diff --git a/broker-core/src/main/java/org/apache/qpid/server/transport/AbstractAMQPConnection.java b/broker-core/src/main/java/org/apache/qpid/server/transport/AbstractAMQPConnection.java
index fe5a219..bb77538 100644
--- a/broker-core/src/main/java/org/apache/qpid/server/transport/AbstractAMQPConnection.java
+++ b/broker-core/src/main/java/org/apache/qpid/server/transport/AbstractAMQPConnection.java
@@ -331,18 +331,18 @@
     @Override
     public void pushScheduler(final NetworkConnectionScheduler networkConnectionScheduler)
     {
-        if(_network instanceof NonBlockingConnection)
+        if(_network instanceof NonBlockingInboundConnection)
         {
-            ((NonBlockingConnection) _network).pushScheduler(networkConnectionScheduler);
+            ((NonBlockingInboundConnection) _network).pushScheduler(networkConnectionScheduler);
         }
     }
 
     @Override
     public NetworkConnectionScheduler popScheduler()
     {
-        if(_network instanceof NonBlockingConnection)
+        if(_network instanceof NonBlockingInboundConnection)
         {
-            return ((NonBlockingConnection) _network).popScheduler();
+            return ((NonBlockingInboundConnection) _network).popScheduler();
         }
         return null;
     }
diff --git a/broker-core/src/main/java/org/apache/qpid/server/transport/NetworkConnectionScheduler.java b/broker-core/src/main/java/org/apache/qpid/server/transport/NetworkConnectionScheduler.java
index b0e40bb..8855e45 100644
--- a/broker-core/src/main/java/org/apache/qpid/server/transport/NetworkConnectionScheduler.java
+++ b/broker-core/src/main/java/org/apache/qpid/server/transport/NetworkConnectionScheduler.java
@@ -115,7 +115,7 @@
         }
     }
 
-    void processConnection(final NonBlockingConnection connection)
+    void processConnection(final SchedulableConnection connection)
     {
         Thread.currentThread().setName(connection.getThreadName());
         connection.doPreWork();
@@ -207,12 +207,12 @@
         _selectorThread.cancelAcceptingSocket(serverSocket);
     }
 
-    public void addConnection(final NonBlockingConnection connection)
+    public void addConnection(final SchedulableConnection connection)
     {
         _selectorThread.addConnection(connection);
     }
 
-    public void removeConnection(final NonBlockingConnection connection)
+    public void removeConnection(final SchedulableConnection connection)
     {
         _selectorThread.removeConnection(connection);
     }
@@ -222,7 +222,7 @@
         return _poolSize;
     }
 
-    public void schedule(final NonBlockingConnection connection)
+    public void schedule(final SchedulableConnection connection)
     {
         _selectorThread.addToWork(connection);
     }
diff --git a/broker-core/src/main/java/org/apache/qpid/server/transport/NonBlockingConnection.java b/broker-core/src/main/java/org/apache/qpid/server/transport/NonBlockingConnection.java
index 7eaa721..ff64fe8 100644
--- a/broker-core/src/main/java/org/apache/qpid/server/transport/NonBlockingConnection.java
+++ b/broker-core/src/main/java/org/apache/qpid/server/transport/NonBlockingConnection.java
@@ -1,5 +1,5 @@
 /*
-*
+ *
  * Licensed to the Apache Software Foundation (ASF) under one
  * or more contributor license agreements.  See the NOTICE file
  * distributed with this work for additional information
@@ -29,7 +29,6 @@
 import java.util.Deque;
 import java.util.Iterator;
 import java.util.List;
-import java.util.Set;
 import java.util.concurrent.ConcurrentLinkedDeque;
 import java.util.concurrent.ConcurrentLinkedQueue;
 import java.util.concurrent.CopyOnWriteArrayList;
@@ -40,231 +39,232 @@
 import org.slf4j.LoggerFactory;
 
 import org.apache.qpid.bytebuffer.QpidByteBuffer;
-import org.apache.qpid.server.model.port.AmqpPort;
 import org.apache.qpid.server.util.Action;
 import org.apache.qpid.server.util.ConnectionScopedRuntimeException;
 import org.apache.qpid.transport.ByteBufferSender;
 import org.apache.qpid.transport.network.Ticker;
-import org.apache.qpid.transport.network.TransportEncryption;
 import org.apache.qpid.util.SystemUtils;
 
-public class NonBlockingConnection implements ServerNetworkConnection, ByteBufferSender
+public abstract class NonBlockingConnection implements SchedulableConnection
 {
     private static final Logger LOGGER = LoggerFactory.getLogger(NonBlockingConnection.class);
 
+    final AtomicLong _usedOutboundMessageSpace = new AtomicLong();
     private final SocketChannel _socketChannel;
-    private NonBlockingConnectionDelegate _delegate;
     private final Deque<NetworkConnectionScheduler> _schedulerDeque = new ConcurrentLinkedDeque<>();
-    private final ConcurrentLinkedQueue<QpidByteBuffer> _buffers = new ConcurrentLinkedQueue<>();
-
-    private final String _remoteSocketAddress;
-    private final AtomicBoolean _closed = new AtomicBoolean(false);
-    private final ProtocolEngine _protocolEngine;
-    private final Runnable _onTransportEncryptionAction;
-    private final AtomicLong _usedOutboundMessageSpace = new AtomicLong();
-    private final long _outboundMessageBufferLimit;
-
-    private volatile boolean _fullyWritten = true;
-
-    private boolean _partialRead = false;
-
-    private final AmqpPort _port;
+    private final String _remoteAddressString;
     private final AtomicBoolean _scheduled = new AtomicBoolean();
-    private volatile long _scheduledTime;
-    private volatile boolean _unexpectedByteBufferSizeReported;
-    private final String _threadName;
-    private volatile SelectorThread.SelectionTask _selectionTask;
-    private Iterator<Runnable> _pendingIterator;
     private final AtomicLong _maxWriteIdleMillis = new AtomicLong();
     private final AtomicLong _maxReadIdleMillis = new AtomicLong();
-    private final List<SchedulingDelayNotificationListener> _schedulingDelayNotificationListeners = new CopyOnWriteArrayList<>();
-    private final AtomicBoolean _hasShutdown = new AtomicBoolean();
+    private final List<SchedulingDelayNotificationListener>
+            _schedulingDelayNotificationListeners = new CopyOnWriteArrayList<>();
+    private final String _threadName;
+    private final ConcurrentLinkedQueue<QpidByteBuffer> _buffers = new ConcurrentLinkedQueue<>();
+    private NonBlockingConnectionDelegate _delegate;
+    private final AtomicBoolean _closed = new AtomicBoolean(false);
 
-    public NonBlockingConnection(SocketChannel socketChannel,
-                                 ProtocolEngine protocolEngine,
-                                 final Set<TransportEncryption> encryptionSet,
-                                 final Runnable onTransportEncryptionAction,
-                                 final NetworkConnectionScheduler scheduler,
-                                 final AmqpPort port)
+    private volatile SelectorThread.SelectionTask _selectionTask;
+    private volatile long _scheduledTime;
+    private final AtomicBoolean _hasShutdown = new AtomicBoolean();
+    private final AtomicBoolean _unexpectedByteBufferSizeReported = new AtomicBoolean();
+    private final ProtocolEngine _protocolEngine;
+    private volatile Iterator<Runnable> _pendingIterator;
+    private volatile boolean _fullyWritten = true;
+    private volatile boolean _partialRead = false;
+
+    protected NonBlockingConnection(final SocketChannel socketChannel, ProtocolEngine protocolEngine,
+                                    final NetworkConnectionScheduler scheduler,
+                                    String remoteAddressString)
     {
         _socketChannel = socketChannel;
-        pushScheduler(scheduler);
-
         _protocolEngine = protocolEngine;
-        _onTransportEncryptionAction = onTransportEncryptionAction;
-
-        _remoteSocketAddress = _socketChannel.socket().getRemoteSocketAddress().toString();
-        _port = port;
-        _threadName = SelectorThread.IO_THREAD_NAME_PREFIX + _remoteSocketAddress.toString();
-
-        _outboundMessageBufferLimit = (long) _port.getContextValue(Long.class,
-                                                                   AmqpPort.PORT_AMQP_OUTBOUND_MESSAGE_BUFFER_SIZE);
-
+        _remoteAddressString = remoteAddressString;
+        _threadName = SelectorThread.IO_THREAD_NAME_PREFIX + _remoteAddressString;
+        pushScheduler(scheduler);
         protocolEngine.setWorkListener(new Action<ProtocolEngine>()
         {
             @Override
             public void performAction(final ProtocolEngine object)
             {
-                if(!_scheduled.get())
+                NetworkConnectionScheduler scheduler = getScheduler();
+                if(scheduler != null && !_scheduled.get())
                 {
                     getScheduler().schedule(NonBlockingConnection.this);
                 }
             }
         });
 
-        if(encryptionSet.size() == 1)
-        {
-            setTransportEncryption(encryptionSet.iterator().next());
-        }
-        else
-        {
-            _delegate = new NonBlockingConnectionUndecidedDelegate(this);
-        }
 
     }
 
-    String getThreadName()
+    @Override
+    public final String getThreadName()
     {
         return _threadName;
     }
 
-    public boolean isPartialRead()
+
+    protected final String getRemoteAddressString()
     {
-        return _partialRead;
+        return _remoteAddressString;
     }
 
-    Ticker getTicker()
+    protected final boolean isClosed()
     {
-        return _protocolEngine.getAggregateTicker();
+        return _closed.get();
     }
 
-    SocketChannel getSocketChannel()
+    protected final boolean setClosed()
+    {
+        return _closed.compareAndSet(false,true);
+    }
+
+    @Override
+    public final SocketChannel getSocketChannel()
     {
         return _socketChannel;
     }
 
+
     @Override
-    public void start()
+    public final SocketAddress getRemoteAddress()
     {
+        return getSocketChannel().socket().getRemoteSocketAddress();
     }
 
     @Override
-    public ByteBufferSender getSender()
+    public final SocketAddress getLocalAddress()
     {
-        return this;
+        return getSocketChannel().socket().getLocalSocketAddress();
+    }
+
+
+    public final void pushScheduler(NetworkConnectionScheduler scheduler)
+    {
+        _schedulerDeque.addFirst(scheduler);
+    }
+
+    public final NetworkConnectionScheduler popScheduler()
+    {
+        return _schedulerDeque.removeFirst();
     }
 
     @Override
-    public void close()
+    public final NetworkConnectionScheduler getScheduler()
     {
-        LOGGER.debug("Closing " + _remoteSocketAddress);
-        if(_closed.compareAndSet(false,true))
-        {
-            _protocolEngine.notifyWork();
-            _selectionTask.wakeup();
-        }
+        return _schedulerDeque.peekFirst();
     }
 
     @Override
-    public SocketAddress getRemoteAddress()
-    {
-        return _socketChannel.socket().getRemoteSocketAddress();
-    }
-
-    @Override
-    public SocketAddress getLocalAddress()
-    {
-        return _socketChannel.socket().getLocalSocketAddress();
-    }
-
-    @Override
-    public void setMaxWriteIdleMillis(final long millis)
-    {
-        _maxWriteIdleMillis.set(millis);
-    }
-
-    @Override
-    public void setMaxReadIdleMillis(final long millis)
-    {
-        _maxReadIdleMillis.set(millis);
-    }
-
-    @Override
-    public Principal getPeerPrincipal()
+    public final Principal getPeerPrincipal()
     {
         return _delegate.getPeerPrincipal();
     }
 
     @Override
-    public Certificate getPeerCertificate()
+    public final Certificate getPeerCertificate()
     {
         return _delegate.getPeerCertificate();
     }
 
     @Override
-    public long getMaxReadIdleMillis()
+    public final String getTransportInfo()
+    {
+        return _delegate.getTransportInfo();
+    }
+
+
+    @Override
+    public final SelectorThread.SelectionTask getSelectionTask()
+    {
+        return _selectionTask;
+    }
+
+    @Override
+    public final void setSelectionTask(final SelectorThread.SelectionTask selectionTask)
+    {
+        _selectionTask = selectionTask;
+    }
+
+    @Override
+    public final boolean setScheduled()
+    {
+        final boolean scheduled = _scheduled.compareAndSet(false, true);
+        if (scheduled)
+        {
+            _scheduledTime = System.currentTimeMillis();
+        }
+        return scheduled;
+    }
+
+    @Override
+    public final void clearScheduled()
+    {
+        _scheduled.set(false);
+        _scheduledTime = 0;
+    }
+
+    @Override
+    public final long getScheduledTime()
+    {
+        return _scheduledTime;
+    }
+
+    @Override
+    public final void setMaxWriteIdleMillis(final long millis)
+    {
+        _maxWriteIdleMillis.set(millis);
+    }
+
+    @Override
+    public final void setMaxReadIdleMillis(final long millis)
+    {
+        _maxReadIdleMillis.set(millis);
+    }
+
+    @Override
+    public final long getMaxReadIdleMillis()
     {
         return _maxReadIdleMillis.get();
     }
 
     @Override
-    public long getMaxWriteIdleMillis()
+    public final long getMaxWriteIdleMillis()
     {
         return _maxWriteIdleMillis.get();
     }
-
     @Override
-    public void reserveOutboundMessageSpace(long size)
-    {
-        if (_usedOutboundMessageSpace.addAndGet(size) > _outboundMessageBufferLimit)
-        {
-            _protocolEngine.setMessageAssignmentSuspended(true, false);
-        }
-    }
-
-    @Override
-    public String getTransportInfo()
-    {
-        return _delegate.getTransportInfo();
-    }
-
-    boolean wantsRead()
-    {
-        return _fullyWritten;
-    }
-
-    boolean wantsWrite()
-    {
-        return !_fullyWritten;
-    }
-
-    public boolean isStateChanged()
+    public final boolean isStateChanged()
     {
         return _protocolEngine.hasWork();
     }
 
-    public void doPreWork()
+    @Override
+    public final boolean wantsRead()
     {
-        if (!_closed.get())
-        {
-            long currentTime = System.currentTimeMillis();
-            long schedulingDelay = currentTime - getScheduledTime();
-            if (!_schedulingDelayNotificationListeners.isEmpty())
-            {
-                for (SchedulingDelayNotificationListener listener : _schedulingDelayNotificationListeners)
-                {
-                    listener.notifySchedulingDelay(schedulingDelay);
-                }
-            }
-        }
+        return _fullyWritten;
     }
 
+    @Override
+    public final boolean wantsWrite()
+    {
+        return !_fullyWritten;
+    }
+
+    @Override
+    public final boolean isPartialRead()
+    {
+        return _partialRead;
+    }
+
+    @Override
     public boolean doWork()
     {
         _protocolEngine.clearWork();
-        if (!_closed.get())
+        try
         {
-            try
+
+            if (!isClosed() && (!wantsConnect() || completeConnection()))
             {
                 long currentTime = System.currentTimeMillis();
                 int tick = getTicker().getTimeToNextTick(currentTime);
@@ -278,14 +278,16 @@
 
                 boolean processPendingComplete = processPending();
 
-                if(processPendingComplete)
+                if (processPendingComplete)
                 {
                     _pendingIterator = null;
                     _protocolEngine.setTransportBlockedForWriting(false);
                     boolean dataRead = doRead();
-                    _protocolEngine.setTransportBlockedForWriting(!doWrite());
+                    _fullyWritten = doWrite();
+                    _protocolEngine.setTransportBlockedForWriting(!_fullyWritten);
 
-                    if (!_fullyWritten || dataRead || (_delegate.needsWork() && _delegate.getNetInputBuffer().position() != 0))
+                    if (!_fullyWritten || dataRead || (_delegate.needsWork()
+                                                       && _delegate.getNetInputBuffer().position() != 0))
                     {
                         _protocolEngine.notifyWork();
                     }
@@ -299,34 +301,33 @@
                 {
                     _protocolEngine.notifyWork();
                 }
-
-            }
-            catch (IOException |
-                    ConnectionScopedRuntimeException e)
-            {
-                if (LOGGER.isDebugEnabled())
-                {
-                    LOGGER.debug("Exception performing I/O for connection '{}'",
-                                 _remoteSocketAddress, e);
-                }
-                else
-                {
-                    LOGGER.info("Exception performing I/O for connection '{}' : {}",
-                                _remoteSocketAddress, e.getMessage());
-                }
-
-                if(_closed.compareAndSet(false,true))
-                {
-                    _protocolEngine.notifyWork();
-                }
-            }
-            finally
-            {
-                _protocolEngine.setIOThread(null);
             }
         }
+        catch (IOException |
+                ConnectionScopedRuntimeException e)
+        {
+            if (LOGGER.isDebugEnabled())
+            {
+                LOGGER.debug("Exception performing I/O for connection '{}'",
+                             getRemoteAddressString(), e);
+            }
+            else
+            {
+                LOGGER.info("Exception performing I/O for connection '{}' : {}",
+                            getRemoteAddressString(), e.getMessage());
+            }
 
-        final boolean closed = _closed.get();
+            if(setClosed())
+            {
+                _protocolEngine.notifyWork();
+            }
+        }
+        finally
+        {
+            _protocolEngine.setIOThread(null);
+        }
+
+        final boolean closed = isClosed();
         if (closed)
         {
             shutdown();
@@ -336,17 +337,12 @@
 
     }
 
-    @Override
-    public void addSchedulingDelayNotificationListeners(final SchedulingDelayNotificationListener listener)
+    private boolean completeConnection() throws IOException
     {
-        _schedulingDelayNotificationListeners.add(listener);
+        boolean finishConnect = getSocketChannel().finishConnect();
+        return finishConnect  && !wantsConnect();
     }
 
-    @Override
-    public void removeSchedulingDelayNotificationListeners(final SchedulingDelayNotificationListener listener)
-    {
-        _schedulingDelayNotificationListeners.remove(listener);
-    }
 
     private boolean processPending() throws IOException
     {
@@ -355,14 +351,14 @@
             _pendingIterator = _protocolEngine.processPendingIterator();
         }
 
-        final int networkBufferSize = _port.getNetworkBufferSize();
+        final int networkBufferSize = getNetworkBufferSize();
 
         while(_pendingIterator.hasNext())
         {
             long size = getBufferedSize();
             if(size >= networkBufferSize)
             {
-                doWrite();
+                _fullyWritten = doWrite();
                 long bytesWritten = size - getBufferedSize();
                 if(bytesWritten < (networkBufferSize / 2))
                 {
@@ -379,19 +375,123 @@
         boolean complete = !_pendingIterator.hasNext();
         if (getBufferedSize() >= networkBufferSize)
         {
-            doWrite();
+            _fullyWritten = doWrite();
             complete &= getBufferedSize() < networkBufferSize /2;
         }
         return complete;
     }
 
-    private long getBufferedSize()
+    protected abstract int getNetworkBufferSize();
+
+
+    @Override
+    public final void doPreWork()
+    {
+        if (!isClosed())
+        {
+            long currentTime = System.currentTimeMillis();
+            long schedulingDelay = currentTime - getScheduledTime();
+            if (!_schedulingDelayNotificationListeners.isEmpty())
+            {
+                for (SchedulingDelayNotificationListener listener : _schedulingDelayNotificationListeners)
+                {
+                    listener.notifySchedulingDelay(schedulingDelay);
+                }
+            }
+        }
+    }
+
+
+    /**
+     * doRead is not reentrant.
+     */
+    boolean doRead() throws IOException
+    {
+        _partialRead = false;
+        if(!isClosed() && _delegate.readyForRead())
+        {
+            int readData = readFromNetwork();
+
+            if (readData > 0)
+            {
+                return _delegate.processData();
+            }
+            else
+            {
+                return false;
+            }
+        }
+        else
+        {
+            return false;
+        }
+    }
+
+    @Override
+    public long writeToTransport(Collection<QpidByteBuffer> buffers) throws IOException
+    {
+        long written  = QpidByteBuffer.write(getSocketChannel(), buffers);
+        if (LOGGER.isDebugEnabled())
+        {
+            LOGGER.debug("Written " + written + " bytes");
+        }
+        return written;
+    }
+
+    protected int readFromNetwork() throws IOException
+    {
+        QpidByteBuffer buffer = _delegate.getNetInputBuffer();
+
+        int read = buffer.read(getSocketChannel());
+        if (read == -1)
+        {
+            setClosed();
+        }
+
+        _partialRead = read != 0;
+
+        if (LOGGER.isDebugEnabled())
+        {
+            LOGGER.debug("Read " + read + " byte(s)");
+        }
+        return read;
+    }
+
+
+
+
+    @Override
+    public final void addSchedulingDelayNotificationListeners(final SchedulingDelayNotificationListener listener)
+    {
+        _schedulingDelayNotificationListeners.add(listener);
+    }
+
+    @Override
+    public final void removeSchedulingDelayNotificationListeners(final SchedulingDelayNotificationListener listener)
+    {
+        _schedulingDelayNotificationListeners.remove(listener);
+    }
+
+    @Override
+    public final ByteBufferSender getSender()
+    {
+        return this;
+    }
+
+    @Override
+    public final boolean isDirectBufferPreferred()
+    {
+        return true;
+    }
+
+    private final long getBufferedSize()
     {
         // Avoids iterator garbage if empty
         if (_buffers.isEmpty())
         {
             return 0L;
         }
+
         long totalSize = 0L;
         for(QpidByteBuffer buf : _buffers)
         {
@@ -400,7 +500,44 @@
         return totalSize;
     }
 
-    private void shutdown()
+    final boolean doWrite() throws IOException
+    {
+        boolean fullyWritten = _delegate.doWrite(_buffers);
+        while(!_buffers.isEmpty())
+        {
+            QpidByteBuffer buf = _buffers.peek();
+            if(buf.hasRemaining())
+            {
+                break;
+            }
+            _buffers.poll();
+            buf.dispose();
+        }
+        if (fullyWritten)
+        {
+            _usedOutboundMessageSpace.set(0);
+        }
+        return fullyWritten;
+
+    }
+
+    @Override
+    public final void send(final QpidByteBuffer msg)
+    {
+
+        if (isClosed())
+        {
+            LOGGER.warn("Send ignored as the connection is already closed");
+        }
+        else if (msg.remaining() > 0)
+        {
+            _buffers.add(msg.duplicate());
+        }
+        msg.position(msg.limit());
+    }
+
+
+    protected final void shutdown()
     {
         if (_hasShutdown.getAndSet(true))
         {
@@ -411,7 +548,9 @@
         {
             shutdownInput();
             shutdownFinalWrite();
+
             _protocolEngine.closed();
+
             shutdownOutput();
         }
         finally
@@ -428,12 +567,12 @@
                 }
                 finally
                 {
-                    _socketChannel.close();
+                    getSocketChannel().close();
                 }
             }
             catch (IOException e)
             {
-                LOGGER.info("Exception closing socket '{}': {}", _remoteSocketAddress, e.getMessage());
+                LOGGER.info("Exception closing socket '{}': {}", getRemoteAddressString(), e.getMessage());
             }
 
             if (SystemUtils.isWindows())
@@ -454,7 +593,7 @@
         }
         catch (IOException e)
         {
-            LOGGER.info("Exception performing final write/close for '{}': {}", _remoteSocketAddress, e.getMessage());
+            LOGGER.info("Exception performing final write/close for '{}': {}", getRemoteAddressString(), e.getMessage());
         }
     }
 
@@ -464,11 +603,11 @@
         {
             try
             {
-                _socketChannel.shutdownOutput();
+                getSocketChannel().shutdownOutput();
             }
             catch (IOException e)
             {
-                LOGGER.info("Exception closing socket '{}': {}", _remoteSocketAddress, e.getMessage());
+                LOGGER.info("Exception closing socket '{}': {}", getRemoteAddressString(), e.getMessage());
             }
             finally
             {
@@ -484,11 +623,11 @@
         {
             try
             {
-                _socketChannel.shutdownInput();
+                getSocketChannel().shutdownInput();
             }
             catch (IOException e)
             {
-                LOGGER.info("Exception shutting down input for '{}': {}", _remoteSocketAddress, e.getMessage());
+                LOGGER.info("Exception shutting down input for '{}': {}", getRemoteAddressString(), e.getMessage());
             }
             finally
             {
@@ -497,197 +636,78 @@
         }
     }
 
-    /**
-     * doRead is not reentrant.
-     */
-    boolean doRead() throws IOException
+
+    @Override
+    public final void start()
     {
-        _partialRead = false;
-        if(!_closed.get() && _delegate.readyForRead())
-        {
-            int readData = readFromNetwork();
-
-            if (readData > 0)
-            {
-                return _delegate.processData();
-            }
-            else
-            {
-                return false;
-            }
-        }
-        else
-        {
-            return false;
-        }
-    }
-
-    long writeToTransport(Collection<QpidByteBuffer> buffers) throws IOException
-    {
-        long written  = QpidByteBuffer.write(_socketChannel, buffers);
-        if (LOGGER.isDebugEnabled())
-        {
-            LOGGER.debug("Written " + written + " bytes");
-        }
-        return written;
-    }
-
-    private boolean doWrite() throws IOException
-    {
-        _fullyWritten = _delegate.doWrite(_buffers);
-        while(!_buffers.isEmpty())
-        {
-            QpidByteBuffer buf = _buffers.peek();
-            if(buf.hasRemaining())
-            {
-                break;
-            }
-            _buffers.poll();
-            buf.dispose();
-        }
-        if (_fullyWritten)
-        {
-            _usedOutboundMessageSpace.set(0);
-        }
-        return _fullyWritten;
-
-    }
-
-    protected int readFromNetwork() throws IOException
-    {
-        QpidByteBuffer buffer = _delegate.getNetInputBuffer();
-
-        int read = buffer.read(_socketChannel);
-        if (read == -1)
-        {
-            _closed.set(true);
-        }
-
-        _partialRead = read != 0;
-
-        if (LOGGER.isDebugEnabled())
-        {
-            LOGGER.debug("Read " + read + " byte(s)");
-        }
-        return read;
     }
 
     @Override
-    public boolean isDirectBufferPreferred()
+    public final void flush()
     {
-        return true;
     }
 
-    @Override
-    public void send(final QpidByteBuffer msg)
-    {
 
-        if (_closed.get())
+    @Override
+    public final void close()
+    {
+        LOGGER.debug("Closing " + getRemoteAddressString());
+        if(setClosed())
         {
-            LOGGER.warn("Send ignored as the connection is already closed");
+            _protocolEngine.notifyWork();
+            getSelectionTask().wakeup();
         }
-        else if (msg.remaining() > 0)
-        {
-            _buffers.add(msg.duplicate());
-        }
-        msg.position(msg.limit());
     }
 
+
     @Override
-    public void flush()
-    {
-    }
-
-    public final void pushScheduler(NetworkConnectionScheduler scheduler)
-    {
-        _schedulerDeque.addFirst(scheduler);
-    }
-
-    public final NetworkConnectionScheduler popScheduler()
-    {
-        return _schedulerDeque.removeFirst();
-    }
-
-    public final NetworkConnectionScheduler getScheduler()
-    {
-        return _schedulerDeque.peekFirst();
-    }
-
-    @Override
-    public String toString()
-    {
-        return "[NonBlockingConnection " + _remoteSocketAddress + "]";
-    }
-
     public void processAmqpData(QpidByteBuffer applicationData)
     {
         _protocolEngine.received(applicationData);
     }
 
-    public void setTransportEncryption(TransportEncryption transportEncryption)
-    {
-        NonBlockingConnectionDelegate oldDelegate = _delegate;
-        switch (transportEncryption)
-        {
-            case TLS:
-                _onTransportEncryptionAction.run();
-                _delegate = new NonBlockingConnectionTLSDelegate(this, _port);
-                break;
-            case NONE:
-                _delegate = new NonBlockingConnectionPlainDelegate(this, _port);
-                break;
-            default:
-                throw new IllegalArgumentException("unknown TransportEncryption " + transportEncryption);
-        }
-        if(oldDelegate != null)
-        {
-            QpidByteBuffer src = oldDelegate.getNetInputBuffer().duplicate();
-            src.flip();
-            _delegate.getNetInputBuffer().put(src);
-            src.dispose();
-        }
-        LOGGER.debug("Identified transport encryption as " + transportEncryption);
-    }
-
-    public boolean setScheduled()
-    {
-        final boolean scheduled = _scheduled.compareAndSet(false, true);
-        if (scheduled)
-        {
-            _scheduledTime = System.currentTimeMillis();
-        }
-        return scheduled;
-    }
-
-    public void clearScheduled()
-    {
-        _scheduled.set(false);
-        _scheduledTime = 0;
-    }
 
     @Override
-    public long getScheduledTime()
+    public final void reserveOutboundMessageSpace(long size)
     {
-        return _scheduledTime;
-    }
-
-    void reportUnexpectedByteBufferSizeUsage()
-    {
-        if (!_unexpectedByteBufferSizeReported)
+        if (_usedOutboundMessageSpace.addAndGet(size) > getOutboundMessageBufferLimit())
         {
-            LOGGER.info("At least one frame unexpectedly does not fit into default byte buffer size ({}B) on a connection {}.",
-                    _port.getNetworkBufferSize(), this.toString());
-            _unexpectedByteBufferSizeReported = true;
+            _protocolEngine.setMessageAssignmentSuspended(true, false);
         }
     }
 
-    public SelectorThread.SelectionTask getSelectionTask()
+
+    @Override
+    public final Ticker getTicker()
     {
-        return _selectionTask;
+        return _protocolEngine.getAggregateTicker();
     }
 
-    public void setSelectionTask(final SelectorThread.SelectionTask selectionTask)
+
+    protected abstract long getOutboundMessageBufferLimit();
+
+
+    public final void reportUnexpectedByteBufferSizeUsage()
     {
-        _selectionTask = selectionTask;
+        if (_unexpectedByteBufferSizeReported.compareAndSet(false,true))
+        {
+            LOGGER.info("At least one frame unexpectedly does not fit into default byte buffer size ({}B) on a connection {}.",
+                        getNetworkBufferSize(), this.toString());
+        }
+    }
+
+    protected NonBlockingConnectionDelegate getDelegate()
+    {
+        return _delegate;
+    }
+
+    protected void setDelegate(NonBlockingConnectionDelegate delegate)
+    {
+        _delegate = delegate;
+    }
+
+    public final ProtocolEngine getProtocolEngine()
+    {
+        return _protocolEngine;
     }
 }
diff --git a/broker-core/src/main/java/org/apache/qpid/server/transport/NonBlockingConnectionPlainDelegate.java b/broker-core/src/main/java/org/apache/qpid/server/transport/NonBlockingConnectionPlainDelegate.java
index d4b1257..3bfd56e 100644
--- a/broker-core/src/main/java/org/apache/qpid/server/transport/NonBlockingConnectionPlainDelegate.java
+++ b/broker-core/src/main/java/org/apache/qpid/server/transport/NonBlockingConnectionPlainDelegate.java
@@ -24,7 +24,6 @@
 import java.security.cert.Certificate;
 import java.util.Collection;
 
-import org.apache.qpid.server.model.port.AmqpPort;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -34,14 +33,14 @@
 {
     private static final Logger LOGGER = LoggerFactory.getLogger(NonBlockingConnectionPlainDelegate.class);
 
-    private final NonBlockingConnection _parent;
+    private final SchedulableConnection _parent;
     private final int _networkBufferSize;
     private volatile QpidByteBuffer _netInputBuffer;
 
-    public NonBlockingConnectionPlainDelegate(NonBlockingConnection parent, AmqpPort<?> port)
+    public NonBlockingConnectionPlainDelegate(SchedulableConnection parent, int networkBufferSize)
     {
         _parent = parent;
-        _networkBufferSize = port.getNetworkBufferSize();
+        _networkBufferSize = networkBufferSize;
         _netInputBuffer = QpidByteBuffer.allocateDirect(_networkBufferSize);
     }
 
diff --git a/broker-core/src/main/java/org/apache/qpid/server/transport/NonBlockingConnectionTLSDelegate.java b/broker-core/src/main/java/org/apache/qpid/server/transport/NonBlockingConnectionTLSDelegate.java
index 564eb64..cda7c04 100644
--- a/broker-core/src/main/java/org/apache/qpid/server/transport/NonBlockingConnectionTLSDelegate.java
+++ b/broker-core/src/main/java/org/apache/qpid/server/transport/NonBlockingConnectionTLSDelegate.java
@@ -19,19 +19,6 @@
 
 package org.apache.qpid.server.transport;
 
-import org.apache.qpid.bytebuffer.QpidByteBuffer;
-import org.apache.qpid.server.model.port.AmqpPort;
-import org.apache.qpid.server.util.ServerScopedRuntimeException;
-import org.apache.qpid.transport.network.security.ssl.SSLUtil;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import javax.net.ssl.SSLEngine;
-import javax.net.ssl.SSLEngineResult;
-import javax.net.ssl.SSLException;
-import javax.net.ssl.SSLPeerUnverifiedException;
-import javax.net.ssl.SSLSession;
-
 import java.io.IOException;
 import java.security.Principal;
 import java.security.cert.Certificate;
@@ -41,12 +28,24 @@
 import java.util.List;
 import java.util.ListIterator;
 
+import javax.net.ssl.SSLEngine;
+import javax.net.ssl.SSLEngineResult;
+import javax.net.ssl.SSLException;
+import javax.net.ssl.SSLPeerUnverifiedException;
+import javax.net.ssl.SSLSession;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import org.apache.qpid.bytebuffer.QpidByteBuffer;
+import org.apache.qpid.server.util.ServerScopedRuntimeException;
+
 public class NonBlockingConnectionTLSDelegate implements NonBlockingConnectionDelegate
 {
     private static final Logger LOGGER = LoggerFactory.getLogger(NonBlockingConnectionTLSDelegate.class);
 
     private final SSLEngine _sslEngine;
-    private final NonBlockingConnection _parent;
+    private final SchedulableConnection _parent;
     private final int _networkBufferSize;
     private SSLEngineResult _status;
     private final List<QpidByteBuffer> _encryptedOutput = new ArrayList<>();
@@ -58,11 +57,11 @@
     private QpidByteBuffer _applicationBuffer;
 
 
-    public NonBlockingConnectionTLSDelegate(NonBlockingConnection parent, AmqpPort port)
+    public NonBlockingConnectionTLSDelegate(SchedulableConnection parent, int networkBufferSize, SSLEngine sslEngine)
     {
         _parent = parent;
-        _sslEngine = createSSLEngine(port);
-        _networkBufferSize = port.getNetworkBufferSize();
+        _sslEngine = sslEngine;
+        _networkBufferSize = networkBufferSize;
 
         final int tlsPacketBufferSize = _sslEngine.getSession().getPacketBufferSize();
         if (tlsPacketBufferSize > _networkBufferSize)
@@ -313,28 +312,6 @@
         }
     }
 
-    private SSLEngine createSSLEngine(AmqpPort<?> port)
-    {
-        SSLEngine sslEngine = port.getSSLContext().createSSLEngine();
-        sslEngine.setUseClientMode(false);
-        SSLUtil.updateEnabledTlsProtocols(sslEngine, port.getTlsProtocolWhiteList(), port.getTlsProtocolBlackList());
-        SSLUtil.updateEnabledCipherSuites(sslEngine, port.getTlsCipherSuiteWhiteList(), port.getTlsCipherSuiteBlackList());
-        if(port.getTlsCipherSuiteWhiteList() != null && !port.getTlsCipherSuiteWhiteList().isEmpty())
-        {
-            SSLUtil.useCipherOrderIfPossible(sslEngine);
-        }
-
-        if(port.getNeedClientAuth())
-        {
-            sslEngine.setNeedClientAuth(true);
-        }
-        else if(port.getWantClientAuth())
-        {
-            sslEngine.setWantClientAuth(true);
-        }
-        return sslEngine;
-    }
-
     @Override
     public QpidByteBuffer getNetInputBuffer()
     {
diff --git a/broker-core/src/main/java/org/apache/qpid/server/transport/NonBlockingConnectionUndecidedDelegate.java b/broker-core/src/main/java/org/apache/qpid/server/transport/NonBlockingConnectionUndecidedDelegate.java
index f80bd4e..6d7c723 100644
--- a/broker-core/src/main/java/org/apache/qpid/server/transport/NonBlockingConnectionUndecidedDelegate.java
+++ b/broker-core/src/main/java/org/apache/qpid/server/transport/NonBlockingConnectionUndecidedDelegate.java
@@ -19,22 +19,22 @@
 
 package org.apache.qpid.server.transport;
 
-import org.apache.qpid.bytebuffer.QpidByteBuffer;
-import org.apache.qpid.transport.network.TransportEncryption;
-
 import java.io.IOException;
 import java.security.Principal;
 import java.security.cert.Certificate;
 import java.util.Collection;
 
+import org.apache.qpid.bytebuffer.QpidByteBuffer;
+import org.apache.qpid.transport.network.TransportEncryption;
+
 public class NonBlockingConnectionUndecidedDelegate implements NonBlockingConnectionDelegate
 {
     private static final int NUMBER_OF_BYTES_FOR_TLS_CHECK = 6;
-    public final NonBlockingConnection _parent;
+    public final NonBlockingInboundConnection _parent;
 
     private QpidByteBuffer _netInputBuffer;
 
-    public NonBlockingConnectionUndecidedDelegate(NonBlockingConnection parent)
+    public NonBlockingConnectionUndecidedDelegate(NonBlockingInboundConnection parent)
     {
         _parent = parent;
         _netInputBuffer = QpidByteBuffer.allocateDirect(NUMBER_OF_BYTES_FOR_TLS_CHECK);
diff --git a/broker-core/src/main/java/org/apache/qpid/server/transport/NonBlockingInboundConnection.java b/broker-core/src/main/java/org/apache/qpid/server/transport/NonBlockingInboundConnection.java
new file mode 100644
index 0000000..11ca4de
--- /dev/null
+++ b/broker-core/src/main/java/org/apache/qpid/server/transport/NonBlockingInboundConnection.java
@@ -0,0 +1,148 @@
+/*
+*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.server.transport;
+
+import java.nio.channels.SocketChannel;
+import java.util.Set;
+
+import javax.net.ssl.SSLEngine;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import org.apache.qpid.bytebuffer.QpidByteBuffer;
+import org.apache.qpid.server.model.port.AmqpPort;
+import org.apache.qpid.transport.network.TransportEncryption;
+import org.apache.qpid.transport.network.security.ssl.SSLUtil;
+
+public class NonBlockingInboundConnection extends NonBlockingConnection
+{
+    private static final Logger LOGGER = LoggerFactory.getLogger(NonBlockingInboundConnection.class);
+
+    private final Runnable _onTransportEncryptionAction;
+    private final long _outboundMessageBufferLimit;
+
+
+    private final AmqpPort _port;
+
+    public NonBlockingInboundConnection(SocketChannel socketChannel,
+                                        ProtocolEngine protocolEngine,
+                                        final Set<TransportEncryption> encryptionSet,
+                                        final Runnable onTransportEncryptionAction,
+                                        final NetworkConnectionScheduler scheduler,
+                                        final AmqpPort port)
+    {
+        super(socketChannel, protocolEngine, scheduler, socketChannel.socket().getRemoteSocketAddress().toString());
+        _onTransportEncryptionAction = onTransportEncryptionAction;
+
+        _port = port;
+
+        _outboundMessageBufferLimit = (long) _port.getContextValue(Long.class,
+                                                                   AmqpPort.PORT_AMQP_OUTBOUND_MESSAGE_BUFFER_SIZE);
+
+
+        if(encryptionSet.size() == 1)
+        {
+            setTransportEncryption(encryptionSet.iterator().next());
+        }
+        else
+        {
+            setDelegate(new NonBlockingConnectionUndecidedDelegate(this));
+        }
+
+    }
+
+    static SSLEngine createSSLEngine(AmqpPort<?> port)
+    {
+        SSLEngine sslEngine = port.getSSLContext().createSSLEngine();
+        sslEngine.setUseClientMode(false);
+        SSLUtil.updateEnabledTlsProtocols(sslEngine, port.getTlsProtocolWhiteList(), port.getTlsProtocolBlackList());
+        SSLUtil.updateEnabledCipherSuites(sslEngine, port.getTlsCipherSuiteWhiteList(), port.getTlsCipherSuiteBlackList());
+        if(port.getTlsCipherSuiteWhiteList() != null && !port.getTlsCipherSuiteWhiteList().isEmpty())
+        {
+            SSLUtil.useCipherOrderIfPossible(sslEngine);
+        }
+
+        if(port.getNeedClientAuth())
+        {
+            sslEngine.setNeedClientAuth(true);
+        }
+        else if(port.getWantClientAuth())
+        {
+            sslEngine.setWantClientAuth(true);
+        }
+        return sslEngine;
+    }
+
+    @Override
+    protected long getOutboundMessageBufferLimit()
+    {
+        return _outboundMessageBufferLimit;
+    }
+
+    @Override
+    protected int getNetworkBufferSize()
+    {
+        return _port.getNetworkBufferSize();
+    }
+
+    @Override
+    public boolean wantsConnect()
+    {
+        return false;
+    }
+
+
+    @Override
+    public String toString()
+    {
+        return "[InboundConnection " + getRemoteAddressString() + "]";
+    }
+
+    public void setTransportEncryption(TransportEncryption transportEncryption)
+    {
+        NonBlockingConnectionDelegate oldDelegate = getDelegate();
+        switch (transportEncryption)
+        {
+            case TLS:
+                _onTransportEncryptionAction.run();
+                setDelegate(new NonBlockingConnectionTLSDelegate(this,
+                                                                 _port.getNetworkBufferSize(),
+                                                                 createSSLEngine(_port)));
+                break;
+            case NONE:
+                setDelegate(new NonBlockingConnectionPlainDelegate(this, _port.getNetworkBufferSize()));
+                break;
+            default:
+                throw new IllegalArgumentException("unknown TransportEncryption " + transportEncryption);
+        }
+        if(oldDelegate != null)
+        {
+            QpidByteBuffer src = oldDelegate.getNetInputBuffer().duplicate();
+            src.flip();
+            getDelegate().getNetInputBuffer().put(src);
+            src.dispose();
+        }
+        LOGGER.debug("Identified transport encryption as " + transportEncryption);
+    }
+
+
+}
diff --git a/broker-core/src/main/java/org/apache/qpid/server/transport/NonBlockingNetworkTransport.java b/broker-core/src/main/java/org/apache/qpid/server/transport/NonBlockingNetworkTransport.java
index ad1435b..77ed00f 100644
--- a/broker-core/src/main/java/org/apache/qpid/server/transport/NonBlockingNetworkTransport.java
+++ b/broker-core/src/main/java/org/apache/qpid/server/transport/NonBlockingNetworkTransport.java
@@ -20,6 +20,8 @@
  */
 package org.apache.qpid.server.transport;
 
+import static org.apache.qpid.transport.ConnectionSettings.WILDCARD_ADDRESS;
+
 import java.io.IOException;
 import java.net.BindException;
 import java.net.InetSocketAddress;
@@ -30,16 +32,14 @@
 import java.util.EnumSet;
 import java.util.Set;
 
-import org.apache.qpid.server.model.port.AmqpPort;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 import org.apache.qpid.configuration.CommonProperties;
+import org.apache.qpid.server.model.port.AmqpPort;
 import org.apache.qpid.transport.TransportException;
 import org.apache.qpid.transport.network.TransportEncryption;
 
-import static org.apache.qpid.transport.ConnectionSettings.WILDCARD_ADDRESS;
-
 public class NonBlockingNetworkTransport
 {
 
@@ -156,10 +156,10 @@
 
 
                     NonBlockingConnection connection =
-                            new NonBlockingConnection(socketChannel,
-                                                      engine,
-                                                      _encryptionSet,
-                                                      new Runnable()
+                            new NonBlockingInboundConnection(socketChannel,
+                                                             engine,
+                                                             _encryptionSet,
+                                                             new Runnable()
                                                       {
 
                                                           @Override
@@ -168,8 +168,8 @@
                                                               engine.encryptedTransport();
                                                           }
                                                       },
-                                                      _scheduler,
-                                                      _port);
+                                                             _scheduler,
+                                                             _port);
 
                     engine.setNetworkConnection(connection);
 
diff --git a/broker-core/src/main/java/org/apache/qpid/server/transport/NonBlockingOutboundConnection.java b/broker-core/src/main/java/org/apache/qpid/server/transport/NonBlockingOutboundConnection.java
new file mode 100644
index 0000000..117a01b
--- /dev/null
+++ b/broker-core/src/main/java/org/apache/qpid/server/transport/NonBlockingOutboundConnection.java
@@ -0,0 +1,198 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.server.transport;
+
+import java.nio.channels.SocketChannel;
+import java.security.GeneralSecurityException;
+import java.util.ArrayList;
+import java.util.Collection;
+
+import javax.net.ssl.KeyManager;
+import javax.net.ssl.SSLContext;
+import javax.net.ssl.SSLEngine;
+import javax.net.ssl.TrustManager;
+import javax.net.ssl.X509TrustManager;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import org.apache.qpid.server.federation.OutboundProtocolEngine;
+import org.apache.qpid.server.model.Container;
+import org.apache.qpid.server.model.KeyStore;
+import org.apache.qpid.server.model.RemoteHostAddress;
+import org.apache.qpid.server.model.TrustStore;
+import org.apache.qpid.server.model.port.AmqpPort;
+import org.apache.qpid.server.plugin.OutboundProtocolEngineCreator;
+import org.apache.qpid.server.plugin.QpidServiceLoader;
+import org.apache.qpid.server.util.Action;
+import org.apache.qpid.server.virtualhost.AbstractVirtualHost;
+import org.apache.qpid.transport.network.security.ssl.QpidMultipleTrustManager;
+import org.apache.qpid.transport.network.security.ssl.SSLUtil;
+
+public class NonBlockingOutboundConnection extends NonBlockingConnection
+{
+    private static final Logger LOGGER = LoggerFactory.getLogger(NonBlockingOutboundConnection.class);
+
+    private final AbstractVirtualHost<?> _virtualHost;
+    private final RemoteHostAddress<?> _address;
+    private final int _networkBufferSize;
+    private final long _outboundMessageBufferLimit;
+    private volatile boolean _connected;
+
+    public NonBlockingOutboundConnection(SocketChannel socketChannel,
+                                         final RemoteHostAddress<?> address,
+                                         final NetworkConnectionScheduler networkConnectionScheduler,
+                                         final AbstractVirtualHost<?> virtualHost,
+                                         final Action<Boolean> onConnectionLoss)
+    {
+        super(socketChannel, createProtocolEngine(address, virtualHost), networkConnectionScheduler, address.getAddress()+":"+address.getPort());
+        OutboundProtocolEngine protocolEngine = (OutboundProtocolEngine) getProtocolEngine();
+        protocolEngine.setConnection(this);
+        protocolEngine.setOnClosedTask(onConnectionLoss);
+        _virtualHost = virtualHost;
+        _address = address;
+        _networkBufferSize = virtualHost.getAncestor(Container.class).getNetworkBufferSize();
+        _outboundMessageBufferLimit = (long) virtualHost.getContextValue(Long.class,
+                                                                   AmqpPort.PORT_AMQP_OUTBOUND_MESSAGE_BUFFER_SIZE);
+
+        final NonBlockingConnectionDelegate delegate;
+        switch(address.getTransport())
+        {
+            case TCP:
+                delegate = new NonBlockingConnectionPlainDelegate(this, getNetworkBufferSize());
+                break;
+            case SSL:
+                delegate = new NonBlockingConnectionTLSDelegate(this, getNetworkBufferSize(), createSSLEngine(address));
+                break;
+            default:
+                throw new IllegalArgumentException("Transport '"+address.getTransport()+"' is not supported");
+        }
+        setDelegate(delegate);
+    }
+
+    private static ProtocolEngine createProtocolEngine(final RemoteHostAddress<?> address, final AbstractVirtualHost<?> virtualHost)
+    {
+        for(OutboundProtocolEngineCreator engineCreator : (new QpidServiceLoader()).instancesOf(OutboundProtocolEngineCreator.class))
+        {
+            if(engineCreator.getVersion().equals(address.getProtocol()))
+            {
+                return engineCreator.newProtocolEngine(address, virtualHost);
+            }
+        }
+
+        return null;
+    }
+
+
+    @Override
+    protected long getOutboundMessageBufferLimit()
+    {
+        return _outboundMessageBufferLimit;
+    }
+
+    @Override
+    protected int getNetworkBufferSize()
+    {
+        return _networkBufferSize;
+    }
+
+
+    @Override
+    public boolean wantsConnect()
+    {
+        return !_connected && !(_connected = getSocketChannel().isConnected());
+    }
+
+    static SSLEngine createSSLEngine(RemoteHostAddress<?> address)
+    {
+        SSLEngine sslEngine = createSslContext(address).createSSLEngine();
+        sslEngine.setUseClientMode(true);
+        SSLUtil.updateEnabledTlsProtocols(sslEngine, address.getTlsProtocolWhiteList(), address.getTlsProtocolBlackList());
+        SSLUtil.updateEnabledCipherSuites(sslEngine, address.getTlsCipherSuiteWhiteList(), address.getTlsCipherSuiteBlackList());
+        if(address.getTlsCipherSuiteWhiteList() != null && !address.getTlsCipherSuiteWhiteList().isEmpty())
+        {
+            SSLUtil.useCipherOrderIfPossible(sslEngine);
+        }
+
+        return sslEngine;
+    }
+
+    private static SSLContext createSslContext(RemoteHostAddress<?> address)
+    {
+        KeyStore keyStore = address.getKeyStore();
+        Collection<TrustStore> trustStores = address.getTrustStores();
+
+        try
+        {
+            SSLContext sslContext = SSLUtil.tryGetSSLContext();
+
+            KeyManager[] keyManagers = keyStore.getKeyManagers();
+
+            TrustManager[] trustManagers;
+            if(trustStores == null || trustStores.isEmpty())
+            {
+                trustManagers = null;
+            }
+            else if(trustStores.size() == 1)
+            {
+                trustManagers = trustStores.iterator().next().getTrustManagers();
+            }
+            else
+            {
+                Collection<TrustManager> trustManagerList = new ArrayList<>();
+                final QpidMultipleTrustManager mulTrustManager = new QpidMultipleTrustManager();
+
+                for(TrustStore ts : trustStores)
+                {
+                    TrustManager[] managers = ts.getTrustManagers();
+                    if(managers != null)
+                    {
+                        for(TrustManager manager : managers)
+                        {
+                            if(manager instanceof X509TrustManager)
+                            {
+                                mulTrustManager.addTrustManager((X509TrustManager)manager);
+                            }
+                            else
+                            {
+                                trustManagerList.add(manager);
+                            }
+                        }
+                    }
+                }
+                if(!mulTrustManager.isEmpty())
+                {
+                    trustManagerList.add(mulTrustManager);
+                }
+                trustManagers = trustManagerList.toArray(new TrustManager[trustManagerList.size()]);
+            }
+            sslContext.init(keyManagers, trustManagers, null);
+
+            return sslContext;
+
+        }
+        catch (GeneralSecurityException e)
+        {
+            throw new IllegalArgumentException("Unable to create SSLContext for key or trust store", e);
+        }
+    }
+
+}
diff --git a/broker-core/src/main/java/org/apache/qpid/server/transport/SchedulableConnection.java b/broker-core/src/main/java/org/apache/qpid/server/transport/SchedulableConnection.java
new file mode 100644
index 0000000..d95bb56
--- /dev/null
+++ b/broker-core/src/main/java/org/apache/qpid/server/transport/SchedulableConnection.java
@@ -0,0 +1,68 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.server.transport;
+
+import java.io.IOException;
+import java.nio.channels.SocketChannel;
+import java.util.Collection;
+
+import org.apache.qpid.bytebuffer.QpidByteBuffer;
+import org.apache.qpid.transport.ByteBufferSender;
+import org.apache.qpid.transport.network.Ticker;
+
+public interface SchedulableConnection extends ServerNetworkConnection, ByteBufferSender
+{
+    String getThreadName();
+
+    boolean isPartialRead();
+
+    Ticker getTicker();
+
+    SocketChannel getSocketChannel();
+
+    boolean wantsRead();
+
+    boolean wantsWrite();
+
+    boolean wantsConnect();
+
+    boolean isStateChanged();
+
+    void doPreWork();
+
+    boolean doWork();
+
+    NetworkConnectionScheduler getScheduler();
+
+    boolean setScheduled();
+
+    void clearScheduled();
+
+    SelectorThread.SelectionTask getSelectionTask();
+
+    void setSelectionTask(SelectorThread.SelectionTask selectionTask);
+
+    void processAmqpData(QpidByteBuffer applicationData);
+
+    long writeToTransport(Collection<QpidByteBuffer> bufferArray) throws IOException;
+
+    void reportUnexpectedByteBufferSizeUsage();
+}
diff --git a/broker-core/src/main/java/org/apache/qpid/server/transport/SelectorThread.java b/broker-core/src/main/java/org/apache/qpid/server/transport/SelectorThread.java
index f8f5f0a..f535347 100644
--- a/broker-core/src/main/java/org/apache/qpid/server/transport/SelectorThread.java
+++ b/broker-core/src/main/java/org/apache/qpid/server/transport/SelectorThread.java
@@ -69,10 +69,10 @@
          * Queue of connections that are not currently scheduled and not registered with the selector.
          * These need to go back into the Selector.
          */
-        private final Queue<NonBlockingConnection> _unregisteredConnections = new ConcurrentLinkedQueue<>();
+        private final Queue<SchedulableConnection> _unregisteredConnections = new ConcurrentLinkedQueue<>();
 
         /** Set of connections that are currently being selected upon */
-        private final Set<NonBlockingConnection> _unscheduledConnections = new HashSet<>();
+        private final Set<SchedulableConnection> _unscheduledConnections = new HashSet<>();
 
 
 
@@ -102,17 +102,17 @@
             return _selector;
         }
 
-        public Queue<NonBlockingConnection> getUnregisteredConnections()
+        public Queue<SchedulableConnection> getUnregisteredConnections()
         {
             return _unregisteredConnections;
         }
 
-        public Set<NonBlockingConnection> getUnscheduledConnections()
+        public Set<SchedulableConnection> getUnscheduledConnections()
         {
             return _unscheduledConnections;
         }
 
-        private List<NonBlockingConnection> processUnscheduledConnections()
+        private List<SchedulableConnection> processUnscheduledConnections()
         {
             _nextTimeout = Integer.MAX_VALUE;
             if (getUnscheduledConnections().isEmpty())
@@ -120,13 +120,13 @@
                 return Collections.emptyList();
             }
 
-            List<NonBlockingConnection> toBeScheduled = new ArrayList<>();
+            List<SchedulableConnection> toBeScheduled = new ArrayList<>();
 
             long currentTime = System.currentTimeMillis();
-            Iterator<NonBlockingConnection> iterator = getUnscheduledConnections().iterator();
+            Iterator<SchedulableConnection> iterator = getUnscheduledConnections().iterator();
             while (iterator.hasNext())
             {
-                NonBlockingConnection connection = iterator.next();
+                SchedulableConnection connection = iterator.next();
 
                 int period = connection.getTicker().getTimeToNextTick(currentTime);
 
@@ -151,10 +151,10 @@
             }
 
             // QPID-7447: prevent unnecessary allocation of empty iterator
-            return toBeScheduled.isEmpty() ? Collections.<NonBlockingConnection>emptyList() : toBeScheduled;
+            return toBeScheduled.isEmpty() ? Collections.<SchedulableConnection>emptyList() : toBeScheduled;
         }
 
-        private List<NonBlockingConnection> processSelectionKeys()
+        private List<SchedulableConnection> processSelectionKeys()
         {
             Set<SelectionKey> selectionKeys = _selector.selectedKeys();
             if (selectionKeys.isEmpty())
@@ -162,7 +162,7 @@
                 return Collections.emptyList();
             }
 
-            List<NonBlockingConnection> toBeScheduled = new ArrayList<>();
+            List<SchedulableConnection> toBeScheduled = new ArrayList<>();
             for (SelectionKey key : selectionKeys)
             {
                 if(key.isAcceptable())
@@ -213,7 +213,7 @@
                 }
                 else
                 {
-                    NonBlockingConnection connection = (NonBlockingConnection) key.attachment();
+                    SchedulableConnection connection = (SchedulableConnection) key.attachment();
                     if(connection != null)
                     {
                         try
@@ -236,15 +236,15 @@
             return toBeScheduled;
         }
 
-        private List<NonBlockingConnection> reregisterUnregisteredConnections()
+        private List<SchedulableConnection> reregisterUnregisteredConnections()
         {
             if (getUnregisteredConnections().isEmpty())
             {
                 return Collections.emptyList();
             }
-            List<NonBlockingConnection> unregisterableConnections = new ArrayList<>();
+            List<SchedulableConnection> unregisterableConnections = new ArrayList<>();
 
-            NonBlockingConnection unregisteredConnection;
+            SchedulableConnection unregisteredConnection;
             while ((unregisteredConnection = getUnregisteredConnections().poll()) != null)
             {
                 getUnscheduledConnections().add(unregisteredConnection);
@@ -263,7 +263,7 @@
             }
 
             // QPID-7447: prevent unnecessary allocation of empty iterator
-            return unregisterableConnections.isEmpty() ? Collections.<NonBlockingConnection>emptyList() : unregisterableConnections;
+            return unregisterableConnections.isEmpty() ? Collections.<SchedulableConnection>emptyList() : unregisterableConnections;
         }
 
         private void performSelect()
@@ -304,21 +304,21 @@
                                 {
                                     _inSelect.set(false);
                                 }
-                                for (NonBlockingConnection connection : processSelectionKeys())
+                                for (SchedulableConnection connection : processSelectionKeys())
                                 {
                                     if (connection.setScheduled())
                                     {
                                         connections.add(new ConnectionProcessor(_scheduler, connection));
                                     }
                                 }
-                                for (NonBlockingConnection connection : reregisterUnregisteredConnections())
+                                for (SchedulableConnection connection : reregisterUnregisteredConnections())
                                 {
                                     if (connection.setScheduled())
                                     {
                                         connections.add(new ConnectionProcessor(_scheduler, connection));
                                     }
                                 }
-                                for (NonBlockingConnection connection : processUnscheduledConnections())
+                                for (SchedulableConnection connection : processUnscheduledConnections())
                                 {
                                     if (connection.setScheduled())
                                     {
@@ -479,10 +479,10 @@
     {
 
         private final NetworkConnectionScheduler _scheduler;
-        private final NonBlockingConnection _connection;
+        private final SchedulableConnection _connection;
         private AtomicBoolean _running = new AtomicBoolean();
 
-        public ConnectionProcessor(final NetworkConnectionScheduler scheduler, final NonBlockingConnection connection)
+        public ConnectionProcessor(final NetworkConnectionScheduler scheduler, final SchedulableConnection connection)
         {
             _scheduler = scheduler;
             _connection = connection;
@@ -511,7 +511,7 @@
         }
     }
 
-    private void unregisterConnection(final NonBlockingConnection connection) throws ClosedChannelException
+    private void unregisterConnection(final SchedulableConnection connection) throws ClosedChannelException
     {
         SelectionKey register = connection.getSocketChannel().register(connection.getSelectionTask().getSelector(), 0);
         register.cancel();
@@ -526,14 +526,15 @@
         }
     }
 
-    private boolean selectionInterestRequiresUpdate(NonBlockingConnection connection)
+    private boolean selectionInterestRequiresUpdate(SchedulableConnection connection)
     {
         SelectionTask selectionTask = connection.getSelectionTask();
         if(selectionTask != null)
         {
             final SelectionKey selectionKey = connection.getSocketChannel().keyFor(selectionTask.getSelector());
             int expectedOps = (connection.wantsRead() ? SelectionKey.OP_READ : 0)
-                              | (connection.wantsWrite() ? SelectionKey.OP_WRITE : 0);
+                              | (connection.wantsWrite() ? SelectionKey.OP_WRITE : 0)
+                              | (connection.wantsConnect() ? SelectionKey.OP_CONNECT : 0);
 
             try
             {
@@ -550,7 +551,7 @@
         }
     }
 
-    public void addConnection(final NonBlockingConnection connection)
+    public void addConnection(final SchedulableConnection connection)
     {
         if(selectionInterestRequiresUpdate(connection))
         {
@@ -562,7 +563,7 @@
 
     }
 
-    public void returnConnectionToSelector(final NonBlockingConnection connection)
+    public void returnConnectionToSelector(final SchedulableConnection connection)
     {
         if(selectionInterestRequiresUpdate(connection))
         {
@@ -588,7 +589,7 @@
         return _selectionTasks[index];
     }
 
-    void removeConnection(NonBlockingConnection connection)
+    void removeConnection(SchedulableConnection connection)
     {
         try
         {
@@ -636,7 +637,7 @@
 
     }
 
-     public void addToWork(final NonBlockingConnection connection)
+     public void addToWork(final SchedulableConnection connection)
      {
          if (_closed.get())
          {
diff --git a/broker-core/src/main/java/org/apache/qpid/server/virtualhost/AbstractSystemMessageSource.java b/broker-core/src/main/java/org/apache/qpid/server/virtualhost/AbstractSystemMessageSource.java
index 4a69f00..935ab60 100644
--- a/broker-core/src/main/java/org/apache/qpid/server/virtualhost/AbstractSystemMessageSource.java
+++ b/broker-core/src/main/java/org/apache/qpid/server/virtualhost/AbstractSystemMessageSource.java
@@ -29,12 +29,14 @@
 import java.util.UUID;
 import java.util.concurrent.CopyOnWriteArrayList;
 
-import org.apache.qpid.server.consumer.ConsumerImpl;
 import org.apache.qpid.server.consumer.ConsumerTarget;
 import org.apache.qpid.server.filter.FilterManager;
 import org.apache.qpid.server.filter.Filterable;
+import org.apache.qpid.server.message.BaseMessageInstance;
+import org.apache.qpid.server.message.ConsumerOption;
 import org.apache.qpid.server.message.InstanceProperties;
 import org.apache.qpid.server.message.MessageInstance;
+import org.apache.qpid.server.message.MessageInstanceConsumer;
 import org.apache.qpid.server.message.MessageSource;
 import org.apache.qpid.server.message.ServerMessage;
 import org.apache.qpid.server.message.internal.InternalMessage;
@@ -48,12 +50,12 @@
 import org.apache.qpid.server.util.Action;
 import org.apache.qpid.server.util.StateChangeListener;
 
-public abstract class AbstractSystemMessageSource implements MessageSource
+public abstract class AbstractSystemMessageSource implements MessageSource<AbstractSystemMessageSource.SystemMessageSourceConsumer>
 {
-    protected final UUID _id;
-    protected final String _name;
-    protected final NamedAddressSpace _addressSpace;
-    private List<Consumer> _consumers = new CopyOnWriteArrayList<>();
+    private final UUID _id;
+    private final String _name;
+    private final NamedAddressSpace _addressSpace;
+    private List<SystemMessageSourceConsumer> _consumers = new CopyOnWriteArrayList<>();
 
     public AbstractSystemMessageSource(String name, final NamedAddressSpace addressSpace)
     {
@@ -82,22 +84,22 @@
     }
 
     @Override
-    public Consumer addConsumer(final ConsumerTarget target,
-                                final FilterManager filters,
-                                final Class<? extends ServerMessage> messageClass,
-                                final String consumerName,
-                                final EnumSet<ConsumerImpl.Option> options, final Integer priority)
+    public SystemMessageSourceConsumer addConsumer(final ConsumerTarget target,
+                                                   final FilterManager filters,
+                                                   final Class<? extends ServerMessage> messageClass,
+                                                   final String consumerName,
+                                                   final EnumSet<ConsumerOption> options, final Integer priority)
             throws ExistingExclusiveConsumer, ExistingConsumerPreventsExclusive,
                    ConsumerAccessRefused
     {
-        final Consumer consumer = new Consumer(consumerName, target);
+        final SystemMessageSourceConsumer consumer = new SystemMessageSourceConsumer(consumerName, target);
         target.consumerAdded(consumer);
         _consumers.add(consumer);
         return consumer;
     }
 
     @Override
-    public Collection<Consumer> getConsumers()
+    public Collection<SystemMessageSourceConsumer> getConsumers()
     {
         return new ArrayList<>(_consumers);
     }
@@ -108,19 +110,23 @@
         return true;
     }
 
-    protected class Consumer implements ConsumerImpl
+    public NamedAddressSpace getAddressSpace()
+    {
+        return _addressSpace;
+    }
+
+    protected class SystemMessageSourceConsumer implements MessageInstanceConsumer
     {
 
-        private final long _id = ConsumerImpl.CONSUMER_NUMBER_GENERATOR.getAndIncrement();
         private final List<PropertiesMessageInstance> _queue =
                 Collections.synchronizedList(new ArrayList<PropertiesMessageInstance>());
         private final ConsumerTarget _target;
         private final String _name;
         private final StateChangeListener<ConsumerTarget, ConsumerTarget.State> _targetChangeListener =
-                new Consumer.TargetChangeListener();
+                new SystemMessageSourceConsumer.TargetChangeListener();
+        private final Object _identifier = new Object();
 
-
-        public Consumer(final String consumerName, ConsumerTarget target)
+        SystemMessageSourceConsumer(final String consumerName, ConsumerTarget target)
         {
             _name = consumerName;
             _target = target;
@@ -133,13 +139,16 @@
 
         }
 
-        @Override
+        public Object getIdentifier()
+        {
+            return _identifier;
+        }
+
         public ConsumerTarget getTarget()
         {
             return _target;
         }
 
-        @Override
         public boolean hasAvailableMessages()
         {
             return !_queue.isEmpty();
@@ -151,55 +160,12 @@
 
         }
 
-        @Override
-        public long getBytesOut()
-        {
-            return 0;
-        }
-
-        @Override
-        public long getMessagesOut()
-        {
-            return 0;
-        }
-
-        @Override
-        public long getUnacknowledgedBytes()
-        {
-            return 0;
-        }
-
-        @Override
-        public long getUnacknowledgedMessages()
-        {
-            return 0;
-        }
-
-        @Override
         public AMQSessionModel getSessionModel()
         {
             return _target.getSessionModel();
         }
 
         @Override
-        public MessageSource getMessageSource()
-        {
-            return AbstractSystemMessageSource.this;
-        }
-
-        @Override
-        public long getConsumerNumber()
-        {
-            return _id;
-        }
-
-        @Override
-        public boolean isSuspended()
-        {
-            return false;
-        }
-
-        @Override
         public boolean isClosed()
         {
             return false;
@@ -212,42 +178,12 @@
         }
 
         @Override
-        public boolean seesRequeues()
-        {
-            return false;
-        }
-
-        @Override
         public void close()
         {
             _consumers.remove(this);
         }
 
         @Override
-        public boolean trySendLock()
-        {
-            return _target.trySendLock();
-        }
-
-        @Override
-        public void getSendLock()
-        {
-            _target.getSendLock();
-        }
-
-        @Override
-        public void releaseSendLock()
-        {
-            _target.releaseSendLock();
-        }
-
-        @Override
-        public boolean isActive()
-        {
-            return false;
-        }
-
-        @Override
         public String getName()
         {
             return _name;
@@ -334,16 +270,15 @@
 
     }
 
-    class PropertiesMessageInstance implements MessageInstance
+    private class PropertiesMessageInstance implements MessageInstance
     {
-        private final Consumer _consumer;
+        private final SystemMessageSourceConsumer _consumer;
         private int _deliveryCount;
         private boolean _isRedelivered;
-        private boolean _isDelivered;
         private boolean _isDeleted;
         private InternalMessage _message;
 
-        PropertiesMessageInstance(final Consumer consumer, final InternalMessage message)
+        PropertiesMessageInstance(final SystemMessageSourceConsumer consumer, final InternalMessage message)
         {
             _consumer = consumer;
             _message = message;
@@ -352,7 +287,7 @@
         @Override
         public int getDeliveryCount()
         {
-            return 0;
+            return _deliveryCount;
         }
 
         @Override
@@ -387,7 +322,7 @@
         }
 
         @Override
-        public ConsumerImpl getAcquiringConsumer()
+        public MessageInstanceConsumer getAcquiringConsumer()
         {
             return _consumer;
         }
@@ -399,13 +334,13 @@
         }
 
         @Override
-        public boolean isAcquiredBy(final ConsumerImpl consumer)
+        public boolean isAcquiredBy(final MessageInstanceConsumer consumer)
         {
             return consumer == _consumer && !isDeleted();
         }
 
         @Override
-        public boolean removeAcquisitionFromConsumer(final ConsumerImpl consumer)
+        public boolean removeAcquisitionFromConsumer(final MessageInstanceConsumer consumer)
         {
             return consumer == _consumer;
         }
@@ -423,7 +358,7 @@
         }
 
         @Override
-        public Consumer getDeliveredConsumer()
+        public SystemMessageSourceConsumer getDeliveredConsumer()
         {
             return isDeleted() ? null : _consumer;
         }
@@ -435,7 +370,7 @@
         }
 
         @Override
-        public boolean isRejectedBy(final ConsumerImpl consumer)
+        public boolean isRejectedBy(final MessageInstanceConsumer consumer)
         {
             return false;
         }
@@ -443,7 +378,7 @@
         @Override
         public boolean getDeliveredToConsumer()
         {
-            return _isDelivered;
+            return _deliveryCount > 0;
         }
 
         @Override
@@ -453,13 +388,13 @@
         }
 
         @Override
-        public boolean acquire(final ConsumerImpl sub)
+        public boolean acquire(final MessageInstanceConsumer sub)
         {
             return false;
         }
 
         @Override
-        public boolean makeAcquisitionUnstealable(final ConsumerImpl consumer)
+        public boolean makeAcquisitionUnstealable(final MessageInstanceConsumer consumer)
         {
             return false;
         }
@@ -477,7 +412,7 @@
         }
 
         @Override
-        public int routeToAlternate(final Action<? super MessageInstance> action,
+        public int routeToAlternate(final Action<? super BaseMessageInstance> action,
                                     final ServerTransaction txn)
         {
             return 0;
@@ -515,7 +450,7 @@
         }
 
         @Override
-        public void release(ConsumerImpl consumer)
+        public void release(MessageInstanceConsumer consumer)
         {
             release();
         }
diff --git a/broker-core/src/main/java/org/apache/qpid/server/virtualhost/AbstractVirtualHost.java b/broker-core/src/main/java/org/apache/qpid/server/virtualhost/AbstractVirtualHost.java
index bc072f2..5b9c3ac 100644
--- a/broker-core/src/main/java/org/apache/qpid/server/virtualhost/AbstractVirtualHost.java
+++ b/broker-core/src/main/java/org/apache/qpid/server/virtualhost/AbstractVirtualHost.java
@@ -30,9 +30,11 @@
 import java.io.OutputStream;
 import java.io.Serializable;
 import java.io.UnsupportedEncodingException;
+import java.net.InetSocketAddress;
 import java.net.MalformedURLException;
 import java.net.URL;
 import java.net.URLEncoder;
+import java.nio.channels.SocketChannel;
 import java.nio.charset.StandardCharsets;
 import java.security.AccessControlContext;
 import java.security.Principal;
@@ -132,8 +134,11 @@
 import org.apache.qpid.server.store.preferences.PreferencesRecoverer;
 import org.apache.qpid.server.store.preferences.PreferencesRoot;
 import org.apache.qpid.server.store.serializer.MessageStoreSerializer;
+import org.apache.qpid.server.transfer.TransferQueue;
+import org.apache.qpid.server.transfer.TransferQueueImpl;
 import org.apache.qpid.server.transport.AMQPConnection;
 import org.apache.qpid.server.transport.NetworkConnectionScheduler;
+import org.apache.qpid.server.transport.NonBlockingOutboundConnection;
 import org.apache.qpid.server.txn.AutoCommitTransaction;
 import org.apache.qpid.server.txn.DtxRegistry;
 import org.apache.qpid.server.txn.LocalTransaction;
@@ -155,6 +160,9 @@
     private final AtomicBoolean _acceptsConnections = new AtomicBoolean(false);
     private TaskExecutor _preferenceTaskExecutor;
 
+    private Map<String,MessageDestination> _availableRoutes = new HashMap<>();
+    private TransferQueue _transferQueue;
+
     private static enum BlockingType { STORE, FILESYSTEM };
 
     private static final String USE_ASYNC_RECOVERY = "use_async_message_store_recovery";
@@ -216,7 +224,6 @@
         }
     }, Result.DEFER);
 
-
     @ManagedAttributeField
     private boolean _queue_deadLetterQueueEnabled;
 
@@ -304,6 +311,7 @@
         _fileSystemSpaceCheckerJobContext = getSystemTaskControllerContext("FileSystemSpaceChecker["+getName()+"]", _principal);
 
         _fileSystemSpaceChecker = new FileSystemSpaceChecker();
+        _transferQueue = new TransferQueueImpl(this);
 
         addChangeListener(new TargetSizeAssigningListener());
     }
@@ -438,6 +446,13 @@
     {
         super.postResolveChildren();
         addChangeListener(_accessControlProviderListener);
+        for(RemoteHost<?> remoteHost : getChildren(RemoteHost.class))
+        {
+            for(String address : remoteHost.getRoutableAddresses())
+            {
+                _availableRoutes.put(address, _transferQueue);
+            }
+        }
     }
 
     private void validateNodeAutoCreationPolicy(final NodeAutoCreationPolicy policy)
@@ -793,7 +808,9 @@
         {
             throw new UnsupportedOperationException();
         }
-        else if(childClass == VirtualHostLogger.class || childClass == VirtualHostAccessControlProvider.class)
+        else if(childClass == VirtualHostLogger.class
+                || childClass == VirtualHostAccessControlProvider.class
+                || childClass == RemoteHost.class)
         {
             return getObjectFactory().createAsync(childClass, attributes, this);
         }
@@ -1333,12 +1350,60 @@
         }
         if(destination == null)
         {
-
             destination = autoCreateNode(name, MessageDestination.class, true);
         }
+        if(destination == null)
+        {
+            destination = getTransferAgent( name );
+        }
         return destination;
     }
 
+    private MessageDestination getTransferAgent(final String address)
+    {
+        if(address.contains("/") && getGlobalAddressDomains() != null)
+        {
+            for(String domain : getGlobalAddressDomains())
+            {
+                if(address.startsWith(domain + "/"))
+                {
+                    return null;
+                }
+            }
+        }
+        for(Map.Entry<String, MessageDestination> route : _availableRoutes.entrySet())
+        {
+            if(address.equals(route.getKey()) || address.startsWith(route.getKey() + "/"))
+            {
+                return route.getValue();
+            }
+        }
+        return null;
+    }
+
+    private boolean isGlobalAddress(final String address)
+    {
+        if(address.contains("/") && getGlobalAddressDomains() != null)
+        {
+            for(String domain : getGlobalAddressDomains())
+            {
+                if(address.startsWith(domain + "/"))
+                {
+                    return false;
+                }
+            }
+        }
+        Set<String> routes = _availableRoutes.keySet();
+        for(String route : routes)
+        {
+            if(address.equals(route) || address.startsWith(address + "/"))
+            {
+                return true;
+            }
+        }
+        return false;
+    }
+
     @Override
     public <T extends ConfiguredObject<?>> T getAttainedChildFromAddress(final Class<T> childClass,
                                                                          final String address)
@@ -1410,7 +1475,7 @@
             {
                 if(localAddress.length() > routingAddress.length() - domain.length() && routingAddress.startsWith(domain + "/"))
                 {
-                    localAddress = routingAddress.substring(domain.length());
+                    localAddress = routingAddress.substring(domain.length()+1);
                 }
             }
         }
@@ -1752,7 +1817,7 @@
         }
     }
 
-    private class TargetSizeAssigningListener implements ConfigurationChangeListener
+    private class TargetSizeAssigningListener extends AbstractConfigurationChangeListener
     {
         @Override
         public void childAdded(final ConfiguredObject<?> object, final ConfiguredObject<?> child)
@@ -1780,23 +1845,6 @@
         {
         }
 
-        @Override
-        public void attributeSet(final ConfiguredObject<?> object,
-                                 final String attributeName,
-                                 final Object oldAttributeValue,
-                                 final Object newAttributeValue)
-        {
-        }
-
-        @Override
-        public void bulkChangeStart(final ConfiguredObject<?> object)
-        {
-        }
-
-        @Override
-        public void bulkChangeEnd(final ConfiguredObject<?> object)
-        {
-        }
     }
 
     private class VirtualHostHouseKeepingTask extends HouseKeepingTask
@@ -2559,6 +2607,29 @@
         }
     }
 
+    public boolean makeConnection(final RemoteHostAddress<?> address, final Action<Boolean> onConnectionLoss)
+    {
+        try
+        {
+
+            _logger.info("Attempting to connect to {}", address);
+            SocketChannel socketChannel = SocketChannel.open();
+            socketChannel.configureBlocking(false);
+            socketChannel.connect(new InetSocketAddress(address.getAddress(), address.getPort()));
+            NonBlockingOutboundConnection connection = new NonBlockingOutboundConnection(socketChannel,
+                                                                                         address,
+                                                                                         _networkConnectionScheduler,
+                                                                                         this, onConnectionLoss);
+            _networkConnectionScheduler.addConnection(connection);
+            return true;
+        }
+        catch (IOException e)
+        {
+            _logger.debug("Failed to make connection to {}", address, e);
+            return false;
+        }
+    }
+
     protected void startFileSystemSpaceChecking()
     {
         File storeLocationAsFile = _messageStore.getStoreLocationAsFile();
@@ -2702,6 +2773,12 @@
     }
 
     @Override
+    public TransferQueue getTransferQueue()
+    {
+        return _transferQueue;
+    }
+
+    @Override
     public <T extends MessageDestination> T createMessageDestination(final Class<T> clazz,
                                                                      final Map<String, Object> attributes)
     {
@@ -2725,17 +2802,11 @@
         return !(_systemNodeSources.isEmpty() && getChildren(Queue.class).isEmpty());
     }
 
-    private final class AccessControlProviderListener implements ConfigurationChangeListener
+    private final class AccessControlProviderListener extends AbstractConfigurationChangeListener
     {
         private final Set<ConfiguredObject<?>> _bulkChanges = new HashSet<>();
 
         @Override
-        public void stateChanged(final ConfiguredObject<?> object, final State oldState, final State newState)
-        {
-
-        }
-
-        @Override
         public void childAdded(final ConfiguredObject<?> object, final ConfiguredObject<?> child)
         {
             if(object.getCategoryClass() == VirtualHost.class && child.getCategoryClass() == VirtualHostAccessControlProvider.class)
diff --git a/broker-core/src/main/java/org/apache/qpid/server/virtualhost/AsynchronousMessageStoreRecoverer.java b/broker-core/src/main/java/org/apache/qpid/server/virtualhost/AsynchronousMessageStoreRecoverer.java
index b1617b2..84b8774 100644
--- a/broker-core/src/main/java/org/apache/qpid/server/virtualhost/AsynchronousMessageStoreRecoverer.java
+++ b/broker-core/src/main/java/org/apache/qpid/server/virtualhost/AsynchronousMessageStoreRecoverer.java
@@ -48,6 +48,7 @@
 import org.apache.qpid.server.model.VirtualHost;
 import org.apache.qpid.server.plugin.MessageMetaDataType;
 import org.apache.qpid.server.queue.QueueEntry;
+import org.apache.qpid.server.queue.RecoverableBaseQueue;
 import org.apache.qpid.server.store.MessageEnqueueRecord;
 import org.apache.qpid.server.store.MessageStore;
 import org.apache.qpid.server.store.StorableMessageMetaData;
@@ -127,6 +128,9 @@
                 ListenableFuture<Void> result = _queueRecoveryExecutor.submit(new QueueRecoveringTask(queue), null);
                 queueRecoveryFutures.add(result);
             }
+            ListenableFuture<Void> result = _queueRecoveryExecutor.submit(new QueueRecoveringTask(_virtualHost.getTransferQueue()), null);
+            queueRecoveryFutures.add(result);
+
             ListenableFuture<List<Void>> combinedFuture = Futures.allAsList(queueRecoveryFutures);
             return Futures.transform(combinedFuture, new Function<List<?>, Void>()
             {
@@ -163,7 +167,7 @@
             return _recoveringQueues.contains(queue);
         }
 
-        private void recoverQueue(Queue<?> queue)
+        private void recoverQueue(RecoverableBaseQueue queue)
         {
             MessageInstanceVisitor handler = new MessageInstanceVisitor(queue);
             _storeReader.visitMessageInstances(queue, handler);
@@ -434,9 +438,9 @@
 
         private class QueueRecoveringTask implements Runnable
         {
-            private final Queue<?> _queue;
+            private final RecoverableBaseQueue _queue;
 
-            public QueueRecoveringTask(final Queue<?> queue)
+            public QueueRecoveringTask(final RecoverableBaseQueue queue)
             {
                 _queue = queue;
             }
@@ -461,10 +465,10 @@
 
         private class MessageInstanceVisitor implements MessageInstanceHandler
         {
-            private final Queue<?> _queue;
+            private final RecoverableBaseQueue _queue;
             long _recoveredCount;
 
-            private MessageInstanceVisitor(Queue<?> queue)
+            private MessageInstanceVisitor(RecoverableBaseQueue queue)
             {
                 _queue = queue;
             }
diff --git a/broker-core/src/main/java/org/apache/qpid/server/virtualhost/SynchronousMessageStoreRecoverer.java b/broker-core/src/main/java/org/apache/qpid/server/virtualhost/SynchronousMessageStoreRecoverer.java
index f67935d..6f3c94a 100644
--- a/broker-core/src/main/java/org/apache/qpid/server/virtualhost/SynchronousMessageStoreRecoverer.java
+++ b/broker-core/src/main/java/org/apache/qpid/server/virtualhost/SynchronousMessageStoreRecoverer.java
@@ -40,6 +40,7 @@
 import org.apache.qpid.server.model.VirtualHost;
 import org.apache.qpid.server.plugin.MessageMetaDataType;
 import org.apache.qpid.server.queue.QueueEntry;
+import org.apache.qpid.server.queue.RecoverableBaseQueue;
 import org.apache.qpid.server.store.MessageEnqueueRecord;
 import org.apache.qpid.server.store.MessageStore;
 import org.apache.qpid.server.store.StorableMessageMetaData;
@@ -49,6 +50,7 @@
 import org.apache.qpid.server.store.handler.DistributedTransactionHandler;
 import org.apache.qpid.server.store.handler.MessageHandler;
 import org.apache.qpid.server.store.handler.MessageInstanceHandler;
+import org.apache.qpid.server.transfer.TransferQueue;
 import org.apache.qpid.server.txn.DtxBranch;
 import org.apache.qpid.server.txn.DtxRegistry;
 import org.apache.qpid.server.txn.ServerTransaction;
@@ -85,7 +87,11 @@
         {
             eventLogger.message(logSubject, TransactionLogMessages.RECOVERED(entry.getValue(), entry.getKey()));
             eventLogger.message(logSubject, TransactionLogMessages.RECOVERY_COMPLETE(entry.getKey(), true));
-            virtualHost.getAttainedChildFromAddress(Queue.class, entry.getKey()).completeRecovery();
+            Queue queue = virtualHost.getAttainedChildFromAddress(Queue.class, entry.getKey());
+            if(queue != null)
+            {
+                queue.completeRecovery();
+            }
         }
 
         for(Queue<?> q : virtualHost.getChildren(Queue.class))
@@ -95,6 +101,8 @@
                 q.completeRecovery();
             }
         }
+        TransferQueue q = virtualHost.getTransferQueue();
+        q.completeRecovery();
 
         storeReader.visitDistributedTransactions(new DistributedTransactionVisitor(virtualHost, store, eventLogger,
                                                                              logSubject, recoveredMessages, unusedMessages));
@@ -179,7 +187,11 @@
         {
             final UUID queueId = record.getQueueId();
             long messageId = record.getMessageNumber();
-            Queue<?> queue = _virtualHost.getAttainedQueue(queueId);
+            RecoverableBaseQueue queue = _virtualHost.getAttainedQueue(queueId);
+            if(queue == null && _virtualHost.getTransferQueue().getId().equals(queueId))
+            {
+                queue = _virtualHost.getTransferQueue();
+            }
             if(queue != null)
             {
                 String queueName = queue.getName();
diff --git a/broker-core/src/main/java/org/apache/qpid/server/virtualhost/VirtualHostPropertiesNode.java b/broker-core/src/main/java/org/apache/qpid/server/virtualhost/VirtualHostPropertiesNode.java
index 8392ce4..81b8232 100644
--- a/broker-core/src/main/java/org/apache/qpid/server/virtualhost/VirtualHostPropertiesNode.java
+++ b/broker-core/src/main/java/org/apache/qpid/server/virtualhost/VirtualHostPropertiesNode.java
@@ -26,9 +26,9 @@
 import java.util.Map;
 import java.util.UUID;
 
-import org.apache.qpid.server.consumer.ConsumerImpl;
 import org.apache.qpid.server.consumer.ConsumerTarget;
 import org.apache.qpid.server.filter.FilterManager;
+import org.apache.qpid.server.message.ConsumerOption;
 import org.apache.qpid.server.message.ServerMessage;
 import org.apache.qpid.server.message.internal.InternalMessage;
 import org.apache.qpid.server.message.internal.InternalMessageHeader;
@@ -47,15 +47,16 @@
     }
 
     @Override
-    public Consumer addConsumer(final ConsumerTarget target,
-                                final FilterManager filters,
-                                final Class<? extends ServerMessage> messageClass,
-                                final String consumerName,
-                                final EnumSet<ConsumerImpl.Option> options, final Integer priority)
+    public SystemMessageSourceConsumer addConsumer(final ConsumerTarget target,
+                                                   final FilterManager filters,
+                                                   final Class<? extends ServerMessage> messageClass,
+                                                   final String consumerName,
+                                                   final EnumSet<ConsumerOption> options, final Integer priority)
             throws ExistingExclusiveConsumer, ExistingConsumerPreventsExclusive,
                    ConsumerAccessRefused
     {
-        final Consumer consumer = super.addConsumer(target, filters, messageClass, consumerName, options, priority);
+        final SystemMessageSourceConsumer
+                consumer = super.addConsumer(target, filters, messageClass, consumerName, options, priority);
         consumer.send(createMessage());
         target.queueEmpty();
         return consumer;
@@ -66,7 +67,7 @@
 
         Map<String, Object> headers = new HashMap<>();
 
-        final List<String> globalAddresseDomains = _addressSpace.getGlobalAddressDomains();
+        final List<String> globalAddresseDomains = getAddressSpace().getGlobalAddressDomains();
         if (globalAddresseDomains != null && !globalAddresseDomains.isEmpty())
         {
             String primaryDomain = globalAddresseDomains.get(0);
@@ -80,13 +81,13 @@
                 headers.put("virtualHost.temporaryQueuePrefix", primaryDomain);
             }
         }
-
+        headers.put("virtualhost.globalDomains", globalAddresseDomains);
         InternalMessageHeader header = new InternalMessageHeader(headers,
                                                                  null, 0l, null, null, UUID.randomUUID().toString(),
                                                                  null, null, (byte) 4, System.currentTimeMillis(),
                                                                  0L, null, null);
         final InternalMessage message =
-                InternalMessage.createBytesMessage(_addressSpace.getMessageStore(), header, new byte[0]);
+                InternalMessage.createBytesMessage(getAddressSpace().getMessageStore(), header, new byte[0]);
         message.setInitialRoutingAddress(getName());
         return message;
     }
diff --git a/broker-core/src/main/java/org/apache/qpid/server/virtualhostnode/RedirectingVirtualHostImpl.java b/broker-core/src/main/java/org/apache/qpid/server/virtualhostnode/RedirectingVirtualHostImpl.java
index 289287f..fc51d42 100644
--- a/broker-core/src/main/java/org/apache/qpid/server/virtualhostnode/RedirectingVirtualHostImpl.java
+++ b/broker-core/src/main/java/org/apache/qpid/server/virtualhostnode/RedirectingVirtualHostImpl.java
@@ -47,6 +47,7 @@
 import org.apache.qpid.server.model.ManagedObject;
 import org.apache.qpid.server.model.ManagedObjectFactoryConstructor;
 import org.apache.qpid.server.model.Queue;
+import org.apache.qpid.server.model.RemoteHostAddress;
 import org.apache.qpid.server.model.State;
 import org.apache.qpid.server.model.VirtualHostNode;
 import org.apache.qpid.server.model.port.AmqpPort;
@@ -55,8 +56,10 @@
 import org.apache.qpid.server.stats.StatisticsCounter;
 import org.apache.qpid.server.store.DurableConfigurationStore;
 import org.apache.qpid.server.store.MessageStore;
+import org.apache.qpid.server.transfer.TransferQueue;
 import org.apache.qpid.server.transport.AMQPConnection;
 import org.apache.qpid.server.txn.DtxRegistry;
+import org.apache.qpid.server.util.Action;
 import org.apache.qpid.server.virtualhost.HouseKeepingTask;
 import org.apache.qpid.server.virtualhost.NodeAutoCreationPolicy;
 import org.apache.qpid.server.virtualhost.VirtualHostPrincipal;
@@ -524,6 +527,12 @@
     }
 
     @Override
+    public TransferQueue getTransferQueue()
+    {
+        throw new UnsupportedOperationException();
+    }
+
+    @Override
     public Principal getPrincipal()
     {
         return _principal;
@@ -554,6 +563,13 @@
     }
 
     @Override
+    public boolean makeConnection(final RemoteHostAddress<?> address, final Action<Boolean> onConnectionLoss)
+    {
+        throwUnsupportedForRedirector();
+        return false;
+    }
+
+    @Override
     public UserPreferences createUserPreferences(final ConfiguredObject<?> object)
     {
         throwUnsupportedForRedirector();
diff --git a/broker-core/src/test/java/org/apache/qpid/server/consumer/MockConsumer.java b/broker-core/src/test/java/org/apache/qpid/server/consumer/MockConsumer.java
index 50ade31..5cec366 100644
--- a/broker-core/src/test/java/org/apache/qpid/server/consumer/MockConsumer.java
+++ b/broker-core/src/test/java/org/apache/qpid/server/consumer/MockConsumer.java
@@ -36,6 +36,7 @@
 import org.apache.qpid.server.configuration.updater.TaskExecutor;
 import org.apache.qpid.server.logging.LogSubject;
 import org.apache.qpid.server.message.MessageInstance;
+import org.apache.qpid.server.message.MessageInstanceConsumer;
 import org.apache.qpid.server.message.ServerMessage;
 import org.apache.qpid.server.model.BrokerModel;
 import org.apache.qpid.server.model.ConfiguredObjectFactory;
@@ -136,7 +137,7 @@
     {
     }
 
-    public long send(final ConsumerImpl consumer, MessageInstance entry, boolean batch)
+    public long send(final MessageInstanceConsumer consumer, MessageInstance entry, boolean batch)
     {
         long size = entry.getMessage().getSize();
         if (messages.contains(entry))
@@ -188,12 +189,12 @@
     }
 
     @Override
-    public void consumerAdded(final ConsumerImpl sub)
+    public void consumerAdded(final MessageInstanceConsumer consumer)
     {
     }
 
     @Override
-    public void consumerRemoved(final ConsumerImpl sub)
+    public void consumerRemoved(final MessageInstanceConsumer consumer)
     {
        close();
     }
diff --git a/broker-core/src/test/java/org/apache/qpid/server/model/testmodels/hierarchy/ConfiguredObjectTypeRegistryTest.java b/broker-core/src/test/java/org/apache/qpid/server/model/testmodels/hierarchy/ConfiguredObjectTypeRegistryTest.java
index fab9944..cc83945 100644
--- a/broker-core/src/test/java/org/apache/qpid/server/model/testmodels/hierarchy/ConfiguredObjectTypeRegistryTest.java
+++ b/broker-core/src/test/java/org/apache/qpid/server/model/testmodels/hierarchy/ConfiguredObjectTypeRegistryTest.java
@@ -98,7 +98,8 @@
                 (ConfiguredObjectOperation<TestCar>) kitCarOperations.get("openDoor");
 
         // test explicitly setting parameter
-        Object returnVal = operation.perform(object, Collections.<String, Object>singletonMap("door", "DRIVER"));
+        Object returnVal = operation.perform(object, Collections.<String, Object>singletonMap("door", "DRIVER")
+                                            );
         assertEquals(TestCar.Door.DRIVER, returnVal);
 
         // test default parameter
@@ -117,7 +118,8 @@
 
         try
         {
-            operation.perform(object, Collections.<String, Object>singletonMap("door", "[\"eggs\", \"flour\", \"milk\"]"));
+            operation.perform(object, Collections.<String, Object>singletonMap("door", "[\"eggs\", \"flour\", \"milk\"]")
+                             );
             fail("Should not be able to pass in a parameter of the wrong type");
         }
         catch(IllegalArgumentException e)
diff --git a/broker-core/src/test/java/org/apache/qpid/server/model/testmodels/hierarchy/InjectedAttributeTest.java b/broker-core/src/test/java/org/apache/qpid/server/model/testmodels/hierarchy/InjectedAttributeTest.java
index 1c69983..85503ae 100644
--- a/broker-core/src/test/java/org/apache/qpid/server/model/testmodels/hierarchy/InjectedAttributeTest.java
+++ b/broker-core/src/test/java/org/apache/qpid/server/model/testmodels/hierarchy/InjectedAttributeTest.java
@@ -385,11 +385,13 @@
 
         final ConfiguredObjectOperation foundOperation = allOperations.get("fly");
 
-        Object result = foundOperation.perform(testCar, Collections.<String, Object>singletonMap("height", 0));
+        Object result = foundOperation.perform(testCar, Collections.<String, Object>singletonMap("height", 0)
+                                              );
 
         assertEquals("Car should be able to fly at 0m", Boolean.TRUE, result);
 
-        result = foundOperation.perform(testCar, Collections.<String, Object>singletonMap("height", 5000));
+        result = foundOperation.perform(testCar, Collections.<String, Object>singletonMap("height", 5000)
+                                       );
 
         assertEquals("Car should not be able to fly at 5000m", Boolean.FALSE, result);
     }
@@ -436,11 +438,13 @@
         final ConfiguredObjectOperation helloOperation = allOperations.get("sayHello");
         final ConfiguredObjectOperation goodbyeOperation = allOperations.get("sayGoodbye");
 
-        Object result = helloOperation.perform(testCar, Collections.<String, Object>singletonMap("count", 3));
+        Object result = helloOperation.perform(testCar, Collections.<String, Object>singletonMap("count", 3)
+                                              );
 
         assertEquals("Car should say 'Hello' 3 times", Arrays.asList("Hello", "Hello", "Hello"), result);
 
-        result = goodbyeOperation.perform(testCar, Collections.<String, Object>singletonMap("count", 1));
+        result = goodbyeOperation.perform(testCar, Collections.<String, Object>singletonMap("count", 1)
+                                         );
 
         assertEquals("Car say 'Goodbye' once", Collections.singletonList("Goodbye"), result);
     }
diff --git a/broker-core/src/test/java/org/apache/qpid/server/model/testmodels/lifecycle/AbstractConfiguredObjectTest.java b/broker-core/src/test/java/org/apache/qpid/server/model/testmodels/lifecycle/AbstractConfiguredObjectTest.java
index a63fb82..4a95c40 100644
--- a/broker-core/src/test/java/org/apache/qpid/server/model/testmodels/lifecycle/AbstractConfiguredObjectTest.java
+++ b/broker-core/src/test/java/org/apache/qpid/server/model/testmodels/lifecycle/AbstractConfiguredObjectTest.java
@@ -30,7 +30,7 @@
 import org.apache.qpid.server.model.ConfiguredObject;
 import org.apache.qpid.server.model.Exchange;
 import org.apache.qpid.server.model.IllegalStateTransitionException;
-import org.apache.qpid.server.model.NoopConfigurationChangeListener;
+import org.apache.qpid.server.model.AbstractConfigurationChangeListener;
 import org.apache.qpid.server.model.Port;
 import org.apache.qpid.server.model.State;
 import org.apache.qpid.test.utils.QpidTestCase;
@@ -231,7 +231,7 @@
 
         final AtomicReference<State> newState = new AtomicReference<>();
         final AtomicInteger callCounter = new AtomicInteger();
-        parent.addChangeListener(new NoopConfigurationChangeListener()
+        parent.addChangeListener(new AbstractConfigurationChangeListener()
         {
             @Override
             public void stateChanged(final ConfiguredObject<?> object, final State old, final State state)
@@ -262,7 +262,7 @@
         parent.create();
 
         final AtomicInteger callCounter = new AtomicInteger();
-        parent.addChangeListener(new NoopConfigurationChangeListener()
+        parent.addChangeListener(new AbstractConfigurationChangeListener()
         {
             @Override
             public void stateChanged(final ConfiguredObject<?> object, final State old, final State state)
@@ -300,7 +300,7 @@
         configuredObject.create();
 
         final List<ChangeEvent> events = new ArrayList<>();
-        configuredObject.addChangeListener(new NoopConfigurationChangeListener()
+        configuredObject.addChangeListener(new AbstractConfigurationChangeListener()
         {
             @Override
             public void attributeSet(ConfiguredObject<?> object, String attributeName, Object oldAttributeValue, Object newAttributeValue)
diff --git a/broker-core/src/test/java/org/apache/qpid/server/model/testmodels/singleton/AbstractConfiguredObjectTest.java b/broker-core/src/test/java/org/apache/qpid/server/model/testmodels/singleton/AbstractConfiguredObjectTest.java
index 321d585..5ebf24a 100644
--- a/broker-core/src/test/java/org/apache/qpid/server/model/testmodels/singleton/AbstractConfiguredObjectTest.java
+++ b/broker-core/src/test/java/org/apache/qpid/server/model/testmodels/singleton/AbstractConfiguredObjectTest.java
@@ -37,7 +37,7 @@
 import org.apache.qpid.server.model.AbstractConfiguredObject;
 import org.apache.qpid.server.model.ConfiguredObject;
 import org.apache.qpid.server.model.Model;
-import org.apache.qpid.server.model.NoopConfigurationChangeListener;
+import org.apache.qpid.server.model.AbstractConfigurationChangeListener;
 import org.apache.qpid.server.model.SystemConfig;
 import org.apache.qpid.server.security.auth.AuthenticatedPrincipal;
 import org.apache.qpid.server.security.auth.UsernamePrincipal;
@@ -789,7 +789,7 @@
 
         final AtomicInteger listenerCount = new AtomicInteger();
         final LinkedHashMap<String, String> updates = new LinkedHashMap<>();
-        object.addChangeListener(new NoopConfigurationChangeListener()
+        object.addChangeListener(new AbstractConfigurationChangeListener()
         {
             @Override
             public void attributeSet(final ConfiguredObject<?> object,
@@ -844,7 +844,7 @@
         final TestSingleton object = _model.getObjectFactory().create(TestSingleton.class, attributes);
 
         final AtomicInteger listenerCount = new AtomicInteger();
-        object.addChangeListener(new NoopConfigurationChangeListener()
+        object.addChangeListener(new AbstractConfigurationChangeListener()
         {
             @Override
             public void attributeSet(final ConfiguredObject<?> object,
diff --git a/broker-core/src/test/java/org/apache/qpid/server/queue/AbstractQueueTestBase.java b/broker-core/src/test/java/org/apache/qpid/server/queue/AbstractQueueTestBase.java
index f53ea8f..fffdea6 100644
--- a/broker-core/src/test/java/org/apache/qpid/server/queue/AbstractQueueTestBase.java
+++ b/broker-core/src/test/java/org/apache/qpid/server/queue/AbstractQueueTestBase.java
@@ -40,10 +40,6 @@
 import java.util.concurrent.CountDownLatch;
 import java.util.concurrent.TimeUnit;
 
-import org.apache.qpid.server.model.Binding;
-import org.apache.qpid.server.model.Exchange;
-import org.apache.qpid.server.model.VirtualHost;
-import org.apache.qpid.server.util.StateChangeListener;
 import org.mockito.ArgumentCaptor;
 import org.mockito.invocation.InvocationOnMock;
 import org.mockito.stubbing.Answer;
@@ -51,21 +47,27 @@
 import org.slf4j.LoggerFactory;
 
 import org.apache.qpid.exchange.ExchangeDefaults;
-import org.apache.qpid.server.consumer.ConsumerImpl;
 import org.apache.qpid.server.consumer.MockConsumer;
 import org.apache.qpid.server.exchange.DirectExchange;
 import org.apache.qpid.server.message.AMQMessageHeader;
+import org.apache.qpid.server.message.BaseMessageInstance;
+import org.apache.qpid.server.message.ConsumerOption;
 import org.apache.qpid.server.message.InstanceProperties;
 import org.apache.qpid.server.message.MessageInstance;
+import org.apache.qpid.server.message.MessageInstanceConsumer;
 import org.apache.qpid.server.message.MessageReference;
 import org.apache.qpid.server.message.MessageSource;
 import org.apache.qpid.server.message.ServerMessage;
+import org.apache.qpid.server.model.Binding;
+import org.apache.qpid.server.model.BrokerTestHelper;
+import org.apache.qpid.server.model.Exchange;
 import org.apache.qpid.server.model.Queue;
 import org.apache.qpid.server.model.QueueNotificationListener;
+import org.apache.qpid.server.model.VirtualHost;
 import org.apache.qpid.server.queue.AbstractQueue.QueueEntryFilter;
 import org.apache.qpid.server.store.TransactionLogResource;
 import org.apache.qpid.server.util.Action;
-import org.apache.qpid.server.model.BrokerTestHelper;
+import org.apache.qpid.server.util.StateChangeListener;
 import org.apache.qpid.test.utils.QpidTestCase;
 
 abstract class AbstractQueueTestBase extends QpidTestCase
@@ -173,8 +175,8 @@
 
         // Check adding a consumer adds it to the queue
         _consumer = (QueueConsumer<?>) _queue.addConsumer(_consumerTarget, null, messageA.getClass(), "test",
-                                                          EnumSet.of(ConsumerImpl.Option.ACQUIRES,
-                                                  ConsumerImpl.Option.SEES_REQUEUES), 0);
+                                                          EnumSet.of(ConsumerOption.ACQUIRES,
+                                                                     ConsumerOption.SEES_REQUEUES), 0);
         assertEquals("Queue does not have consumer", 1,
                      _queue.getConsumerCount());
         assertEquals("Queue does not have active consumer", 1,
@@ -205,8 +207,8 @@
         ServerMessage messageA = createMessage(new Long(24));
         _queue.enqueue(messageA, null, null);
         _consumer = (QueueConsumer<?>) _queue.addConsumer(_consumerTarget, null, messageA.getClass(), "test",
-                                                          EnumSet.of(ConsumerImpl.Option.ACQUIRES,
-                                                  ConsumerImpl.Option.SEES_REQUEUES), 0);
+                                                          EnumSet.of(ConsumerOption.ACQUIRES,
+                                                                     ConsumerOption.SEES_REQUEUES), 0);
         Thread.sleep(_queueRunnerWaitTime);
         assertEquals(messageA, _consumer.getQueueContext().getLastSeenEntry().getMessage());
         assertNull("There should be no releasedEntry after an enqueue",
@@ -223,8 +225,8 @@
         _queue.enqueue(messageA, null, null);
         _queue.enqueue(messageB, null, null);
         _consumer = (QueueConsumer<?>) _queue.addConsumer(_consumerTarget, null, messageA.getClass(), "test",
-                                                          EnumSet.of(ConsumerImpl.Option.ACQUIRES,
-                                                  ConsumerImpl.Option.SEES_REQUEUES), 0);
+                                                          EnumSet.of(ConsumerOption.ACQUIRES,
+                                                                     ConsumerOption.SEES_REQUEUES), 0);
         Thread.sleep(_queueRunnerWaitTime);
         assertEquals(messageB, _consumer.getQueueContext().getLastSeenEntry().getMessage());
         assertNull("There should be no releasedEntry after enqueues",
@@ -246,8 +248,8 @@
         when(messageHeader.getNotValidBefore()).thenReturn(System.currentTimeMillis()+20000L);
         _queue.enqueue(messageA, null, null);
         _consumer = (QueueConsumer<?>) _queue.addConsumer(_consumerTarget, null, messageA.getClass(), "test",
-                                                          EnumSet.of(ConsumerImpl.Option.ACQUIRES,
-                                                                     ConsumerImpl.Option.SEES_REQUEUES), 0);
+                                                          EnumSet.of(ConsumerOption.ACQUIRES,
+                                                                     ConsumerOption.SEES_REQUEUES), 0);
         Thread.sleep(_queueRunnerWaitTime);
 
         assertEquals("Message which was not yet valid was received", 0, _consumerTarget.getMessages().size());
@@ -272,8 +274,8 @@
         when(messageHeader.getNotValidBefore()).thenReturn(System.currentTimeMillis()+20000L);
         _queue.enqueue(messageA, null, null);
         _consumer = (QueueConsumer<?>) _queue.addConsumer(_consumerTarget, null, messageA.getClass(), "test",
-                                                          EnumSet.of(ConsumerImpl.Option.ACQUIRES,
-                                                                     ConsumerImpl.Option.SEES_REQUEUES), 0);
+                                                          EnumSet.of(ConsumerOption.ACQUIRES,
+                                                                     ConsumerOption.SEES_REQUEUES), 0);
         Thread.sleep(_queueRunnerWaitTime);
 
         assertEquals("Message was held despite queue not having holding enabled", 1, _consumerTarget.getMessages().size());
@@ -298,8 +300,8 @@
         _queue.enqueue(messageB, null, null);
 
         _consumer = (QueueConsumer<?>) _queue.addConsumer(_consumerTarget, null, messageA.getClass(), "test",
-                                                          EnumSet.of(ConsumerImpl.Option.ACQUIRES,
-                                                                     ConsumerImpl.Option.SEES_REQUEUES), 0);
+                                                          EnumSet.of(ConsumerOption.ACQUIRES,
+                                                                     ConsumerOption.SEES_REQUEUES), 0);
         Thread.sleep(_queueRunnerWaitTime);
 
         assertEquals("Expect one message (message B)", 1, _consumerTarget.getMessages().size());
@@ -326,8 +328,8 @@
 
 
         _consumer = (QueueConsumer<?>) _queue.addConsumer(_consumerTarget, null, messageA.getClass(), "test",
-                                                          EnumSet.of(ConsumerImpl.Option.ACQUIRES,
-                                                      ConsumerImpl.Option.SEES_REQUEUES), 0);
+                                                          EnumSet.of(ConsumerOption.ACQUIRES,
+                                                                     ConsumerOption.SEES_REQUEUES), 0);
 
         final ArrayList<QueueEntry> queueEntries = new ArrayList<QueueEntry>();
         EntryListAddingAction postEnqueueAction = new EntryListAddingAction(queueEntries);
@@ -375,7 +377,7 @@
         _consumerTarget = new MockConsumer()
         {
             @Override
-            public long send(ConsumerImpl consumer, MessageInstance entry, boolean batch)
+            public long send(MessageInstanceConsumer consumer, MessageInstance entry, boolean batch)
             {
                 try
                 {
@@ -389,8 +391,8 @@
         };
 
         _consumer = (QueueConsumer<?>) _queue.addConsumer(_consumerTarget, null, messageA.getClass(), "test",
-                                                          EnumSet.of(ConsumerImpl.Option.SEES_REQUEUES,
-                                                      ConsumerImpl.Option.ACQUIRES), 0);
+                                                          EnumSet.of(ConsumerOption.SEES_REQUEUES,
+                                                                     ConsumerOption.ACQUIRES), 0);
 
         final ArrayList<QueueEntry> queueEntries = new ArrayList<QueueEntry>();
         EntryListAddingAction postEnqueueAction = new EntryListAddingAction(queueEntries);
@@ -460,8 +462,8 @@
         ServerMessage messageC = createMessage(new Long(26));
 
         _consumer = (QueueConsumer<?>) _queue.addConsumer(_consumerTarget, null, messageA.getClass(), "test",
-                                                          EnumSet.of(ConsumerImpl.Option.ACQUIRES,
-                                                      ConsumerImpl.Option.SEES_REQUEUES), 0);
+                                                          EnumSet.of(ConsumerOption.ACQUIRES,
+                                                                     ConsumerOption.SEES_REQUEUES), 0);
 
         final ArrayList<QueueEntry> queueEntries = new ArrayList<QueueEntry>();
         EntryListAddingAction postEnqueueAction = new EntryListAddingAction(queueEntries);
@@ -513,12 +515,12 @@
 
 
         QueueConsumer consumer1 = (QueueConsumer) _queue.addConsumer(target1, null, messageA.getClass(), "test",
-                                                                     EnumSet.of(ConsumerImpl.Option.ACQUIRES,
-                                                                    ConsumerImpl.Option.SEES_REQUEUES), 0);
+                                                                     EnumSet.of(ConsumerOption.ACQUIRES,
+                                                                                ConsumerOption.SEES_REQUEUES), 0);
 
         QueueConsumer consumer2 = (QueueConsumer) _queue.addConsumer(target2, null, messageA.getClass(), "test",
-                                                                     EnumSet.of(ConsumerImpl.Option.ACQUIRES,
-                                                                    ConsumerImpl.Option.SEES_REQUEUES), 0);
+                                                                     EnumSet.of(ConsumerOption.ACQUIRES,
+                                                                                ConsumerOption.SEES_REQUEUES), 0);
 
 
         final ArrayList<QueueEntry> queueEntries = new ArrayList<QueueEntry>();
@@ -555,8 +557,8 @@
         // Check adding an exclusive consumer adds it to the queue
 
         _consumer = (QueueConsumer<?>) _queue.addConsumer(_consumerTarget, null, messageA.getClass(), "test",
-                                                          EnumSet.of(ConsumerImpl.Option.EXCLUSIVE, ConsumerImpl.Option.ACQUIRES,
-                                                      ConsumerImpl.Option.SEES_REQUEUES), 0);
+                                                          EnumSet.of(ConsumerOption.EXCLUSIVE, ConsumerOption.ACQUIRES,
+                                                                     ConsumerOption.SEES_REQUEUES), 0);
 
         assertEquals("Queue does not have consumer", 1,
                      _queue.getConsumerCount());
@@ -585,8 +587,8 @@
         {
 
             _queue.addConsumer(subB, null, messageA.getClass(), "test",
-                               EnumSet.of(ConsumerImpl.Option.ACQUIRES,
-                                          ConsumerImpl.Option.SEES_REQUEUES), 0);
+                               EnumSet.of(ConsumerOption.ACQUIRES,
+                                          ConsumerOption.SEES_REQUEUES), 0);
 
         }
         catch (MessageSource.ExistingExclusiveConsumer e)
@@ -599,14 +601,14 @@
         // existing consumer
         _consumer.close();
         _consumer = (QueueConsumer<?>) _queue.addConsumer(_consumerTarget, null, messageA.getClass(), "test",
-                                                          EnumSet.of(ConsumerImpl.Option.ACQUIRES,
-                                                  ConsumerImpl.Option.SEES_REQUEUES), 0);
+                                                          EnumSet.of(ConsumerOption.ACQUIRES,
+                                                                     ConsumerOption.SEES_REQUEUES), 0);
 
         try
         {
 
             _consumer = (QueueConsumer<?>) _queue.addConsumer(subB, null, messageA.getClass(), "test",
-                                                              EnumSet.of(ConsumerImpl.Option.EXCLUSIVE), 0);
+                                                              EnumSet.of(ConsumerOption.EXCLUSIVE), 0);
 
         }
         catch (MessageSource.ExistingConsumerPreventsExclusive e)
@@ -623,13 +625,13 @@
         ServerMessage message = createMessage(id);
 
         _consumer = (QueueConsumer<?>) _queue.addConsumer(_consumerTarget, null, message.getClass(), "test",
-                                                          EnumSet.of(ConsumerImpl.Option.ACQUIRES, ConsumerImpl.Option.SEES_REQUEUES),
+                                                          EnumSet.of(ConsumerOption.ACQUIRES, ConsumerOption.SEES_REQUEUES),
                                                           0);
 
-        _queue.enqueue(message, new Action<MessageInstance>()
+        _queue.enqueue(message, new Action<BaseMessageInstance>()
         {
             @Override
-            public void performAction(final MessageInstance object)
+            public void performAction(final BaseMessageInstance object)
             {
                 QueueEntryImpl entry = (QueueEntryImpl) object;
                 entry.setRedelivered();
@@ -1189,7 +1191,7 @@
         return message;
     }
 
-    private static class EntryListAddingAction implements Action<MessageInstance>
+    private static class EntryListAddingAction implements Action<BaseMessageInstance>
     {
         private final ArrayList<QueueEntry> _queueEntries;
 
@@ -1198,7 +1200,7 @@
             _queueEntries = queueEntries;
         }
 
-        public void performAction(MessageInstance entry)
+        public void performAction(BaseMessageInstance entry)
         {
             _queueEntries.add((QueueEntry) entry);
         }
diff --git a/broker-core/src/test/java/org/apache/qpid/server/queue/ConsumerListTest.java b/broker-core/src/test/java/org/apache/qpid/server/queue/ConsumerListTest.java
index 357c720..58993ec 100644
--- a/broker-core/src/test/java/org/apache/qpid/server/queue/ConsumerListTest.java
+++ b/broker-core/src/test/java/org/apache/qpid/server/queue/ConsumerListTest.java
@@ -21,13 +21,12 @@
 package org.apache.qpid.server.queue;
 
 
-import org.apache.qpid.server.consumer.ConsumerImpl;
-import org.apache.qpid.server.message.MessageInstance;
-import org.apache.qpid.test.utils.QpidTestCase;
-
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.when;
 
+import org.apache.qpid.server.message.MessageInstance;
+import org.apache.qpid.test.utils.QpidTestCase;
+
 public class ConsumerListTest extends QpidTestCase
 {
     private QueueConsumerList _subList;
@@ -147,7 +146,7 @@
      * Traverses the list nodes in a non-mutating fashion, returning the first node which matches the given
      * Consumer, or null if none is found.
      */
-    private ConsumerNode getNodeForConsumer(final QueueConsumerList list, final ConsumerImpl sub)
+    private ConsumerNode getNodeForConsumer(final QueueConsumerList list, final QueueConsumer sub)
     {
         ConsumerNode node = list.getHead();
         while (node != null && node.getConsumer() != sub)
diff --git a/broker-core/src/test/java/org/apache/qpid/server/queue/MockMessageInstance.java b/broker-core/src/test/java/org/apache/qpid/server/queue/MockMessageInstance.java
index 31534be..728a72a 100644
--- a/broker-core/src/test/java/org/apache/qpid/server/queue/MockMessageInstance.java
+++ b/broker-core/src/test/java/org/apache/qpid/server/queue/MockMessageInstance.java
@@ -20,11 +20,12 @@
  */
 package org.apache.qpid.server.queue;
 
-import org.apache.qpid.server.consumer.ConsumerImpl;
 import org.apache.qpid.server.filter.Filterable;
 import org.apache.qpid.server.message.AMQMessageHeader;
+import org.apache.qpid.server.message.BaseMessageInstance;
 import org.apache.qpid.server.message.InstanceProperties;
 import org.apache.qpid.server.message.MessageInstance;
+import org.apache.qpid.server.message.MessageInstanceConsumer;
 import org.apache.qpid.server.message.ServerMessage;
 import org.apache.qpid.server.store.MessageEnqueueRecord;
 import org.apache.qpid.server.store.TransactionLogResource;
@@ -49,7 +50,7 @@
     }
 
     @Override
-    public int routeToAlternate(final Action<? super MessageInstance> action,
+    public int routeToAlternate(final Action<? super BaseMessageInstance> action,
                                 final ServerTransaction txn)
     {
         return 0;
@@ -61,7 +62,7 @@
     }
 
     @Override
-    public ConsumerImpl getAcquiringConsumer()
+    public MessageInstanceConsumer getAcquiringConsumer()
     {
         return null;
     }
@@ -73,13 +74,13 @@
     }
 
     @Override
-    public boolean isAcquiredBy(final ConsumerImpl consumer)
+    public boolean isAcquiredBy(final MessageInstanceConsumer consumer)
     {
         return false;
     }
 
     @Override
-    public boolean removeAcquisitionFromConsumer(final ConsumerImpl consumer)
+    public boolean removeAcquisitionFromConsumer(final MessageInstanceConsumer consumer)
     {
         return false;
     }
@@ -95,13 +96,13 @@
     }
 
     @Override
-    public boolean acquire(final ConsumerImpl sub)
+    public boolean acquire(final MessageInstanceConsumer sub)
     {
         return false;
     }
 
     @Override
-    public boolean makeAcquisitionUnstealable(final ConsumerImpl consumer)
+    public boolean makeAcquisitionUnstealable(final MessageInstanceConsumer consumer)
     {
         return false;
     }
@@ -117,7 +118,7 @@
         return false;
     }
 
-    public ConsumerImpl getDeliveredConsumer()
+    public MessageInstanceConsumer getDeliveredConsumer()
     {
         return null;
     }
@@ -147,7 +148,7 @@
     }
 
     @Override
-    public boolean isRejectedBy(final ConsumerImpl consumer)
+    public boolean isRejectedBy(final MessageInstanceConsumer consumer)
     {
         return false;
     }
@@ -158,7 +159,7 @@
     }
 
     @Override
-    public void release(final ConsumerImpl release)
+    public void release(final MessageInstanceConsumer release)
     {
     }
 
diff --git a/broker-core/src/test/java/org/apache/qpid/server/queue/PriorityQueueTest.java b/broker-core/src/test/java/org/apache/qpid/server/queue/PriorityQueueTest.java
index d9ec109..e307c5b 100644
--- a/broker-core/src/test/java/org/apache/qpid/server/queue/PriorityQueueTest.java
+++ b/broker-core/src/test/java/org/apache/qpid/server/queue/PriorityQueueTest.java
@@ -28,8 +28,8 @@
 
 import junit.framework.AssertionFailedError;
 
-import org.apache.qpid.server.consumer.ConsumerImpl;
 import org.apache.qpid.server.message.AMQMessageHeader;
+import org.apache.qpid.server.message.ConsumerOption;
 import org.apache.qpid.server.message.MessageInstance;
 import org.apache.qpid.server.message.ServerMessage;
 
@@ -63,7 +63,7 @@
         queue.enqueue(createMessage(9L, (byte) 0), null, null);
 
         // Register subscriber
-        queue.addConsumer(getConsumer(), null, null, "test", EnumSet.noneOf(ConsumerImpl.Option.class), 0);
+        queue.addConsumer(getConsumer(), null, null, "test", EnumSet.noneOf(ConsumerOption.class), 0);
         Thread.sleep(150);
 
         ArrayList<MessageInstance> msgs = getConsumer().getMessages();
diff --git a/broker-core/src/test/java/org/apache/qpid/server/queue/QueueEntryImplTestBase.java b/broker-core/src/test/java/org/apache/qpid/server/queue/QueueEntryImplTestBase.java
index 3e07bda..08f8dad 100644
--- a/broker-core/src/test/java/org/apache/qpid/server/queue/QueueEntryImplTestBase.java
+++ b/broker-core/src/test/java/org/apache/qpid/server/queue/QueueEntryImplTestBase.java
@@ -145,7 +145,9 @@
         StealableConsumerAcquiredState
                 owningState = new StealableConsumerAcquiredState(consumer);
         when(consumer.getOwningState()).thenReturn(owningState);
-        when(consumer.getConsumerNumber()).thenReturn(_consumerId++);
+        final long consumerNum = _consumerId++;
+        when(consumer.getConsumerNumber()).thenReturn(consumerNum);
+        when(consumer.getIdentifier()).thenReturn(consumerNum);
         return consumer;
     }
 
@@ -298,7 +300,7 @@
 
         StandardQueueImpl queue = new StandardQueueImpl(queueAttributes, virtualHost);
         queue.open();
-        OrderedQueueEntryList queueEntryList = queue.getEntries();
+        OrderedBaseQueueEntryList queueEntryList = queue.getEntries();
 
         // create test entries
         for(int i = 0; i < numberOfEntries ; i++)
diff --git a/broker-core/src/test/java/org/apache/qpid/server/queue/SimpleQueueEntryImplTest.java b/broker-core/src/test/java/org/apache/qpid/server/queue/SimpleQueueEntryImplTest.java
index 7671218..691879d 100644
--- a/broker-core/src/test/java/org/apache/qpid/server/queue/SimpleQueueEntryImplTest.java
+++ b/broker-core/src/test/java/org/apache/qpid/server/queue/SimpleQueueEntryImplTest.java
@@ -44,7 +44,7 @@
 public class SimpleQueueEntryImplTest extends QueueEntryImplTestBase
 {
 
-    private OrderedQueueEntryList queueEntryList;
+    private OrderedBaseQueueEntryList queueEntryList;
 
     @Override
     public void setUp() throws Exception
diff --git a/broker-core/src/test/java/org/apache/qpid/server/queue/StandardQueueEntryListTest.java b/broker-core/src/test/java/org/apache/qpid/server/queue/StandardQueueEntryListTest.java
index 2f4005c..44a65f1 100644
--- a/broker-core/src/test/java/org/apache/qpid/server/queue/StandardQueueEntryListTest.java
+++ b/broker-core/src/test/java/org/apache/qpid/server/queue/StandardQueueEntryListTest.java
@@ -160,7 +160,7 @@
 
     public void testScavenge() throws Exception
     {
-        OrderedQueueEntryList sqel = new StandardQueueEntryList(mock(StandardQueueImpl.class));
+        OrderedBaseQueueEntryList sqel = new StandardQueueEntryList(mock(StandardQueueImpl.class));
         ConcurrentMap<Integer,QueueEntry> entriesMap = new ConcurrentHashMap<Integer,QueueEntry>();
 
 
@@ -265,7 +265,7 @@
     {
         final int numberOfEntries = 5;
         final OrderedQueueEntry[] entries = new OrderedQueueEntry[numberOfEntries];
-        final OrderedQueueEntryList queueEntryList = getTestList(true);
+        final OrderedBaseQueueEntryList queueEntryList = getTestList(true);
 
         // create test entries
         for(int i = 0; i < numberOfEntries; i++)
diff --git a/broker-core/src/test/java/org/apache/qpid/server/queue/StandardQueueTest.java b/broker-core/src/test/java/org/apache/qpid/server/queue/StandardQueueTest.java
index d386e49..aae05f4 100644
--- a/broker-core/src/test/java/org/apache/qpid/server/queue/StandardQueueTest.java
+++ b/broker-core/src/test/java/org/apache/qpid/server/queue/StandardQueueTest.java
@@ -29,10 +29,11 @@
 import java.util.concurrent.CountDownLatch;
 import java.util.concurrent.TimeUnit;
 
-import org.apache.qpid.server.consumer.ConsumerImpl;
 import org.apache.qpid.server.consumer.ConsumerTarget;
 import org.apache.qpid.server.consumer.MockConsumer;
+import org.apache.qpid.server.message.ConsumerOption;
 import org.apache.qpid.server.message.MessageInstance;
+import org.apache.qpid.server.message.MessageInstanceConsumer;
 import org.apache.qpid.server.message.ServerMessage;
 import org.apache.qpid.server.model.LifetimePolicy;
 import org.apache.qpid.server.model.Queue;
@@ -57,8 +58,8 @@
         ServerMessage message = createMessage(25l);
         QueueConsumer consumer =
                 (QueueConsumer) getQueue().addConsumer(getConsumerTarget(), null, message.getClass(), "test",
-                                                       EnumSet.of(ConsumerImpl.Option.ACQUIRES,
-                                                  ConsumerImpl.Option.SEES_REQUEUES), 0);
+                                                       EnumSet.of(ConsumerOption.ACQUIRES,
+                                                                  ConsumerOption.SEES_REQUEUES), 0);
 
         getQueue().enqueue(message, null, null);
         consumer.close();
@@ -83,8 +84,8 @@
                           null,
                           createMessage(-1l).getClass(),
                           "test",
-                          EnumSet.of(ConsumerImpl.Option.ACQUIRES,
-                                     ConsumerImpl.Option.SEES_REQUEUES), 0);
+                          EnumSet.of(ConsumerOption.ACQUIRES,
+                                     ConsumerOption.SEES_REQUEUES), 0);
         assertEquals("Unexpected active consumer count", 1, queue.getConsumerCountWithCredit());
 
         //verify adding an inactive consumer doesn't increase the count
@@ -96,8 +97,8 @@
                           null,
                           createMessage(-1l).getClass(),
                           "test",
-                          EnumSet.of(ConsumerImpl.Option.ACQUIRES,
-                                     ConsumerImpl.Option.SEES_REQUEUES), 0);
+                          EnumSet.of(ConsumerOption.ACQUIRES,
+                                     ConsumerOption.SEES_REQUEUES), 0);
         assertEquals("Unexpected active consumer count", 1, queue.getConsumerCountWithCredit());
 
         //verify behaviour in face of expected state changes:
@@ -151,8 +152,8 @@
                           null,
                           createMessage(-1l).getClass(),
                           "test",
-                          EnumSet.of(ConsumerImpl.Option.ACQUIRES,
-                                     ConsumerImpl.Option.SEES_REQUEUES), 0);
+                          EnumSet.of(ConsumerOption.ACQUIRES,
+                                     ConsumerOption.SEES_REQUEUES), 0);
 
         // put test messages into a queue
         putGivenNumberOfMessages(queue, 4);
@@ -201,7 +202,7 @@
              * @param entry
              * @param batch
              */
-            public long send(final ConsumerImpl consumer, MessageInstance entry, boolean batch)
+            public long send(final MessageInstanceConsumer consumer, MessageInstance entry, boolean batch)
             {
                 long size = super.send(consumer, entry, batch);
                 latch.countDown();
@@ -214,8 +215,8 @@
                               null,
                               entries.get(0).getMessage().getClass(),
                               "test",
-                              EnumSet.of(ConsumerImpl.Option.ACQUIRES,
-                                         ConsumerImpl.Option.SEES_REQUEUES), 0);
+                              EnumSet.of(ConsumerOption.ACQUIRES,
+                                         ConsumerOption.SEES_REQUEUES), 0);
 
         // process queue
         testQueue.processQueue(new QueueRunner(testQueue, AccessController.getContext())
@@ -341,7 +342,7 @@
         }
 
         @Override
-        public boolean acquire(ConsumerImpl sub)
+        public boolean acquire(MessageInstanceConsumer sub)
         {
             if(_message.getMessageNumber() % 2 == 0)
             {
@@ -354,7 +355,7 @@
         }
 
         @Override
-        public boolean makeAcquisitionUnstealable(final ConsumerImpl consumer)
+        public boolean makeAcquisitionUnstealable(final MessageInstanceConsumer consumer)
         {
             return true;
         }
diff --git a/broker-core/src/test/java/org/apache/qpid/server/security/TrustStoreMessageSourceTest.java b/broker-core/src/test/java/org/apache/qpid/server/security/TrustStoreMessageSourceTest.java
index 0f9569f..6cada6d 100644
--- a/broker-core/src/test/java/org/apache/qpid/server/security/TrustStoreMessageSourceTest.java
+++ b/broker-core/src/test/java/org/apache/qpid/server/security/TrustStoreMessageSourceTest.java
@@ -38,9 +38,10 @@
 import org.mockito.ArgumentCaptor;
 
 import org.apache.qpid.bytebuffer.QpidByteBuffer;
-import org.apache.qpid.server.consumer.ConsumerImpl;
 import org.apache.qpid.server.consumer.ConsumerTarget;
+import org.apache.qpid.server.message.ConsumerOption;
 import org.apache.qpid.server.message.MessageInstance;
+import org.apache.qpid.server.message.MessageInstanceConsumer;
 import org.apache.qpid.server.message.ServerMessage;
 import org.apache.qpid.server.model.State;
 import org.apache.qpid.server.model.TrustStore;
@@ -74,14 +75,14 @@
 
     public void testAddConsumer() throws Exception
     {
-        final EnumSet<ConsumerImpl.Option> options = EnumSet.noneOf(ConsumerImpl.Option.class);
+        final EnumSet<ConsumerOption> options = EnumSet.noneOf(ConsumerOption.class);
         final ConsumerTarget target = mock(ConsumerTarget.class);
         when(target.allocateCredit(any(ServerMessage.class))).thenReturn(true);
 
         _trustStoreMessageSource.addConsumer(target, null, ServerMessage.class, getTestName(), options, 0);
 
         ArgumentCaptor<MessageInstance> argumentCaptor = ArgumentCaptor.forClass(MessageInstance.class);
-        verify(target).send(any(ConsumerImpl.class), argumentCaptor.capture(), anyBoolean());
+        verify(target).send(any(MessageInstanceConsumer.class), argumentCaptor.capture(), anyBoolean());
         final ServerMessage message = argumentCaptor.getValue().getMessage();
         assertCertificates(getCertificatesFromMessage(message));
     }
diff --git a/broker-core/src/test/java/org/apache/qpid/server/virtualhost/AsynchronousMessageStoreRecovererTest.java b/broker-core/src/test/java/org/apache/qpid/server/virtualhost/AsynchronousMessageStoreRecovererTest.java
index f095f92..a948519 100644
--- a/broker-core/src/test/java/org/apache/qpid/server/virtualhost/AsynchronousMessageStoreRecovererTest.java
+++ b/broker-core/src/test/java/org/apache/qpid/server/virtualhost/AsynchronousMessageStoreRecovererTest.java
@@ -37,6 +37,7 @@
 import org.apache.qpid.server.store.MessageStore;
 import org.apache.qpid.server.store.TransactionLogResource;
 import org.apache.qpid.server.store.handler.MessageInstanceHandler;
+import org.apache.qpid.server.transfer.TransferQueue;
 import org.apache.qpid.server.util.ServerScopedRuntimeException;
 import org.apache.qpid.test.utils.QpidTestCase;
 
@@ -54,6 +55,9 @@
         _virtualHost = mock(VirtualHost.class);
         _store = mock(MessageStore.class);
         _storeReader = mock(MessageStore.MessageStoreReader.class);
+        TransferQueue tq = mock(TransferQueue.class);
+        when(tq.getName()).thenReturn("$transfer");
+        when(_virtualHost.getTransferQueue()).thenReturn(tq);
 
         when(_virtualHost.getEventLogger()).thenReturn(new EventLogger());
         when(_virtualHost.getMessageStore()).thenReturn(_store);
diff --git a/broker-core/src/test/java/org/apache/qpid/server/virtualhost/SynchronousMessageStoreRecovererTest.java b/broker-core/src/test/java/org/apache/qpid/server/virtualhost/SynchronousMessageStoreRecovererTest.java
index 55fde08..d5821c1 100644
--- a/broker-core/src/test/java/org/apache/qpid/server/virtualhost/SynchronousMessageStoreRecovererTest.java
+++ b/broker-core/src/test/java/org/apache/qpid/server/virtualhost/SynchronousMessageStoreRecovererTest.java
@@ -32,15 +32,14 @@
 
 import java.util.UUID;
 
-import org.apache.qpid.server.model.Queue;
-import org.apache.qpid.server.model.VirtualHost;
-import org.apache.qpid.test.utils.QpidTestCase;
 import org.mockito.ArgumentMatcher;
 
 import org.apache.qpid.server.logging.EventLogger;
+import org.apache.qpid.server.message.BaseMessageInstance;
 import org.apache.qpid.server.message.EnqueueableMessage;
-import org.apache.qpid.server.message.MessageInstance;
 import org.apache.qpid.server.message.ServerMessage;
+import org.apache.qpid.server.model.Queue;
+import org.apache.qpid.server.model.VirtualHost;
 import org.apache.qpid.server.queue.QueueEntry;
 import org.apache.qpid.server.store.MessageDurability;
 import org.apache.qpid.server.store.MessageEnqueueRecord;
@@ -55,9 +54,11 @@
 import org.apache.qpid.server.store.handler.DistributedTransactionHandler;
 import org.apache.qpid.server.store.handler.MessageHandler;
 import org.apache.qpid.server.store.handler.MessageInstanceHandler;
+import org.apache.qpid.server.transfer.TransferQueue;
 import org.apache.qpid.server.txn.DtxBranch;
 import org.apache.qpid.server.txn.DtxRegistry;
 import org.apache.qpid.server.util.Action;
+import org.apache.qpid.test.utils.QpidTestCase;
 import org.apache.qpid.transport.Xid;
 
 public class SynchronousMessageStoreRecovererTest extends QpidTestCase
@@ -70,7 +71,11 @@
         super.setUp();
 
         _virtualHost = mock(VirtualHost.class);
+        TransferQueue tq = mock(TransferQueue.class);
+        UUID tqId = UUID.randomUUID();
+        when(tq.getId()).thenReturn(tqId);
         when(_virtualHost.getEventLogger()).thenReturn(new EventLogger());
+        when(_virtualHost.getTransferQueue()).thenReturn(tq);
 
     }
 
@@ -294,7 +299,7 @@
         branch.commit();
 
         ServerMessage<?> message = storedMessage.getMetaData().getType().createMessage(storedMessage);
-        verify(queue, times(1)).enqueue(eq(message), (Action<? super MessageInstance>)isNull(), any(MessageEnqueueRecord.class));
+        verify(queue, times(1)).enqueue(eq(message), (Action<? super BaseMessageInstance>)isNull(), any(MessageEnqueueRecord.class));
         verify(transaction).commitTran();
     }
 
diff --git a/broker-core/src/test/java/org/apache/qpid/server/virtualhost/VirtualHostPropertiesNodeTest.java b/broker-core/src/test/java/org/apache/qpid/server/virtualhost/VirtualHostPropertiesNodeTest.java
index dd2dd47..11e73e5 100644
--- a/broker-core/src/test/java/org/apache/qpid/server/virtualhost/VirtualHostPropertiesNodeTest.java
+++ b/broker-core/src/test/java/org/apache/qpid/server/virtualhost/VirtualHostPropertiesNodeTest.java
@@ -26,9 +26,10 @@
 
 import java.util.EnumSet;
 
-import org.apache.qpid.server.consumer.ConsumerImpl;
 import org.apache.qpid.server.consumer.ConsumerTarget;
+import org.apache.qpid.server.message.ConsumerOption;
 import org.apache.qpid.server.message.MessageInstance;
+import org.apache.qpid.server.message.MessageInstanceConsumer;
 import org.apache.qpid.server.message.ServerMessage;
 import org.apache.qpid.server.model.VirtualHost;
 import org.apache.qpid.server.store.MessageStore;
@@ -52,11 +53,11 @@
 
     public void testAddConsumer() throws Exception
     {
-        final EnumSet<ConsumerImpl.Option> options = EnumSet.noneOf(ConsumerImpl.Option.class);
+        final EnumSet<ConsumerOption> options = EnumSet.noneOf(ConsumerOption.class);
         final ConsumerTarget target = mock(ConsumerTarget.class);
         when(target.allocateCredit(any(ServerMessage.class))).thenReturn(true);
 
         _virtualHostPropertiesNode.addConsumer(target, null, ServerMessage.class, getTestName(), options, 0);
-        verify(target).send(any(ConsumerImpl.class), any(MessageInstance.class), anyBoolean());
+        verify(target).send(any(MessageInstanceConsumer.class), any(MessageInstance.class), anyBoolean());
     }
 }
diff --git a/broker-plugins/amqp-0-10-protocol/src/main/java/org/apache/qpid/server/protocol/v0_10/ConsumerTarget_0_10.java b/broker-plugins/amqp-0-10-protocol/src/main/java/org/apache/qpid/server/protocol/v0_10/ConsumerTarget_0_10.java
index cfb6770..b93be3d 100644
--- a/broker-plugins/amqp-0-10-protocol/src/main/java/org/apache/qpid/server/protocol/v0_10/ConsumerTarget_0_10.java
+++ b/broker-plugins/amqp-0-10-protocol/src/main/java/org/apache/qpid/server/protocol/v0_10/ConsumerTarget_0_10.java
@@ -31,13 +31,14 @@
 
 import org.apache.qpid.bytebuffer.QpidByteBuffer;
 import org.apache.qpid.server.consumer.AbstractConsumerTarget;
-import org.apache.qpid.server.consumer.ConsumerImpl;
 import org.apache.qpid.server.flow.FlowCreditManager;
 import org.apache.qpid.server.logging.EventLogger;
 import org.apache.qpid.server.logging.messages.ChannelMessages;
+import org.apache.qpid.server.message.BaseMessageInstance;
 import org.apache.qpid.server.message.MessageInstance;
 import org.apache.qpid.server.message.MessageInstance.ConsumerAcquiredState;
 import org.apache.qpid.server.message.MessageInstance.EntryState;
+import org.apache.qpid.server.message.MessageInstanceConsumer;
 import org.apache.qpid.server.message.ServerMessage;
 import org.apache.qpid.server.model.Exchange;
 import org.apache.qpid.server.model.Queue;
@@ -148,7 +149,6 @@
         // TODO check for Session suspension
     }
 
-    @Override
     protected void doCloseInternal()
     {
         _creditManager.removeListener(this);
@@ -213,7 +213,7 @@
 
     private final AddMessageDispositionListenerAction _postIdSettingAction;
 
-    public void doSend(final ConsumerImpl consumer, final MessageInstance entry, boolean batch)
+    public void doSend(final MessageInstanceConsumer consumer, final MessageInstance entry, boolean batch)
     {
         ServerMessage serverMsg = entry.getMessage();
 
@@ -435,7 +435,7 @@
                            });
    }
 
-    void reject(final ConsumerImpl consumer, final MessageInstance entry)
+    void reject(final MessageInstanceConsumer consumer, final MessageInstance entry)
     {
         entry.setRedelivered();
         if (entry.makeAcquisitionUnstealable(consumer))
@@ -444,7 +444,7 @@
         }
     }
 
-    void release(final ConsumerImpl consumer,
+    void release(final MessageInstanceConsumer consumer,
                  final MessageInstance entry,
                  final boolean setRedelivered)
     {
@@ -468,17 +468,17 @@
         }
     }
 
-    protected void sendToDLQOrDiscard(final ConsumerImpl consumer, MessageInstance entry)
+    protected void sendToDLQOrDiscard(final MessageInstanceConsumer consumer, MessageInstance entry)
     {
         final ServerMessage msg = entry.getMessage();
 
         int requeues = 0;
         if (entry.makeAcquisitionUnstealable(consumer))
         {
-            requeues = entry.routeToAlternate(new Action<MessageInstance>()
+            requeues = entry.routeToAlternate(new Action<BaseMessageInstance>()
             {
                 @Override
-                public void performAction(final MessageInstance requeueEntry)
+                public void performAction(final BaseMessageInstance requeueEntry)
                 {
                     getEventLogger().message(ChannelMessages.DEADLETTERMSG(msg.getMessageNumber(),
                                                                            requeueEntry.getOwningResource()
@@ -614,7 +614,7 @@
     public void flush()
     {
         flushCreditState(true);
-        for(ConsumerImpl consumer : getConsumers())
+        for(MessageInstanceConsumer consumer : getConsumers())
         {
             consumer.flush();
         }
diff --git a/broker-plugins/amqp-0-10-protocol/src/main/java/org/apache/qpid/server/protocol/v0_10/ExplicitAcceptDispositionChangeListener.java b/broker-plugins/amqp-0-10-protocol/src/main/java/org/apache/qpid/server/protocol/v0_10/ExplicitAcceptDispositionChangeListener.java
index 0a12dfd..283315d 100755
--- a/broker-plugins/amqp-0-10-protocol/src/main/java/org/apache/qpid/server/protocol/v0_10/ExplicitAcceptDispositionChangeListener.java
+++ b/broker-plugins/amqp-0-10-protocol/src/main/java/org/apache/qpid/server/protocol/v0_10/ExplicitAcceptDispositionChangeListener.java
@@ -23,8 +23,8 @@
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import org.apache.qpid.server.consumer.ConsumerImpl;
 import org.apache.qpid.server.message.MessageInstance;
+import org.apache.qpid.server.message.MessageInstanceConsumer;
 
 
 class ExplicitAcceptDispositionChangeListener implements ServerSession.MessageDispositionChangeListener
@@ -34,11 +34,11 @@
 
     private final MessageInstance _entry;
     private final ConsumerTarget_0_10 _target;
-    private final ConsumerImpl _consumer;
+    private final MessageInstanceConsumer _consumer;
 
     public ExplicitAcceptDispositionChangeListener(MessageInstance entry,
                                                    ConsumerTarget_0_10 target,
-                                                   final ConsumerImpl consumer)
+                                                   final MessageInstanceConsumer consumer)
     {
         _entry = entry;
         _target = target;
diff --git a/broker-plugins/amqp-0-10-protocol/src/main/java/org/apache/qpid/server/protocol/v0_10/ImplicitAcceptDispositionChangeListener.java b/broker-plugins/amqp-0-10-protocol/src/main/java/org/apache/qpid/server/protocol/v0_10/ImplicitAcceptDispositionChangeListener.java
index 10bc474..8adf027 100755
--- a/broker-plugins/amqp-0-10-protocol/src/main/java/org/apache/qpid/server/protocol/v0_10/ImplicitAcceptDispositionChangeListener.java
+++ b/broker-plugins/amqp-0-10-protocol/src/main/java/org/apache/qpid/server/protocol/v0_10/ImplicitAcceptDispositionChangeListener.java
@@ -23,8 +23,8 @@
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import org.apache.qpid.server.consumer.ConsumerImpl;
 import org.apache.qpid.server.message.MessageInstance;
+import org.apache.qpid.server.message.MessageInstanceConsumer;
 
 class ImplicitAcceptDispositionChangeListener implements ServerSession.MessageDispositionChangeListener
 {
@@ -33,11 +33,11 @@
 
     private final MessageInstance _entry;
     private final ConsumerTarget_0_10 _target;
-    private final ConsumerImpl _consumer;
+    private final MessageInstanceConsumer _consumer;
 
     public ImplicitAcceptDispositionChangeListener(MessageInstance entry,
                                                    ConsumerTarget_0_10 target,
-                                                   final ConsumerImpl consumer)
+                                                   final MessageInstanceConsumer consumer)
     {
         _entry = entry;
         _target = target;
diff --git a/broker-plugins/amqp-0-10-protocol/src/main/java/org/apache/qpid/server/protocol/v0_10/MessageAcceptCompletionListener.java b/broker-plugins/amqp-0-10-protocol/src/main/java/org/apache/qpid/server/protocol/v0_10/MessageAcceptCompletionListener.java
index d1a4d27..3641415 100755
--- a/broker-plugins/amqp-0-10-protocol/src/main/java/org/apache/qpid/server/protocol/v0_10/MessageAcceptCompletionListener.java
+++ b/broker-plugins/amqp-0-10-protocol/src/main/java/org/apache/qpid/server/protocol/v0_10/MessageAcceptCompletionListener.java
@@ -21,8 +21,8 @@
 
 package org.apache.qpid.server.protocol.v0_10;
 
-import org.apache.qpid.server.consumer.ConsumerImpl;
 import org.apache.qpid.server.message.MessageInstance;
+import org.apache.qpid.server.message.MessageInstanceConsumer;
 import org.apache.qpid.transport.Method;
 
 public class MessageAcceptCompletionListener implements Method.CompletionListener
@@ -30,12 +30,12 @@
     private final ConsumerTarget_0_10 _sub;
     private final MessageInstance _entry;
     private final ServerSession _session;
-    private final ConsumerImpl _consumer;
+    private final MessageInstanceConsumer _consumer;
     private long _messageSize;
     private boolean _restoreCredit;
 
     public MessageAcceptCompletionListener(ConsumerTarget_0_10 sub,
-                                           final ConsumerImpl consumer,
+                                           final MessageInstanceConsumer consumer,
                                            ServerSession session,
                                            MessageInstance entry,
                                            boolean restoreCredit)
diff --git a/broker-plugins/amqp-0-10-protocol/src/main/java/org/apache/qpid/server/protocol/v0_10/ServerSession.java b/broker-plugins/amqp-0-10-protocol/src/main/java/org/apache/qpid/server/protocol/v0_10/ServerSession.java
index 8afa6aa..cb1fb9b 100644
--- a/broker-plugins/amqp-0-10-protocol/src/main/java/org/apache/qpid/server/protocol/v0_10/ServerSession.java
+++ b/broker-plugins/amqp-0-10-protocol/src/main/java/org/apache/qpid/server/protocol/v0_10/ServerSession.java
@@ -56,15 +56,17 @@
 
 import org.apache.qpid.protocol.AMQConstant;
 import org.apache.qpid.server.connection.SessionPrincipal;
-import org.apache.qpid.server.consumer.ConsumerImpl;
 import org.apache.qpid.server.consumer.ConsumerTarget;
 import org.apache.qpid.server.logging.LogMessage;
 import org.apache.qpid.server.logging.LogSubject;
 import org.apache.qpid.server.logging.messages.ChannelMessages;
 import org.apache.qpid.server.logging.subjects.ChannelLogSubject;
+import org.apache.qpid.server.message.BaseMessageInstance;
 import org.apache.qpid.server.message.InstanceProperties;
 import org.apache.qpid.server.message.MessageDestination;
 import org.apache.qpid.server.message.MessageInstance;
+import org.apache.qpid.server.message.MessageInstanceConsumer;
+import org.apache.qpid.server.model.AbstractConfigurationChangeListener;
 import org.apache.qpid.server.model.Broker;
 import org.apache.qpid.server.model.ConfigurationChangeListener;
 import org.apache.qpid.server.model.ConfiguredObject;
@@ -536,7 +538,7 @@
         // Broker shouldn't block awaiting close - thus do override this method to do nothing
     }
 
-    public void acknowledge(final ConsumerImpl consumer,
+    public void acknowledge(final MessageInstanceConsumer consumer,
                             final ConsumerTarget_0_10 target,
                             final MessageInstance entry)
     {
@@ -573,14 +575,14 @@
     }
 
 
-    public void register(final ConsumerImpl consumerImpl)
+    public void register(final MessageInstanceConsumer consumer)
     {
-        if(consumerImpl instanceof Consumer<?>)
+        if(consumer instanceof Consumer<?>)
         {
-            final Consumer<?> consumer = (Consumer<?>) consumerImpl;
-            _consumers.add(consumer);
-            consumer.addChangeListener(_consumerClosedListener);
-            consumerAdded(consumer);
+            final Consumer<?> modelConsumer = (Consumer<?>) consumer;
+            _consumers.add(modelConsumer);
+            modelConsumer.addChangeListener(_consumerClosedListener);
+            consumerAdded(modelConsumer);
         }
     }
 
@@ -1296,10 +1298,10 @@
         return getId().compareTo(o.getId());
     }
 
-    private class CheckCapacityAction implements Action<MessageInstance>
+    private class CheckCapacityAction implements Action<BaseMessageInstance>
     {
         @Override
-        public void performAction(final MessageInstance entry)
+        public void performAction(final BaseMessageInstance entry)
         {
             TransactionLogResource queue = entry.getOwningResource();
             if(queue instanceof CapacityChecker)
@@ -1309,7 +1311,7 @@
         }
     }
 
-    private class ConsumerClosedListener implements ConfigurationChangeListener
+    private class ConsumerClosedListener extends AbstractConfigurationChangeListener
     {
         @Override
         public void stateChanged(final ConfiguredObject object, final org.apache.qpid.server.model.State oldState, final org.apache.qpid.server.model.State newState)
@@ -1320,37 +1322,5 @@
             }
         }
 
-        @Override
-        public void childAdded(final ConfiguredObject object, final ConfiguredObject child)
-        {
-
-        }
-
-        @Override
-        public void childRemoved(final ConfiguredObject object, final ConfiguredObject child)
-        {
-
-        }
-
-        @Override
-        public void attributeSet(final ConfiguredObject object,
-                                 final String attributeName,
-                                 final Object oldAttributeValue,
-                                 final Object newAttributeValue)
-        {
-
-        }
-
-        @Override
-        public void bulkChangeStart(final ConfiguredObject<?> object)
-        {
-
-        }
-
-        @Override
-        public void bulkChangeEnd(final ConfiguredObject<?> object)
-        {
-
-        }
     }
 }
diff --git a/broker-plugins/amqp-0-10-protocol/src/main/java/org/apache/qpid/server/protocol/v0_10/ServerSessionDelegate.java b/broker-plugins/amqp-0-10-protocol/src/main/java/org/apache/qpid/server/protocol/v0_10/ServerSessionDelegate.java
index 898edd6..a999d4e 100644
--- a/broker-plugins/amqp-0-10-protocol/src/main/java/org/apache/qpid/server/protocol/v0_10/ServerSessionDelegate.java
+++ b/broker-plugins/amqp-0-10-protocol/src/main/java/org/apache/qpid/server/protocol/v0_10/ServerSessionDelegate.java
@@ -39,7 +39,6 @@
 import org.apache.qpid.common.AMQPFilterTypes;
 import org.apache.qpid.exchange.ExchangeDefaults;
 import org.apache.qpid.protocol.AMQConstant;
-import org.apache.qpid.server.consumer.ConsumerImpl;
 import org.apache.qpid.server.filter.AMQInvalidArgumentException;
 import org.apache.qpid.server.filter.ArrivalTimeFilter;
 import org.apache.qpid.server.filter.FilterManager;
@@ -48,6 +47,7 @@
 import org.apache.qpid.server.logging.EventLogger;
 import org.apache.qpid.server.logging.messages.ChannelMessages;
 import org.apache.qpid.server.logging.messages.ExchangeMessages;
+import org.apache.qpid.server.message.ConsumerOption;
 import org.apache.qpid.server.message.InstanceProperties;
 import org.apache.qpid.server.message.MessageDestination;
 import org.apache.qpid.server.message.MessageReference;
@@ -338,18 +338,18 @@
                     ((ServerSession)session).register(destination, target);
                     try
                     {
-                        EnumSet<ConsumerImpl.Option> options = EnumSet.noneOf(ConsumerImpl.Option.class);
+                        EnumSet<ConsumerOption> options = EnumSet.noneOf(ConsumerOption.class);
                         if(method.getAcquireMode() == MessageAcquireMode.PRE_ACQUIRED)
                         {
-                            options.add(ConsumerImpl.Option.ACQUIRES);
+                            options.add(ConsumerOption.ACQUIRES);
                         }
                         if(method.getAcquireMode() != MessageAcquireMode.NOT_ACQUIRED || method.getAcceptMode() == MessageAcceptMode.EXPLICIT)
                         {
-                            options.add(ConsumerImpl.Option.SEES_REQUEUES);
+                            options.add(ConsumerOption.SEES_REQUEUES);
                         }
                         if(method.getExclusive())
                         {
-                            options.add(ConsumerImpl.Option.EXCLUSIVE);
+                            options.add(ConsumerOption.EXCLUSIVE);
                         }
                         for(MessageSource source : sources)
                         {
diff --git a/broker-plugins/amqp-0-8-protocol/src/main/java/org/apache/qpid/server/protocol/v0_8/AMQChannel.java b/broker-plugins/amqp-0-8-protocol/src/main/java/org/apache/qpid/server/protocol/v0_8/AMQChannel.java
index ccfb99e..46d5939 100644
--- a/broker-plugins/amqp-0-8-protocol/src/main/java/org/apache/qpid/server/protocol/v0_8/AMQChannel.java
+++ b/broker-plugins/amqp-0-8-protocol/src/main/java/org/apache/qpid/server/protocol/v0_8/AMQChannel.java
@@ -57,7 +57,6 @@
 import org.apache.qpid.framing.*;
 import org.apache.qpid.protocol.AMQConstant;
 import org.apache.qpid.server.connection.SessionPrincipal;
-import org.apache.qpid.server.consumer.ConsumerImpl;
 import org.apache.qpid.server.consumer.ConsumerTarget;
 import org.apache.qpid.server.filter.AMQInvalidArgumentException;
 import org.apache.qpid.server.filter.ArrivalTimeFilter;
@@ -73,12 +72,16 @@
 import org.apache.qpid.server.logging.messages.ChannelMessages;
 import org.apache.qpid.server.logging.messages.ExchangeMessages;
 import org.apache.qpid.server.logging.subjects.ChannelLogSubject;
+import org.apache.qpid.server.message.BaseMessageInstance;
+import org.apache.qpid.server.message.ConsumerOption;
 import org.apache.qpid.server.message.InstanceProperties;
 import org.apache.qpid.server.message.MessageDestination;
 import org.apache.qpid.server.message.MessageInstance;
+import org.apache.qpid.server.message.MessageInstanceConsumer;
 import org.apache.qpid.server.message.MessageReference;
 import org.apache.qpid.server.message.MessageSource;
 import org.apache.qpid.server.message.ServerMessage;
+import org.apache.qpid.server.model.AbstractConfigurationChangeListener;
 import org.apache.qpid.server.model.Broker;
 import org.apache.qpid.server.model.ConfigurationChangeListener;
 import org.apache.qpid.server.model.ConfiguredObject;
@@ -307,7 +310,7 @@
         final RecordDeliveryMethod getRecordMethod = new RecordDeliveryMethod()
         {
 
-            public void recordMessageDelivery(final ConsumerImpl sub,
+            public void recordMessageDelivery(final MessageInstanceConsumer sub,
                                               final MessageInstance entry,
                                               final long deliveryTag)
             {
@@ -316,8 +319,8 @@
         };
 
         ConsumerTarget_0_8 target;
-        EnumSet<ConsumerImpl.Option> options = EnumSet.of(ConsumerImpl.Option.TRANSIENT, ConsumerImpl.Option.ACQUIRES,
-                                                          ConsumerImpl.Option.SEES_REQUEUES);
+        EnumSet<ConsumerOption> options = EnumSet.of(ConsumerOption.TRANSIENT, ConsumerOption.ACQUIRES,
+                                                     ConsumerOption.SEES_REQUEUES);
         if (acks)
         {
 
@@ -332,7 +335,7 @@
                                                              singleMessageCredit, getDeliveryMethod, getRecordMethod);
         }
 
-        ConsumerImpl sub = queue.addConsumer(target, null, AMQMessage.class, "", options, null);
+        MessageInstanceConsumer sub = queue.addConsumer(target, null, AMQMessage.class, "", options, null);
         sub.flush();
         sub.close();
         return getDeliveryMethod.hasDeliveredMessage();
@@ -629,12 +632,13 @@
         }
         else
         {
+            if(_confirmOnPublish)
+            {
+                _connection.writeFrame(new AMQFrame(_channelId, new BasicNackBody(_confirmedMessageCounter, false, false)));
+            }
+
             if (mandatory || message.isImmediate())
             {
-                if(_confirmOnPublish)
-                {
-                    _connection.writeFrame(new AMQFrame(_channelId, new BasicNackBody(_confirmedMessageCounter, false, false)));
-                }
                 _transaction.addPostTransactionAction(new WriteReturnAction(AMQConstant.NO_ROUTE,
                                                                             "No Route for message "
                                                                             + description,
@@ -726,7 +730,7 @@
         }
 
         ConsumerTarget_0_8 target;
-        EnumSet<ConsumerImpl.Option> options = EnumSet.noneOf(ConsumerImpl.Option.class);
+        EnumSet<ConsumerOption> options = EnumSet.noneOf(ConsumerOption.class);
         final boolean multiQueue = sources.size()>1;
         if(arguments != null && Boolean.TRUE.equals(arguments.get(AMQPFilterTypes.NO_CONSUME.getValue())))
         {
@@ -735,19 +739,19 @@
         else if(acks)
         {
             target = ConsumerTarget_0_8.createAckTarget(this, tag, arguments, _creditManager, multiQueue);
-            options.add(ConsumerImpl.Option.ACQUIRES);
-            options.add(ConsumerImpl.Option.SEES_REQUEUES);
+            options.add(ConsumerOption.ACQUIRES);
+            options.add(ConsumerOption.SEES_REQUEUES);
         }
         else
         {
             target = ConsumerTarget_0_8.createNoAckTarget(this, tag, arguments, _noAckCreditManager, multiQueue);
-            options.add(ConsumerImpl.Option.ACQUIRES);
-            options.add(ConsumerImpl.Option.SEES_REQUEUES);
+            options.add(ConsumerOption.ACQUIRES);
+            options.add(ConsumerOption.SEES_REQUEUES);
         }
 
         if(exclusive)
         {
-            options.add(ConsumerImpl.Option.EXCLUSIVE);
+            options.add(ConsumerOption.EXCLUSIVE);
         }
 
 
@@ -831,7 +835,7 @@
 
             for(MessageSource source : sources)
             {
-                ConsumerImpl sub =
+                MessageInstanceConsumer sub =
                         source.addConsumer(target,
                                            filterManager,
                                            AMQMessage.class,
@@ -871,15 +875,15 @@
         }
 
         ConsumerTarget_0_8 target = _tag2SubscriptionTargetMap.remove(consumerTag);
-        Collection<ConsumerImpl> subs = target == null ? null : target.getConsumers();
-        if (subs != null)
+        Collection<MessageInstanceConsumer> consumers = target == null ? null : target.getConsumers();
+        if (consumers != null)
         {
-            for(ConsumerImpl sub : subs)
+            for(MessageInstanceConsumer consumer : consumers)
             {
-                sub.close();
-                if (sub instanceof Consumer<?>)
+                consumer.close();
+                if (consumer instanceof Consumer<?>)
                 {
-                    _consumers.remove(sub);
+                    _consumers.remove(consumer);
                 }
             }
             return true;
@@ -959,13 +963,12 @@
 
     /**
      * Add a message to the channel-based list of unacknowledged messages
-     *
-     * @param entry       the record of the message on the queue that was delivered
+     *  @param entry       the record of the message on the queue that was delivered
      * @param deliveryTag the delivery tag used when delivering the message (see protocol spec for description of the
      *                    delivery tag)
      * @param consumer The consumer that is to acknowledge this message.
      */
-    public void addUnacknowledgedMessage(MessageInstance entry, long deliveryTag, ConsumerImpl consumer)
+    public void addUnacknowledgedMessage(MessageInstance entry, long deliveryTag, MessageInstanceConsumer consumer)
     {
         if (_logger.isDebugEnabled())
         {
@@ -1211,9 +1214,9 @@
                 // may need to deliver queued messages
                 for (ConsumerTarget_0_8 s : getConsumerTargets())
                 {
-                    for(ConsumerImpl sub : s.getConsumers())
+                    for(MessageInstanceConsumer consumer : s.getConsumers())
                     {
-                        sub.externalStateChange();
+                        consumer.externalStateChange();
                     }
                 }
             }
@@ -1319,7 +1322,7 @@
 
         for(MessageInstance entry : _resendList)
         {
-            ConsumerImpl sub = entry.getAcquiringConsumer();
+            MessageInstanceConsumer sub = entry.getAcquiringConsumer();
             if (sub == null || sub.isClosed())
             {
                 entry.release(sub);
@@ -1336,9 +1339,9 @@
             _suspended.set(false);
             for(ConsumerTarget_0_8 target : getConsumerTargets())
             {
-                for(ConsumerImpl sub : target.getConsumers())
+                for(MessageInstanceConsumer consumer : target.getConsumers())
                 {
-                    sub.externalStateChange();
+                    consumer.externalStateChange();
                 }
             }
 
@@ -1388,7 +1391,7 @@
     private final RecordDeliveryMethod _recordDeliveryMethod = new RecordDeliveryMethod()
         {
 
-            public void recordMessageDelivery(final ConsumerImpl sub, final MessageInstance entry, final long deliveryTag)
+            public void recordMessageDelivery(final MessageInstanceConsumer sub, final MessageInstance entry, final long deliveryTag)
             {
                 addUnacknowledgedMessage(entry, deliveryTag, sub);
             }
@@ -1508,7 +1511,7 @@
         }
 
         @Override
-        public long deliverToClient(final ConsumerImpl sub, final ServerMessage message,
+        public long deliverToClient(final MessageInstanceConsumer consumer, final ServerMessage message,
                                     final InstanceProperties props, final long deliveryTag)
         {
             _singleMessageCredit.useCreditForMessage(message.getSize());
@@ -1530,14 +1533,14 @@
     }
 
 
-    private class ImmediateAction implements Action<MessageInstance>
+    private class ImmediateAction implements Action<BaseMessageInstance>
     {
 
         public ImmediateAction()
         {
         }
 
-        public void performAction(MessageInstance entry)
+        public void performAction(BaseMessageInstance entry)
         {
             TransactionLogResource queue = entry.getOwningResource();
 
@@ -1595,10 +1598,10 @@
         }
     }
 
-    private final class CapacityCheckAction implements Action<MessageInstance>
+    private final class CapacityCheckAction implements Action<BaseMessageInstance>
     {
         @Override
-        public void performAction(final MessageInstance entry)
+        public void performAction(final BaseMessageInstance entry)
         {
             TransactionLogResource queue = entry.getOwningResource();
             if(queue instanceof CapacityChecker)
@@ -1800,10 +1803,10 @@
             int requeues = 0;
             if (rejectedQueueEntry.makeAcquisitionUnstealable(rejectedQueueEntry.getAcquiringConsumer()))
             {
-                requeues = rejectedQueueEntry.routeToAlternate(new Action<MessageInstance>()
+                requeues = rejectedQueueEntry.routeToAlternate(new Action<BaseMessageInstance>()
                 {
                     @Override
-                    public void performAction(final MessageInstance requeueEntry)
+                    public void performAction(final BaseMessageInstance requeueEntry)
                     {
                         messageWithSubject(ChannelMessages.DEADLETTERMSG(msg.getMessageNumber(),
                                                                          requeueEntry.getOwningResource()
@@ -1941,7 +1944,7 @@
         return Collections.unmodifiableCollection(_consumers);
     }
 
-    private class ConsumerClosedListener implements ConfigurationChangeListener
+    private class ConsumerClosedListener extends AbstractConfigurationChangeListener
     {
         @Override
         public void stateChanged(final ConfiguredObject object, final State oldState, final State newState)
@@ -1952,38 +1955,6 @@
             }
         }
 
-        @Override
-        public void childAdded(final ConfiguredObject object, final ConfiguredObject child)
-        {
-
-        }
-
-        @Override
-        public void childRemoved(final ConfiguredObject object, final ConfiguredObject child)
-        {
-
-        }
-
-        @Override
-        public void attributeSet(final ConfiguredObject object,
-                                 final String attributeName,
-                                 final Object oldAttributeValue,
-                                 final Object newAttributeValue)
-        {
-
-        }
-
-        @Override
-        public void bulkChangeStart(final ConfiguredObject<?> object)
-        {
-
-        }
-
-        @Override
-        public void bulkChangeEnd(final ConfiguredObject<?> object)
-        {
-
-        }
     }
 
     private void consumerAdded(final Consumer<?> consumer)
diff --git a/broker-plugins/amqp-0-8-protocol/src/main/java/org/apache/qpid/server/protocol/v0_8/AMQPConnection_0_8Impl.java b/broker-plugins/amqp-0-8-protocol/src/main/java/org/apache/qpid/server/protocol/v0_8/AMQPConnection_0_8Impl.java
index 3a51f36..68aaaea 100644
--- a/broker-plugins/amqp-0-8-protocol/src/main/java/org/apache/qpid/server/protocol/v0_8/AMQPConnection_0_8Impl.java
+++ b/broker-plugins/amqp-0-8-protocol/src/main/java/org/apache/qpid/server/protocol/v0_8/AMQPConnection_0_8Impl.java
@@ -61,9 +61,9 @@
 import org.apache.qpid.properties.ConnectionStartProperties;
 import org.apache.qpid.protocol.AMQConstant;
 import org.apache.qpid.server.configuration.BrokerProperties;
-import org.apache.qpid.server.consumer.ConsumerImpl;
 import org.apache.qpid.server.logging.messages.ConnectionMessages;
 import org.apache.qpid.server.message.InstanceProperties;
+import org.apache.qpid.server.message.MessageInstanceConsumer;
 import org.apache.qpid.server.message.ServerMessage;
 import org.apache.qpid.server.model.Broker;
 import org.apache.qpid.server.model.NamedAddressSpace;
@@ -757,7 +757,7 @@
         }, getAccessControllerContext());
     }
 
-    public synchronized void writerIdle()
+    public void writerIdle()
     {
         writeFrame(HeartbeatBody.FRAME);
     }
@@ -1269,14 +1269,14 @@
         }
 
         @Override
-        public long deliverToClient(final ConsumerImpl sub, final ServerMessage message,
+        public long deliverToClient(final MessageInstanceConsumer consumer, final ServerMessage message,
                                     final InstanceProperties props, final long deliveryTag)
         {
             long size = _protocolOutputConverter.writeDeliver(message,
                                                   props,
                                                   _channelId,
                                                   deliveryTag,
-                                                  new AMQShortString(sub.getName()));
+                                                  new AMQShortString(consumer.getName()));
             registerMessageDelivered(size);
             return size;
         }
diff --git a/broker-plugins/amqp-0-8-protocol/src/main/java/org/apache/qpid/server/protocol/v0_8/ClientDeliveryMethod.java b/broker-plugins/amqp-0-8-protocol/src/main/java/org/apache/qpid/server/protocol/v0_8/ClientDeliveryMethod.java
index c7871e8..3703b02 100644
--- a/broker-plugins/amqp-0-8-protocol/src/main/java/org/apache/qpid/server/protocol/v0_8/ClientDeliveryMethod.java
+++ b/broker-plugins/amqp-0-8-protocol/src/main/java/org/apache/qpid/server/protocol/v0_8/ClientDeliveryMethod.java
@@ -20,12 +20,12 @@
 */
 package org.apache.qpid.server.protocol.v0_8;
 
-import org.apache.qpid.server.consumer.ConsumerImpl;
 import org.apache.qpid.server.message.InstanceProperties;
+import org.apache.qpid.server.message.MessageInstanceConsumer;
 import org.apache.qpid.server.message.ServerMessage;
 
 public interface ClientDeliveryMethod
 {
-    long deliverToClient(final ConsumerImpl sub, final ServerMessage message, final InstanceProperties props,
+    long deliverToClient(final MessageInstanceConsumer consumer, final ServerMessage message, final InstanceProperties props,
                          final long deliveryTag);
 }
diff --git a/broker-plugins/amqp-0-8-protocol/src/main/java/org/apache/qpid/server/protocol/v0_8/ConsumerTarget_0_8.java b/broker-plugins/amqp-0-8-protocol/src/main/java/org/apache/qpid/server/protocol/v0_8/ConsumerTarget_0_8.java
index 8736eca..c549fe1 100644
--- a/broker-plugins/amqp-0-8-protocol/src/main/java/org/apache/qpid/server/protocol/v0_8/ConsumerTarget_0_8.java
+++ b/broker-plugins/amqp-0-8-protocol/src/main/java/org/apache/qpid/server/protocol/v0_8/ConsumerTarget_0_8.java
@@ -28,11 +28,11 @@
 import org.apache.qpid.framing.AMQShortString;
 import org.apache.qpid.framing.FieldTable;
 import org.apache.qpid.server.consumer.AbstractConsumerTarget;
-import org.apache.qpid.server.consumer.ConsumerImpl;
 import org.apache.qpid.server.flow.FlowCreditManager;
 import org.apache.qpid.server.message.InstanceProperties;
 import org.apache.qpid.server.message.MessageInstance;
 import org.apache.qpid.server.message.MessageInstance.EntryState;
+import org.apache.qpid.server.message.MessageInstanceConsumer;
 import org.apache.qpid.server.message.MessageReference;
 import org.apache.qpid.server.message.ServerMessage;
 import org.apache.qpid.server.protocol.AMQSessionModel;
@@ -102,7 +102,7 @@
          * @throws QpidException
          */
         @Override
-        public void doSend(final ConsumerImpl consumer, MessageInstance entry, boolean batch)
+        public void doSend(final MessageInstanceConsumer consumer, MessageInstance entry, boolean batch)
         {
             // We don't decrement the reference here as we don't want to consume the message
             // but we do want to send it to the client.
@@ -146,13 +146,12 @@
         /**
          * This method can be called by each of the publisher threads. As a result all changes to the channel object must be
          * thread safe.
-         *
-         * @param consumer
+         *  @param consumer
          * @param entry   The message to send
          * @param batch
          */
         @Override
-        public void doSend(final ConsumerImpl consumer, MessageInstance entry, boolean batch)
+        public void doSend(final MessageInstanceConsumer consumer, MessageInstance entry, boolean batch)
         {
             // if we do not need to wait for client acknowledgements
             // we can decrement the reference count immediately.
@@ -253,13 +252,12 @@
         /**
          * This method can be called by each of the publisher threads. As a result all changes to the channel object must be
          * thread safe.
-         *
-         * @param consumer
+         *  @param consumer
          * @param entry   The message to send
          * @param batch
          */
         @Override
-        public void doSend(final ConsumerImpl consumer, MessageInstance entry, boolean batch)
+        public void doSend(final MessageInstanceConsumer consumer, MessageInstance entry, boolean batch)
         {
 
             // put queue entry on a list and then notify the connection to read list.
@@ -350,8 +348,6 @@
                && Boolean.valueOf(String.valueOf(arguments.get(PULL_ONLY_CONSUMER)));
     }
 
-
-
     @Override
     public String getTargetAddress()
     {
@@ -444,7 +440,7 @@
         }
     }
 
-    protected long sendToClient(final ConsumerImpl consumer, final ServerMessage message,
+    protected long sendToClient(final MessageInstanceConsumer consumer, final ServerMessage message,
                                 final InstanceProperties props,
                                 final long deliveryTag)
     {
@@ -453,7 +449,7 @@
     }
 
 
-    protected void recordMessageDelivery(final ConsumerImpl consumer,
+    protected void recordMessageDelivery(final MessageInstanceConsumer consumer,
                                          final MessageInstance entry,
                                          final long deliveryTag)
     {
diff --git a/broker-plugins/amqp-0-8-protocol/src/main/java/org/apache/qpid/server/protocol/v0_8/ExtractResendAndRequeue.java b/broker-plugins/amqp-0-8-protocol/src/main/java/org/apache/qpid/server/protocol/v0_8/ExtractResendAndRequeue.java
index 98fd6b6..634cecf 100644
--- a/broker-plugins/amqp-0-8-protocol/src/main/java/org/apache/qpid/server/protocol/v0_8/ExtractResendAndRequeue.java
+++ b/broker-plugins/amqp-0-8-protocol/src/main/java/org/apache/qpid/server/protocol/v0_8/ExtractResendAndRequeue.java
@@ -25,8 +25,8 @@
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import org.apache.qpid.server.consumer.ConsumerImpl;
 import org.apache.qpid.server.message.MessageInstance;
+import org.apache.qpid.server.message.MessageInstanceConsumer;
 
 public class ExtractResendAndRequeue implements UnacknowledgedMessageMap.Visitor
 {
@@ -49,7 +49,7 @@
     {
 
         message.setRedelivered();
-        final ConsumerImpl consumer = message.getDeliveredConsumer();
+        final MessageInstanceConsumer consumer = message.getDeliveredConsumer();
         if (consumer != null)
         {
             // Consumer exists
diff --git a/broker-plugins/amqp-0-8-protocol/src/main/java/org/apache/qpid/server/protocol/v0_8/MessageContentSourceBody.java b/broker-plugins/amqp-0-8-protocol/src/main/java/org/apache/qpid/server/protocol/v0_8/MessageContentSourceBody.java
new file mode 100644
index 0000000..50f17e6
--- /dev/null
+++ b/broker-plugins/amqp-0-8-protocol/src/main/java/org/apache/qpid/server/protocol/v0_8/MessageContentSourceBody.java
@@ -0,0 +1,79 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.server.protocol.v0_8;
+
+import org.apache.qpid.QpidException;
+import org.apache.qpid.bytebuffer.QpidByteBuffer;
+import org.apache.qpid.framing.AMQBody;
+import org.apache.qpid.protocol.AMQVersionAwareProtocolSession;
+import org.apache.qpid.server.message.MessageContentSource;
+import org.apache.qpid.transport.ByteBufferSender;
+
+public class MessageContentSourceBody implements AMQBody
+{
+    public static final byte TYPE = 3;
+    private final int _length;
+    private final MessageContentSource _content;
+    private final int _offset;
+
+    public MessageContentSourceBody(MessageContentSource content, int offset, int length)
+    {
+        _content = content;
+        _offset = offset;
+        _length = length;
+    }
+
+    public byte getFrameType()
+    {
+        return TYPE;
+    }
+
+    public int getSize()
+    {
+        return _length;
+    }
+
+    @Override
+    public long writePayload(final ByteBufferSender sender)
+    {
+        long size = 0L;
+        for(QpidByteBuffer buf : _content.getContent(_offset, _length))
+        {
+            size += buf.remaining();
+
+            sender.send(buf);
+            buf.dispose();
+        }
+        return size;
+    }
+
+    public void handle(int channelId, AMQVersionAwareProtocolSession amqProtocolSession) throws QpidException
+    {
+        throw new UnsupportedOperationException();
+    }
+
+    @Override
+    public String toString()
+    {
+        return "[" + getClass().getSimpleName() + " offset: " + _offset + ", length: " + _length + "]";
+    }
+
+}
diff --git a/broker-plugins/amqp-0-8-protocol/src/main/java/org/apache/qpid/server/protocol/v0_8/ProtocolOutputConverterImpl.java b/broker-plugins/amqp-0-8-protocol/src/main/java/org/apache/qpid/server/protocol/v0_8/ProtocolOutputConverterImpl.java
index a66318a..6bab565 100644
--- a/broker-plugins/amqp-0-8-protocol/src/main/java/org/apache/qpid/server/protocol/v0_8/ProtocolOutputConverterImpl.java
+++ b/broker-plugins/amqp-0-8-protocol/src/main/java/org/apache/qpid/server/protocol/v0_8/ProtocolOutputConverterImpl.java
@@ -246,57 +246,6 @@
         return GZIP_ENCODING.equals(contentHeaderBody.getProperties().getEncoding());
     }
 
-    private class MessageContentSourceBody implements AMQBody
-    {
-        public static final byte TYPE = 3;
-        private final int _length;
-        private final MessageContentSource _content;
-        private final int _offset;
-
-        public MessageContentSourceBody(MessageContentSource content, int offset, int length)
-        {
-            _content = content;
-            _offset = offset;
-            _length = length;
-        }
-
-        public byte getFrameType()
-        {
-            return TYPE;
-        }
-
-        public int getSize()
-        {
-            return _length;
-        }
-
-        @Override
-        public long writePayload(final ByteBufferSender sender)
-        {
-            long size = 0L;
-            for(QpidByteBuffer buf : _content.getContent(_offset, _length))
-            {
-                size += buf.remaining();
-
-                sender.send(buf);
-                buf.dispose();
-            }
-            return size;
-        }
-
-        public void handle(int channelId, AMQVersionAwareProtocolSession amqProtocolSession) throws QpidException
-        {
-            throw new UnsupportedOperationException();
-        }
-
-        @Override
-        public String toString()
-        {
-            return "[" + getClass().getSimpleName() + " offset: " + _offset + ", length: " + _length + "]";
-        }
-
-    }
-
     public long writeGetOk(final ServerMessage msg,
                            final InstanceProperties props,
                            int channelId,
diff --git a/broker-plugins/amqp-0-8-protocol/src/main/java/org/apache/qpid/server/protocol/v0_8/RecordDeliveryMethod.java b/broker-plugins/amqp-0-8-protocol/src/main/java/org/apache/qpid/server/protocol/v0_8/RecordDeliveryMethod.java
index c13ff17..34a17a4 100644
--- a/broker-plugins/amqp-0-8-protocol/src/main/java/org/apache/qpid/server/protocol/v0_8/RecordDeliveryMethod.java
+++ b/broker-plugins/amqp-0-8-protocol/src/main/java/org/apache/qpid/server/protocol/v0_8/RecordDeliveryMethod.java
@@ -20,10 +20,10 @@
 */
 package org.apache.qpid.server.protocol.v0_8;
 
-import org.apache.qpid.server.consumer.ConsumerImpl;
 import org.apache.qpid.server.message.MessageInstance;
+import org.apache.qpid.server.message.MessageInstanceConsumer;
 
 public interface RecordDeliveryMethod
 {
-    void recordMessageDelivery(final ConsumerImpl sub, final MessageInstance entry, final long deliveryTag);
+    void recordMessageDelivery(final MessageInstanceConsumer sub, final MessageInstance entry, final long deliveryTag);
 }
diff --git a/broker-plugins/amqp-0-8-protocol/src/main/java/org/apache/qpid/server/protocol/v0_8/federation/FederationDecoder.java b/broker-plugins/amqp-0-8-protocol/src/main/java/org/apache/qpid/server/protocol/v0_8/federation/FederationDecoder.java
new file mode 100644
index 0000000..01eb3bb
--- /dev/null
+++ b/broker-plugins/amqp-0-8-protocol/src/main/java/org/apache/qpid/server/protocol/v0_8/federation/FederationDecoder.java
@@ -0,0 +1,122 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.server.protocol.v0_8.federation;
+
+import java.io.IOException;
+import java.security.AccessController;
+import java.security.PrivilegedActionException;
+import java.security.PrivilegedExceptionAction;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import org.apache.qpid.bytebuffer.QpidByteBuffer;
+import org.apache.qpid.codec.ClientDecoder;
+import org.apache.qpid.framing.AMQFrameDecodingException;
+import org.apache.qpid.framing.AMQProtocolVersionException;
+import org.apache.qpid.server.util.ServerScopedRuntimeException;
+
+class FederationDecoder extends ClientDecoder
+{
+    private static final Logger LOGGER = LoggerFactory.getLogger(FederationDecoder.class);
+
+
+    private final OutboundConnection_0_8 _connection;
+
+    FederationDecoder(final OutboundConnection_0_8 connection)
+    {
+        super(connection);
+        _connection = connection;
+    }
+
+    public void decodeBuffer(QpidByteBuffer buf) throws AMQFrameDecodingException, AMQProtocolVersionException, IOException
+    {
+        decode(buf);
+    }
+
+    @Override
+    protected void processFrame(final int channelId, final byte type, final long bodySize, final QpidByteBuffer in)
+            throws AMQFrameDecodingException
+    {
+        long startTime = 0;
+        try
+        {
+            if (LOGGER.isDebugEnabled())
+            {
+                startTime = System.currentTimeMillis();
+            }
+            OutboundChannel channel = _connection.getChannel(channelId);
+            if(channel == null)
+            {
+                doProcessFrame(channelId, type, bodySize, in);
+            }
+            else
+            {
+
+                try
+                {
+                    AccessController.doPrivileged(new PrivilegedExceptionAction<Object>()
+                    {
+                        @Override
+                        public Void run() throws IOException, AMQFrameDecodingException
+                        {
+                            doProcessFrame(channelId, type, bodySize, in);
+                            return null;
+                        }
+                    }, channel.getAccessControllerContext());
+                }
+                catch (PrivilegedActionException e)
+                {
+                    Throwable cause = e.getCause();
+                    if(cause instanceof AMQFrameDecodingException)
+                    {
+                        throw (AMQFrameDecodingException) cause;
+                    }
+                    else if(cause instanceof RuntimeException)
+                    {
+                        throw (RuntimeException) cause;
+                    }
+                    else
+                    {
+                        throw new ServerScopedRuntimeException(cause);
+                    }
+                }
+            }
+        }
+        finally
+        {
+            if(LOGGER.isDebugEnabled())
+            {
+                LOGGER.debug("Frame handled in {} ms.", (System.currentTimeMillis() - startTime));
+            }
+        }
+    }
+
+
+    private void doProcessFrame(final int channelId, final byte type, final long bodySize, final QpidByteBuffer in)
+            throws AMQFrameDecodingException
+    {
+        super.processFrame(channelId, type, bodySize, in);
+
+    }
+
+
+}
diff --git a/broker-core/src/main/java/org/apache/qpid/server/message/MessageSourceConsumer.java b/broker-plugins/amqp-0-8-protocol/src/main/java/org/apache/qpid/server/protocol/v0_8/federation/OutboundChannel.java
similarity index 70%
copy from broker-core/src/main/java/org/apache/qpid/server/message/MessageSourceConsumer.java
copy to broker-plugins/amqp-0-8-protocol/src/main/java/org/apache/qpid/server/protocol/v0_8/federation/OutboundChannel.java
index 7ca5c6d..4769f2f 100644
--- a/broker-core/src/main/java/org/apache/qpid/server/message/MessageSourceConsumer.java
+++ b/broker-plugins/amqp-0-8-protocol/src/main/java/org/apache/qpid/server/protocol/v0_8/federation/OutboundChannel.java
@@ -18,11 +18,17 @@
  * under the License.
  *
  */
-package org.apache.qpid.server.message;
+package org.apache.qpid.server.protocol.v0_8.federation;
 
-import org.apache.qpid.server.consumer.ConsumerImpl;
-import org.apache.qpid.server.model.Consumer;
+import java.security.AccessControlContext;
 
-public interface MessageSourceConsumer<X extends MessageSourceConsumer<X>> extends ConsumerImpl, Consumer<MessageSourceConsumer<X>>
+import org.apache.qpid.framing.ClientChannelMethodProcessor;
+
+interface OutboundChannel extends ClientChannelMethodProcessor
 {
+    AccessControlContext getAccessControllerContext();
+
+    boolean processPending();
+
+    void receivedComplete();
 }
diff --git a/broker-plugins/amqp-0-8-protocol/src/main/java/org/apache/qpid/server/protocol/v0_8/federation/OutboundConnection_0_8.java b/broker-plugins/amqp-0-8-protocol/src/main/java/org/apache/qpid/server/protocol/v0_8/federation/OutboundConnection_0_8.java
new file mode 100644
index 0000000..9ddb011
--- /dev/null
+++ b/broker-plugins/amqp-0-8-protocol/src/main/java/org/apache/qpid/server/protocol/v0_8/federation/OutboundConnection_0_8.java
@@ -0,0 +1,772 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.server.protocol.v0_8.federation;
+
+import java.io.IOException;
+import java.nio.charset.StandardCharsets;
+import java.security.AccessControlContext;
+import java.security.AccessController;
+import java.security.PrivilegedAction;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.NoSuchElementException;
+import java.util.concurrent.CopyOnWriteArrayList;
+import java.util.concurrent.atomic.AtomicBoolean;
+import java.util.concurrent.atomic.AtomicReference;
+
+import javax.security.auth.Subject;
+import javax.security.auth.SubjectDomainCombiner;
+import javax.security.sasl.SaslClient;
+import javax.security.sasl.SaslException;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import org.apache.qpid.bytebuffer.QpidByteBuffer;
+import org.apache.qpid.common.ServerPropertyNames;
+import org.apache.qpid.configuration.CommonProperties;
+import org.apache.qpid.framing.AMQDataBlock;
+import org.apache.qpid.framing.AMQFrameDecodingException;
+import org.apache.qpid.framing.AMQShortString;
+import org.apache.qpid.framing.ClientChannelMethodProcessor;
+import org.apache.qpid.framing.ClientMethodProcessor;
+import org.apache.qpid.framing.FieldTable;
+import org.apache.qpid.framing.FieldTableFactory;
+import org.apache.qpid.framing.HeartbeatBody;
+import org.apache.qpid.framing.MethodRegistry;
+import org.apache.qpid.framing.ProtocolInitiation;
+import org.apache.qpid.framing.ProtocolVersion;
+import org.apache.qpid.server.configuration.BrokerProperties;
+import org.apache.qpid.server.federation.OutboundProtocolEngine;
+import org.apache.qpid.server.model.Broker;
+import org.apache.qpid.server.model.Credential;
+import org.apache.qpid.server.model.Protocol;
+import org.apache.qpid.server.model.RemoteHost;
+import org.apache.qpid.server.model.RemoteHostAddress;
+import org.apache.qpid.server.model.VirtualHost;
+import org.apache.qpid.server.store.StoreException;
+import org.apache.qpid.server.transport.AggregateTicker;
+import org.apache.qpid.server.transport.ProtocolEngine;
+import org.apache.qpid.server.transport.SchedulableConnection;
+import org.apache.qpid.server.transport.ServerIdleReadTimeoutTicker;
+import org.apache.qpid.server.transport.ServerIdleWriteTimeoutTicker;
+import org.apache.qpid.server.util.Action;
+import org.apache.qpid.server.util.ConnectionScopedRuntimeException;
+import org.apache.qpid.server.util.ServerScopedRuntimeException;
+
+
+class OutboundConnection_0_8 implements OutboundProtocolEngine, ClientMethodProcessor<ClientChannelMethodProcessor>
+{
+
+    private static final Map<Protocol, ProtocolVersion> PROTOCOL_VERSION_MAP;
+
+    static
+    {
+        Map<Protocol, ProtocolVersion> protocolVersionMap = new HashMap<>();
+        protocolVersionMap.put(Protocol.AMQP_0_8, ProtocolVersion.v0_8);
+        protocolVersionMap.put(Protocol.AMQP_0_9, ProtocolVersion.v0_9);
+        protocolVersionMap.put(Protocol.AMQP_0_9_1, ProtocolVersion.v0_91);
+
+        PROTOCOL_VERSION_MAP = Collections.unmodifiableMap(protocolVersionMap);
+    }
+
+    private static final int TRANSFER_SESSION_ID = 0;
+
+    private static final Logger LOGGER = LoggerFactory.getLogger(OutboundConnection_0_8.class);
+
+    private final Protocol _protocol;
+    private final RemoteHost<?> _remoteHost;
+    private final RemoteHostAddress<?> _address;
+    private final VirtualHost<?> _virtualHost;
+
+    private final FederationDecoder _decoder;
+
+
+    private final AggregateTicker _aggregateTicker;
+    private final ProtocolVersion _protocolVersion;
+
+    private final MethodRegistry _methodRegistry;
+    private volatile long _lastReadTime;
+    private volatile long _lastWriteTime;
+    private SchedulableConnection _connection;
+    private volatile AccessControlContext _accessControllerContext;
+
+
+
+    private final AtomicBoolean _stateChanged = new AtomicBoolean();
+    private final AtomicReference<Action<ProtocolEngine>> _workListener = new AtomicReference<>();
+    private volatile Thread _ioThread;
+    private final List<Runnable> _pendingTasks = new CopyOnWriteArrayList<>();
+    private int _classId;
+    private int _methodId;
+    private SaslClient _saslClient;
+    private int _maxFrameSize;
+    private int _maxNoOfChannels;
+
+    private static final OutboundChannel[] _channels = new OutboundChannel[3];
+    private Action<Boolean> _onClosedTask;
+
+    enum State
+    {
+        INIT,
+        AWAIT_START,
+        AWAIT_SECURE,
+        AWAIT_TUNE,
+        AWAIT_OPEN_OK,
+        OPEN,
+        AWAIT_CLOSE_OK,
+        CLOSED
+    }
+
+    private State _state = State.INIT;
+
+
+    public OutboundConnection_0_8(final RemoteHostAddress<?> address,
+                                  final VirtualHost<?> virtualHost,
+                                  final Protocol protocol,
+                                  final byte[] protocolHeader)
+    {
+        _address = address;
+        _protocol = protocol;
+        _virtualHost = virtualHost;
+        _aggregateTicker = new AggregateTicker();
+        _remoteHost = address.getParent(RemoteHost.class);
+        _decoder = new FederationDecoder(this);
+        _protocolVersion = PROTOCOL_VERSION_MAP.get(protocol);
+        _methodRegistry = new MethodRegistry(_protocolVersion);
+
+        _pendingTasks.add(new Runnable()
+        {
+            @Override
+            public void run()
+            {
+                changeState(State.INIT, State.AWAIT_START);
+                _connection.send(QpidByteBuffer.wrap(protocolHeader));
+            }
+        });
+        _stateChanged.set(true);
+    }
+
+
+    public VirtualHost<?> getVirtualHost()
+    {
+        return _virtualHost;
+    }
+
+
+    private synchronized void changeState(final State currentState, final State newState)
+    {
+        if(_state != currentState)
+        {
+            throw new ConnectionScopedRuntimeException("Incorrect state");
+        }
+        _state = newState;
+    }
+
+    private synchronized void assertState(final State currentState)
+    {
+        if (_state != currentState)
+        {
+            throw new ConnectionScopedRuntimeException("Incorrect state");
+        }
+    }
+
+    public Protocol getProtocol()
+    {
+        return _protocol;
+    }
+
+    @Override
+    public final AggregateTicker getAggregateTicker()
+    {
+        return _aggregateTicker;
+    }
+
+    public final Date getLastIoTime()
+    {
+        return new Date(Math.max(getLastReadTime(), getLastWriteTime()));
+    }
+
+    @Override
+    public final long getLastReadTime()
+    {
+        return _lastReadTime;
+    }
+
+    public final void updateLastReadTime()
+    {
+        _lastReadTime = System.currentTimeMillis();
+    }
+
+    @Override
+    public final long getLastWriteTime()
+    {
+        return _lastWriteTime;
+    }
+
+    public final void updateLastWriteTime()
+    {
+        _lastWriteTime = System.currentTimeMillis();
+    }
+
+
+    MethodRegistry getMethodRegistry()
+    {
+        return _methodRegistry;
+    }
+
+
+    @Override
+    public void closed()
+    {
+        Action<Boolean> task = _onClosedTask;
+        if(task != null)
+        {
+            task.performAction(_state == State.OPEN);
+        }
+    }
+
+    public synchronized void writerIdle()
+    {
+        writeFrame(HeartbeatBody.FRAME);
+    }
+
+    @Override
+    public void readerIdle()
+    {
+
+    }
+
+    @Override
+    public Subject getSubject()
+    {
+        return null;
+    }
+
+    @Override
+    public boolean isTransportBlockedForWriting()
+    {
+        return false;
+    }
+
+    @Override
+    public void setTransportBlockedForWriting(final boolean blocked)
+    {
+
+    }
+
+    @Override
+    public void setMessageAssignmentSuspended(final boolean value, final boolean notifyConsumers)
+    {
+
+    }
+
+    @Override
+    public boolean isMessageAssignmentSuspended()
+    {
+        return false;
+    }
+
+
+    @Override
+    public Iterator<Runnable> processPendingIterator()
+    {
+        if (!isIOThread())
+        {
+            return Collections.emptyIterator();
+        }
+        return new ProcessPendingIterator();
+    }
+
+    @Override
+    public boolean hasWork()
+    {
+        return _stateChanged.get();
+    }
+
+    @Override
+    public void notifyWork()
+    {
+        _stateChanged.set(true);
+
+        final Action<ProtocolEngine> listener = _workListener.get();
+        if(listener != null)
+        {
+
+            listener.performAction(this);
+        }
+    }
+
+    @Override
+    public void clearWork()
+    {
+        _stateChanged.set(false);
+    }
+
+    @Override
+    public void setWorkListener(final Action<ProtocolEngine> listener)
+    {
+        _workListener.set(listener);
+    }
+
+
+    @Override
+    public void encryptedTransport()
+    {
+
+    }
+
+    @Override
+    public void received(final QpidByteBuffer msg)
+    {
+        AccessController.doPrivileged(new PrivilegedAction<Void>()
+        {
+            @Override
+            public Void run()
+            {
+                updateLastReadTime();
+
+                try
+                {
+                    _decoder.decodeBuffer(msg);
+                    receivedComplete();
+                }
+                catch (AMQFrameDecodingException | IOException e)
+                {
+                    LOGGER.error("Unexpected exception", e);
+                    throw new ConnectionScopedRuntimeException(e);
+                }
+                catch (StoreException e)
+                {
+                    if (_virtualHost.isActive())
+                    {
+                        throw new ServerScopedRuntimeException(e);
+                    }
+                    else
+                    {
+                        throw new ConnectionScopedRuntimeException(e);
+                    }
+                }
+                return null;
+            }
+        }, getAccessControllerContext());
+
+
+    }
+
+    private void receivedComplete()
+    {
+        for(OutboundChannel channel : _channels)
+        {
+            if (channel != null)
+            {
+                channel.receivedComplete();
+            }
+        }
+    }
+
+
+    public AccessControlContext getAccessControllerContext()
+    {
+        return _accessControllerContext;
+    }
+
+    public final void updateAccessControllerContext()
+    {
+        _accessControllerContext = getAccessControlContextFromSubject(
+                getSubject());
+    }
+
+    public final AccessControlContext getAccessControlContextFromSubject(final Subject subject)
+    {
+        final AccessControlContext acc = AccessController.getContext();
+        return AccessController.doPrivileged(
+                new PrivilegedAction<AccessControlContext>()
+                {
+                    public AccessControlContext run()
+                    {
+                        if (subject == null)
+                            return new AccessControlContext(acc, null);
+                        else
+                            return new AccessControlContext
+                                    (acc,
+                                     new SubjectDomainCombiner(subject));
+                    }
+                });
+    }
+
+
+    @Override
+    public void setIOThread(final Thread ioThread)
+    {
+        _ioThread = ioThread;
+    }
+
+    public boolean isIOThread()
+    {
+        return Thread.currentThread() == _ioThread;
+    }
+
+
+    @Override
+    public void setConnection(final SchedulableConnection connection)
+    {
+        _connection = connection;
+    }
+
+    @Override
+    public void setOnClosedTask(final Action<Boolean> onClosedTask)
+    {
+        _onClosedTask = onClosedTask;
+    }
+
+    @Override
+    public ProtocolVersion getProtocolVersion()
+    {
+        return _protocolVersion;
+    }
+
+    @Override
+    public ClientChannelMethodProcessor getChannelMethodProcessor(final int channelId)
+    {
+        return getChannel(channelId);
+    }
+
+
+    public OutboundChannel getChannel(final int channelId)
+    {
+        return channelId < _channels.length ? _channels[channelId] : null;
+    }
+
+    public void setMaxFrameSize(int frameMax)
+    {
+        _maxFrameSize = frameMax;
+        _decoder.setMaxFrameSize(frameMax);
+    }
+
+    public int getMaxFrameSize()
+    {
+        return _maxFrameSize;
+    }
+
+    @Override
+    public void receiveConnectionClose(final int replyCode,
+                                       final AMQShortString replyText,
+                                       final int classId,
+                                       final int methodId)
+    {
+
+        writeFrame(_methodRegistry.createConnectionCloseOkBody().generateFrame(0));
+        _connection.close();
+    }
+
+    @Override
+    public void receiveConnectionCloseOk()
+    {
+        // TODO
+    }
+
+    @Override
+    public void receiveHeartbeat()
+    {
+    }
+
+    @Override
+    public void receiveProtocolHeader(final ProtocolInitiation protocolInitiation)
+    {
+        _connection.close();
+    }
+
+    @Override
+    public void setCurrentMethod(final int classId, final int methodId)
+    {
+        _classId = classId;
+        _methodId = methodId;
+    }
+
+    void writeFrame(AMQDataBlock frame)
+    {
+        LOGGER.debug("SEND: {}", frame);
+
+
+        frame.writePayload(_connection);
+
+
+        updateLastWriteTime();
+
+    }
+
+
+    @Override
+    public boolean ignoreAllButCloseOk()
+    {
+        // TODO
+        return false;
+    }
+
+    @Override
+    public void receiveConnectionStart(final short versionMajor,
+                                       final short versionMinor,
+                                       final FieldTable serverProperties,
+                                       final byte[] mechanisms,
+                                       final byte[] locales)
+    {
+        changeState(State.AWAIT_START, State.AWAIT_SECURE);
+        List<String> saslMechanisms = Arrays.asList(new String(mechanisms, StandardCharsets.UTF_8).split(" "));
+        Map propMap = FieldTable.convertToMap(serverProperties);
+
+        Collection<Credential> credentialList = _remoteHost.getChildren(Credential.class);
+
+        SaslClient client = null;
+        for(Credential<?> credentials : credentialList)
+        {
+            client = credentials.getSaslClient(saslMechanisms);
+            if(client != null)
+            {
+                break;
+            }
+        }
+
+        if(client != null)
+        {
+            _saslClient = client;
+            try
+            {
+                byte[] initialResponse = client.hasInitialResponse() ? client.evaluateChallenge(new byte[0]) : new byte[0];
+
+                FieldTable clientProperties = FieldTableFactory.newFieldTable();
+                clientProperties.setString(ServerPropertyNames.PRODUCT,
+                                           CommonProperties.getProductName());
+                clientProperties.setString(ServerPropertyNames.VERSION,
+                                           CommonProperties.getReleaseVersion());
+                clientProperties.setString(ServerPropertyNames.QPID_BUILD,
+                                           CommonProperties.getBuildVersion());
+                clientProperties.setString(ServerPropertyNames.QPID_INSTANCE_NAME,
+                                           _virtualHost.getName());
+
+
+                writeFrame(_methodRegistry.createConnectionStartOkBody(clientProperties, AMQShortString.valueOf(_saslClient.getMechanismName()), initialResponse, null).generateFrame(0));
+                if(client.isComplete())
+                {
+                    changeState(State.AWAIT_SECURE, State.AWAIT_TUNE);
+                }
+            }
+            catch (SaslException e)
+            {
+                throw new ConnectionScopedRuntimeException(e);
+            }
+        }
+        else
+        {
+            throw new ConnectionScopedRuntimeException("Unable to find acceptable sasl mechanism");
+        }
+
+    }
+
+    @Override
+    public void receiveConnectionSecure(final byte[] challenge)
+    {
+        assertState(State.AWAIT_SECURE);
+        try
+        {
+            byte[] response = _saslClient.evaluateChallenge(challenge);
+
+            writeFrame(_methodRegistry.createConnectionSecureOkBody(response).generateFrame(0));
+            if(_saslClient.isComplete())
+            {
+                changeState(State.AWAIT_SECURE, State.AWAIT_TUNE);
+            }
+        }
+        catch (SaslException e)
+        {
+            throw new ConnectionScopedRuntimeException(e);
+        }
+    }
+
+    @Override
+    public void receiveConnectionRedirect(final AMQShortString host, final AMQShortString knownHosts)
+    {
+        LOGGER.info("Connection redirect to {} received, however redirection is not followed for federation links");
+        _connection.close();
+    }
+
+    private int getDefaultMaxFrameSize()
+    {
+        Broker<?> broker = _virtualHost.getBroker();
+
+        return broker.getNetworkBufferSize();
+    }
+
+    protected void initialiseHeartbeating(final long writerDelay, final long readerDelay)
+    {
+        if (writerDelay > 0)
+        {
+            _aggregateTicker.addTicker(new ServerIdleWriteTimeoutTicker(this, (int) writerDelay));
+            _connection.setMaxWriteIdleMillis(writerDelay);
+        }
+
+        if (readerDelay > 0)
+        {
+            _aggregateTicker.addTicker(new ServerIdleReadTimeoutTicker(_connection, this, (int) readerDelay));
+            _connection.setMaxReadIdleMillis(readerDelay);
+        }
+    }
+
+
+
+    public int getMaximumNumberOfChannels()
+    {
+        return _maxNoOfChannels;
+    }
+
+    private void setMaximumNumberOfChannels(int value)
+    {
+        _maxNoOfChannels = value;
+    }
+
+
+    @Override
+    public void receiveConnectionTune(final int channelMax, final long frameMax, final int heartbeat)
+    {
+        assertState(State.AWAIT_TUNE);
+
+        final int desiredHeartbeatInterval = _address.getDesiredHeartbeatInterval();
+        int heartbeatDelay = heartbeat == 0
+                ? desiredHeartbeatInterval
+                : (desiredHeartbeatInterval == 0) ? heartbeat : Math.min(heartbeat, desiredHeartbeatInterval);
+
+        long writerDelay = 1000L * heartbeatDelay;
+        long readerDelay = 1000L * BrokerProperties.HEARTBEAT_TIMEOUT_FACTOR * heartbeatDelay;
+        initialiseHeartbeating(writerDelay, readerDelay);
+
+        int maxFrameSize = getDefaultMaxFrameSize();
+        if (maxFrameSize <= 0)
+        {
+            maxFrameSize = Integer.MAX_VALUE;
+        }
+
+        if (frameMax > 0 && frameMax < maxFrameSize)
+        {
+            maxFrameSize = (int) frameMax;
+        }
+
+        setMaxFrameSize(maxFrameSize);
+
+        //0 means no implied limit, except that forced by protocol limitations (0xFFFF)
+        setMaximumNumberOfChannels( ((channelMax == 0l) || (channelMax > 0xFFFFL))
+                                            ? 0xFFFF
+                                            : (int)channelMax);
+
+
+
+        writeFrame(_methodRegistry.createConnectionTuneOkBody(_maxNoOfChannels, maxFrameSize, heartbeatDelay).generateFrame(0));
+        writeFrame(_methodRegistry.createConnectionOpenBody(AMQShortString.valueOf(_address.getHostName()), AMQShortString.EMPTY_STRING, false).generateFrame(0));
+
+        changeState(State.AWAIT_TUNE, State.AWAIT_OPEN_OK);
+
+
+    }
+
+    @Override
+    public void receiveConnectionOpenOk(final AMQShortString knownHosts)
+    {
+        changeState(State.AWAIT_OPEN_OK, State.OPEN);
+
+        createTransferSession();
+
+    }
+
+    private void createTransferSession()
+    {
+        _channels[TRANSFER_SESSION_ID] = new TransferSession_0_8(TRANSFER_SESSION_ID, this);
+    }
+
+
+    private class ProcessPendingIterator implements Iterator<Runnable>
+    {
+        private final List<OutboundChannel> _sessionsWithPending;
+        private Iterator<OutboundChannel> _sessionIterator;
+        private ProcessPendingIterator()
+        {
+            _sessionsWithPending = new ArrayList<>();
+            for(OutboundChannel channel : _channels)
+            {
+                if(channel != null)
+                {
+                    _sessionsWithPending.add(channel);
+                }
+            }
+            _sessionIterator = _sessionsWithPending.iterator();
+        }
+
+        @Override
+        public boolean hasNext()
+        {
+            return !(_sessionsWithPending.isEmpty() && _pendingTasks.isEmpty());
+        }
+
+        @Override
+        public Runnable next()
+        {
+            if(!_sessionsWithPending.isEmpty())
+            {
+                if(!_sessionIterator.hasNext())
+                {
+                    _sessionIterator = _sessionsWithPending.iterator();
+                }
+                final OutboundChannel session = _sessionIterator.next();
+                return new Runnable()
+                {
+                    @Override
+                    public void run()
+                    {
+                        if(!session.processPending())
+                        {
+                            _sessionIterator.remove();
+                        }
+                    }
+                };
+            }
+            else if(!_pendingTasks.isEmpty())
+            {
+                return _pendingTasks.remove(0);
+            }
+            else
+            {
+                throw new NoSuchElementException();
+            }
+        }
+
+        @Override
+        public void remove()
+        {
+            throw new UnsupportedOperationException();
+        }
+    }
+
+}
diff --git a/broker-plugins/amqp-0-8-protocol/src/main/java/org/apache/qpid/server/protocol/v0_8/federation/OutboundProtocolEngineCreator_0_8.java b/broker-plugins/amqp-0-8-protocol/src/main/java/org/apache/qpid/server/protocol/v0_8/federation/OutboundProtocolEngineCreator_0_8.java
new file mode 100644
index 0000000..b8af4ff
--- /dev/null
+++ b/broker-plugins/amqp-0-8-protocol/src/main/java/org/apache/qpid/server/protocol/v0_8/federation/OutboundProtocolEngineCreator_0_8.java
@@ -0,0 +1,65 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.server.protocol.v0_8.federation;
+
+import org.apache.qpid.server.federation.OutboundProtocolEngine;
+import org.apache.qpid.server.model.Protocol;
+import org.apache.qpid.server.model.RemoteHostAddress;
+import org.apache.qpid.server.model.VirtualHost;
+import org.apache.qpid.server.plugin.OutboundProtocolEngineCreator;
+import org.apache.qpid.server.plugin.PluggableService;
+
+@PluggableService
+public class OutboundProtocolEngineCreator_0_8 implements OutboundProtocolEngineCreator
+{
+
+    private static final byte[] AMQP_0_8_HEADER =
+            new byte[] { (byte) 'A',
+                         (byte) 'M',
+                         (byte) 'Q',
+                         (byte) 'P',
+                         (byte) 1,
+                         (byte) 1,
+                         (byte) 8,
+                         (byte) 0
+            };
+
+    public OutboundProtocolEngineCreator_0_8()
+    {
+    }
+
+    public Protocol getVersion()
+    {
+        return Protocol.AMQP_0_8;
+    }
+
+    @Override
+    public OutboundProtocolEngine newProtocolEngine(final RemoteHostAddress<?> address, final VirtualHost<?> virtualHost)
+    {
+        return new OutboundConnection_0_8(address, virtualHost, Protocol.AMQP_0_8, AMQP_0_8_HEADER);
+    }
+
+    @Override
+    public String getType()
+    {
+        return getVersion().toString();
+    }
+}
diff --git a/broker-plugins/amqp-0-8-protocol/src/main/java/org/apache/qpid/server/protocol/v0_8/federation/OutboundProtocolEngineCreator_0_9.java b/broker-plugins/amqp-0-8-protocol/src/main/java/org/apache/qpid/server/protocol/v0_8/federation/OutboundProtocolEngineCreator_0_9.java
new file mode 100644
index 0000000..2854a42
--- /dev/null
+++ b/broker-plugins/amqp-0-8-protocol/src/main/java/org/apache/qpid/server/protocol/v0_8/federation/OutboundProtocolEngineCreator_0_9.java
@@ -0,0 +1,65 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.server.protocol.v0_8.federation;
+
+import org.apache.qpid.server.federation.OutboundProtocolEngine;
+import org.apache.qpid.server.model.Protocol;
+import org.apache.qpid.server.model.RemoteHostAddress;
+import org.apache.qpid.server.model.VirtualHost;
+import org.apache.qpid.server.plugin.OutboundProtocolEngineCreator;
+import org.apache.qpid.server.plugin.PluggableService;
+
+@PluggableService
+public class OutboundProtocolEngineCreator_0_9 implements OutboundProtocolEngineCreator
+{
+
+    private static final byte[] AMQP_0_9_HEADER =
+            new byte[] { (byte) 'A',
+                         (byte) 'M',
+                         (byte) 'Q',
+                         (byte) 'P',
+                         (byte) 1,
+                         (byte) 1,
+                         (byte) 0,
+                         (byte) 9
+            };
+
+    public OutboundProtocolEngineCreator_0_9()
+    {
+    }
+
+    public Protocol getVersion()
+    {
+        return Protocol.AMQP_0_9;
+    }
+
+    @Override
+    public OutboundProtocolEngine newProtocolEngine(final RemoteHostAddress<?> address, final VirtualHost<?> virtualHost)
+    {
+        return new OutboundConnection_0_8(address, virtualHost, Protocol.AMQP_0_9, AMQP_0_9_HEADER);
+    }
+
+    @Override
+    public String getType()
+    {
+        return getVersion().toString();
+    }
+}
diff --git a/broker-plugins/amqp-0-8-protocol/src/main/java/org/apache/qpid/server/protocol/v0_8/federation/OutboundProtocolEngineCreator_0_9_1.java b/broker-plugins/amqp-0-8-protocol/src/main/java/org/apache/qpid/server/protocol/v0_8/federation/OutboundProtocolEngineCreator_0_9_1.java
new file mode 100644
index 0000000..87f7cd0
--- /dev/null
+++ b/broker-plugins/amqp-0-8-protocol/src/main/java/org/apache/qpid/server/protocol/v0_8/federation/OutboundProtocolEngineCreator_0_9_1.java
@@ -0,0 +1,65 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.server.protocol.v0_8.federation;
+
+import org.apache.qpid.server.federation.OutboundProtocolEngine;
+import org.apache.qpid.server.model.Protocol;
+import org.apache.qpid.server.model.RemoteHostAddress;
+import org.apache.qpid.server.model.VirtualHost;
+import org.apache.qpid.server.plugin.OutboundProtocolEngineCreator;
+import org.apache.qpid.server.plugin.PluggableService;
+
+@PluggableService
+public class OutboundProtocolEngineCreator_0_9_1 implements OutboundProtocolEngineCreator
+{
+
+    private static final byte[] AMQP_0_9_1_HEADER =
+            new byte[] { (byte) 'A',
+                         (byte) 'M',
+                         (byte) 'Q',
+                         (byte) 'P',
+                         (byte) 0,
+                         (byte) 0,
+                         (byte) 9,
+                         (byte) 1
+            };
+
+    public OutboundProtocolEngineCreator_0_9_1()
+    {
+    }
+
+    public Protocol getVersion()
+    {
+        return Protocol.AMQP_0_9_1;
+    }
+
+    @Override
+    public OutboundProtocolEngine newProtocolEngine(final RemoteHostAddress<?> address, final VirtualHost<?> virtualHost)
+    {
+        return new OutboundConnection_0_8(address, virtualHost, Protocol.AMQP_0_9_1, AMQP_0_9_1_HEADER);
+    }
+
+    @Override
+    public String getType()
+    {
+        return getVersion().toString();
+    }
+}
diff --git a/broker-plugins/amqp-0-8-protocol/src/main/java/org/apache/qpid/server/protocol/v0_8/federation/TransferSession_0_8.java b/broker-plugins/amqp-0-8-protocol/src/main/java/org/apache/qpid/server/protocol/v0_8/federation/TransferSession_0_8.java
new file mode 100644
index 0000000..b5d86cc
--- /dev/null
+++ b/broker-plugins/amqp-0-8-protocol/src/main/java/org/apache/qpid/server/protocol/v0_8/federation/TransferSession_0_8.java
@@ -0,0 +1,721 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.server.protocol.v0_8.federation;
+
+import java.security.AccessControlContext;
+import java.util.Collection;
+import java.util.EnumMap;
+import java.util.Iterator;
+import java.util.LinkedList;
+import java.util.Map;
+import java.util.Queue;
+import java.util.SortedMap;
+import java.util.TreeMap;
+import java.util.concurrent.TimeoutException;
+
+import com.google.common.util.concurrent.AbstractFuture;
+import com.google.common.util.concurrent.FutureCallback;
+import com.google.common.util.concurrent.Futures;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import org.apache.qpid.bytebuffer.QpidByteBuffer;
+import org.apache.qpid.framing.AMQBody;
+import org.apache.qpid.framing.AMQFrame;
+import org.apache.qpid.framing.AMQMethodBody;
+import org.apache.qpid.framing.AMQShortString;
+import org.apache.qpid.framing.BasicContentHeaderProperties;
+import org.apache.qpid.framing.BasicGetOkBody;
+import org.apache.qpid.framing.ConfirmSelectBody;
+import org.apache.qpid.framing.ConfirmSelectOkBody;
+import org.apache.qpid.framing.ContentHeaderBody;
+import org.apache.qpid.framing.FieldTable;
+import org.apache.qpid.framing.MethodRegistry;
+import org.apache.qpid.server.message.ServerMessage;
+import org.apache.qpid.server.plugin.MessageConverter;
+import org.apache.qpid.server.protocol.MessageConverterRegistry;
+import org.apache.qpid.server.protocol.v0_8.AMQMessage;
+import org.apache.qpid.server.protocol.v0_8.MessageContentSourceBody;
+import org.apache.qpid.server.transfer.TransferQueueConsumer;
+import org.apache.qpid.server.transfer.TransferQueueEntry;
+import org.apache.qpid.server.txn.LocalTransaction;
+import org.apache.qpid.server.txn.ServerTransaction;
+import org.apache.qpid.server.util.ConnectionScopedRuntimeException;
+
+class TransferSession_0_8 implements OutboundChannel
+{
+    private static final Logger LOGGER = LoggerFactory.getLogger(TransferSession_0_8.class);
+    private static final Runnable NO_OP = new Runnable()
+    {
+        @Override
+        public void run()
+        {
+
+        }
+    };
+
+    private final OutboundConnection_0_8 _connection;
+    private final int _channelId;
+    private final MethodRegistry _methodRegistry;
+    private final LocalTransaction _txn;
+    private Collection<String> _remoteHostGlobalDomains;
+    private TransferTarget_0_8 _target;
+    private TransferQueueConsumer _consumer;
+    private final SortedMap<Long, TransferQueueEntry> _unconfirmed = new TreeMap<>();
+    private volatile boolean _flowControlled;
+    private volatile long _lastSent = -0L;
+
+    private int _maxUnconfirmed = 200;
+
+    enum Operation {
+        EXCHANGE_DECLARE,
+        EXCHANGE_DELETE,
+        EXCHANGE_BOUND,
+        QUEUE_BIND,
+        QUEUE_UNBIND,
+        QUEUE_DECLARE,
+        QUEUE_DELETE,
+        QUEUE_PURGE,
+        BASIC_RECOVER_SYNC,
+        BAISC_QOS,
+        BASIC_CONSUME,
+        BASIC_CANCEL,
+        TX_SELECT,
+        TX_COMMIT,
+        TX_ROLLBACK,
+        CHANNEL_FLOW,
+        CONFIRM_SELECT,
+        ACK,
+        BASIC_GET
+    }
+
+    private static final class TimedSettableFuture<V> extends AbstractFuture<V>
+    {
+        private final long _timeoutTime;
+
+        private TimedSettableFuture(final long timeoutTime)
+        {
+            _timeoutTime = timeoutTime;
+        }
+
+        public boolean set(V value)
+        {
+            return super.set(value);
+        }
+
+        @Override
+        public boolean setException(Throwable throwable)
+        {
+            return super.setException(throwable);
+        }
+
+        public long getTimeoutTime()
+        {
+            return _timeoutTime;
+        }
+
+        public boolean checkTimeout(long time)
+        {
+            if(time > _timeoutTime)
+            {
+                setException(new TimeoutException("Timed out waiting for response"));
+                return true;
+            }
+            else
+            {
+                return false;
+            }
+        }
+    }
+
+    private final Map<Operation, Queue<TimedSettableFuture<AMQMethodBody>>> _synchronousOperationListeners = new EnumMap<>(Operation.class);
+
+    {
+        for(Operation op : Operation.values())
+        {
+            _synchronousOperationListeners.put(op, new LinkedList<TimedSettableFuture<AMQMethodBody>>());
+        }
+    }
+
+    enum State { AWAITING_OPEN, OPEN, AWAITING_CLOSE_OK }
+
+    private State _state = State.AWAITING_OPEN;
+
+    private interface MessageHandler
+    {
+        void receiveMessageHeader(BasicContentHeaderProperties properties, long bodySize);
+
+        void receiveMessageContent(QpidByteBuffer data);
+    }
+
+
+    private final MessageHandler _unexpectedMessageHandler = new MessageHandler()
+    {
+        @Override
+        public void receiveMessageHeader(final BasicContentHeaderProperties properties, final long bodySize)
+        {
+            throw new ConnectionScopedRuntimeException("Unexpected frame");
+        }
+
+        @Override
+        public void receiveMessageContent(final QpidByteBuffer data)
+        {
+            throw new ConnectionScopedRuntimeException("Unexpected frame");
+        }
+    };
+
+    private volatile MessageHandler _messageHandler = _unexpectedMessageHandler;
+
+
+    TransferSession_0_8(final int channelId, final OutboundConnection_0_8 outboundConnection)
+    {
+        _connection = outboundConnection;
+        _channelId = channelId;
+        _methodRegistry = outboundConnection.getMethodRegistry();
+        writeMethod(_methodRegistry.createChannelOpenBody(AMQShortString.EMPTY_STRING));
+        _txn = new LocalTransaction(outboundConnection.getVirtualHost().getMessageStore());
+    }
+
+    private synchronized void changeState(final State currentState, final State newState)
+    {
+        if(_state != currentState)
+        {
+            throw new ConnectionScopedRuntimeException("Incorrect state");
+        }
+        _state = newState;
+    }
+
+    private synchronized void assertState(final State currentState)
+    {
+        if (_state != currentState)
+        {
+            throw new ConnectionScopedRuntimeException("Incorrect state");
+        }
+    }
+
+
+    @Override
+    public void receiveChannelOpenOk()
+    {
+        changeState(State.AWAITING_OPEN, State.OPEN);
+
+        writeMethod(new ConfirmSelectBody(true));
+
+        writeMethod(_methodRegistry.createBasicGetBody(0, AMQShortString.valueOf("$virtualhostProperties"), true));
+        final FutureCallback<AMQMethodBody> callback = new FutureCallback<AMQMethodBody>()
+        {
+            @Override
+            public void onSuccess(final AMQMethodBody result)
+            {
+                if (result instanceof BasicGetOkBody)
+                {
+                    _messageHandler = new VirtualHostPropertiesHandler();
+                }
+                else
+                {
+                    throw new ConnectionScopedRuntimeException("Unable to determine virtual host properties from remote host");
+                }
+            }
+
+            @Override
+            public void onFailure(final Throwable t)
+            {
+                if(t instanceof RuntimeException)
+                {
+                    throw ((RuntimeException)t);
+                }
+                else
+                {
+                    throw new ConnectionScopedRuntimeException(t);
+                }
+            }
+        };
+        addOperationResponse(Operation.BASIC_GET, callback);
+    }
+
+    private void addOperationResponse(Operation operation, FutureCallback<AMQMethodBody> callback)
+    {
+        final TimedSettableFuture<AMQMethodBody> future =
+                new TimedSettableFuture<>(System.currentTimeMillis() + 30000L);
+        Futures.addCallback(future, callback);
+        _synchronousOperationListeners.get(operation).add(future);
+    }
+
+    private void performOperationResponse(Operation operation, AMQMethodBody body)
+    {
+        final TimedSettableFuture<AMQMethodBody> future = _synchronousOperationListeners.get(operation).poll();
+
+        if(future == null)
+        {
+            throw new ConnectionScopedRuntimeException("Unexpected frame ");
+        }
+        else
+        {
+            future.set(body);
+        }
+    }
+
+
+    private void setRemoteHostGlobalDomains(final Collection<String> remoteHostGlobalDomains)
+    {
+        LOGGER.debug("Setting remote host global domains: {}", remoteHostGlobalDomains);
+        _remoteHostGlobalDomains = remoteHostGlobalDomains;
+
+        _target = new TransferTarget_0_8(this, remoteHostGlobalDomains);
+        _consumer = _connection.getVirtualHost().getTransferQueue().addConsumer(_target, "consumer");
+    }
+
+
+
+    @Override
+    public void receiveChannelAlert(final int replyCode, final AMQShortString replyText, final FieldTable details)
+    {
+
+    }
+
+    @Override
+    public void receiveAccessRequestOk(final int ticket)
+    {
+
+    }
+
+    @Override
+    public void receiveExchangeDeclareOk()
+    {
+        performOperationResponse(Operation.EXCHANGE_DECLARE, _methodRegistry.createExchangeDeclareOkBody());
+    }
+
+    @Override
+    public void receiveExchangeDeleteOk()
+    {
+        performOperationResponse(Operation.EXCHANGE_DELETE, _methodRegistry.createExchangeDeleteOkBody());
+    }
+
+    @Override
+    public void receiveExchangeBoundOk(final int replyCode, final AMQShortString replyText)
+    {
+        performOperationResponse(Operation.EXCHANGE_BOUND, _methodRegistry.createExchangeBoundOkBody(replyCode, replyText));
+    }
+
+    @Override
+    public void receiveQueueBindOk()
+    {
+        performOperationResponse(Operation.QUEUE_BIND, _methodRegistry.createQueueBindOkBody());
+    }
+
+    @Override
+    public void receiveQueueUnbindOk()
+    {
+        performOperationResponse(Operation.QUEUE_UNBIND, _methodRegistry.createQueueUnbindOkBody());
+    }
+
+    @Override
+    public void receiveQueueDeclareOk(final AMQShortString queue, final long messageCount, final long consumerCount)
+    {
+        performOperationResponse(Operation.QUEUE_DECLARE, _methodRegistry.createQueueDeclareOkBody(queue, messageCount, consumerCount));
+    }
+
+    @Override
+    public void receiveQueuePurgeOk(final long messageCount)
+    {
+        performOperationResponse(Operation.QUEUE_PURGE, _methodRegistry.createQueuePurgeOkBody(messageCount));
+
+    }
+
+    @Override
+    public void receiveQueueDeleteOk(final long messageCount)
+    {
+        performOperationResponse(Operation.QUEUE_DELETE, _methodRegistry.createQueueDeleteOkBody(messageCount));
+
+    }
+
+    @Override
+    public void receiveBasicRecoverSyncOk()
+    {
+        performOperationResponse(Operation.BASIC_RECOVER_SYNC, _methodRegistry.createBasicRecoverSyncOkBody());
+    }
+
+    @Override
+    public void receiveBasicQosOk()
+    {
+        performOperationResponse(Operation.BAISC_QOS, _methodRegistry.createBasicQosOkBody());
+    }
+
+    @Override
+    public void receiveBasicConsumeOk(final AMQShortString consumerTag)
+    {
+        performOperationResponse(Operation.BASIC_CONSUME, _methodRegistry.createBasicConsumeOkBody(consumerTag));
+    }
+
+    @Override
+    public void receiveBasicCancelOk(final AMQShortString consumerTag)
+    {
+        performOperationResponse(Operation.BASIC_CANCEL, _methodRegistry.createBasicCancelOkBody(consumerTag));
+    }
+
+    @Override
+    public void receiveBasicReturn(final int replyCode,
+                                   final AMQShortString replyText,
+                                   final AMQShortString exchange,
+                                   final AMQShortString routingKey)
+    {
+
+    }
+
+    @Override
+    public void receiveBasicDeliver(final AMQShortString consumerTag,
+                                    final long deliveryTag,
+                                    final boolean redelivered,
+                                    final AMQShortString exchange,
+                                    final AMQShortString routingKey)
+    {
+
+    }
+
+    @Override
+    public void receiveBasicGetOk(final long deliveryTag,
+                                  final boolean redelivered,
+                                  final AMQShortString exchange,
+                                  final AMQShortString routingKey,
+                                  final long messageCount)
+    {
+        performOperationResponse(Operation.BASIC_GET, _methodRegistry.createBasicGetOkBody(deliveryTag, redelivered, exchange, routingKey, messageCount));
+    }
+
+    @Override
+    public void receiveBasicGetEmpty()
+    {
+        performOperationResponse(Operation.BASIC_GET, _methodRegistry.createBasicGetEmptyBody(AMQShortString.EMPTY_STRING));
+    }
+
+    @Override
+    public void receiveTxSelectOk()
+    {
+        performOperationResponse(Operation.TX_SELECT, _methodRegistry.createTxSelectOkBody());
+    }
+
+    @Override
+    public void receiveTxCommitOk()
+    {
+        performOperationResponse(Operation.TX_COMMIT, _methodRegistry.createTxCommitOkBody());
+    }
+
+    @Override
+    public void receiveTxRollbackOk()
+    {
+        performOperationResponse(Operation.TX_ROLLBACK, _methodRegistry.createTxRollbackOkBody());
+    }
+
+    @Override
+    public void receiveConfirmSelectOk()
+    {
+        performOperationResponse(Operation.CONFIRM_SELECT, ConfirmSelectOkBody.INSTANCE);
+    }
+
+    @Override
+    public void receiveChannelFlow(final boolean active)
+    {
+        _flowControlled = !active;
+        writeMethod(_methodRegistry.createChannelFlowOkBody(active));
+
+    }
+
+    @Override
+    public void receiveChannelFlowOk(final boolean active)
+    {
+        performOperationResponse(Operation.CHANNEL_FLOW, _methodRegistry.createChannelFlowOkBody(active));
+    }
+
+    @Override
+    public void receiveChannelClose(final int replyCode,
+                                    final AMQShortString replyText,
+                                    final int classId,
+                                    final int methodId)
+    {
+
+    }
+
+    @Override
+    public void receiveChannelCloseOk()
+    {
+    }
+
+    @Override
+    public void receiveMessageContent(final QpidByteBuffer data)
+    {
+        _messageHandler.receiveMessageContent(data);
+    }
+
+    @Override
+    public void receiveMessageHeader(final BasicContentHeaderProperties properties, final long bodySize)
+    {
+        _messageHandler.receiveMessageHeader(properties, bodySize);
+    }
+
+    @Override
+    public boolean ignoreAllButCloseOk()
+    {
+        return false;
+    }
+
+    @Override
+    public void receiveBasicNack(final long deliveryTag, final boolean multiple, final boolean requeue)
+    {
+        if(multiple)
+        {
+            Iterator<Map.Entry<Long, TransferQueueEntry>> iter = _unconfirmed.entrySet().iterator();
+            while(iter.hasNext())
+            {
+                Map.Entry<Long, TransferQueueEntry> pair = iter.next();
+                if(pair.getKey() > deliveryTag)
+                {
+                    break;
+                }
+                else
+                {
+                    final TransferQueueEntry entry = pair.getValue();
+
+                    if(requeue)
+                    {
+                        entry.release();
+                    }
+                    else
+                    {
+                        _txn.dequeue(entry.getEnqueueRecord(), new ServerTransaction.Action()
+                        {
+                            @Override
+                            public void postCommit()
+                            {
+                                entry.delete();
+                            }
+
+                            @Override
+                            public void onRollback()
+                            {
+                                entry.release();
+                            }
+                        });
+
+                    }
+                }
+            }
+        }
+        else
+        {
+            final TransferQueueEntry entry = _unconfirmed.remove(deliveryTag);
+            if(requeue)
+            {
+                entry.release();
+            }
+            else
+            {
+                _txn.dequeue(entry.getEnqueueRecord(), new ServerTransaction.Action()
+                {
+                    @Override
+                    public void postCommit()
+                    {
+                        entry.delete();
+                    }
+
+                    @Override
+                    public void onRollback()
+                    {
+                        entry.release();
+                    }
+                });
+            }
+        }
+    }
+
+    @Override
+    public void receiveBasicAck(final long deliveryTag, final boolean multiple)
+    {
+        if(multiple)
+        {
+            Iterator<Map.Entry<Long, TransferQueueEntry>> iter = _unconfirmed.entrySet().iterator();
+            while(iter.hasNext())
+            {
+                Map.Entry<Long, TransferQueueEntry> pair = iter.next();
+                if(pair.getKey() > deliveryTag)
+                {
+                    break;
+                }
+                else
+                {
+                    final TransferQueueEntry entry = pair.getValue();
+                    _txn.dequeue(entry.getEnqueueRecord(), new ServerTransaction.Action()
+                    {
+                        @Override
+                        public void postCommit()
+                        {
+                            entry.delete();
+                        }
+
+                        @Override
+                        public void onRollback()
+                        {
+                            entry.release();
+                        }
+                    });
+                }
+            }
+        }
+        else
+        {
+            final TransferQueueEntry entry = _unconfirmed.remove(deliveryTag);
+            _txn.dequeue(entry.getEnqueueRecord(), new ServerTransaction.Action()
+            {
+                @Override
+                public void postCommit()
+                {
+                    entry.delete();
+                }
+
+                @Override
+                public void onRollback()
+                {
+                    entry.release();
+                }
+            });
+
+        }
+    }
+
+    boolean isSuspended()
+    {
+        return _flowControlled || _unconfirmed.size() > _maxUnconfirmed;
+    }
+
+    @Override
+    public AccessControlContext getAccessControllerContext()
+    {
+        return null;
+    }
+
+    @Override
+    public boolean processPending()
+    {
+        if(_consumer != null)
+        {
+            return _consumer.processPending();
+        }
+        return false;
+    }
+
+    void notifyWork()
+    {
+        _connection.notifyWork();
+    }
+
+    @Override
+    public void receivedComplete()
+    {
+        _txn.commitAsync(NO_OP);
+    }
+
+    void writeMethod(AMQMethodBody body)
+    {
+        writeFrame(body.generateFrame(_channelId));
+    }
+
+    void writeFrame(AMQFrame frame)
+    {
+        _connection.writeFrame(frame);
+    }
+
+
+    private class VirtualHostPropertiesHandler implements MessageHandler
+    {
+        private long _remaining;
+        private BasicContentHeaderProperties _properties;
+
+        @Override
+        public void receiveMessageHeader(final BasicContentHeaderProperties properties, final long bodySize)
+        {
+            _remaining = bodySize;
+            _properties = properties;
+            receiveVirtualHostProperties(_properties);
+        }
+
+        @Override
+        public void receiveMessageContent(final QpidByteBuffer data)
+        {
+            if((_remaining -= data.remaining()) == 0l)
+            {
+                _messageHandler = _unexpectedMessageHandler;
+            }
+        }
+    }
+
+    private void receiveVirtualHostProperties(final BasicContentHeaderProperties properties)
+    {
+        Collection<String> remoteHostGlobalDomains =
+                properties.getHeaders().getFieldArray("virtualhost.globalDomains");
+        setRemoteHostGlobalDomains(remoteHostGlobalDomains);
+    }
+
+
+    void transfer(final TransferQueueEntry entry)
+    {
+        ServerMessage message = entry.getMessage();
+        _unconfirmed.put(++_lastSent, entry);
+
+        writeMethod(_methodRegistry.createBasicPublishBody(0, "", message.getInitialRoutingAddress(), false, false));
+        if(!(message instanceof AMQMessage))
+        {
+            final MessageConverter converter =
+                    MessageConverterRegistry.getConverter(message.getClass(), AMQMessage.class);
+            message = converter.convert(message, _connection.getVirtualHost());
+        }
+
+        AMQMessage amqMessage = (AMQMessage) message;
+        ContentHeaderBody contentHeaderBody = amqMessage.getContentHeaderBody();
+        writeHeader(contentHeaderBody);
+
+        int bodySize = (int) contentHeaderBody.getBodySize();
+
+        if (bodySize > 0)
+        {
+            int maxBodySize = (int) _connection.getMaxFrameSize() - AMQFrame.getFrameOverhead();
+
+            int writtenSize = 0;
+
+            while (writtenSize < bodySize)
+            {
+                int capacity = bodySize - writtenSize > maxBodySize ? maxBodySize : bodySize - writtenSize;
+                AMQBody body = new MessageContentSourceBody(message, writtenSize, capacity);
+                writtenSize += capacity;
+
+                writeFrame(new AMQFrame(_channelId, body));
+            }
+        }
+
+    }
+
+
+
+
+
+    private void writeHeader(final ContentHeaderBody headerBody)
+    {
+        _connection.writeFrame(new AMQFrame(_channelId, headerBody));
+    }
+}
diff --git a/broker-plugins/amqp-0-8-protocol/src/main/java/org/apache/qpid/server/protocol/v0_8/federation/TransferTarget_0_8.java b/broker-plugins/amqp-0-8-protocol/src/main/java/org/apache/qpid/server/protocol/v0_8/federation/TransferTarget_0_8.java
new file mode 100644
index 0000000..135714e
--- /dev/null
+++ b/broker-plugins/amqp-0-8-protocol/src/main/java/org/apache/qpid/server/protocol/v0_8/federation/TransferTarget_0_8.java
@@ -0,0 +1,77 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.server.protocol.v0_8.federation;
+
+import java.util.Collection;
+import java.util.Collections;
+
+import org.apache.qpid.server.message.ServerMessage;
+import org.apache.qpid.server.transfer.TransferQueueEntry;
+import org.apache.qpid.server.transfer.TransferTarget;
+
+public class TransferTarget_0_8 implements TransferTarget
+{
+    private final TransferSession_0_8 _session;
+    private final Collection<String> _globalDomains;
+
+    public TransferTarget_0_8(final TransferSession_0_8 transferSession_0_8,
+                              final Collection<String> remoteHostGlobalDomains)
+    {
+        _session = transferSession_0_8;
+        _globalDomains = remoteHostGlobalDomains;
+    }
+
+    @Override
+    public void notifyWork()
+    {
+        _session.notifyWork();
+    }
+
+    @Override
+    public Collection<String> getGlobalAddressDomains()
+    {
+        return Collections.unmodifiableCollection(_globalDomains);
+    }
+
+    @Override
+    public void send(final TransferQueueEntry entry)
+    {
+        _session.transfer(entry);
+    }
+
+    @Override
+    public void restoreCredit(final ServerMessage message)
+    {
+
+    }
+
+    @Override
+    public boolean wouldSuspend(final TransferQueueEntry entry)
+    {
+        return _session.isSuspended();
+    }
+
+    @Override
+    public boolean isSuspended()
+    {
+        return _session.isSuspended();
+    }
+}
diff --git a/broker-plugins/amqp-0-8-protocol/src/test/java/org/apache/qpid/server/protocol/v0_8/ExtractResendAndRequeueTest.java b/broker-plugins/amqp-0-8-protocol/src/test/java/org/apache/qpid/server/protocol/v0_8/ExtractResendAndRequeueTest.java
index 74dccd6..33018b8 100644
--- a/broker-plugins/amqp-0-8-protocol/src/test/java/org/apache/qpid/server/protocol/v0_8/ExtractResendAndRequeueTest.java
+++ b/broker-plugins/amqp-0-8-protocol/src/test/java/org/apache/qpid/server/protocol/v0_8/ExtractResendAndRequeueTest.java
@@ -20,23 +20,25 @@
  */
 package org.apache.qpid.server.protocol.v0_8;
 
-import org.apache.qpid.QpidException;
-import org.apache.qpid.server.consumer.ConsumerImpl;
-import org.apache.qpid.server.message.MessageInstance;
-import org.apache.qpid.server.message.ServerMessage;
-import org.apache.qpid.server.model.Queue;
-import org.apache.qpid.server.queue.QueueEntry;
-import org.apache.qpid.test.utils.QpidTestCase;
-import org.mockito.invocation.InvocationOnMock;
-import org.mockito.stubbing.Answer;
+import static org.mockito.Mockito.doAnswer;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
 
 import java.util.LinkedHashMap;
 import java.util.LinkedList;
 import java.util.Map;
 
-import static org.mockito.Mockito.doAnswer;
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.when;
+import org.mockito.invocation.InvocationOnMock;
+import org.mockito.stubbing.Answer;
+
+import org.apache.qpid.QpidException;
+import org.apache.qpid.server.message.MessageInstance;
+import org.apache.qpid.server.message.MessageInstanceConsumer;
+import org.apache.qpid.server.message.ServerMessage;
+import org.apache.qpid.server.model.Consumer;
+import org.apache.qpid.server.model.Queue;
+import org.apache.qpid.server.queue.QueueEntry;
+import org.apache.qpid.test.utils.QpidTestCase;
 
 /**
  * QPID-1385 : Race condition between added to unacked map and resending due to a rollback.
@@ -62,7 +64,7 @@
     private static final int INITIAL_MSG_COUNT = 10;
     private Queue _queue;
     private LinkedList<MessageInstance> _referenceList = new LinkedList<MessageInstance>();
-    private ConsumerImpl _consumer;
+    private MessageInstanceConsumer _consumer;
     private boolean _queueDeleted;
 
     @Override
@@ -73,8 +75,8 @@
         _queue = mock(Queue.class);
         when(_queue.getName()).thenReturn(getName());
         when(_queue.isDeleted()).thenReturn(_queueDeleted);
-        _consumer = mock(ConsumerImpl.class);
-        when(_consumer.getConsumerNumber()).thenReturn(ConsumerImpl.CONSUMER_NUMBER_GENERATOR.getAndIncrement());
+        _consumer = mock(MessageInstanceConsumer.class);
+        when(_consumer.getIdentifier()).thenReturn(Consumer.CONSUMER_NUMBER_GENERATOR.getAndIncrement());
 
 
         long id = 0;
diff --git a/broker-plugins/amqp-0-8-protocol/src/test/java/org/apache/qpid/server/protocol/v0_8/UnacknowledgedMessageMapTest.java b/broker-plugins/amqp-0-8-protocol/src/test/java/org/apache/qpid/server/protocol/v0_8/UnacknowledgedMessageMapTest.java
index f70afd6..52a6225 100644
--- a/broker-plugins/amqp-0-8-protocol/src/test/java/org/apache/qpid/server/protocol/v0_8/UnacknowledgedMessageMapTest.java
+++ b/broker-plugins/amqp-0-8-protocol/src/test/java/org/apache/qpid/server/protocol/v0_8/UnacknowledgedMessageMapTest.java
@@ -25,13 +25,13 @@
 
 import java.util.Collection;
 
-import org.apache.qpid.server.consumer.ConsumerImpl;
 import org.apache.qpid.server.message.MessageInstance;
+import org.apache.qpid.server.message.MessageInstanceConsumer;
 import org.apache.qpid.test.utils.QpidTestCase;
 
 public class UnacknowledgedMessageMapTest extends QpidTestCase
 {
-    private final ConsumerImpl _consumer = mock(ConsumerImpl.class);
+    private final MessageInstanceConsumer _consumer = mock(MessageInstanceConsumer.class);
 
     public void testDeletedMessagesCantBeAcknowledged()
     {
diff --git a/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/ConsumerTarget_1_0.java b/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/ConsumerTarget_1_0.java
index 876f91a..2e9a24c 100644
--- a/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/ConsumerTarget_1_0.java
+++ b/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/ConsumerTarget_1_0.java
@@ -27,6 +27,7 @@
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import org.apache.qpid.server.message.MessageInstanceConsumer;
 import org.apache.qpid.server.protocol.v1_0.codec.ValueHandler;
 import org.apache.qpid.server.protocol.v1_0.messaging.SectionEncoder;
 import org.apache.qpid.server.protocol.v1_0.messaging.SectionEncoderImpl;
@@ -49,7 +50,6 @@
 import org.apache.qpid.bytebuffer.QpidByteBuffer;
 import org.apache.qpid.server.transport.ProtocolEngine;
 import org.apache.qpid.server.consumer.AbstractConsumerTarget;
-import org.apache.qpid.server.consumer.ConsumerImpl;
 import org.apache.qpid.server.message.MessageInstance;
 import org.apache.qpid.server.message.ServerMessage;
 import org.apache.qpid.server.plugin.MessageConverter;
@@ -106,7 +106,7 @@
 
     }
 
-    public void doSend(final ConsumerImpl consumer, final MessageInstance entry, boolean batch)
+    public void doSend(final MessageInstanceConsumer consumer, final MessageInstance entry, boolean batch)
     {
         // TODO
         ServerMessage serverMessage = entry.getMessage();
@@ -329,7 +329,7 @@
 
     public void flush()
     {
-        for(ConsumerImpl consumer : getConsumers())
+        for(MessageInstanceConsumer consumer : getConsumers())
         {
             consumer.flush();
         }
@@ -340,16 +340,16 @@
 
         private final MessageInstance _queueEntry;
         private final Binary _deliveryTag;
-        private final ConsumerImpl _consumer;
+        private final MessageInstanceConsumer _consumer;
 
-        public DispositionAction(Binary tag, MessageInstance queueEntry, final ConsumerImpl consumer)
+        public DispositionAction(Binary tag, MessageInstance queueEntry, final MessageInstanceConsumer consumer)
         {
             _deliveryTag = tag;
             _queueEntry = queueEntry;
             _consumer = consumer;
         }
 
-        public ConsumerImpl getConsumer()
+        public MessageInstanceConsumer getConsumer()
         {
             return _consumer;
         }
@@ -522,7 +522,6 @@
         return target instanceof org.apache.qpid.server.protocol.v1_0.type.messaging.Target ? ((org.apache.qpid.server.protocol.v1_0.type.messaging.Target) target).getAddress() : _link.getEndpoint().getName();
     }
 
-    @Override
     public long getUnacknowledgedBytes()
     {
         // TODO
diff --git a/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/SendingLink_1_0.java b/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/SendingLink_1_0.java
index 40f95da..7145ca9 100644
--- a/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/SendingLink_1_0.java
+++ b/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/SendingLink_1_0.java
@@ -35,6 +35,9 @@
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import org.apache.qpid.server.consumer.ConsumerTarget;
+import org.apache.qpid.server.message.ConsumerOption;
+import org.apache.qpid.server.message.MessageInstanceConsumer;
 import org.apache.qpid.server.model.NamedAddressSpace;
 import org.apache.qpid.server.protocol.v1_0.type.AmqpErrorException;
 import org.apache.qpid.server.protocol.v1_0.type.Binary;
@@ -61,7 +64,6 @@
 import org.apache.qpid.filter.SelectorParsingException;
 import org.apache.qpid.filter.selector.ParseException;
 import org.apache.qpid.filter.selector.TokenMgrError;
-import org.apache.qpid.server.consumer.ConsumerImpl;
 import org.apache.qpid.server.filter.FilterManager;
 import org.apache.qpid.server.filter.JMSSelectorFilter;
 import org.apache.qpid.server.message.MessageInstance;
@@ -84,7 +86,7 @@
     private NamedAddressSpace _addressSpace;
     private SendingDestination _destination;
 
-    private ConsumerImpl _consumer;
+    private MessageInstanceConsumer _consumer;
     private ConsumerTarget_1_0 _target;
 
     private boolean _draining;
@@ -114,7 +116,7 @@
         linkAttachment.setDeliveryStateHandler(this);
         QueueDestination qd = null;
 
-        EnumSet<ConsumerImpl.Option> options = EnumSet.noneOf(ConsumerImpl.Option.class);
+        EnumSet<ConsumerOption> options = EnumSet.noneOf(ConsumerOption.class);
 
 
         boolean noLocal = false;
@@ -170,8 +172,8 @@
             _target = new ConsumerTarget_1_0(this, source.getDistributionMode() != StdDistMode.COPY);
             if(source.getDistributionMode() != StdDistMode.COPY)
             {
-                options.add(ConsumerImpl.Option.ACQUIRES);
-                options.add(ConsumerImpl.Option.SEES_REQUEUES);
+                options.add(ConsumerOption.ACQUIRES);
+                options.add(ConsumerOption.SEES_REQUEUES);
             }
 
         }
@@ -330,8 +332,8 @@
 
 
             _target = new ConsumerTarget_1_0(this, true);
-            options.add(ConsumerImpl.Option.ACQUIRES);
-            options.add(ConsumerImpl.Option.SEES_REQUEUES);
+            options.add(ConsumerOption.ACQUIRES);
+            options.add(ConsumerOption.SEES_REQUEUES);
 
         }
         else
@@ -343,13 +345,13 @@
         {
             if(noLocal)
             {
-                options.add(ConsumerImpl.Option.NO_LOCAL);
+                options.add(ConsumerOption.NO_LOCAL);
             }
 
             if(_durability == TerminusDurability.CONFIGURATION ||
                _durability == TerminusDurability.UNSETTLED_STATE )
             {
-                options.add(ConsumerImpl.Option.DURABLE);
+                options.add(ConsumerOption.DURABLE);
             }
 
             try
@@ -588,7 +590,7 @@
     public synchronized void setLinkAttachment(SendingLinkAttachment linkAttachment)
     {
 
-        if(_consumer.isActive())
+        if(_target.getState() == ConsumerTarget.State.ACTIVE)
         {
             _target.suspend();
         }
@@ -694,7 +696,7 @@
         return _addressSpace;
     }
 
-    public ConsumerImpl getConsumer()
+    public MessageInstanceConsumer getConsumer()
     {
         return _consumer;
     }
diff --git a/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/Session_1_0.java b/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/Session_1_0.java
index 744f009..40f22ec 100644
--- a/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/Session_1_0.java
+++ b/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/Session_1_0.java
@@ -45,7 +45,24 @@
 import org.slf4j.LoggerFactory;
 
 import org.apache.qpid.bytebuffer.QpidByteBuffer;
+import org.apache.qpid.protocol.AMQConstant;
+import org.apache.qpid.server.connection.SessionPrincipal;
+import org.apache.qpid.server.consumer.ConsumerTarget;
+import org.apache.qpid.server.logging.LogSubject;
+import org.apache.qpid.server.message.MessageDestination;
+import org.apache.qpid.server.message.MessageInstanceConsumer;
+import org.apache.qpid.server.message.MessageSource;
+import org.apache.qpid.server.model.AbstractConfigurationChangeListener;
+import org.apache.qpid.server.model.ConfigurationChangeListener;
+import org.apache.qpid.server.model.ConfiguredObject;
+import org.apache.qpid.server.model.Consumer;
+import org.apache.qpid.server.model.Exchange;
 import org.apache.qpid.server.model.NamedAddressSpace;
+import org.apache.qpid.server.model.Queue;
+import org.apache.qpid.server.model.Session;
+import org.apache.qpid.server.protocol.AMQSessionModel;
+import org.apache.qpid.server.protocol.ConsumerListener;
+import org.apache.qpid.server.protocol.LinkRegistry;
 import org.apache.qpid.server.protocol.v1_0.framing.OversizeFrameException;
 import org.apache.qpid.server.protocol.v1_0.type.AmqpErrorException;
 import org.apache.qpid.server.protocol.v1_0.type.Binary;
@@ -75,22 +92,6 @@
 import org.apache.qpid.server.protocol.v1_0.type.transport.LinkError;
 import org.apache.qpid.server.protocol.v1_0.type.transport.Role;
 import org.apache.qpid.server.protocol.v1_0.type.transport.Transfer;
-import org.apache.qpid.protocol.AMQConstant;
-import org.apache.qpid.server.connection.SessionPrincipal;
-import org.apache.qpid.server.consumer.ConsumerImpl;
-import org.apache.qpid.server.consumer.ConsumerTarget;
-import org.apache.qpid.server.logging.LogSubject;
-import org.apache.qpid.server.message.MessageDestination;
-import org.apache.qpid.server.message.MessageSource;
-import org.apache.qpid.server.model.ConfigurationChangeListener;
-import org.apache.qpid.server.model.ConfiguredObject;
-import org.apache.qpid.server.model.Consumer;
-import org.apache.qpid.server.model.Exchange;
-import org.apache.qpid.server.model.Queue;
-import org.apache.qpid.server.model.Session;
-import org.apache.qpid.server.protocol.AMQSessionModel;
-import org.apache.qpid.server.protocol.ConsumerListener;
-import org.apache.qpid.server.protocol.LinkRegistry;
 import org.apache.qpid.server.security.SecurityToken;
 import org.apache.qpid.server.transport.AMQPConnection;
 import org.apache.qpid.server.txn.AutoCommitTransaction;
@@ -1042,7 +1043,7 @@
 
     private void registerConsumer(final SendingLink_1_0 link)
     {
-        ConsumerImpl consumer = link.getConsumer();
+        MessageInstanceConsumer consumer = link.getConsumer();
         if(consumer instanceof Consumer<?>)
         {
             Consumer<?> modelConsumer = (Consumer<?>) consumer;
@@ -1628,7 +1629,7 @@
         }
     }
 
-    private class ConsumerClosedListener implements ConfigurationChangeListener
+    private class ConsumerClosedListener extends AbstractConfigurationChangeListener
     {
         @Override
         public void stateChanged(final ConfiguredObject object, final org.apache.qpid.server.model.State oldState, final org.apache.qpid.server.model.State newState)
@@ -1638,39 +1639,6 @@
                 consumerRemoved((Consumer<?>)object);
             }
         }
-
-        @Override
-        public void childAdded(final ConfiguredObject object, final ConfiguredObject child)
-        {
-
-        }
-
-        @Override
-        public void childRemoved(final ConfiguredObject object, final ConfiguredObject child)
-        {
-
-        }
-
-        @Override
-        public void attributeSet(final ConfiguredObject object,
-                                 final String attributeName,
-                                 final Object oldAttributeValue,
-                                 final Object newAttributeValue)
-        {
-
-        }
-
-        @Override
-        public void bulkChangeStart(final ConfiguredObject<?> object)
-        {
-
-        }
-
-        @Override
-        public void bulkChangeEnd(final ConfiguredObject<?> object)
-        {
-
-        }
     }
 
     @Override
diff --git a/broker-plugins/logging-logback/src/main/java/org/apache/qpid/server/logging/logback/AbstractLogger.java b/broker-plugins/logging-logback/src/main/java/org/apache/qpid/server/logging/logback/AbstractLogger.java
index 35ad562..bfac0d6 100644
--- a/broker-plugins/logging-logback/src/main/java/org/apache/qpid/server/logging/logback/AbstractLogger.java
+++ b/broker-plugins/logging-logback/src/main/java/org/apache/qpid/server/logging/logback/AbstractLogger.java
@@ -36,9 +36,9 @@
 import org.slf4j.LoggerFactory;
 
 import org.apache.qpid.server.logging.LogInclusionRule;
+import org.apache.qpid.server.model.AbstractConfigurationChangeListener;
 import org.apache.qpid.server.model.AbstractConfiguredObject;
 import org.apache.qpid.server.model.BrokerLogInclusionRule;
-import org.apache.qpid.server.model.ConfigurationChangeListener;
 import org.apache.qpid.server.model.ConfiguredObject;
 import org.apache.qpid.server.model.ConfiguredObjectTypeRegistry;
 import org.apache.qpid.server.model.ManagedObject;
@@ -149,7 +149,7 @@
         }
     }
 
-    private class LogInclusionRuleListener implements ConfigurationChangeListener
+    private class LogInclusionRuleListener extends AbstractConfigurationChangeListener
     {
 
         @Override
@@ -170,28 +170,6 @@
             }
         }
 
-        @Override
-        public void stateChanged(final ConfiguredObject<?> object, final State oldState, final State newState)
-        {
-        }
-
-        @Override
-        public void attributeSet(final ConfiguredObject<?> object,
-                                 final String attributeName,
-                                 final Object oldAttributeValue,
-                                 final Object newAttributeValue)
-        {
-        }
-
-        @Override
-        public void bulkChangeStart(final ConfiguredObject<?> object)
-        {
-        }
-
-        @Override
-        public void bulkChangeEnd(final ConfiguredObject<?> object)
-        {
-        }
     }
 
     public static Map<String, Collection<String>> getSupportedVirtualHostLoggerChildTypes()
diff --git a/broker-plugins/management-amqp/src/main/java/org/apache/qpid/server/management/amqp/ManagementAddressSpace.java b/broker-plugins/management-amqp/src/main/java/org/apache/qpid/server/management/amqp/ManagementAddressSpace.java
index ee633f6..7ee2200 100644
--- a/broker-plugins/management-amqp/src/main/java/org/apache/qpid/server/management/amqp/ManagementAddressSpace.java
+++ b/broker-plugins/management-amqp/src/main/java/org/apache/qpid/server/management/amqp/ManagementAddressSpace.java
@@ -29,9 +29,9 @@
 import java.util.concurrent.CopyOnWriteArrayList;
 
 import org.apache.qpid.exchange.ExchangeDefaults;
+import org.apache.qpid.server.message.BaseMessageInstance;
 import org.apache.qpid.server.message.InstanceProperties;
 import org.apache.qpid.server.message.MessageDestination;
-import org.apache.qpid.server.message.MessageInstance;
 import org.apache.qpid.server.message.MessageSource;
 import org.apache.qpid.server.message.ServerMessage;
 import org.apache.qpid.server.model.Broker;
@@ -237,7 +237,7 @@
                                                                                      final String routingAddress,
                                                                                      final InstanceProperties instanceProperties,
                                                                                      final ServerTransaction txn,
-                                                                                     final Action<? super MessageInstance> postEnqueueAction)
+                                                                                     final Action<? super BaseMessageInstance> postEnqueueAction)
         {
             MessageDestination destination = getAttainedMessageDestination(routingAddress);
             if(destination == null || destination == this)
diff --git a/broker-plugins/management-amqp/src/main/java/org/apache/qpid/server/management/amqp/ManagementNode.java b/broker-plugins/management-amqp/src/main/java/org/apache/qpid/server/management/amqp/ManagementNode.java
index 243da37..b1e2650 100644
--- a/broker-plugins/management-amqp/src/main/java/org/apache/qpid/server/management/amqp/ManagementNode.java
+++ b/broker-plugins/management-amqp/src/main/java/org/apache/qpid/server/management/amqp/ManagementNode.java
@@ -41,19 +41,22 @@
 import javax.security.auth.Subject;
 
 import org.apache.qpid.server.connection.SessionPrincipal;
-import org.apache.qpid.server.consumer.ConsumerImpl;
 import org.apache.qpid.server.consumer.ConsumerTarget;
 import org.apache.qpid.server.filter.FilterManager;
 import org.apache.qpid.server.filter.Filterable;
 import org.apache.qpid.server.message.AMQMessageHeader;
+import org.apache.qpid.server.message.AcquiringMessageInstanceConsumer;
+import org.apache.qpid.server.message.BaseMessageInstance;
+import org.apache.qpid.server.message.ConsumerOption;
 import org.apache.qpid.server.message.InstanceProperties;
 import org.apache.qpid.server.message.MessageDestination;
 import org.apache.qpid.server.message.MessageInstance;
+import org.apache.qpid.server.message.MessageInstanceConsumer;
 import org.apache.qpid.server.message.MessageSource;
 import org.apache.qpid.server.message.ServerMessage;
 import org.apache.qpid.server.message.internal.InternalMessage;
 import org.apache.qpid.server.message.internal.InternalMessageHeader;
-import org.apache.qpid.server.model.ConfigurationChangeListener;
+import org.apache.qpid.server.model.AbstractConfigurationChangeListener;
 import org.apache.qpid.server.model.ConfiguredObject;
 import org.apache.qpid.server.model.ManagedObject;
 import org.apache.qpid.server.model.NamedAddressSpace;
@@ -71,7 +74,7 @@
 import org.apache.qpid.server.util.Action;
 import org.apache.qpid.server.util.StateChangeListener;
 
-class ManagementNode implements MessageSource, MessageDestination
+class ManagementNode implements MessageSource<ManagementNodeConsumer>, MessageDestination
 {
 
     public static final String NAME_ATTRIBUTE = "name";
@@ -263,7 +266,7 @@
                                                                                   final String routingAddress,
                                                                                   final InstanceProperties instanceProperties,
                                                                                   final ServerTransaction txn,
-                                                                                  final Action<? super MessageInstance> postEnqueueAction)
+                                                                                  final Action<? super BaseMessageInstance> postEnqueueAction)
     {
 
         @SuppressWarnings("unchecked")
@@ -982,7 +985,7 @@
                                                             final FilterManager filters,
                                                             final Class<? extends ServerMessage> messageClass,
                                                             final String consumerName,
-                                                            final EnumSet<ConsumerImpl.Option> options,
+                                                            final EnumSet<ConsumerOption> options,
                                                             final Integer priority)
     {
 
@@ -1099,7 +1102,7 @@
         }
 
         @Override
-        public ConsumerImpl getAcquiringConsumer()
+        public MessageInstanceConsumer getAcquiringConsumer()
         {
             return null;
         }
@@ -1111,13 +1114,13 @@
         }
 
         @Override
-        public boolean isAcquiredBy(final ConsumerImpl consumer)
+        public boolean isAcquiredBy(final MessageInstanceConsumer consumer)
         {
             return false;
         }
 
         @Override
-        public boolean removeAcquisitionFromConsumer(final ConsumerImpl consumer)
+        public boolean removeAcquisitionFromConsumer(final MessageInstanceConsumer consumer)
         {
             return false;
         }
@@ -1135,7 +1138,7 @@
         }
 
         @Override
-        public ConsumerImpl getDeliveredConsumer()
+        public AcquiringMessageInstanceConsumer<?,?> getDeliveredConsumer()
         {
             return null;
         }
@@ -1147,7 +1150,7 @@
         }
 
         @Override
-        public boolean isRejectedBy(final ConsumerImpl consumer)
+        public boolean isRejectedBy(final MessageInstanceConsumer consumer)
         {
             return false;
         }
@@ -1165,13 +1168,13 @@
         }
 
         @Override
-        public boolean acquire(final ConsumerImpl sub)
+        public boolean acquire(final MessageInstanceConsumer sub)
         {
             return false;
         }
 
         @Override
-        public boolean makeAcquisitionUnstealable(final ConsumerImpl consumer)
+        public boolean makeAcquisitionUnstealable(final MessageInstanceConsumer consumer)
         {
             return false;
         }
@@ -1189,7 +1192,7 @@
         }
 
         @Override
-        public int routeToAlternate(final Action<? super MessageInstance> action,
+        public int routeToAlternate(final Action<? super BaseMessageInstance> action,
                                     final ServerTransaction txn)
         {
             return 0;
@@ -1227,7 +1230,7 @@
         }
 
         @Override
-        public void release(final ConsumerImpl release)
+        public void release(final MessageInstanceConsumer release)
         {
 
         }
@@ -1275,7 +1278,7 @@
         }
     }
 
-    private class ModelObjectListener implements ConfigurationChangeListener
+    private class ModelObjectListener extends AbstractConfigurationChangeListener
     {
         @Override
         public void stateChanged(final ConfiguredObject object, final State oldState, final State newState)
@@ -1328,27 +1331,6 @@
                 _entities.get(entityType).remove(child.getName());
             }
         }
-
-        @Override
-        public void attributeSet(final ConfiguredObject object,
-                                 final String attributeName,
-                                 final Object oldAttributeValue,
-                                 final Object newAttributeValue)
-        {
-
-        }
-
-        @Override
-        public void bulkChangeStart(final ConfiguredObject<?> object)
-        {
-
-        }
-
-        @Override
-        public void bulkChangeEnd(final ConfiguredObject<?> object)
-        {
-
-        }
     }
 
     private static class MutableMessageHeader implements AMQMessageHeader
diff --git a/broker-plugins/management-amqp/src/main/java/org/apache/qpid/server/management/amqp/ManagementNodeConsumer.java b/broker-plugins/management-amqp/src/main/java/org/apache/qpid/server/management/amqp/ManagementNodeConsumer.java
index 9890992..e46273d 100644
--- a/broker-plugins/management-amqp/src/main/java/org/apache/qpid/server/management/amqp/ManagementNodeConsumer.java
+++ b/broker-plugins/management-amqp/src/main/java/org/apache/qpid/server/management/amqp/ManagementNodeConsumer.java
@@ -26,12 +26,11 @@
 import java.util.List;
 import java.util.Map;
 
-import org.apache.qpid.server.consumer.ConsumerImpl;
 import org.apache.qpid.server.consumer.ConsumerTarget;
+import org.apache.qpid.server.message.BaseMessageInstance;
 import org.apache.qpid.server.message.InstanceProperties;
 import org.apache.qpid.server.message.MessageDestination;
-import org.apache.qpid.server.message.MessageInstance;
-import org.apache.qpid.server.message.MessageSource;
+import org.apache.qpid.server.message.MessageInstanceConsumer;
 import org.apache.qpid.server.message.ServerMessage;
 import org.apache.qpid.server.message.internal.InternalMessage;
 import org.apache.qpid.server.model.NamedAddressSpace;
@@ -42,15 +41,14 @@
 import org.apache.qpid.server.util.Action;
 import org.apache.qpid.server.util.StateChangeListener;
 
-class ManagementNodeConsumer implements ConsumerImpl, MessageDestination
+class ManagementNodeConsumer implements MessageInstanceConsumer, MessageDestination
 {
-    private final long _id = ConsumerImpl.CONSUMER_NUMBER_GENERATOR.getAndIncrement();
     private final ManagementNode _managementNode;
     private final List<ManagementResponse> _queue = Collections.synchronizedList(new ArrayList<ManagementResponse>());
     private final ConsumerTarget _target;
     private final String _name;
     private final StateChangeListener<ConsumerTarget, ConsumerTarget.State> _targetChangeListener = new TargetChangeListener();
-
+    private final Object _identifier = new Object();
 
     public ManagementNodeConsumer(final String consumerName, final ManagementNode managementNode, ConsumerTarget target)
     {
@@ -67,6 +65,11 @@
     }
 
     @Override
+    public Object getIdentifier()
+    {
+        return _identifier;
+    }
+
     public boolean hasAvailableMessages()
     {
         return !_queue.isEmpty();
@@ -78,53 +81,12 @@
 
     }
 
-    @Override
-    public long getBytesOut()
-    {
-        return 0;
-    }
 
-    @Override
-    public long getMessagesOut()
-    {
-        return 0;
-    }
-
-    @Override
-    public long getUnacknowledgedBytes()
-    {
-        return 0;
-    }
-
-    @Override
-    public long getUnacknowledgedMessages()
-    {
-        return 0;
-    }
-
-    @Override
     public AMQSessionModel getSessionModel()
     {
         return _target.getSessionModel();
     }
 
-    @Override
-    public MessageSource getMessageSource()
-    {
-        return _managementNode;
-    }
-
-    @Override
-    public long getConsumerNumber()
-    {
-        return _id;
-    }
-
-    @Override
-    public boolean isSuspended()
-    {
-        return false;
-    }
 
     @Override
     public boolean isClosed()
@@ -139,42 +101,11 @@
     }
 
     @Override
-    public boolean seesRequeues()
-    {
-        return false;
-    }
-
-    @Override
     public void close()
     {
     }
 
     @Override
-    public boolean trySendLock()
-    {
-        return _target.trySendLock();
-    }
-
-    @Override
-    public void getSendLock()
-    {
-        _target.getSendLock();
-    }
-
-    @Override
-    public void releaseSendLock()
-    {
-        _target.releaseSendLock();
-    }
-
-
-    @Override
-    public boolean isActive()
-    {
-        return false;
-    }
-
-    @Override
     public NamedAddressSpace getAddressSpace()
     {
         return _managementNode.getAddressSpace();
@@ -198,7 +129,7 @@
                                                                                  final String routingAddress,
                                                                                  final InstanceProperties instanceProperties,
                                                                                  final ServerTransaction txn,
-                                                                                 final Action<? super MessageInstance> postEnqueueAction)
+                                                                                 final Action<? super BaseMessageInstance> postEnqueueAction)
     {
         send((InternalMessage)message);
         return 1;
@@ -210,7 +141,6 @@
 
     }
 
-    @Override
     public ConsumerTarget getTarget()
     {
         return _target;
diff --git a/broker-plugins/management-amqp/src/main/java/org/apache/qpid/server/management/amqp/ManagementResponse.java b/broker-plugins/management-amqp/src/main/java/org/apache/qpid/server/management/amqp/ManagementResponse.java
index 0b17b0f..71d0225 100644
--- a/broker-plugins/management-amqp/src/main/java/org/apache/qpid/server/management/amqp/ManagementResponse.java
+++ b/broker-plugins/management-amqp/src/main/java/org/apache/qpid/server/management/amqp/ManagementResponse.java
@@ -20,10 +20,11 @@
  */
 package org.apache.qpid.server.management.amqp;
 
-import org.apache.qpid.server.consumer.ConsumerImpl;
 import org.apache.qpid.server.filter.Filterable;
+import org.apache.qpid.server.message.BaseMessageInstance;
 import org.apache.qpid.server.message.InstanceProperties;
 import org.apache.qpid.server.message.MessageInstance;
+import org.apache.qpid.server.message.MessageInstanceConsumer;
 import org.apache.qpid.server.message.ServerMessage;
 import org.apache.qpid.server.message.internal.InternalMessage;
 import org.apache.qpid.server.store.MessageEnqueueRecord;
@@ -85,7 +86,7 @@
     }
 
     @Override
-    public ConsumerImpl getAcquiringConsumer()
+    public MessageInstanceConsumer getAcquiringConsumer()
     {
         return _consumer;
     }
@@ -97,13 +98,13 @@
     }
 
     @Override
-    public boolean isAcquiredBy(final ConsumerImpl consumer)
+    public boolean isAcquiredBy(final MessageInstanceConsumer consumer)
     {
         return consumer == _consumer && !isDeleted();
     }
 
     @Override
-    public boolean removeAcquisitionFromConsumer(final ConsumerImpl consumer)
+    public boolean removeAcquisitionFromConsumer(final MessageInstanceConsumer consumer)
     {
         return consumer == _consumer;
     }
@@ -133,7 +134,7 @@
     }
 
     @Override
-    public boolean isRejectedBy(final ConsumerImpl consumer)
+    public boolean isRejectedBy(final MessageInstanceConsumer consumer)
     {
         return false;
     }
@@ -151,13 +152,13 @@
     }
 
     @Override
-    public boolean acquire(final ConsumerImpl sub)
+    public boolean acquire(final MessageInstanceConsumer sub)
     {
         return false;
     }
 
     @Override
-    public boolean makeAcquisitionUnstealable(final ConsumerImpl consumer)
+    public boolean makeAcquisitionUnstealable(final MessageInstanceConsumer consumer)
     {
         return false;
     }
@@ -175,7 +176,7 @@
     }
 
     @Override
-    public int routeToAlternate(final Action<? super MessageInstance> action,
+    public int routeToAlternate(final Action<? super BaseMessageInstance> action,
                                 final ServerTransaction txn)
     {
         return 0;
@@ -213,7 +214,7 @@
     }
 
     @Override
-    public void release(final ConsumerImpl release)
+    public void release(final MessageInstanceConsumer release)
     {
         release();
     }
diff --git a/client/src/main/java/org/apache/qpid/client/url/URLParser.java b/client/src/main/java/org/apache/qpid/client/url/URLParser.java
index 7791f32..2fe7216 100644
--- a/client/src/main/java/org/apache/qpid/client/url/URLParser.java
+++ b/client/src/main/java/org/apache/qpid/client/url/URLParser.java
@@ -21,16 +21,19 @@
 package org.apache.qpid.client.url;
 
 
-import org.apache.qpid.client.BrokerDetails;
-import org.apache.qpid.client.AMQConnectionFactory;
-import org.apache.qpid.client.AMQConnectionURL;
-import org.apache.qpid.url.URLHelper;
-import org.apache.qpid.url.URLSyntaxException;
-
+import java.io.UnsupportedEncodingException;
 import java.net.URI;
 import java.net.URISyntaxException;
+import java.net.URLDecoder;
+import java.nio.charset.StandardCharsets;
 import java.util.StringTokenizer;
 
+import org.apache.qpid.client.AMQConnectionFactory;
+import org.apache.qpid.client.AMQConnectionURL;
+import org.apache.qpid.client.BrokerDetails;
+import org.apache.qpid.url.URLHelper;
+import org.apache.qpid.url.URLSyntaxException;
+
 public class URLParser
 {
     private AMQConnectionURL _url;
@@ -82,12 +85,12 @@
                 _url.setClientName(connection.getHost());
             }
             
-            String userInfo = connection.getUserInfo();
+            String userInfo = connection.getRawUserInfo();
 
             if (userInfo == null)
             {
-                // Fix for Java 1.5 which doesn't parse UserInfo for non http URIs
-                userInfo = connection.getAuthority();
+                // Fix for Java Environments which don't parse UserInfo for non http URIs
+                userInfo = connection.getRawAuthority();
 
                 if (userInfo != null)
                 {
@@ -178,8 +181,16 @@
         }
         else
         {
-            _url.setUsername(userinfo.substring(0, colonIndex));
-            _url.setPassword(userinfo.substring(colonIndex + 1));
+            try
+            {
+                _url.setUsername(URLDecoder.decode(userinfo.substring(0, colonIndex), StandardCharsets.UTF_8.name()));
+                _url.setPassword(URLDecoder.decode(userinfo.substring(colonIndex + 1), StandardCharsets.UTF_8.name()));
+            }
+            catch (UnsupportedEncodingException e)
+            {
+                throw URLHelper.parseError(AMQConnectionURL.AMQ_PROTOCOL.length() + 3, userinfo.length(),
+                                           e.getLocalizedMessage(), _url.getURL());
+            }
         }
 
     }
diff --git a/client/src/test/java/org/apache/qpid/test/unit/client/connectionurl/ConnectionURLTest.java b/client/src/test/java/org/apache/qpid/test/unit/client/connectionurl/ConnectionURLTest.java
index c31eb4d..8bafa85 100644
--- a/client/src/test/java/org/apache/qpid/test/unit/client/connectionurl/ConnectionURLTest.java
+++ b/client/src/test/java/org/apache/qpid/test/unit/client/connectionurl/ConnectionURLTest.java
@@ -34,6 +34,26 @@
 
 public class ConnectionURLTest extends QpidTestCase
 {
+
+    public void testPasswordWithColon() throws URLSyntaxException
+    {
+        String url = "amqp://PQ-RST-UV-W:VPN%3amwrst@/test?brokerlist='tcp://localhost:5672'";
+        ConnectionURL connectionurl = new AMQConnectionURL(url);
+        assertEquals("PQ-RST-UV-W", connectionurl.getUsername());
+        assertEquals("VPN:mwrst", connectionurl.getPassword());
+        assertEquals("/test",connectionurl.getVirtualHost());
+    }
+
+    public void testUsernameWithColon() throws URLSyntaxException
+    {
+        String url = "amqp://PQ%3aRST-UV-W:VPN%3amwrst@/test?brokerlist='tcp://localhost:5672'";
+        ConnectionURL connectionurl = new AMQConnectionURL(url);
+        assertEquals("PQ:RST-UV-W", connectionurl.getUsername());
+        assertEquals("VPN:mwrst", connectionurl.getPassword());
+        assertEquals("/test",connectionurl.getVirtualHost());
+    }
+
+
     public void testFailoverURL() throws URLSyntaxException
     {
         String url = "amqp://ritchiem:bob@/test?brokerlist='tcp://localhost:5672;tcp://fancyserver:3000/',failover='roundrobin?cyclecount='100''";
diff --git a/common/src/main/java/org/apache/qpid/framing/FieldTable.java b/common/src/main/java/org/apache/qpid/framing/FieldTable.java
index a15ef99..ff3cf90 100644
--- a/common/src/main/java/org/apache/qpid/framing/FieldTable.java
+++ b/common/src/main/java/org/apache/qpid/framing/FieldTable.java
@@ -414,6 +414,28 @@
         }
     }
 
+    public FieldArray getFieldArray(String string)
+    {
+        return getFieldArray(AMQShortString.valueOf(string));
+    }
+
+    public FieldArray getFieldArray(AMQShortString string)
+    {
+        AMQTypedValue value = getProperty(string);
+
+        if ((value != null) && (value.getType() == AMQType.FIELD_ARRAY))
+        {
+            return (FieldArray) value.getValue();
+        }
+        else
+        {
+            return null;
+        }
+    }
+
+
+
+
     public Object getObject(String string)
     {
         return getObject(AMQShortString.valueOf(string));
diff --git a/common/src/main/java/org/apache/qpid/framing/HeartbeatBody.java b/common/src/main/java/org/apache/qpid/framing/HeartbeatBody.java
index cb985f5..cfefe59 100644
--- a/common/src/main/java/org/apache/qpid/framing/HeartbeatBody.java
+++ b/common/src/main/java/org/apache/qpid/framing/HeartbeatBody.java
@@ -95,4 +95,10 @@
         }
         processor.receiveHeartbeat();
     }
+
+    @Override
+    public String toString()
+    {
+        return "[HeartbeatBody]";
+    }
 }
