diff --git a/systests/src/main/java/org/apache/qpid/test/utils/JmsProvider.java b/systests/src/main/java/org/apache/qpid/test/utils/JmsProvider.java
index a4dbc49..661905d 100644
--- a/systests/src/main/java/org/apache/qpid/test/utils/JmsProvider.java
+++ b/systests/src/main/java/org/apache/qpid/test/utils/JmsProvider.java
@@ -36,8 +36,6 @@
 public interface JmsProvider
 {
 
-    InitialContext getInitialContext() throws NamingException;
-
     ConnectionFactory getConnectionFactory() throws NamingException;
 
     ConnectionFactory getConnectionFactory(Map<String, String> options) throws NamingException;
diff --git a/systests/src/main/java/org/apache/qpid/test/utils/QpidBrokerTestCase.java b/systests/src/main/java/org/apache/qpid/test/utils/QpidBrokerTestCase.java
index e7abdba..e237b45 100755
--- a/systests/src/main/java/org/apache/qpid/test/utils/QpidBrokerTestCase.java
+++ b/systests/src/main/java/org/apache/qpid/test/utils/QpidBrokerTestCase.java
@@ -217,11 +217,6 @@
         }
     }
 
-    public InitialContext getInitialContext() throws NamingException
-    {
-        return _jmsProvider.getInitialContext();
-    }
-
     /**
      * Get the default connection factory for the currently used broker
      * Default factory is "local"
diff --git a/systests/src/main/java/org/apache/qpid/test/utils/QpidJmsClient0xProvider.java b/systests/src/main/java/org/apache/qpid/test/utils/QpidJmsClient0xProvider.java
index f9e865c..af4bbe6 100644
--- a/systests/src/main/java/org/apache/qpid/test/utils/QpidJmsClient0xProvider.java
+++ b/systests/src/main/java/org/apache/qpid/test/utils/QpidJmsClient0xProvider.java
@@ -67,12 +67,6 @@
     }
 
     @Override
-    public InitialContext getInitialContext() throws NamingException
-    {
-        return new InitialContext(_initialContextEnvironment);
-    }
-
-    @Override
     public ConnectionFactory getConnectionFactory() throws NamingException
     {
         if (Boolean.getBoolean(QpidBrokerTestCase.PROFILE_USE_SSL))
@@ -113,8 +107,7 @@
             throws NamingException
     {
 
-
-        return (ConnectionFactory) getInitialContext().lookup(factoryName);
+        return (ConnectionFactory) new InitialContext(_initialContextEnvironment).lookup(factoryName);
     }
 
     @Override
diff --git a/systests/src/main/java/org/apache/qpid/test/utils/QpidJmsClientProvider.java b/systests/src/main/java/org/apache/qpid/test/utils/QpidJmsClientProvider.java
index b612739..f336e40 100644
--- a/systests/src/main/java/org/apache/qpid/test/utils/QpidJmsClientProvider.java
+++ b/systests/src/main/java/org/apache/qpid/test/utils/QpidJmsClientProvider.java
@@ -56,12 +56,6 @@
     }
 
     @Override
-    public InitialContext getInitialContext() throws NamingException
-    {
-        return new InitialContext(_initialContextEnvironment);
-    }
-
-    @Override
     public ConnectionFactory getConnectionFactory() throws NamingException
     {
         return getConnectionFactory(Collections.<String, String>emptyMap());
@@ -170,7 +164,7 @@
             appendOptions(options, stem);
             _initialContextEnvironment.put("connectionfactory.default.ssl", stem.toString());
         }
-        return (ConnectionFactory) getInitialContext().lookup(factoryName);
+        return (ConnectionFactory) new InitialContext(_initialContextEnvironment).lookup(factoryName);
     }
 
     @Override
diff --git a/systests/src/test/java/org/apache/qpid/client/failover/FailoverBehaviourTest.java b/systests/src/test/java/org/apache/qpid/client/failover/FailoverBehaviourTest.java
index d3dac04..5fa7b2d 100644
--- a/systests/src/test/java/org/apache/qpid/client/failover/FailoverBehaviourTest.java
+++ b/systests/src/test/java/org/apache/qpid/client/failover/FailoverBehaviourTest.java
@@ -114,7 +114,7 @@
     private JMSException _exceptionListenerException;
 
     @Override
-    protected void setUp() throws Exception
+    public void setUp() throws Exception
     {
         super.setUp();
 
diff --git a/systests/src/test/java/org/apache/qpid/test/client/failover/FailoverTest.java b/systests/src/test/java/org/apache/qpid/test/client/failover/FailoverTest.java
index fe93d83..32f62b6 100644
--- a/systests/src/test/java/org/apache/qpid/test/client/failover/FailoverTest.java
+++ b/systests/src/test/java/org/apache/qpid/test/client/failover/FailoverTest.java
@@ -60,7 +60,7 @@
     private Random rand;
 
     @Override
-    protected void setUp() throws Exception
+    public void setUp() throws Exception
     {
         super.setUp();
 
diff --git a/systests/src/test/java/org/apache/qpid/test/unit/xa/FaultTest.java b/systests/src/test/java/org/apache/qpid/test/unit/xa/FaultTest.java
index 3761803..117ba23 100644
--- a/systests/src/test/java/org/apache/qpid/test/unit/xa/FaultTest.java
+++ b/systests/src/test/java/org/apache/qpid/test/unit/xa/FaultTest.java
@@ -32,7 +32,6 @@
 import javax.transaction.xa.XAResource;
 import javax.transaction.xa.Xid;
 
-import junit.framework.TestSuite;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -66,45 +65,30 @@
      */
     private static QueueSession _nonXASession = null;
 
