diff --git a/systests/protocol-tests-amqp-1-0/src/test/java/org/apache/qpid/tests/protocol/v1_0/extensions/soleconn/CloseExistingPolicy.java b/systests/protocol-tests-amqp-1-0/src/test/java/org/apache/qpid/tests/protocol/v1_0/extensions/soleconn/CloseExistingPolicy.java
index 8e4f676..0427c96 100644
--- a/systests/protocol-tests-amqp-1-0/src/test/java/org/apache/qpid/tests/protocol/v1_0/extensions/soleconn/CloseExistingPolicy.java
+++ b/systests/protocol-tests-amqp-1-0/src/test/java/org/apache/qpid/tests/protocol/v1_0/extensions/soleconn/CloseExistingPolicy.java
@@ -24,30 +24,28 @@
 import static org.apache.qpid.server.protocol.v1_0.type.extensions.soleconn.SoleConnectionConnectionProperties.SOLE_CONNECTION_ENFORCEMENT_POLICY;
 import static org.apache.qpid.server.protocol.v1_0.type.extensions.soleconn.SoleConnectionConnectionProperties.SOLE_CONNECTION_FOR_CONTAINER;
 import static org.apache.qpid.server.protocol.v1_0.type.extensions.soleconn.SoleConnectionEnforcementPolicy.CLOSE_EXISTING;
-import static org.hamcrest.CoreMatchers.hasItem;
-import static org.hamcrest.CoreMatchers.notNullValue;
+import static org.apache.qpid.tests.protocol.v1_0.extensions.soleconn.SoleConnectionAsserts.assertEnforcementPolicyCloseExisting;
+import static org.apache.qpid.tests.protocol.v1_0.extensions.soleconn.SoleConnectionAsserts.assertResourceLocked;
+import static org.apache.qpid.tests.protocol.v1_0.extensions.soleconn.SoleConnectionAsserts.assertSoleConnectionCapability;
+import static org.apache.qpid.tests.protocol.v1_0.extensions.soleconn.SoleConnectionAsserts.assumeDetectionPolicyStrong;
+import static org.apache.qpid.tests.protocol.v1_0.extensions.soleconn.SoleConnectionAsserts.assumeEnforcementPolicyCloseExisting;
+import static org.apache.qpid.tests.protocol.v1_0.extensions.soleconn.SoleConnectionAsserts.assumeSoleConnectionCapability;
 import static org.hamcrest.MatcherAssert.assertThat;
-import static org.hamcrest.Matchers.equalTo;
 import static org.hamcrest.Matchers.in;
-import static org.hamcrest.Matchers.is;
-import static org.junit.Assume.assumeThat;
 
 import java.net.InetSocketAddress;
-import java.util.Arrays;
 import java.util.Collections;
 
 import org.junit.Before;
 import org.junit.Test;
 
-import org.apache.qpid.server.protocol.v1_0.type.Symbol;
 import org.apache.qpid.server.protocol.v1_0.type.UnsignedInteger;
 import org.apache.qpid.server.protocol.v1_0.type.extensions.soleconn.SoleConnectionDetectionPolicy;
-import org.apache.qpid.server.protocol.v1_0.type.transport.AmqpError;
 import org.apache.qpid.server.protocol.v1_0.type.transport.Close;
 import org.apache.qpid.server.protocol.v1_0.type.transport.Open;
-import org.apache.qpid.tests.utils.BrokerAdmin;
 import org.apache.qpid.tests.protocol.v1_0.FrameTransport;
 import org.apache.qpid.tests.protocol.v1_0.Interaction;
+import org.apache.qpid.tests.utils.BrokerAdmin;
 import org.apache.qpid.tests.utils.BrokerAdminUsingTestBase;
 
 public class CloseExistingPolicy extends BrokerAdminUsingTestBase
@@ -75,7 +73,9 @@
                                          .open().consumeResponse()
                                          .getLatestResponse(Open.class);
 
-            assertThat(Arrays.asList(responseOpen.getOfferedCapabilities()), hasItem(SOLE_CONNECTION_FOR_CONTAINER));
+            assumeSoleConnectionCapability(responseOpen);
+            assumeEnforcementPolicyCloseExisting(responseOpen);
+
             if (responseOpen.getProperties().containsKey(SOLE_CONNECTION_DETECTION_POLICY))
             {
                 assertThat(responseOpen.getProperties().get(SOLE_CONNECTION_DETECTION_POLICY),
@@ -98,6 +98,10 @@
                                                                  CLOSE_EXISTING))
                         .open().consumeResponse(Open.class);
 
