diff --git a/apps/acl/src/test/java/org/onosproject/acl/AclWebResourceTest.java b/apps/acl/src/test/java/org/onosproject/acl/AclWebResourceTest.java
index c554db6..34765a4 100644
--- a/apps/acl/src/test/java/org/onosproject/acl/AclWebResourceTest.java
+++ b/apps/acl/src/test/java/org/onosproject/acl/AclWebResourceTest.java
@@ -20,9 +20,8 @@
 
 package org.onosproject.acl;
 
-import com.sun.jersey.api.client.WebResource;
-import com.sun.jersey.test.framework.AppDescriptor;
-import com.sun.jersey.test.framework.WebAppDescriptor;
+import org.glassfish.jersey.server.ResourceConfig;
+import org.glassfish.jersey.test.JerseyTest;
 import org.junit.After;
 import org.junit.Before;
 import org.junit.Ignore;
@@ -31,30 +30,42 @@
 import org.onlab.osgi.TestServiceDirectory;
 import org.onlab.rest.BaseResource;
 import org.onosproject.core.IdGenerator;
-import org.onosproject.rest.ResourceTest;
 
+import javax.ws.rs.client.Entity;
+import javax.ws.rs.client.WebTarget;
 import java.io.IOException;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.concurrent.atomic.AtomicLong;
 
-import static org.easymock.EasyMock.*;
+import static org.easymock.EasyMock.createMock;
+import static org.easymock.EasyMock.expect;
+import static org.easymock.EasyMock.replay;
+import static org.easymock.EasyMock.verify;
 import static org.hamcrest.Matchers.containsString;
 import static org.junit.Assert.assertThat;
 
 /**
  * Test class for ACL application REST resource.
  */
-public class AclWebResourceTest extends ResourceTest {
+public class AclWebResourceTest extends JerseyTest {
 
     final AclService mockAclService = createMock(AclService.class);
     final AclStore mockAclStore = createMock(AclStore.class);
     final List<AclRule> rules = new ArrayList<>();
 
+    /**
+     * Constructs a control metrics collector resource test instance.
+     */
+    public AclWebResourceTest() {
+        super(ResourceConfig.forApplicationClass(AclWebApplication.class));
+    }
+
     @Before
-    public void setUp() {
+    public void setUpMock() {
         expect(mockAclService.getAclRules()).andReturn(rules).anyTimes();
-        ServiceDirectory testDirectory = new TestServiceDirectory().add(AclService.class, mockAclService)
+        ServiceDirectory testDirectory = new TestServiceDirectory()
+                .add(AclService.class, mockAclService)
                 .add(AclStore.class, mockAclStore);
         BaseResource.setServiceDirectory(testDirectory);
 
@@ -79,64 +90,62 @@
         }
     }
 
-    @Override
-    public AppDescriptor configure() {
-        return new WebAppDescriptor.Builder("org.onosproject.acl").build();
-    }
-
     @Test
     @Ignore("FIXME: This needs to get reworked")
     public void addRule() throws IOException {
-        WebResource.Builder rs = resource().path("rules").header("Content-type", "application/json");
+        WebTarget wt = target();
         String response;
         String json;
 
         replay(mockAclService);
 
+        // FIXME: following code snippet requires refactoring by extracting
+        // json string as a separated file
+
         // input a invalid JSON string that contains neither nw_src and nw_dst
         json = "{\"ipProto\":\"TCP\",\"dstTpPort\":\"80\"}";
-        response = rs.post(String.class, json);
+        response = wt.request().post(Entity.json(json), String.class);
         assertThat(response, containsString("Failed! Either srcIp or dstIp must be assigned."));
 
         // input a invalid JSON string that doesn't contain CIDR mask bits
         json = "{\"ipProto\":\"TCP\",\"srcIp\":\"10.0.0.1\",\"dstTpPort\":\"80\",\"action\":\"DENY\"}";
-        response = rs.post(String.class, json);
+        response = wt.request().post(Entity.json(json), String.class);
         assertThat(response, containsString("Malformed IPv4 prefix string: 10.0.0.1. " +
                                                     "Address must take form \"x.x.x.x/y\""));
 
         // input a invalid JSON string that contains a invalid IP address
         json = "{\"ipProto\":\"TCP\",\"srcIp\":\"10.0.0.256/32\",\"dstTpPort\":\"80\",\"action\":\"DENY\"}";
-        response = rs.post(String.class, json);
+        response = wt.request().post(Entity.json(json), String.class);
         assertThat(response, containsString("Invalid IP address string: 10.0.0.256"));
 
         // input a invalid JSON string that contains a invalid IP address
         json = "{\"ipProto\":\"TCP\",\"srcIp\":\"10.0.01/32\",\"dstTpPort\":\"80\",\"action\":\"DENY\"}";
-        response = rs.post(String.class, json);
+        response = wt.request().post(Entity.json(json), String.class);
         assertThat(response, containsString("Invalid IP address string: 10.0.01"));
 
         // input a invalid JSON string that contains a invalid CIDR mask bits
         json = "{\"ipProto\":\"TCP\",\"srcIp\":\"10.0.0.1/a\",\"dstTpPort\":\"80\",\"action\":\"DENY\"}";
-        response = rs.post(String.class, json);
+        response = wt.request().post(Entity.json(json), String.class);
         assertThat(response, containsString("Failed! For input string: \"a\""));
 
         // input a invalid JSON string that contains a invalid CIDR mask bits
         json = "{\"ipProto\":\"TCP\",\"srcIp\":\"10.0.0.1/33\",\"dstTpPort\":\"80\",\"action\":\"DENY\"}";
-        response = rs.post(String.class, json);
+        response = wt.request().post(Entity.json(json), String.class);
         assertThat(response, containsString("Invalid prefix length 33. The value must be in the interval [0, 32]"));
 
         // input a invalid JSON string that contains a invalid ipProto value
         json = "{\"ipProto\":\"ARP\",\"srcIp\":\"10.0.0.1/32\",\"dstTpPort\":\"80\",\"action\":\"DENY\"}";
-        response = rs.post(String.class, json);
+        response = wt.request().post(Entity.json(json), String.class);
         assertThat(response, containsString("ipProto must be assigned to TCP, UDP, or ICMP."));
 
         // input a invalid JSON string that contains a invalid dstTpPort value
         json = "{\"ipProto\":\"TCP\",\"srcIp\":\"10.0.0.1/32\",\"dstTpPort\":\"a\",\"action\":\"DENY\"}";
-        response = rs.post(String.class, json);
+        response = wt.request().post(Entity.json(json), String.class);
         assertThat(response, containsString("dstTpPort must be assigned to a numerical value."));
 
         // input a invalid JSON string that contains a invalid action value
         json = "{\"ipProto\":\"TCP\",\"srcIp\":\"10.0.0.1/32\",\"dstTpPort\":\"80\",\"action\":\"PERMIT\"}";
-        response = rs.post(String.class, json);
+        response = wt.request().post(Entity.json(json), String.class);
         assertThat(response, containsString("action must be assigned to ALLOW or DENY."));
     }
 }
