diff --git a/modules/rampart-integration/src/main/java/org/apache/axis2/integration/JettyServer.java b/modules/rampart-integration/src/main/java/org/apache/axis2/integration/JettyServer.java
index ce2b863..d3ec600 100644
--- a/modules/rampart-integration/src/main/java/org/apache/axis2/integration/JettyServer.java
+++ b/modules/rampart-integration/src/main/java/org/apache/axis2/integration/JettyServer.java
@@ -24,6 +24,7 @@
 import org.eclipse.jetty.servlet.ServletHolder;
 import org.eclipse.jetty.util.ssl.SslContextFactory;
 import org.eclipse.jetty.webapp.WebAppContext;
+import org.junit.rules.ExternalResource;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.apache.axis2.testutils.PortAllocator;
@@ -32,7 +33,7 @@
 /**
  * Support for running an embedded Jetty server
  */
-public class JettyServer {
+public class JettyServer extends ExternalResource {
 
     /**
      * Keystore to configure for Jetty's ssl context factory: {@value}
@@ -71,57 +72,41 @@
     
     private static final Logger logger = LoggerFactory.getLogger(JettyServer.class);
     
-    private static Server server;
-    
-    private JettyServer() {
-        
-    }
+    private final String repository;
+    private final int httpPort;
+    private final int httpsPort;
+    private Server server;
     
     /**
-     * Starts the embedded Jetty server using dynamic port allocation with both http and https connectors enabled.
+     * Constructor.
      * 
-     * @param repository The path to the Axis2 repository to use. Must not be null or empty.
-     * 
-     * @throws Exception
-     */
-    public static synchronized void start(String repository) throws Exception {
-        start(repository, true, true);
-    }
-    
-    /**
-     * Starts the embedded Jetty server using dynamic port allocation.
-     * 
-     * @param repository The path to the Axis2 repository to use. Must not be null or empty.
-     * @param enableHttp Specifies whether to enable http connector.
-     * @param enableHttps Specifies whether to enable https connector.
-     * 
-     * @throws Exception
-     */
-    public static synchronized void start(String repository, boolean enableHttp, boolean enableHttps) throws Exception {
-        int httpPort = enableHttp ? PortAllocator.allocatePort() : -1;
-        int httpsPort = enableHttps ? PortAllocator.allocatePort() : -1;
-        
-        start(repository, httpPort, httpsPort);
-    }
-    
-    /**
-     * Starts the embedded Jetty server.
-     * 
-     * @param repository The path to the Axis2 repository to use. Must not be null or empty.
-     * @param httpPort The http port to use. Set to <code>-1</code> to disable http connector.
-     * @param httpsPort The https port to use. Set to <code>-1</code> to disable https connector.
-     * 
-     * @throws Exception
+     * @param repository
+     *            The path to the Axis2 repository to use. Must not be null or empty.
+     * @param httpPort
+     *            The http port to use. Set to <code>-1</code> to disable http connector. Set to
+     *            <code>0</code> to enable dynamic port allocation.
+     * @param httpsPort
+     *            The https port to use. Set to <code>-1</code> to disable https connector. Set to
+     *            <code>0</code> to enable dynamic port allocation.
      * @throws IllegalArgumentException If both ports are set to <code>-1</code>
      */
-    public static synchronized void start(String repository, int httpPort, int httpsPort) throws Exception {
+    public JettyServer(String repository, int httpPort, int httpsPort) {
         if (repository == null || repository.trim().length() == 0) {
             throw new IllegalArgumentException("Axis2 repository must not be null or empty");
         }
-        else if (httpPort == -1 && httpsPort == -1) {
+        if (httpPort == -1 && httpsPort == -1) {
             throw new IllegalArgumentException("At least one port must be specified.");
         }
+        this.repository = repository;
+        this.httpPort = httpPort;
+        this.httpsPort = httpsPort;
+    }
     
+    @Override
+    protected void before() throws Throwable {
+        int httpPort = this.httpPort == 0 ? PortAllocator.allocatePort() : this.httpPort;
+        int httpsPort = this.httpsPort == 0 ? PortAllocator.allocatePort() : this.httpsPort;
+        
         server = new Server();
         
         SelectChannelConnector connector = null;
@@ -196,15 +181,15 @@
         }
     }
     
-    /**
-     * Stops the embedded Jetty server.
-     * 
-     * @throws Exception
-     */
-    public static synchronized void stop() throws Exception {
+    @Override
+    protected void after() {
         if (server != null) {
             logger.info("Stop called");
-            server.stop();
+            try {
+                server.stop();
+            } catch (Exception ex) {
+                logger.error("Failed to stop Jetty server", ex);
+            }
             server = null;
         }
     }
@@ -213,7 +198,7 @@
      * @return Jetty's http connector port. 
      * @throws IllegalStateException If Jetty is not running or the http connector cannot be found.
      */
-    public static synchronized int getHttpPort() throws IllegalStateException {
+    public int getHttpPort() throws IllegalStateException {
         assertStarted();
         
         Connector[] connectors = server.getConnectors();
@@ -236,7 +221,7 @@
      * @return Jetty's ssl connector port. 
      * @throws IllegalStateException If Jetty is not running or the ssl connector cannot be found.
      */
-    public static synchronized int getHttpsPort() throws IllegalStateException {
+    public int getHttpsPort() throws IllegalStateException {
         assertStarted();
         
         Connector[] connectors = server.getConnectors();
@@ -254,7 +239,7 @@
         throw new IllegalStateException("Could not find Jetty https connector");
     }
     
-    private static void assertStarted() throws IllegalStateException {
+    private void assertStarted() throws IllegalStateException {
         if (server == null) {
             throw new IllegalStateException("Jetty server is not initialized");
         }
diff --git a/modules/rampart-integration/src/main/java/org/apache/rahas/TestClient.java b/modules/rampart-integration/src/main/java/org/apache/rahas/TestClient.java
index 33f850b..b6a686c 100644
--- a/modules/rampart-integration/src/main/java/org/apache/rahas/TestClient.java
+++ b/modules/rampart-integration/src/main/java/org/apache/rahas/TestClient.java
@@ -34,27 +34,19 @@
 import org.apache.neethi.Policy;
 import org.apache.neethi.PolicyEngine;
 import org.apache.rampart.RampartMessageData;
+import org.junit.Rule;
+import org.junit.Test;
 
-import junit.framework.TestCase;
-
-public abstract class TestClient extends TestCase {
+public abstract class TestClient {
 
     protected int port = 5555;
 
-    public TestClient(String name) {
-        super(name);
-    }
-
-    protected void setUp() throws Exception {
-        JettyServer.start(Constants.TESTING_PATH + getServiceRepo(), port, -1);
-    }
-
-    protected void tearDown() throws Exception {
-        JettyServer.stop();
-    }
+    @Rule
+    public final JettyServer server = new JettyServer(Constants.TESTING_PATH + getServiceRepo(), port, -1);
 
     /**
      */
+    @Test
     public void testRequest() throws Exception {
         // Get the repository location from the args
         String repo = Constants.TESTING_PATH + "rahas_client_repo";
diff --git a/modules/rampart-integration/src/main/java/org/apache/rampart/KerberosDelegationService.java b/modules/rampart-integration/src/main/java/org/apache/rampart/KerberosDelegationService.java
index e1dd204..ee010b0 100644
--- a/modules/rampart-integration/src/main/java/org/apache/rampart/KerberosDelegationService.java
+++ b/modules/rampart-integration/src/main/java/org/apache/rampart/KerberosDelegationService.java
@@ -3,6 +3,7 @@
 import java.net.MalformedURLException;
 import java.net.URL;
 
+import javax.servlet.http.HttpServletRequest;
 import javax.xml.namespace.QName;
 
 import org.apache.axiom.om.OMAbstractFactory;
@@ -13,7 +14,7 @@
 import org.apache.axis2.client.ServiceClient;
 import org.apache.axis2.context.ConfigurationContext;
 import org.apache.axis2.context.ConfigurationContextFactory;
-import org.apache.axis2.integration.JettyServer;
+import org.apache.axis2.context.MessageContext;
 import org.apache.axis2.transport.http.HTTPConstants;
 import org.apache.neethi.Policy;
 import org.apache.rampart.policy.model.KerberosConfig;
@@ -26,9 +27,10 @@
     
     
     public OMElement echo(OMElement elem) throws MalformedURLException, IllegalStateException, AxisFault {
+        int port = ((HttpServletRequest)MessageContext.getCurrentMessageContext().getProperty(HTTPConstants.MC_HTTP_SERVLETREQUEST)).getLocalPort();
         
         final String serviceName = "KerberosOverTransportKeytab";
-        URL wsdlUrl = new URL(String.format("https://localhost:%s/axis2/services/%s?wsdl", JettyServer.getHttpsPort(), serviceName));
+        URL wsdlUrl = new URL(String.format("https://localhost:%s/axis2/services/%s?wsdl", port, serviceName));
         
         ConfigurationContext configContext = ConfigurationContextFactory.
                         createConfigurationContextFromFileSystem("target/test-resources/rampart_client_repo", null);
diff --git a/modules/rampart-integration/src/test/java/org/apache/rahas/RahasSAML2TokenCertForHoKTest.java b/modules/rampart-integration/src/test/java/org/apache/rahas/RahasSAML2TokenCertForHoKTest.java
index dda4c7c..546bac4 100644
--- a/modules/rampart-integration/src/test/java/org/apache/rahas/RahasSAML2TokenCertForHoKTest.java
+++ b/modules/rampart-integration/src/test/java/org/apache/rahas/RahasSAML2TokenCertForHoKTest.java
@@ -22,13 +22,11 @@
 import org.apache.neethi.Policy;
 import org.apache.ws.secpolicy.SP11Constants;
 
+import static org.junit.Assert.assertNotNull;
+
 import javax.xml.namespace.QName;
 
 public class RahasSAML2TokenCertForHoKTest extends TestClient{
-    public RahasSAML2TokenCertForHoKTest(String name) {
-           super(name);
-       }
-
        public String getServiceRepo() {
            return "rahas_service_repo_1";
        }
diff --git a/modules/rampart-integration/src/test/java/org/apache/rahas/RahasSAML2TokenTest.java b/modules/rampart-integration/src/test/java/org/apache/rahas/RahasSAML2TokenTest.java
index 9d34316..9e35c98 100644
--- a/modules/rampart-integration/src/test/java/org/apache/rahas/RahasSAML2TokenTest.java
+++ b/modules/rampart-integration/src/test/java/org/apache/rahas/RahasSAML2TokenTest.java
@@ -22,15 +22,11 @@
 import org.apache.neethi.Policy;
 import org.apache.ws.secpolicy.SP11Constants;
 
-import javax.xml.namespace.QName;
-public class RahasSAML2TokenTest extends TestClient{
-    /**
-     * @param name
-     */
-    public RahasSAML2TokenTest(String name) {
-        super(name);
-    }
+import static org.junit.Assert.assertNotNull;
 
+import javax.xml.namespace.QName;
+
+public class RahasSAML2TokenTest extends TestClient{
     public String getServiceRepo() {
         return "rahas_service_repo_1";
     }
diff --git a/modules/rampart-integration/src/test/java/org/apache/rahas/RahasSAML2TokenUTForBearerTest.java b/modules/rampart-integration/src/test/java/org/apache/rahas/RahasSAML2TokenUTForBearerTest.java
index 72f70bd..76967c5 100644
--- a/modules/rampart-integration/src/test/java/org/apache/rahas/RahasSAML2TokenUTForBearerTest.java
+++ b/modules/rampart-integration/src/test/java/org/apache/rahas/RahasSAML2TokenUTForBearerTest.java
@@ -33,6 +33,10 @@
 import javax.xml.namespace.QName;
 import javax.xml.parsers.DocumentBuilder;
 import javax.xml.parsers.DocumentBuilderFactory;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+
 import java.io.ByteArrayInputStream;
 import java.util.List;
 
@@ -41,11 +45,6 @@
  * @author Ruchith Fernando (ruchith.fernando@gmail.com)
  */
 public class RahasSAML2TokenUTForBearerTest extends TestClient {
-
-    public RahasSAML2TokenUTForBearerTest(String name) {
-        super(name);
-    }
-
     public OMElement getRequest() {
         try {
             OMElement rstElem = TrustUtil.createRequestSecurityTokenElement(RahasConstants.VERSION_05_02);
diff --git a/modules/rampart-integration/src/test/java/org/apache/rahas/RahasSAMLTokenAttributeTest.java b/modules/rampart-integration/src/test/java/org/apache/rahas/RahasSAMLTokenAttributeTest.java
index 1104743..8acb16e 100644
--- a/modules/rampart-integration/src/test/java/org/apache/rahas/RahasSAMLTokenAttributeTest.java
+++ b/modules/rampart-integration/src/test/java/org/apache/rahas/RahasSAMLTokenAttributeTest.java
@@ -1,5 +1,7 @@
 package org.apache.rahas;
 
+import static org.junit.Assert.assertNotNull;
+
 import javax.xml.namespace.QName;
 
 import org.apache.axiom.om.OMAbstractFactory;
@@ -9,11 +11,6 @@
 import org.apache.ws.secpolicy.SP11Constants;
 
 public class RahasSAMLTokenAttributeTest  extends TestClient{
-    
-	public RahasSAMLTokenAttributeTest(String name) {
-        super(name);
-    }
-    
     public OMElement getRequest() {
         try {
             OMElement rstElem = TrustUtil.createRequestSecurityTokenElement(RahasConstants.VERSION_05_02);
diff --git a/modules/rampart-integration/src/test/java/org/apache/rahas/RahasSAMLTokenCertForHoKTest.java b/modules/rampart-integration/src/test/java/org/apache/rahas/RahasSAMLTokenCertForHoKTest.java
index 4fa687c..9bdcd87 100644
--- a/modules/rampart-integration/src/test/java/org/apache/rahas/RahasSAMLTokenCertForHoKTest.java
+++ b/modules/rampart-integration/src/test/java/org/apache/rahas/RahasSAMLTokenCertForHoKTest.java
@@ -22,15 +22,11 @@
 import org.apache.neethi.Policy;
 import org.apache.ws.secpolicy.SP11Constants;
 
+import static org.junit.Assert.assertNotNull;
+
 import javax.xml.namespace.QName;
 
-
 public class RahasSAMLTokenCertForHoKTest extends TestClient {
-
-    public RahasSAMLTokenCertForHoKTest(String name) {
-        super(name);
-    }
-
     public String getServiceRepo() {
         return "rahas_service_repo_1";
     }
diff --git a/modules/rampart-integration/src/test/java/org/apache/rahas/RahasSAMLTokenCertForHoKV1205Test.java b/modules/rampart-integration/src/test/java/org/apache/rahas/RahasSAMLTokenCertForHoKV1205Test.java
index 8c59a25..006b9a0 100644
--- a/modules/rampart-integration/src/test/java/org/apache/rahas/RahasSAMLTokenCertForHoKV1205Test.java
+++ b/modules/rampart-integration/src/test/java/org/apache/rahas/RahasSAMLTokenCertForHoKV1205Test.java
@@ -22,15 +22,11 @@
 import org.apache.neethi.Policy;
 import org.apache.ws.secpolicy.SP12Constants;
 
+import static org.junit.Assert.assertNotNull;
+
 import javax.xml.namespace.QName;
 
 public class RahasSAMLTokenCertForHoKV1205Test extends TestClient {
-
-
-    public RahasSAMLTokenCertForHoKV1205Test(String name) {
-        super(name);
-    }
-
     public OMElement getRequest() {
         try {
             OMElement rstElem =
diff --git a/modules/rampart-integration/src/test/java/org/apache/rahas/RahasSAMLTokenTest.java b/modules/rampart-integration/src/test/java/org/apache/rahas/RahasSAMLTokenTest.java
index cb579f5..61ed5d2 100644
--- a/modules/rampart-integration/src/test/java/org/apache/rahas/RahasSAMLTokenTest.java
+++ b/modules/rampart-integration/src/test/java/org/apache/rahas/RahasSAMLTokenTest.java
@@ -22,18 +22,11 @@
 import org.apache.neethi.Policy;
 import org.apache.ws.secpolicy.SP11Constants;
 
+import static org.junit.Assert.assertNotNull;
+
 import javax.xml.namespace.QName;
 
 public class RahasSAMLTokenTest extends TestClient {
-
-
-    /**
-     * @param name
-     */
-    public RahasSAMLTokenTest(String name) {
-        super(name);
-    }
-
     public String getServiceRepo() {
         return "rahas_service_repo_1";
     }
diff --git a/modules/rampart-integration/src/test/java/org/apache/rahas/RahasSAMLTokenUTForBearerTest.java b/modules/rampart-integration/src/test/java/org/apache/rahas/RahasSAMLTokenUTForBearerTest.java
index 94d0827..93ed846 100644
--- a/modules/rampart-integration/src/test/java/org/apache/rahas/RahasSAMLTokenUTForBearerTest.java
+++ b/modules/rampart-integration/src/test/java/org/apache/rahas/RahasSAMLTokenUTForBearerTest.java
@@ -34,6 +34,10 @@
 import javax.xml.namespace.QName;
 import javax.xml.parsers.DocumentBuilder;
 import javax.xml.parsers.DocumentBuilderFactory;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+
 import java.io.ByteArrayInputStream;
 import java.util.List;
 
@@ -42,11 +46,6 @@
  * @author Ruchith Fernando (ruchith.fernando@gmail.com)
  */
 public class RahasSAMLTokenUTForBearerTest extends TestClient {
-
-    public RahasSAMLTokenUTForBearerTest(String name) {
-        super(name);
-    }
-
     public OMElement getRequest() {
         try {
             OMElement rstElem = TrustUtil.createRequestSecurityTokenElement(RahasConstants.VERSION_05_02);
diff --git a/modules/rampart-integration/src/test/java/org/apache/rahas/RahasSAMLTokenUTForBearerV1205Test.java b/modules/rampart-integration/src/test/java/org/apache/rahas/RahasSAMLTokenUTForBearerV1205Test.java
index 3be3e08..bfd771f 100644
--- a/modules/rampart-integration/src/test/java/org/apache/rahas/RahasSAMLTokenUTForBearerV1205Test.java
+++ b/modules/rampart-integration/src/test/java/org/apache/rahas/RahasSAMLTokenUTForBearerV1205Test.java
@@ -22,17 +22,11 @@
 import org.apache.neethi.Policy;
 import org.apache.ws.secpolicy.SP12Constants;
 
+import static org.junit.Assert.assertNotNull;
+
 import javax.xml.namespace.QName;
 
 public class RahasSAMLTokenUTForBearerV1205Test extends TestClient {
-
-    /**
-     * @param name
-     */
-    public RahasSAMLTokenUTForBearerV1205Test(String name) {
-        super(name);
-    }
-
     public OMElement getRequest() {
         try {
             OMElement rstElem = TrustUtil.createRequestSecurityTokenElement(RahasConstants.VERSION_05_12);
diff --git a/modules/rampart-integration/src/test/java/org/apache/rahas/RahasSAMLTokenUTForHoKTest.java b/modules/rampart-integration/src/test/java/org/apache/rahas/RahasSAMLTokenUTForHoKTest.java
index cb88a79..9e21c61 100644
--- a/modules/rampart-integration/src/test/java/org/apache/rahas/RahasSAMLTokenUTForHoKTest.java
+++ b/modules/rampart-integration/src/test/java/org/apache/rahas/RahasSAMLTokenUTForHoKTest.java
@@ -22,14 +22,11 @@
 import org.apache.neethi.Policy;
 import org.apache.ws.secpolicy.SP11Constants;
 
+import static org.junit.Assert.assertNotNull;
+
 import javax.xml.namespace.QName;
 
 public class RahasSAMLTokenUTForHoKTest extends TestClient {
-
-    public RahasSAMLTokenUTForHoKTest(String name) {
-        super(name);
-    }
-
     public OMElement getRequest() {
         try {
             OMElement rstElem = TrustUtil.createRequestSecurityTokenElement(RahasConstants.VERSION_05_02);
diff --git a/modules/rampart-integration/src/test/java/org/apache/rahas/RahasSAMLTokenUTForHoKV1205Test.java b/modules/rampart-integration/src/test/java/org/apache/rahas/RahasSAMLTokenUTForHoKV1205Test.java
index 5e816e1..d15ba09 100644
--- a/modules/rampart-integration/src/test/java/org/apache/rahas/RahasSAMLTokenUTForHoKV1205Test.java
+++ b/modules/rampart-integration/src/test/java/org/apache/rahas/RahasSAMLTokenUTForHoKV1205Test.java
@@ -16,6 +16,8 @@
 
 package org.apache.rahas;
 
+import static org.junit.Assert.assertNotNull;
+
 import javax.xml.namespace.QName;
 
 import org.apache.axiom.om.OMAbstractFactory;
@@ -30,13 +32,6 @@
 
     byte[] clientEntr;
     
-    /**
-     * @param name
-     */
-    public RahasSAMLTokenUTForHoKV1205Test(String name) {
-        super(name);
-    }
-
     public OMElement getRequest() {
         try {
             OMElement rstElem = TrustUtil.createRequestSecurityTokenElement(RahasConstants.VERSION_05_12);
diff --git a/modules/rampart-integration/src/test/java/org/apache/rahas/RahasSAMLTokenV1205Test.java b/modules/rampart-integration/src/test/java/org/apache/rahas/RahasSAMLTokenV1205Test.java
index 5ae0782..3fddd7f 100644
--- a/modules/rampart-integration/src/test/java/org/apache/rahas/RahasSAMLTokenV1205Test.java
+++ b/modules/rampart-integration/src/test/java/org/apache/rahas/RahasSAMLTokenV1205Test.java
@@ -22,20 +22,14 @@
 import org.apache.neethi.Policy;
 import org.apache.ws.secpolicy.SP12Constants;
 
+import static org.junit.Assert.assertNotNull;
+
 import javax.xml.namespace.QName;
 
 /**
  * RahasSAMLTokenTest with the WS-SX namespaces
  */
 public class RahasSAMLTokenV1205Test extends TestClient {
-
-    /**
-     * @param name
-     */
-    public RahasSAMLTokenV1205Test(String name) {
-        super(name);
-    }
-
     public OMElement getRequest() {
         try {
             OMElement rstElem = TrustUtil.createRequestSecurityTokenElement(RahasConstants.VERSION_05_12);
diff --git a/modules/rampart-integration/src/test/java/org/apache/rampart/AbstractRampartTest.java b/modules/rampart-integration/src/test/java/org/apache/rampart/AbstractRampartTest.java
index 2b4e017..ece019c 100644
--- a/modules/rampart-integration/src/test/java/org/apache/rampart/AbstractRampartTest.java
+++ b/modules/rampart-integration/src/test/java/org/apache/rampart/AbstractRampartTest.java
@@ -23,8 +23,6 @@
 import java.util.MissingResourceException;
 import java.util.ResourceBundle;
 
-import junit.framework.TestCase;
-
 import org.apache.axiom.om.OMAbstractFactory;
 import org.apache.axiom.om.OMElement;
 import org.apache.axiom.om.OMFactory;
@@ -37,12 +35,15 @@
 import org.apache.axis2.transport.http.HTTPConstants;
 import org.apache.neethi.Policy;
 import org.apache.neethi.PolicyEngine;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Rule;
 
 /**
  * Base test class for integration tests that require Axis2 web application running in a web container.
  * The class uses Axis2 web application deployed via {@link JettyServer}.
  */
-public abstract class AbstractRampartTest extends TestCase {
+public abstract class AbstractRampartTest {
     
     /**
      * Default client connection timeout in milliseconds: {@value}
@@ -54,6 +55,11 @@
     protected static final String RAMPART_SERVICE_REPO_PATH = "target/test-resources/rampart_service_repo";
     
     protected static ResourceBundle resources;
+    
+    @Rule
+    public final JettyServer server = new JettyServer(
+            RAMPART_SERVICE_REPO_PATH, isEnableHttp() ? 0 : -1, isEnableHttps() ? 0 : -1);
+    
     protected String trustStore;
     protected String trustStorePassword;
     protected String trustStoreType;
@@ -65,19 +71,9 @@
             throw new RuntimeException(e.getMessage());
         }
     }
-    
-    public AbstractRampartTest() {
-        
-    }
 
-    public AbstractRampartTest(String name) {
-        super(name);
-    }
-
-    /* (non-Javadoc)
-     * @see junit.framework.TestCase#setUp()
-     */
-    protected void setUp() throws Exception {
+    @Before
+    public void setUp() throws Exception {
         trustStore = System.getProperty("javax.net.ssl.trustStore");
         System.setProperty("javax.net.ssl.trustStore", CLIENT_KEYSTORE);
         
@@ -86,54 +82,31 @@
         
         trustStoreType = System.getProperty("javax.net.ssl.trustStoreType");
         System.setProperty("javax.net.ssl.trustStoreType", "JKS");
-             
-        JettyServer.start(RAMPART_SERVICE_REPO_PATH, isEnableHttp(), isEnableHttps());
     }
     
 
-    /* (non-Javadoc)
-     * @see junit.framework.TestCase#tearDown()
-     */
-    protected void tearDown() throws Exception {
-        try {
-            JettyServer.stop();
+    @After
+    public void tearDown() throws Exception {
+        if (trustStore != null) {
+            System.setProperty("javax.net.ssl.trustStore", trustStore);
         }
-        finally {
-            if (trustStore != null) {
-                System.setProperty("javax.net.ssl.trustStore", trustStore);
-            }
-            else {
-                System.clearProperty("javax.net.ssl.trustStore");
-            }
-            
-            if (trustStorePassword != null) {
-                System.setProperty("javax.net.ssl.trustStorePassword", trustStorePassword);    
-            }
-            else {
-                System.clearProperty("javax.net.ssl.trustStorePassword");
-            }
-            
-            if (trustStoreType != null) {
-                System.setProperty("javax.net.ssl.trustStoreType", trustStoreType);
-            }
-            else {
-                System.clearProperty("javax.net.ssl.trustStoreType");
-            }
+        else {
+            System.clearProperty("javax.net.ssl.trustStore");
         }
-    }
-    
-    /**
-     * @return Jetty http port, see {@link JettyServer#getHttpPort()}
-     */
-    protected int getHttpPort() {
-        return JettyServer.getHttpPort();
-    }
-    
-    /**
-     * @return Jetty https port, see {@link JettyServer#getHttpsPort()}
-     */
-    protected int getHttpsPort() {
-        return JettyServer.getHttpsPort();
+        
+        if (trustStorePassword != null) {
+            System.setProperty("javax.net.ssl.trustStorePassword", trustStorePassword);    
+        }
+        else {
+            System.clearProperty("javax.net.ssl.trustStorePassword");
+        }
+        
+        if (trustStoreType != null) {
+            System.setProperty("javax.net.ssl.trustStoreType", trustStoreType);
+        }
+        else {
+            System.clearProperty("javax.net.ssl.trustStoreType");
+        }
     }
     
     protected ServiceClient getServiceClientInstance() throws AxisFault {
diff --git a/modules/rampart-integration/src/test/java/org/apache/rampart/RampartKerberosTest.java b/modules/rampart-integration/src/test/java/org/apache/rampart/RampartKerberosTest.java
index ff87fb4..2ee02a9 100644
--- a/modules/rampart-integration/src/test/java/org/apache/rampart/RampartKerberosTest.java
+++ b/modules/rampart-integration/src/test/java/org/apache/rampart/RampartKerberosTest.java
@@ -17,6 +17,9 @@
 import org.apache.rampart.policy.model.RampartConfig;
 import org.apache.rampart.util.KerberosServer;
 import org.custommonkey.xmlunit.XMLAssert;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
 import org.xml.sax.SAXException;
 
 /**
@@ -69,9 +72,10 @@
      */
     protected String krb5Conf;
     
+    @Test
     public void testKerberosOverTransportKeytab() throws XMLStreamException, SAXException, IOException {
         final String serviceName = "KerberosOverTransportKeytab";
-        URL serviceUrl = new URL(String.format("https://localhost:%s/axis2/services/%s?wsdl", getHttpsPort(), serviceName));
+        URL serviceUrl = new URL(String.format("https://localhost:%s/axis2/services/%s?wsdl", server.getHttpsPort(), serviceName));
         
         ServiceClient serviceClient = getServiceClientInstance(serviceUrl);
 
@@ -95,9 +99,10 @@
         XMLAssert.assertXMLEqual(echoElement.toStringWithConsume(), result.toStringWithConsume());
     }
     
+    @Test
     public void testKerberosOverTransportPWCB() throws XMLStreamException, SAXException, IOException {
         final String serviceName = "KerberosOverTransportPWCB";
-        URL serviceUrl = new URL(String.format("https://localhost:%s/axis2/services/%s?wsdl", getHttpsPort(), serviceName));
+        URL serviceUrl = new URL(String.format("https://localhost:%s/axis2/services/%s?wsdl", server.getHttpsPort(), serviceName));
         
         ServiceClient serviceClient = getServiceClientInstance(serviceUrl);
 
@@ -123,10 +128,10 @@
         XMLAssert.assertXMLEqual(echoElement.toStringWithConsume(), result.toStringWithConsume());
     }
     
-    
+    @Test
     public void testKerberosDelegation() throws XMLStreamException, SAXException, IOException {
         final String serviceName = "KerberosDelegation";
-        URL serviceUrl = new URL(String.format("https://localhost:%s/axis2/services/%s?wsdl", getHttpsPort(), serviceName));
+        URL serviceUrl = new URL(String.format("https://localhost:%s/axis2/services/%s?wsdl", server.getHttpsPort(), serviceName));
 
         ServiceClient serviceClient = getServiceClientInstance(serviceUrl);
 
@@ -151,13 +156,8 @@
         XMLAssert.assertXMLEqual(echoElement.toStringWithConsume(), result.toStringWithConsume());
     }
     
-    /* (non-Javadoc)
-     * @see org.apache.rampart.AbstractRampartTest#setUp()
-     */
-    @Override
-    protected void setUp() throws Exception {
-        super.setUp();
-        
+    @Before
+    public void setUpKerberos() throws Exception {
         System.setProperty("sun.security.krb5.debug", "true");
         System.setProperty("sun.security.jgss.debug", "true");
         
@@ -176,13 +176,8 @@
         System.setProperty(JAAS_CONF_SYS_PROP, KERBEROS_JAAS_CONF);
     }
 
-    /* (non-Javadoc)
-     * @see org.apache.rampart.AbstractRampartTest#tearDown()
-     */
-    @Override
-    protected void tearDown() throws Exception {
-        super.tearDown();
-        
+    @After
+    public void tearDownKerberos() throws Exception {
         KerberosServer.stopKerberosServer();
         
         if (jaasConf != null) {
diff --git a/modules/rampart-integration/src/test/java/org/apache/rampart/RampartTest.java b/modules/rampart-integration/src/test/java/org/apache/rampart/RampartTest.java
index 622a627..cd0534e 100644
--- a/modules/rampart-integration/src/test/java/org/apache/rampart/RampartTest.java
+++ b/modules/rampart-integration/src/test/java/org/apache/rampart/RampartTest.java
@@ -16,12 +16,11 @@
 
 package org.apache.rampart;
 
-import static org.apache.axis2.integration.JettyServer.getHttpPort;
-import static org.apache.axis2.integration.JettyServer.getHttpsPort;
 import static org.apache.axis2.integration.JettyServer.CLIENT_KEYSTORE;
 import static org.apache.axis2.integration.JettyServer.KEYSTORE_PASSWORD;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.fail;
 
-import junit.framework.TestCase;
 import org.apache.axiom.om.OMAbstractFactory;
 import org.apache.axiom.om.OMElement;
 import org.apache.axiom.om.OMFactory;
@@ -39,14 +38,22 @@
 import org.apache.axis2.integration.JettyServer;
 import org.apache.neethi.Policy;
 import org.apache.neethi.PolicyEngine;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
 
 import java.util.MissingResourceException;
 import java.util.ResourceBundle;
 
 
-public class RampartTest extends TestCase {
+public class RampartTest {
 
     private static ResourceBundle resources;
+    
+    @Rule
+    public final JettyServer server = new JettyServer(Constants.TESTING_PATH + "rampart_service_repo", 0, 0);
+    
     private String trustStore;
     private String trustStorePassword;
     private String trustStoreType;
@@ -59,11 +66,8 @@
         }
     }
 
-    public RampartTest(String name) {
-        super(name);
-    }
-
-    protected void setUp() throws Exception {
+    @Before
+    public void setUp() throws Exception {
         trustStore = System.getProperty("javax.net.ssl.trustStore");
         System.setProperty("javax.net.ssl.trustStore", CLIENT_KEYSTORE);
         
@@ -72,36 +76,30 @@
         
         trustStoreType = System.getProperty("javax.net.ssl.trustStoreType");
         System.setProperty("javax.net.ssl.trustStoreType", "JKS");
-             
-        JettyServer.start(Constants.TESTING_PATH + "rampart_service_repo");
     }
     
 
-    protected void tearDown() throws Exception {
-        try {
-            JettyServer.stop();
+    @After
+    public void tearDown() throws Exception {
+        if (trustStore != null) {
+            System.setProperty("javax.net.ssl.trustStore", trustStore);
         }
-        finally {
-            if (trustStore != null) {
-                System.setProperty("javax.net.ssl.trustStore", trustStore);
-            }
-            else {
-                System.clearProperty("javax.net.ssl.trustStore");
-            }
-            
-            if (trustStorePassword != null) {
-                System.setProperty("javax.net.ssl.trustStorePassword", trustStorePassword);    
-            }
-            else {
-                System.clearProperty("javax.net.ssl.trustStorePassword");
-            }
-            
-            if (trustStoreType != null) {
-                System.setProperty("javax.net.ssl.trustStoreType", trustStoreType);
-            }
-            else {
-                System.clearProperty("javax.net.ssl.trustStoreType");
-            }
+        else {
+            System.clearProperty("javax.net.ssl.trustStore");
+        }
+        
+        if (trustStorePassword != null) {
+            System.setProperty("javax.net.ssl.trustStorePassword", trustStorePassword);    
+        }
+        else {
+            System.clearProperty("javax.net.ssl.trustStorePassword");
+        }
+        
+        if (trustStoreType != null) {
+            System.setProperty("javax.net.ssl.trustStoreType", trustStoreType);
+        }
+        else {
+            System.clearProperty("javax.net.ssl.trustStoreType");
         }
     }
 
@@ -121,6 +119,7 @@
 
     }
 
+    @Test
     public void testWithPolicy() {
         try {
 
@@ -149,7 +148,7 @@
                 
                 if( i == 13 ) {
                     options.setTo(new EndpointReference("https://localhost:" +
-                                    getHttpsPort() +  
+                                    server.getHttpsPort() +  
                                     "/axis2/services/SecureService" + i));
                     //Username token created with user/pass from options
                     options.setUserName("alice");
@@ -157,7 +156,7 @@
                 }
                 else {
                     options.setTo(new EndpointReference("http://localhost:" +
-                                    getHttpPort() +  
+                                    server.getHttpPort() +  
                                     "/axis2/services/SecureService" + i));
                 }
                 
@@ -225,7 +224,7 @@
 
                 if (i == 13) {
                     options.setTo(new EndpointReference("https://localhost:" +
-                                    getHttpsPort() +
+                                    server.getHttpsPort() +
                                     "/axis2/services/SecureService" + i));
                     //Username token created with user/pass from options
                     options.setUserName("alice");
@@ -233,7 +232,7 @@
                 }
                 else {
                     options.setTo(new EndpointReference("http://localhost:" +
-                                    getHttpPort() +
+                                    server.getHttpPort() +
                                     "/axis2/services/SecureService" + i));
                 }
                 System.out.println("Testing WS-Sec: negative scenario " + i);
@@ -259,10 +258,10 @@
                 Options options = new Options();
                 
                 if (i == 3 || i == 6) {
-                    options.setTo(new EndpointReference("https://localhost:" + getHttpsPort() + "/axis2/services/SecureServiceSC" + i));
+                    options.setTo(new EndpointReference("https://localhost:" + server.getHttpsPort() + "/axis2/services/SecureServiceSC" + i));
                 }
                 else {
-                    options.setTo(new EndpointReference("http://localhost:" + getHttpPort() + "/axis2/services/SecureServiceSC" + i));
+                    options.setTo(new EndpointReference("http://localhost:" + server.getHttpPort() + "/axis2/services/SecureServiceSC" + i));
                 }
 
                 System.out.println("Testing WS-SecConv: custom scenario " + i);
diff --git a/pom.xml b/pom.xml
index bb52e99..4f49a17 100644
--- a/pom.xml
+++ b/pom.xml
@@ -547,7 +547,7 @@
             <dependency>
                 <groupId>junit</groupId>
                 <artifactId>junit</artifactId>
-                <version>3.8.2</version>
+                <version>4.12</version>
             </dependency>
             <dependency>
                 <groupId>xmlunit</groupId>
@@ -616,7 +616,7 @@
         <axis2.version>1.8.0-SNAPSHOT</axis2.version>
         <axiom.version>1.3.0-SNAPSHOT</axiom.version>
 
-        <wss4j.version>1.6.17</wss4j.version>
+        <wss4j.version>1.6.19</wss4j.version>
         <opensaml.version>2.5.1-1</opensaml.version>
 
         <bcprov.jdk15.version>1.49</bcprov.jdk15.version>