+            final Open responseOpen = interaction1.getLatestResponse(Open.class);
+            assumeSoleConnectionCapability(responseOpen);
+            assumeEnforcementPolicyCloseExisting(responseOpen);
+
             try (FrameTransport transport2 = new FrameTransport(_brokerAddress).connect())
             {
                 final Interaction interaction2 = transport2.newInteraction();
@@ -109,26 +113,18 @@
                             .open()
                             .sync();
 
-                final Close close1 = interaction1.consumeResponse().getLatestResponse(Close.class);
-                assertThat(close1.getError(), is(notNullValue()));
-                assertThat(close1.getError().getCondition(), is(equalTo(AmqpError.RESOURCE_LOCKED)));
-                assertThat(close1.getError().getInfo(), is(equalTo(Collections.singletonMap(Symbol.valueOf("sole-connection-enforcement"), true))));
+                assertResourceLocked(interaction1.consumeResponse().getLatestResponse(Close.class));
 
                 final Open responseOpen2 = interaction2.consumeResponse().getLatestResponse(Open.class);
-                assertThat(Arrays.asList(responseOpen2.getOfferedCapabilities()), hasItem(SOLE_CONNECTION_FOR_CONTAINER));
-                if (responseOpen2.getProperties().containsKey(SOLE_CONNECTION_DETECTION_POLICY))
-                {
-                    assertThat(responseOpen2.getProperties().get(SOLE_CONNECTION_DETECTION_POLICY),
-                               in(new UnsignedInteger[]{SoleConnectionDetectionPolicy.STRONG.getValue(),
-                                       SoleConnectionDetectionPolicy.WEAK.getValue()}));
-                }
+                assertSoleConnectionCapability(responseOpen2);
+                assertEnforcementPolicyCloseExisting(responseOpen2);
             }
         }
     }
 
 
     @Test
-    public void weakDetection() throws Exception
+    public void strongDetectionWhenConnectionWithoutSoleConnectionCapabilityOpened() throws Exception
     {
         try (FrameTransport transport1 = new FrameTransport(_brokerAddress).connect())
         {
@@ -138,6 +134,10 @@
                         .openContainerId("testContainerId")
                         .open().consumeResponse(Open.class);
 
+            final Open responseOpen = interaction1.getLatestResponse(Open.class);
+            assumeSoleConnectionCapability(responseOpen);
+            assumeDetectionPolicyStrong(responseOpen);
+
             try (FrameTransport transport2 = new FrameTransport(_brokerAddress).connect())
             {
                 final Interaction interaction2 = transport2.newInteraction();
@@ -147,21 +147,13 @@
                             .openProperties(Collections.singletonMap(SOLE_CONNECTION_ENFORCEMENT_POLICY,
                                                                      CLOSE_EXISTING))
                             .open()
-                            .sync();
+                            .consumeResponse(Open.class);
 
-                final Close close1 = interaction1.consumeResponse().getLatestResponse(Close.class);
-                assertThat(close1.getError(), is(notNullValue()));
-                assertThat(close1.getError().getCondition(), is(equalTo(AmqpError.RESOURCE_LOCKED)));
-                assertThat(close1.getError().getInfo(), is(equalTo(Collections.singletonMap(Symbol.valueOf("sole-connection-enforcement"), true))));
-
-                final Open responseOpen2 = interaction2.consumeResponse().getLatestResponse(Open.class);
-                assertThat(Arrays.asList(responseOpen2.getOfferedCapabilities()), hasItem(SOLE_CONNECTION_FOR_CONTAINER));
-                if (responseOpen2.getProperties().containsKey(SOLE_CONNECTION_DETECTION_POLICY))
-                {
-                    assertThat(responseOpen2.getProperties().get(SOLE_CONNECTION_DETECTION_POLICY),
-                               in(new UnsignedInteger[]{SoleConnectionDetectionPolicy.STRONG.getValue(),
-                                       SoleConnectionDetectionPolicy.WEAK.getValue()}));
-                }
+                final Open responseOpen2 = interaction2.getLatestResponse(Open.class);
+                assumeSoleConnectionCapability(responseOpen2);
+                assumeEnforcementPolicyCloseExisting(responseOpen2);
+                assumeDetectionPolicyStrong(responseOpen2);
+                assertResourceLocked(interaction1.consumeResponse().getLatestResponse(Close.class));
             }
         }
     }
