diff --git a/client/src/main/java/org/apache/qpid/client/AMQSession.java b/client/src/main/java/org/apache/qpid/client/AMQSession.java
index 63cc7a8..cba764e 100644
--- a/client/src/main/java/org/apache/qpid/client/AMQSession.java
+++ b/client/src/main/java/org/apache/qpid/client/AMQSession.java
@@ -676,7 +676,30 @@
 
     boolean isResolved(final AMQDestination dest)
     {
-        return _resolvedDestinations.contains(dest);
+        if (!_resolvedDestinations.contains(dest))
+        {
+            return false;
+        }
+
+        if (dest.getAddressType() == AMQDestination.QUEUE_TYPE)
+        {
+            // verify legacy fields are set
+            return dest.getQueueName() != null
+                   && dest.getQueueName().equals(dest.getAddressName())
+                   && dest.getExchangeName() != null
+                   && dest.getExchangeClass() != null
+                   && dest.getRoutingKey() != null;
+        }
+        else if (dest.getAddressType() == AMQDestination.TOPIC_TYPE)
+        {
+            // verify legacy fields are set
+            return dest.getExchangeName() != null
+                   && dest.getExchangeName().equals(dest.getAddressName())
+                   && dest.getExchangeClass() != null
+                   && (dest.getSubject() == null
+                        || (dest.getSubject() != null && dest.getSubject().equals(dest.getRoutingKey())));
+        }
+        return false;
     }
 
     public abstract int resolveAddressType(AMQDestination dest) throws QpidException;
diff --git a/systests/src/test/java/org/apache/qpid/systest/destination/AddressBasedDestinationTest.java b/systests/src/test/java/org/apache/qpid/systest/destination/AddressBasedDestinationTest.java
index cced94d..395b410 100644
--- a/systests/src/test/java/org/apache/qpid/systest/destination/AddressBasedDestinationTest.java
+++ b/systests/src/test/java/org/apache/qpid/systest/destination/AddressBasedDestinationTest.java
@@ -373,6 +373,54 @@
         }
     }
 
+    @Test
+    public void ensureQueueDestinationAlwaysResolved() throws Exception
+    {
+        String address = String.format("ADDR:%s; {create: always, node: {type: queue}}", getTestName());
+
+        Session session = _connection.createSession(true, Session.SESSION_TRANSACTED);
+
+        MessageProducer producer = session.createProducer(null);
+        producer.send(session.createQueue(address), session.createTextMessage("A"));
+        producer.send(session.createQueue(address), session.createTextMessage("B"));
+        session.commit();
+
+        MessageConsumer consumer = session.createConsumer(session.createQueue(address));
+        Message messageA = consumer.receive(getReceiveTimeout());
+        assertNotNull("Message A is not received", messageA);
+        assertTrue("Unexpected type of message A", messageA instanceof TextMessage);
+        assertEquals("Unexpected content of message A", "A", ((TextMessage) messageA).getText());
+
+        Message messageB = consumer.receive(getReceiveTimeout());
+        assertNotNull("Message B is not received", messageB);
+        assertTrue("Unexpected type of message B", messageB instanceof TextMessage);
+        assertEquals("Unexpected content of message B", "B", ((TextMessage) messageB).getText());
+    }
+
+
+    @Test
+    public void ensureTopicDestinationAlwaysResolved() throws Exception
+    {
+        String address = String.format("ADDR:amq.topic/%s; {node: {type: topic}}", getTestName());
+        Session session = _connection.createSession(true, Session.SESSION_TRANSACTED);
+        MessageConsumer consumer = session.createConsumer(session.createTopic(address));
+
+        MessageProducer producer = session.createProducer(null);
+        producer.send(session.createTopic(address), session.createTextMessage("A"));
+        producer.send(session.createTopic(address), session.createTextMessage("B"));
+        session.commit();
+
+        Message messageA = consumer.receive(getReceiveTimeout());
+        assertNotNull("Message A is not received", messageA);
+        assertTrue("Unexpected type of message A", messageA instanceof TextMessage);
+        assertEquals("Unexpected content of message A", "A", ((TextMessage) messageA).getText());
+
+        Message messageB = consumer.receive(getReceiveTimeout());
+        assertNotNull("Message B is not received", messageB);
+        assertTrue("Unexpected type of message B", messageB instanceof TextMessage);
+        assertEquals("Unexpected content of message B", "B", ((TextMessage) messageB).getText());
+    }
+
     private void createExchangeImpl(final boolean withExchangeArgs,
                                     final boolean useNonsenseArguments,
                                     final boolean useNonsenseExchangeType) throws Exception
