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 da161a9..2900acd 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
@@ -58,6 +58,7 @@
 
 import javax.security.auth.Subject;
 
+import com.google.common.collect.Lists;
 import com.google.common.io.ByteStreams;
 import com.google.common.util.concurrent.FutureCallback;
 import com.google.common.util.concurrent.Futures;
@@ -284,7 +285,7 @@
                 while (consumerIterator.hasNext())
                 {
                     QueueConsumer<?> queueConsumer = consumerIterator.next();
-                    if (queueConsumer != null && queueConsumer.getPriority() < highestNotifiedPriority || notifyConsumer(queueConsumer))
+                    if (queueConsumer.getPriority() < highestNotifiedPriority || notifyConsumer(queueConsumer))
                     {
                         break;
                     }
@@ -1042,7 +1043,7 @@
     @Override
     public Collection<QueueConsumer<?>> getConsumers()
     {
-        return getQueueConsumersAsList();
+        return Lists.newArrayList(_queueConsumerManager.getAllIterator());
     }
 
 
@@ -1323,7 +1324,7 @@
             QueueConsumer<?> sub = consumerIterator.next();
 
             // we don't make browsers send the same stuff twice
-            if (sub != null && sub.seesRequeues())
+            if (sub.seesRequeues())
             {
                 updateSubRequeueEntry(sub, entry);
             }
@@ -1829,7 +1830,7 @@
         while (nonAcquiringIterator.hasNext())
         {
             QueueConsumer<?> consumer = nonAcquiringIterator.next();
-            if(consumer != null && consumer.hasInterest(entry))
+            if(consumer.hasInterest(entry))
             {
                 notifyConsumer(consumer);
             }
@@ -1839,7 +1840,7 @@
         while (entry.isAvailable() && interestedIterator.hasNext())
         {
             QueueConsumer<?> consumer = interestedIterator.next();
-            if(consumer != null && consumer.hasInterest(entry))
+            if(consumer.hasInterest(entry))
             {
                 if(notifyConsumer(consumer))
                 {
@@ -1861,14 +1862,12 @@
         while (hasAvailableMessages() && interestedIterator.hasNext())
         {
             QueueConsumer<?> consumer = interestedIterator.next();
-            if(consumer != null)
+
+            if (excludedConsumer != consumer)
             {
-                if (excludedConsumer != consumer)
+                if (notifyConsumer(consumer))
                 {
-                    if (notifyConsumer(consumer))
-                    {
-                        break;
-                    }
+                    break;
                 }
             }
         }
@@ -2015,7 +2014,7 @@
         while (consumerIterator.hasNext())
         {
             QueueConsumer<?> consumer = consumerIterator.next();
-            if(consumer != null && consumer.getPriority() > sub.getPriority())
+            if(consumer.getPriority() > sub.getPriority())
             {
                 if(consumer.isNotifyWorkDesired()
                    && consumer.acquires()
@@ -2959,26 +2958,11 @@
         {
             return _queueConsumerManager == null
                     ? Collections.<C>emptySet()
-                    : (Collection<C>) getQueueConsumersAsList();
+                    : (Collection<C>) Lists.newArrayList(_queueConsumerManager.getAllIterator());
         }
         else return Collections.emptySet();
     }
 
-    private List<QueueConsumer<?>> getQueueConsumersAsList()
-    {
-        List<QueueConsumer<?>> consumers = new ArrayList<>(_queueConsumerManager.getAllSize());
-        final Iterator<QueueConsumer<?>> iter = _queueConsumerManager.getAllIterator();
-        while(iter.hasNext())
-        {
-            final QueueConsumer<?> consumer = iter.next();
-            if(consumer != null)
-            {
-                consumers.add(consumer);
-            }
-        }
-        return consumers;
-    }
-
     @Override
     protected <C extends ConfiguredObject> ListenableFuture<C> addChildAsync(final Class<C> childClass,
                                                       final Map<String, Object> attributes,
@@ -3441,7 +3425,7 @@
             while (consumerIterator.hasNext() && !isDeleted())
             {
                 QueueConsumer<?> sub = consumerIterator.next();
-                if(sub != null && sub.acquires())
+                if(sub.acquires())
                 {
                     getNextAvailableEntry(sub);
                 }
diff --git a/broker-core/src/main/java/org/apache/qpid/server/queue/QueueConsumerManagerImpl.java b/broker-core/src/main/java/org/apache/qpid/server/queue/QueueConsumerManagerImpl.java
index 89415e8..8e69837 100644
--- a/broker-core/src/main/java/org/apache/qpid/server/queue/QueueConsumerManagerImpl.java
+++ b/broker-core/src/main/java/org/apache/qpid/server/queue/QueueConsumerManagerImpl.java
@@ -20,9 +20,11 @@
  */
 package org.apache.qpid.server.queue;
 
+import java.util.Collections;
 import java.util.EnumSet;
 import java.util.Iterator;
 import java.util.List;
+import java.util.NoSuchElementException;
 import java.util.concurrent.CopyOnWriteArrayList;
 
 public class QueueConsumerManagerImpl implements QueueConsumerManager
@@ -263,8 +265,7 @@
         @Override
         public QueueConsumer<?> next()
         {
-            QueueConsumerNode next = _underlying.next();
-            return next == null ? null : next.getQueueConsumer();
+            return _underlying.next().getQueueConsumer();
         }
 
         @Override
@@ -347,6 +348,7 @@
         private PrioritisedQueueConsumerNodeIterator(List<PriorityConsumerListPair> list)
         {
             _outerIterator = list.iterator();
+            _innerIterator = Collections.emptyIterator();
         }
 
         @Override
@@ -354,7 +356,7 @@
         {
             while (true)
             {
-                if (_innerIterator != null && _innerIterator.hasNext())
+                if (_innerIterator.hasNext())
                 {
                     return true;
                 }
@@ -373,15 +375,14 @@
         @Override
         public QueueConsumerNode next()
         {
-            if (hasNext())
+            try
             {
                 return _innerIterator.next();
             }
-            else
+            catch (NoSuchElementException e)
             {
-                // throwing exceptions is expensive, and due to concurrency a caller might get here even though they
-                // had previously checked with hasNext()
-                return null;
+                hasNext();
+                return _innerIterator.next();
             }
         }
 