@@ -180,12 +172,10 @@
                                                     CLOSE_EXISTING))
                                             .open().consumeResponse()
                                             .getLatestResponse(Open.class);
-            assertThat(Arrays.asList(responseOpen.getOfferedCapabilities()), hasItem(SOLE_CONNECTION_FOR_CONTAINER));
-            if (responseOpen.getProperties().containsKey(SOLE_CONNECTION_DETECTION_POLICY))
-            {
-                assumeThat(responseOpen.getProperties().get(SOLE_CONNECTION_DETECTION_POLICY),
-                           is(equalTo(SoleConnectionDetectionPolicy.STRONG.getValue())));
-            }
+
+            assumeSoleConnectionCapability(responseOpen);
+            assumeEnforcementPolicyCloseExisting(responseOpen);
+            assumeDetectionPolicyStrong(responseOpen);
 
             try (FrameTransport transport2 = new FrameTransport(_brokerAddress).connect())
             {
@@ -195,19 +185,8 @@
                             .openContainerId("testContainerId")
                             .open().sync();
 
-                final Close close1 = interaction1.consumeResponse().getLatestResponse(Close.class);
-                assertThat(close1.getError(), is(notNullValue()));
-                assertThat(close1.getError().getCondition(), is(equalTo(AmqpError.RESOURCE_LOCKED)));
-                assertThat(close1.getError().getInfo(), is(equalTo(Collections.singletonMap(Symbol.valueOf("sole-connection-enforcement"), true))));
-
-                final Open responseOpen2 = interaction2.consumeResponse().getLatestResponse(Open.class);
-                assertThat(Arrays.asList(responseOpen2.getOfferedCapabilities()), hasItem(SOLE_CONNECTION_FOR_CONTAINER));
-                if (responseOpen2.getProperties().containsKey(SOLE_CONNECTION_DETECTION_POLICY))
-                {
-                    assertThat(responseOpen2.getProperties().get(SOLE_CONNECTION_DETECTION_POLICY),
-                               in(new UnsignedInteger[]{SoleConnectionDetectionPolicy.STRONG.getValue(),
-                                       SoleConnectionDetectionPolicy.WEAK.getValue()}));
-                }
+                assertResourceLocked(interaction1.consumeResponse().getLatestResponse(Close.class));
+                assertSoleConnectionCapability(interaction2.consumeResponse().getLatestResponse(Open.class));
             }
         }
     }
diff --git a/systests/protocol-tests-amqp-1-0/src/test/java/org/apache/qpid/tests/protocol/v1_0/extensions/soleconn/MixedPolicy.java b/systests/protocol-tests-amqp-1-0/src/test/java/org/apache/qpid/tests/protocol/v1_0/extensions/soleconn/MixedPolicy.java
index 0c9ce9f..5e32c86 100644
--- a/systests/protocol-tests-amqp-1-0/src/test/java/org/apache/qpid/tests/protocol/v1_0/extensions/soleconn/MixedPolicy.java
+++ b/systests/protocol-tests-amqp-1-0/src/test/java/org/apache/qpid/tests/protocol/v1_0/extensions/soleconn/MixedPolicy.java
@@ -24,6 +24,9 @@
 import static org.apache.qpid.server.protocol.v1_0.type.extensions.soleconn.SoleConnectionConnectionProperties.SOLE_CONNECTION_FOR_CONTAINER;
 import static org.apache.qpid.server.protocol.v1_0.type.extensions.soleconn.SoleConnectionEnforcementPolicy.CLOSE_EXISTING;
 import static org.apache.qpid.server.protocol.v1_0.type.extensions.soleconn.SoleConnectionEnforcementPolicy.REFUSE_CONNECTION;
+import static org.apache.qpid.tests.protocol.v1_0.extensions.soleconn.SoleConnectionAsserts.assumeEnforcementPolicyCloseExisting;
+import static org.apache.qpid.tests.protocol.v1_0.extensions.soleconn.SoleConnectionAsserts.assumeEnforcementPolicyRefuse;
+import static org.apache.qpid.tests.protocol.v1_0.extensions.soleconn.SoleConnectionAsserts.assumeSoleConnectionCapability;
 
 import java.net.InetSocketAddress;
 import java.util.Collections;