-    /**
-     * the queue name
-     */
-    private static final String QUEUENAME = "xaQueue";
 
     /** ----------------------------------------------------------------------------------- **/
     /**
      * ----------------------------- JUnit support  ----------------------------------------- *
      */
 
-    /**
-     * Gets the test suite tests
-     *
-     * @return the test suite tests
-     */
-    public static TestSuite getSuite()
-    {
-        return new TestSuite(QueueTest.class);
-    }
-
-    /**
-     * Run the test suite.
-     *
-     * @param args Any command line arguments specified to this class.
-     */
-    public static void main(String args[])
-    {
-        junit.textui.TestRunner.run(getSuite());
-    }
-
     @Override
     public void tearDown() throws Exception
     {
-        if (!isBroker08())
+        try
         {
-            _xaqueueConnection.close();
-            _queueConnection.close();
+            if (_xaqueueConnection != null)
+            {
+                _xaqueueConnection.close();
+            }
+            if (_queueConnection != null)
+            {
+                _queueConnection.close();
+            }
         }
-        super.tearDown();
+        finally
+        {
+            super.tearDown();
+        }
     }
 
     /**
@@ -112,13 +96,13 @@
      */
     public void init() throws Exception
     {
-        if (!isBroker08())
+        if (isBroker010())
         {
-            _queue = (Queue) getInitialContext().lookup(QUEUENAME);
             _queueFactory = (XAQueueConnectionFactory) getConnectionFactory();
-            _xaqueueConnection = _queueFactory.createXAQueueConnection("guest", "guest");
+            _xaqueueConnection = _queueFactory.createXAQueueConnection(GUEST_USERNAME, GUEST_PASSWORD);
             XAQueueSession session = _xaqueueConnection.createXAQueueSession();
-            _queueConnection = _queueFactory.createQueueConnection("guest","guest");
+            _queue = session.createQueue(getTestQueueName());
+            _queueConnection = _queueFactory.createQueueConnection(GUEST_USERNAME, GUEST_PASSWORD);
             _nonXASession = _queueConnection.createQueueSession(true, Session.AUTO_ACKNOWLEDGE);
             init(session, _queue);
         }
diff --git a/systests/src/test/java/org/apache/qpid/test/unit/xa/QueueTest.java b/systests/src/test/java/org/apache/qpid/test/unit/xa/QueueTest.java
index 307cb39..941f973 100644
--- a/systests/src/test/java/org/apache/qpid/test/unit/xa/QueueTest.java
+++ b/systests/src/test/java/org/apache/qpid/test/unit/xa/QueueTest.java
@@ -33,7 +33,6 @@
 import javax.transaction.xa.XAResource;
 import javax.transaction.xa.Xid;
 
-import junit.framework.TestSuite;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -53,12 +52,12 @@
     /**
      * standard xa queue connection
      */
-    private static XAQueueConnection _xaqueueConnection= null;
+    private static XAQueueConnection _xaqueueConnection = null;
 
     /**
      * standard xa queue connection
      */
-    private static QueueConnection _queueConnection=null;
+    private static QueueConnection _queueConnection = null;
 
 
     /**
@@ -66,109 +65,45 @@
      */
     private static QueueSession _nonXASession = null;
 
-    /**
-     * the queue name
-     */
-    private static final String QUEUENAME = "xaQueue";
 
     /** ----------------------------------------------------------------------------------- **/
     /**
      * ----------------------------- JUnit support  ----------------------------------------- *
      */
 
-    /**
-     * Gets the test suite tests
-     *
-     * @return the test suite tests
-     */
-    public static TestSuite getSuite()
-    {
-        return new TestSuite(QueueTest.class);
-    }
-
-    /**
-     * Run the test suite.
-     *
-     * @param args Any command line arguments specified to this class.
-     */
-    public static void main(String args[])
-    {
-        junit.textui.TestRunner.run(getSuite());
-    }
-
+    @Override
     public void tearDown() throws Exception
     {
-        if (!isBroker08())
+        try
         {
-            try
+            if (_xaqueueConnection != null)
             {
                 _xaqueueConnection.close();
+            }
+            if (_queueConnection != null)
+            {
                 _queueConnection.close();
             }
-            catch (Exception e)
-            {
-                fail("Exception thrown when cleaning standard connection: " + e.getStackTrace());
-            }
         }
-        super.tearDown();
+        finally
+        {
+            super.tearDown();
+        }
     }
 
     /**
      * Initialize standard actors
      */
-    public void init()
+    public void init() throws Exception
     {
         if (!isBroker08())
         {
-            // lookup test queue
-            try
-            {
-                _queue = (Queue) getInitialContext().lookup(QUEUENAME);
-            }
-            catch (Exception e)
-            {
-                fail("cannot lookup test queue " + e.getMessage());
-            }
-
-            // lookup connection factory
-            try
-            {
-                _queueFactory = (XAQueueConnectionFactory) getConnectionFactory();
-            }
-            catch (Exception e)
-            {
-                fail("enable to lookup connection factory ");
-            }
-            // create standard connection
-            try
-            {
-                _xaqueueConnection= getNewQueueXAConnection();
-            }
-            catch (JMSException e)
-            {
-                fail("cannot create queue connection: " + e.getMessage());
-            }
-            // create xa session
-            XAQueueSession session = null;
-            try
-            {
-                session = _xaqueueConnection.createXAQueueSession();
-            }
-            catch (JMSException e)
-            {
-                fail("cannot create queue session: " + e.getMessage());
-            }
-            // create a standard session
-            try
-            {
-                _queueConnection = _queueFactory.createQueueConnection("guest", "guest");
-                _nonXASession = _queueConnection.createQueueSession(true, Session.AUTO_ACKNOWLEDGE);
-            }
-            catch (JMSException e)
-            {
-                _logger.error("cannot create queue session",e);
-                fail("cannot create queue session: " + e.getMessage());
-            }
+            _queueFactory = (XAQueueConnectionFactory) getConnectionFactory();
+            _xaqueueConnection= getNewQueueXAConnection();
+            final XAQueueSession session = _xaqueueConnection.createXAQueueSession();
+            _queue = session.createQueue(getTestQueueName());
+            _queueConnection = _queueFactory.createQueueConnection(GUEST_USERNAME, GUEST_PASSWORD);
+            _nonXASession = _queueConnection.createQueueSession(true, Session.AUTO_ACKNOWLEDGE);
             init(session, _queue);
         }
     }
diff --git a/systests/src/test/java/org/apache/qpid/test/unit/xa/TopicTest.java b/systests/src/test/java/org/apache/qpid/test/unit/xa/TopicTest.java
index b29267f..33a2149 100644
--- a/systests/src/test/java/org/apache/qpid/test/unit/xa/TopicTest.java
+++ b/systests/src/test/java/org/apache/qpid/test/unit/xa/TopicTest.java
@@ -26,7 +26,6 @@
 import javax.transaction.xa.XAResource;
 import javax.transaction.xa.Xid;
 
-import junit.framework.TestSuite;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -77,26 +76,7 @@
     /** ----------------------------- JUnit support  ----------------------------------------- **/
     /** -------------------------------------------------------------------------------------- **/
 
-    /**
-     * Gets the test suite tests
-     *
-     * @return the test suite tests
-     */
-    public static TestSuite getSuite()
-    {
-        return new TestSuite(TopicTest.class);
-    }
-
-    /**
-     * Run the test suite.
-     *
-     * @param args Any command line arguments specified to this class.
-     */
-    public static void main(String args[])
-    {
-        junit.textui.TestRunner.run(getSuite());
-    }
-
+    @Override
     public void tearDown() throws Exception
     {
         if (!isBroker08())
@@ -117,56 +97,17 @@
     /**
      * Initialize standard actors
      */
-    public void init()
+    public void init() throws Exception
     {
         if (!isBroker08())
         {
             setTestClientSystemProperty(ClientProperties.MAX_PREFETCH_PROP_NAME, "1");
             // lookup test queue
-            try
-            {
-                _topic = (Topic) getInitialContext().lookup(TOPICNAME);
-            }
-            catch (Exception e)
-            {
-                fail("cannot lookup test topic " + e.getMessage());
-            }
-            // lookup connection factory
-            try
-            {
-                _topicFactory = (XATopicConnectionFactory) getConnectionFactory();
-            }
-            catch (Exception e)
-            {
-                fail("enable to lookup connection factory ");
-            }
-            // create standard connection
-            try
-            {
-                _topicConnection = getNewTopicXAConnection();
-            }
-            catch (JMSException e)
-            {
-                fail("cannot create queue connection: " + e.getMessage());
-            }
-            // create standard session
-            try
-            {
-                _session = _topicConnection.createXATopicSession();
-            }
-            catch (JMSException e)
-            {
-                fail("cannot create queue session: " + e.getMessage());
-            }
-            // create a standard session
-            try
-            {
-                _nonXASession = _topicConnection.createTopicSession(true, Session.AUTO_ACKNOWLEDGE);
-            }
-            catch (JMSException e)
-            {
-                _logger.error("Error creating topic session", e);
-            }
+            _topicFactory = (XATopicConnectionFactory) getConnectionFactory();
+            _topicConnection = getNewTopicXAConnection();
+            _session = _topicConnection.createXATopicSession();
+            _topic = _session.createTopic(getTestQueueName());
+            _nonXASession = _topicConnection.createTopicSession(true, Session.AUTO_ACKNOWLEDGE);
             init(_session, _topic);
         }
     }
diff --git a/systests/src/test/java/org/apache/qpid/test/utils/FailoverBaseCase.java b/systests/src/test/java/org/apache/qpid/test/utils/FailoverBaseCase.java
index d0c77e4..efadf55 100644
--- a/systests/src/test/java/org/apache/qpid/test/utils/FailoverBaseCase.java
+++ b/systests/src/test/java/org/apache/qpid/test/utils/FailoverBaseCase.java
@@ -20,9 +20,13 @@
  */
 package org.apache.qpid.test.utils;
 
+import java.util.ArrayList;
+import java.util.List;
 import java.util.concurrent.CountDownLatch;
 
+import javax.jms.Connection;
 import javax.jms.ConnectionFactory;
+import javax.jms.IllegalStateException;
 import javax.jms.JMSException;
 import javax.naming.NamingException;
 
@@ -43,9 +47,10 @@
     protected int _port;
     protected int _alternativePort;
     private ConnectionFactory _connectionFactory;
+    private final List<Connection> _connections = new ArrayList<>();
 
     @Override
-    protected void setUp() throws Exception
+    public void setUp() throws Exception
     {
         super.setUp();
         _failoverComplete = new CountDownLatch(1);
@@ -60,6 +65,28 @@
         setTestSystemProperty("test.port", String.valueOf(_port));
     }
 
+    @Override
+    protected void tearDown() throws Exception
+    {
+        try
+        {
+            for(Connection c : _connections)
+            {
+                try
+                {
+                    c.close();
+                }
+                catch (JMSException e)
+                {
+                }
+            }
+        }
+        finally
+        {
+            super.tearDown();
+        }
+    }
+
     /**
      * We are using failover factories
      *
@@ -87,7 +114,9 @@
     @Override
     public javax.jms.Connection getConnection() throws JMSException, NamingException
     {
-        return getConnectionFactory().createConnection(GUEST_USERNAME, GUEST_PASSWORD);
+        final Connection connection = getConnectionFactory().createConnection(GUEST_USERNAME, GUEST_PASSWORD);
+        _connections.add(connection);
+        return connection;
     }
 
     public void failDefaultBroker()