@@ -33,9 +36,9 @@
 
 import org.apache.qpid.server.protocol.v1_0.type.transport.Close;
 import org.apache.qpid.server.protocol.v1_0.type.transport.Open;
-import org.apache.qpid.tests.utils.BrokerAdmin;
 import org.apache.qpid.tests.protocol.v1_0.FrameTransport;
 import org.apache.qpid.tests.protocol.v1_0.Interaction;
+import org.apache.qpid.tests.utils.BrokerAdmin;
 import org.apache.qpid.tests.utils.BrokerAdminUsingTestBase;
 
 public class MixedPolicy extends BrokerAdminUsingTestBase
@@ -61,6 +64,10 @@
                                                                  CLOSE_EXISTING))
                         .open().consumeResponse(Open.class);
 
+            Open responseOpen = interaction1.getLatestResponse(Open.class);
+            assumeSoleConnectionCapability(responseOpen);
+            assumeEnforcementPolicyCloseExisting(responseOpen);
+
             try (FrameTransport transport2 = new FrameTransport(_brokerAddress).connect())
             {
                 final Interaction interaction2 = transport2.newInteraction();
@@ -104,6 +111,10 @@
                                                                  REFUSE_CONNECTION))
                         .open().consumeResponse(Open.class);
 
+            final Open responseOpen = interaction1.getLatestResponse(Open.class);
+            assumeSoleConnectionCapability(responseOpen);
+            assumeEnforcementPolicyRefuse(responseOpen);
+
             try (FrameTransport transport2 = new FrameTransport(_brokerAddress).connect())
             {
                 final Interaction interaction2 = transport2.newInteraction();
diff --git a/systests/protocol-tests-amqp-1-0/src/test/java/org/apache/qpid/tests/protocol/v1_0/extensions/soleconn/RefuseConnectionPolicy.java b/systests/protocol-tests-amqp-1-0/src/test/java/org/apache/qpid/tests/protocol/v1_0/extensions/soleconn/RefuseConnectionPolicy.java
index ca7d4a7..08ebda1 100644
--- a/systests/protocol-tests-amqp-1-0/src/test/java/org/apache/qpid/tests/protocol/v1_0/extensions/soleconn/RefuseConnectionPolicy.java
+++ b/systests/protocol-tests-amqp-1-0/src/test/java/org/apache/qpid/tests/protocol/v1_0/extensions/soleconn/RefuseConnectionPolicy.java
@@ -24,31 +24,28 @@
 import static org.apache.qpid.server.protocol.v1_0.type.extensions.soleconn.SoleConnectionConnectionProperties.SOLE_CONNECTION_ENFORCEMENT_POLICY;
 import static org.apache.qpid.server.protocol.v1_0.type.extensions.soleconn.SoleConnectionConnectionProperties.SOLE_CONNECTION_FOR_CONTAINER;
 import static org.apache.qpid.server.protocol.v1_0.type.extensions.soleconn.SoleConnectionEnforcementPolicy.REFUSE_CONNECTION;
-import static org.hamcrest.CoreMatchers.hasItem;
-import static org.hamcrest.CoreMatchers.notNullValue;
+import static org.apache.qpid.tests.protocol.v1_0.extensions.soleconn.SoleConnectionAsserts.assertConnectionEstablishmentFailed;
+import static org.apache.qpid.tests.protocol.v1_0.extensions.soleconn.SoleConnectionAsserts.assertInvalidContainerId;
+import static org.apache.qpid.tests.protocol.v1_0.extensions.soleconn.SoleConnectionAsserts.assumeConnectionEstablishmentFailed;
+import static org.apache.qpid.tests.protocol.v1_0.extensions.soleconn.SoleConnectionAsserts.assumeDetectionPolicyStrong;
+import static org.apache.qpid.tests.protocol.v1_0.extensions.soleconn.SoleConnectionAsserts.assumeEnforcementPolicyRefuse;
+import static org.apache.qpid.tests.protocol.v1_0.extensions.soleconn.SoleConnectionAsserts.assumeSoleConnectionCapability;
 import static org.hamcrest.MatcherAssert.assertThat;
-import static org.hamcrest.Matchers.equalTo;
-import static org.hamcrest.Matchers.hasKey;
 import static org.hamcrest.Matchers.in;
-import static org.hamcrest.Matchers.is;
-import static org.junit.Assume.assumeThat;
 
 import java.net.InetSocketAddress;
-import java.util.Arrays;
 import java.util.Collections;
 
 import org.junit.Before;
 import org.junit.Test;
 
-import org.apache.qpid.server.protocol.v1_0.type.Symbol;
 import org.apache.qpid.server.protocol.v1_0.type.UnsignedInteger;
 import org.apache.qpid.server.protocol.v1_0.type.extensions.soleconn.SoleConnectionDetectionPolicy;
-import org.apache.qpid.server.protocol.v1_0.type.transport.AmqpError;
 import org.apache.qpid.server.protocol.v1_0.type.transport.Close;
 import org.apache.qpid.server.protocol.v1_0.type.transport.Open;
-import org.apache.qpid.tests.utils.BrokerAdmin;
 import org.apache.qpid.tests.protocol.v1_0.FrameTransport;
 import org.apache.qpid.tests.protocol.v1_0.Interaction;
+import org.apache.qpid.tests.utils.BrokerAdmin;
 import org.apache.qpid.tests.utils.BrokerAdminUsingTestBase;
 
 public class RefuseConnectionPolicy extends BrokerAdminUsingTestBase
@@ -76,7 +73,9 @@
                                                  .open().consumeResponse()
                                                  .getLatestResponse(Open.class);
 
-            assertThat(Arrays.asList(responseOpen.getOfferedCapabilities()), hasItem(SOLE_CONNECTION_FOR_CONTAINER));
+            assumeSoleConnectionCapability(responseOpen);
+            assumeEnforcementPolicyRefuse(responseOpen);
+
             if (responseOpen.getProperties().containsKey(SOLE_CONNECTION_DETECTION_POLICY))
             {
                 assertThat(responseOpen.getProperties().get(SOLE_CONNECTION_DETECTION_POLICY),
@@ -99,6 +98,10 @@
                                                                  REFUSE_CONNECTION))
                         .open().consumeResponse(Open.class);
 
+            final Open responseOpen = interaction1.getLatestResponse(Open.class);
+            assumeSoleConnectionCapability(responseOpen);
+            assumeEnforcementPolicyRefuse(responseOpen);
+
             try (FrameTransport transport2 = new FrameTransport(_brokerAddress).connect())
             {
                 final Interaction interaction2 = transport2.newInteraction();
@@ -110,26 +113,16 @@
                                                                REFUSE_CONNECTION))
                                                        .open().consumeResponse()
                                                        .getLatestResponse(Open.class);
-                assertThat(Arrays.asList(responseOpen2.getOfferedCapabilities()),
-                           hasItem(SOLE_CONNECTION_FOR_CONTAINER));
-                assertThat(responseOpen2.getProperties(),
-                           hasKey(Symbol.valueOf("amqp:connection-establishment-failed")));
-                assertThat(responseOpen2.getProperties().get(Symbol.valueOf("amqp:connection-establishment-failed")),
-                           is(true));
 
-                final Close close2 = interaction2.consumeResponse().getLatestResponse(Close.class);
-                assertThat(close2.getError(), is(notNullValue()));
-                assertThat(close2.getError().getCondition(), is(equalTo(AmqpError.INVALID_FIELD)));
-                assertThat(close2.getError().getInfo(),
-                           is(equalTo(Collections.singletonMap(Symbol.valueOf("invalid-field"),
-                                                               Symbol.valueOf("container-id")))));
+                assertConnectionEstablishmentFailed(responseOpen2);
+                assertInvalidContainerId(interaction2.consumeResponse().getLatestResponse(Close.class));
             }
         }
     }
 
 
     @Test
-    public void weakDetection() throws Exception
+    public void strongDetectionWhenConnectionWithoutSoleConnectionCapabilityOpened() throws Exception
     {
         try (FrameTransport transport1 = new FrameTransport(_brokerAddress).connect())
         {
@@ -139,6 +132,10 @@
                         .openContainerId("testContainerId")
                         .open().consumeResponse(Open.class);
 
+            final Open responseOpen = interaction1.getLatestResponse(Open.class);
+            assumeSoleConnectionCapability(responseOpen);
+            assumeDetectionPolicyStrong(responseOpen);
+
             try (FrameTransport transport2 = new FrameTransport(_brokerAddress).connect())
             {
                 final Interaction interaction2 = transport2.newInteraction();
@@ -150,19 +147,9 @@
                                                                REFUSE_CONNECTION))
                                                        .open().consumeResponse()
                                                        .getLatestResponse(Open.class);
-                assertThat(Arrays.asList(responseOpen2.getOfferedCapabilities()),
-                           hasItem(SOLE_CONNECTION_FOR_CONTAINER));
-                assertThat(responseOpen2.getProperties(),
-                           hasKey(Symbol.valueOf("amqp:connection-establishment-failed")));
-                assertThat(responseOpen2.getProperties().get(Symbol.valueOf("amqp:connection-establishment-failed")),
-                           is(true));
 
-                final Close close2 = interaction2.consumeResponse().getLatestResponse(Close.class);
-                assertThat(close2.getError(), is(notNullValue()));
-                assertThat(close2.getError().getCondition(), is(equalTo(AmqpError.INVALID_FIELD)));
-                assertThat(close2.getError().getInfo(),
-                           is(equalTo(Collections.singletonMap(Symbol.valueOf("invalid-field"),
-                                                               Symbol.valueOf("container-id")))));
+                assumeConnectionEstablishmentFailed(responseOpen2);
+                assertInvalidContainerId(interaction2.consumeResponse().getLatestResponse(Close.class));
             }
         }
     }
@@ -178,15 +165,13 @@
                                                   .openDesiredCapabilities(SOLE_CONNECTION_FOR_CONTAINER)
                                                   .openProperties(Collections.singletonMap(
                                                           SOLE_CONNECTION_ENFORCEMENT_POLICY,
-                                                          REFUSE_CONNECTION))
+                                                          REFUSE_CONNECTION.getValue()))
                                                   .open().consumeResponse()
                                                   .getLatestResponse(Open.class);
-            assertThat(Arrays.asList(responseOpen.getOfferedCapabilities()), hasItem(SOLE_CONNECTION_FOR_CONTAINER));
-            if (responseOpen.getProperties().containsKey(SOLE_CONNECTION_DETECTION_POLICY))
-            {
-                assumeThat(responseOpen.getProperties().get(SOLE_CONNECTION_DETECTION_POLICY),
-                           is(equalTo(SoleConnectionDetectionPolicy.STRONG.getValue())));
-            }
+
+            assumeSoleConnectionCapability(responseOpen);
+            assumeEnforcementPolicyRefuse(responseOpen);
+            assumeDetectionPolicyStrong(responseOpen);
 
             try (FrameTransport transport2 = new FrameTransport(_brokerAddress).connect())
             {
@@ -197,19 +182,8 @@
                                                        .open().consumeResponse()
                                                        .getLatestResponse(Open.class);
 
-                assertThat(Arrays.asList(responseOpen2.getOfferedCapabilities()),
-                           hasItem(SOLE_CONNECTION_FOR_CONTAINER));
-                assertThat(responseOpen2.getProperties(),
-                           hasKey(Symbol.valueOf("amqp:connection-establishment-failed")));
-                assertThat(responseOpen2.getProperties().get(Symbol.valueOf("amqp:connection-establishment-failed")),
-                           is(true));
-
-                final Close close2 = interaction2.consumeResponse().getLatestResponse(Close.class);
-                assertThat(close2.getError(), is(notNullValue()));
-                assertThat(close2.getError().getCondition(), is(equalTo(AmqpError.INVALID_FIELD)));
-                assertThat(close2.getError().getInfo(),
-                           is(equalTo(Collections.singletonMap(Symbol.valueOf("invalid-field"),
-                                                               Symbol.valueOf("container-id")))));
+                assertConnectionEstablishmentFailed(responseOpen2);
+                assertInvalidContainerId(interaction2.consumeResponse().getLatestResponse(Close.class));
             }
         }
     }
@@ -226,6 +200,10 @@
                         .openDesiredCapabilities(SOLE_CONNECTION_FOR_CONTAINER)
                         .open().consumeResponse(Open.class);
 
+            final Open responseOpen = interaction1.getLatestResponse(Open.class);
+            assumeSoleConnectionCapability(responseOpen);
+            assumeEnforcementPolicyRefuse(responseOpen);
+
             try (FrameTransport transport2 = new FrameTransport(_brokerAddress).connect())
             {
                 final Interaction interaction2 = transport2.newInteraction();
@@ -236,19 +214,8 @@
                                                        .open().consumeResponse()
                                                        .getLatestResponse(Open.class);
 
-                assertThat(Arrays.asList(responseOpen2.getOfferedCapabilities()),
-                           hasItem(SOLE_CONNECTION_FOR_CONTAINER));
-                assertThat(responseOpen2.getProperties(),
-                           hasKey(Symbol.valueOf("amqp:connection-establishment-failed")));
-                assertThat(responseOpen2.getProperties().get(Symbol.valueOf("amqp:connection-establishment-failed")),
-                           is(true));
-
-                final Close close2 = interaction2.consumeResponse().getLatestResponse(Close.class);
-                assertThat(close2.getError(), is(notNullValue()));
-                assertThat(close2.getError().getCondition(), is(equalTo(AmqpError.INVALID_FIELD)));
-                assertThat(close2.getError().getInfo(),
-                           is(equalTo(Collections.singletonMap(Symbol.valueOf("invalid-field"),
-                                                               Symbol.valueOf("container-id")))));
+                assertConnectionEstablishmentFailed(responseOpen2);
+                assertInvalidContainerId(interaction2.consumeResponse().getLatestResponse(Close.class));
             }
         }
     }
diff --git a/systests/protocol-tests-amqp-1-0/src/test/java/org/apache/qpid/tests/protocol/v1_0/extensions/soleconn/SoleConnectionAsserts.java b/systests/protocol-tests-amqp-1-0/src/test/java/org/apache/qpid/tests/protocol/v1_0/extensions/soleconn/SoleConnectionAsserts.java
new file mode 100644
index 0000000..298ab00
--- /dev/null
+++ b/systests/protocol-tests-amqp-1-0/src/test/java/org/apache/qpid/tests/protocol/v1_0/extensions/soleconn/SoleConnectionAsserts.java
@@ -0,0 +1,129 @@
+/*
+ * 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.tests.protocol.v1_0.extensions.soleconn;
+
+import static org.apache.qpid.server.protocol.v1_0.type.extensions.soleconn.SoleConnectionConnectionProperties.SOLE_CONNECTION_DETECTION_POLICY;
+import static org.apache.qpid.server.protocol.v1_0.type.extensions.soleconn.SoleConnectionConnectionProperties.SOLE_CONNECTION_ENFORCEMENT_POLICY;
+import static org.apache.qpid.server.protocol.v1_0.type.extensions.soleconn.SoleConnectionConnectionProperties.SOLE_CONNECTION_FOR_CONTAINER;
+import static org.apache.qpid.server.protocol.v1_0.type.extensions.soleconn.SoleConnectionEnforcementPolicy.CLOSE_EXISTING;
+import static org.apache.qpid.server.protocol.v1_0.type.extensions.soleconn.SoleConnectionEnforcementPolicy.REFUSE_CONNECTION;
+import static org.hamcrest.CoreMatchers.anyOf;
+import static org.hamcrest.CoreMatchers.not;
+import static org.hamcrest.CoreMatchers.notNullValue;
+import static org.hamcrest.MatcherAssert.assertThat;
+import static org.hamcrest.Matchers.equalTo;
+import static org.hamcrest.Matchers.hasItemInArray;
+import static org.hamcrest.Matchers.is;
+import static org.hamcrest.collection.IsMapContaining.hasEntry;
+import static org.hamcrest.collection.IsMapContaining.hasKey;
+import static org.junit.Assume.assumeThat;
+
+import java.util.Collections;
+
+import org.hamcrest.Matchers;
+
+import org.apache.qpid.server.protocol.v1_0.type.Symbol;
+import org.apache.qpid.server.protocol.v1_0.type.extensions.soleconn.SoleConnectionDetectionPolicy;
+import org.apache.qpid.server.protocol.v1_0.type.transport.AmqpError;
+import org.apache.qpid.server.protocol.v1_0.type.transport.Close;
+import org.apache.qpid.server.protocol.v1_0.type.transport.Open;
+
+class SoleConnectionAsserts
+{
+    private static final Symbol CONNECTION_ESTABLISHMENT_FAILED = Symbol.valueOf("amqp:connection-establishment-failed");
+    private static final Symbol SOLE_CONNECTION_ENFORCEMENT = Symbol.valueOf("sole-connection-enforcement");
+    private static final Symbol INVALID_FIELD = Symbol.valueOf("invalid-field");
+    private static final Symbol CONTAINER_ID = Symbol.valueOf("container-id");
+
+    private SoleConnectionAsserts()
+    {
+    }
+
+    static void assumeSoleConnectionCapability(Open open)
+    {
+        assumeThat(open.getOfferedCapabilities(), is(notNullValue()));
+        assumeThat(open.getOfferedCapabilities(), hasItemInArray(SOLE_CONNECTION_FOR_CONTAINER));
+    }
+
+    static void assertSoleConnectionCapability(Open open)
+    {
+        assertThat(open.getOfferedCapabilities(), is(notNullValue()));
+        assertThat(open.getOfferedCapabilities(), hasItemInArray(SOLE_CONNECTION_FOR_CONTAINER));
+    }
+
+    static void assumeEnforcementPolicyCloseExisting(Open open)
+    {
+        assumeThat(open.getProperties(), is(notNullValue()));
+        assumeThat(open.getProperties(), hasEntry(SOLE_CONNECTION_ENFORCEMENT_POLICY, CLOSE_EXISTING.getValue()));
+    }
+
+    static void assertEnforcementPolicyCloseExisting(Open open)
+    {
+        assertThat(open.getProperties(), is(notNullValue()));
+        assertThat(open.getProperties(), hasEntry(SOLE_CONNECTION_ENFORCEMENT_POLICY, CLOSE_EXISTING.getValue()));
+    }
+
+    static void assumeEnforcementPolicyRefuse(Open open)
+    {
+        assumeThat(open.getProperties(), is(notNullValue()));
+        assumeThat(open.getProperties(),
+                   anyOf(hasEntry(SOLE_CONNECTION_ENFORCEMENT_POLICY, REFUSE_CONNECTION.getValue()),
+                         is(not(Matchers.hasKey(SOLE_CONNECTION_ENFORCEMENT_POLICY)))));
+    }
+
+    static void assumeDetectionPolicyStrong(Open open)
+    {
+        assumeThat(open.getProperties(), is(notNullValue()));
+        assumeThat(open.getProperties(),
+                   anyOf(hasEntry(SOLE_CONNECTION_DETECTION_POLICY, SoleConnectionDetectionPolicy.STRONG.getValue()),
+                         is(not(hasKey(SOLE_CONNECTION_DETECTION_POLICY)))));
+    }
+
+    static void assertConnectionEstablishmentFailed(final Open open)
+    {
+        assertThat(open.getProperties(), is(notNullValue()));
+        assertThat(open.getProperties(), Matchers.hasKey(CONNECTION_ESTABLISHMENT_FAILED));
+        assertThat(open.getProperties(), hasEntry(CONNECTION_ESTABLISHMENT_FAILED, true));
+    }
+
+    static void assumeConnectionEstablishmentFailed(final Open open)
+    {
+        assumeThat(open.getProperties(), is(notNullValue()));
+        assumeThat(open.getProperties(), Matchers.hasKey(CONNECTION_ESTABLISHMENT_FAILED));
+        assertThat(open.getProperties(), hasEntry(CONNECTION_ESTABLISHMENT_FAILED, true));
+    }
+
+
+    static void assertResourceLocked(final Close close)
+    {
+        assertThat(close.getError(), is(notNullValue()));
+        assertThat(close.getError().getCondition(), is(equalTo(AmqpError.RESOURCE_LOCKED)));
+        assertThat(close.getError().getInfo(), is(equalTo(Collections.singletonMap(SOLE_CONNECTION_ENFORCEMENT, true))));
+    }
+
+
+    static void assertInvalidContainerId(final Close close)
+    {
+        assertThat(close.getError(), is(notNullValue()));
+        assertThat(close.getError().getCondition(), is(equalTo(AmqpError.INVALID_FIELD)));
+        assertThat(close.getError().getInfo(), is(equalTo(Collections.singletonMap(INVALID_FIELD, CONTAINER_ID))));
+    }
+}
