diff --git a/core/src/main/java/de/ids_mannheim/korap/web/ClientsHandler.java b/core/src/main/java/de/ids_mannheim/korap/web/ClientsHandler.java
index 8bf4d7f..4ae0a53 100644
--- a/core/src/main/java/de/ids_mannheim/korap/web/ClientsHandler.java
+++ b/core/src/main/java/de/ids_mannheim/korap/web/ClientsHandler.java
@@ -1,9 +1,9 @@
 package de.ids_mannheim.korap.web;
 
-import com.sun.jersey.api.client.UniformInterfaceException;
 import de.ids_mannheim.korap.exceptions.KustvaktException;
 import de.ids_mannheim.korap.exceptions.StatusCodes;
 
+import javax.ws.rs.WebApplicationException;
 import javax.ws.rs.client.Client;
 import javax.ws.rs.client.ClientBuilder;
 import javax.ws.rs.client.WebTarget;
@@ -33,7 +33,7 @@
         try {
             return service.path(path).queryParam(key, value).request().get(String.class);
         }
-        catch (UniformInterfaceException e) {
+        catch (WebApplicationException e) {
             throw new KustvaktException(StatusCodes.REQUEST_INVALID);
         }
     }
@@ -51,7 +51,7 @@
             }
             return resource.request().get(String.class);
         }
-        catch (UniformInterfaceException e) {
+        catch (WebApplicationException e) {
             throw new KustvaktException(StatusCodes.REQUEST_INVALID);
         }
     }
diff --git a/full/src/test/java/de/ids_mannheim/korap/authentication/LdapOAuth2Test.java b/full/src/test/java/de/ids_mannheim/korap/authentication/LdapOAuth2Test.java
index ea19da9..638e8b9 100644
--- a/full/src/test/java/de/ids_mannheim/korap/authentication/LdapOAuth2Test.java
+++ b/full/src/test/java/de/ids_mannheim/korap/authentication/LdapOAuth2Test.java
@@ -20,8 +20,7 @@
 
 import com.fasterxml.jackson.databind.JsonNode;
 import com.google.common.net.HttpHeaders;
-import com.sun.jersey.api.client.ClientHandlerException;
-import com.sun.jersey.api.client.UniformInterfaceException;
+import javax.ws.rs.ProcessingException;
 import javax.ws.rs.core.Response;
 import javax.ws.rs.client.Entity;
 import com.unboundid.ldap.sdk.LDAPException;
@@ -120,7 +119,7 @@
     }
     
     private void testRegisterPublicClient (String accessToken)
-            throws ClientHandlerException, UniformInterfaceException,
+            throws ProcessingException,
             KustvaktException {
         OAuth2ClientJson json = new OAuth2ClientJson();
         json.setName("LDAP test client");
@@ -144,7 +143,7 @@
     }
     
     private JsonNode testRegisterConfidentialClient (String accessToken)
-            throws ClientHandlerException, UniformInterfaceException,
+            throws ProcessingException,
             KustvaktException {
         OAuth2ClientJson json = new OAuth2ClientJson();
         json.setName("LDAP test client");
diff --git a/full/src/test/java/de/ids_mannheim/korap/web/controller/AvailabilityTest.java b/full/src/test/java/de/ids_mannheim/korap/web/controller/AvailabilityTest.java
index a6b6e42..e2605ab 100644
--- a/full/src/test/java/de/ids_mannheim/korap/web/controller/AvailabilityTest.java
+++ b/full/src/test/java/de/ids_mannheim/korap/web/controller/AvailabilityTest.java
@@ -8,8 +8,7 @@
 
 import com.fasterxml.jackson.databind.JsonNode;
 import com.google.common.net.HttpHeaders;
-import com.sun.jersey.api.client.ClientHandlerException;
-import com.sun.jersey.api.client.UniformInterfaceException;
+import javax.ws.rs.ProcessingException;
 import javax.ws.rs.core.Response;
 import javax.ws.rs.core.Response.Status;
 
@@ -147,7 +146,7 @@
 
 
     private Response searchQueryWithIP (String collectionQuery, String ip)
-            throws UniformInterfaceException, ClientHandlerException,
+            throws ProcessingException,
             KustvaktException {
         return target().path(API_VERSION).path("search").queryParam("q", "[orth=das]")
                 .queryParam("ql", "poliqarp").queryParam("cq", collectionQuery)
diff --git a/full/src/test/java/de/ids_mannheim/korap/web/controller/MultipleCorpusQueryTest.java b/full/src/test/java/de/ids_mannheim/korap/web/controller/MultipleCorpusQueryTest.java
index 23fd917..911e716 100644
--- a/full/src/test/java/de/ids_mannheim/korap/web/controller/MultipleCorpusQueryTest.java
+++ b/full/src/test/java/de/ids_mannheim/korap/web/controller/MultipleCorpusQueryTest.java
@@ -6,8 +6,7 @@
 import org.junit.Test;
 
 import com.fasterxml.jackson.databind.JsonNode;
-import com.sun.jersey.api.client.ClientHandlerException;
-import com.sun.jersey.api.client.UniformInterfaceException;
+import javax.ws.rs.ProcessingException;
 import javax.ws.rs.core.Response;
 import javax.ws.rs.core.Response.Status;
 
@@ -44,7 +43,7 @@
 
     @Test
     public void testStatisticsWithMultipleCq ()
-            throws UniformInterfaceException, ClientHandlerException,
+            throws ProcessingException,
             KustvaktException {
         Response response = target().path(API_VERSION)
                 .path("statistics").queryParam("cq", "textType=Abhandlung")
@@ -65,7 +64,7 @@
 
     @Test
     public void testStatisticsWithMultipleCorpusQuery ()
-            throws UniformInterfaceException, ClientHandlerException,
+            throws ProcessingException,
             KustvaktException {
         Response response =
                 target().path(API_VERSION).path("statistics")
diff --git a/full/src/test/java/de/ids_mannheim/korap/web/controller/OAuth2AdminControllerTest.java b/full/src/test/java/de/ids_mannheim/korap/web/controller/OAuth2AdminControllerTest.java
index 3464dfd..db29dec 100644
--- a/full/src/test/java/de/ids_mannheim/korap/web/controller/OAuth2AdminControllerTest.java
+++ b/full/src/test/java/de/ids_mannheim/korap/web/controller/OAuth2AdminControllerTest.java
@@ -12,8 +12,7 @@
 
 import com.fasterxml.jackson.databind.JsonNode;
 import com.google.common.net.HttpHeaders;
-import com.sun.jersey.api.client.ClientHandlerException;
-import com.sun.jersey.api.client.UniformInterfaceException;
+import javax.ws.rs.ProcessingException;
 import javax.ws.rs.core.Response;
 import javax.ws.rs.client.Entity;
 import javax.ws.rs.core.Response.Status;
@@ -46,7 +45,7 @@
 
     private Response updateClientPrivilege (String username,
             Form form)
-            throws UniformInterfaceException, ClientHandlerException,
+            throws ProcessingException,
             KustvaktException {
         Response response = target().path(API_VERSION).path("oauth2")
                 .path("admin").path("client").path("privilege")
@@ -61,7 +60,7 @@
     }
     
     private void updateClientPriviledge (String clientId, boolean isSuper)
-            throws UniformInterfaceException, ClientHandlerException,
+            throws ProcessingException,
             KustvaktException {
         Form form = new Form();
         form.param("client_id", clientId);
diff --git a/full/src/test/java/de/ids_mannheim/korap/web/controller/OAuth2ClientControllerTest.java b/full/src/test/java/de/ids_mannheim/korap/web/controller/OAuth2ClientControllerTest.java
index f158fb6..a0655c6 100644
--- a/full/src/test/java/de/ids_mannheim/korap/web/controller/OAuth2ClientControllerTest.java
+++ b/full/src/test/java/de/ids_mannheim/korap/web/controller/OAuth2ClientControllerTest.java
@@ -22,8 +22,7 @@
 
 import com.fasterxml.jackson.databind.JsonNode;
 import com.google.common.net.HttpHeaders;
-import com.sun.jersey.api.client.ClientHandlerException;
-import com.sun.jersey.api.client.UniformInterfaceException;
+import javax.ws.rs.ProcessingException;
 import javax.ws.rs.core.Response;
 import javax.ws.rs.core.Response.Status;
 import javax.ws.rs.client.Entity;
@@ -132,7 +131,7 @@
     
     @Test
     public void testRegisterClientNameTooShort ()
-            throws UniformInterfaceException, ClientHandlerException,
+            throws ProcessingException,
             KustvaktException {
         OAuth2ClientJson clientJson =
                 createOAuth2ClientJson("R", OAuth2ClientType.PUBLIC, null);
@@ -147,8 +146,8 @@
     }
 
     @Test
-    public void testRegisterClientEmptyName () throws UniformInterfaceException,
-            ClientHandlerException, KustvaktException {
+    public void testRegisterClientEmptyName ()
+            throws ProcessingException, KustvaktException {
         OAuth2ClientJson clientJson =
                 createOAuth2ClientJson("", OAuth2ClientType.PUBLIC, null);
 
@@ -163,7 +162,7 @@
 
     @Test
     public void testRegisterClientMissingName ()
-            throws UniformInterfaceException, ClientHandlerException,
+            throws ProcessingException,
             KustvaktException {
         OAuth2ClientJson clientJson =
                 createOAuth2ClientJson(null, OAuth2ClientType.PUBLIC, null);
@@ -179,7 +178,7 @@
 
     @Test
     public void testRegisterClientMissingDescription ()
-            throws UniformInterfaceException, ClientHandlerException,
+            throws ProcessingException,
             KustvaktException {
         OAuth2ClientJson clientJson = createOAuth2ClientJson("R client",
                 OAuth2ClientType.PUBLIC, null);
@@ -195,7 +194,7 @@
 
     @Test
     public void testRegisterClientMissingType ()
-            throws UniformInterfaceException, ClientHandlerException,
+            throws ProcessingException,
             KustvaktException {
         OAuth2ClientJson clientJson =
                 createOAuth2ClientJson("R client", null, null);
@@ -211,7 +210,7 @@
     
     @Test
     public void testRegisterClientInvalidRedirectURI ()
-            throws UniformInterfaceException, ClientHandlerException,
+            throws ProcessingException,
             KustvaktException {
         // invalid hostname
         String redirectUri = "https://test.public.client/redirect";
@@ -240,7 +239,7 @@
     
     @Test
     public void testRegisterPublicClientWithRefreshTokenExpiry ()
-            throws UniformInterfaceException, ClientHandlerException,
+            throws ProcessingException,
             KustvaktException {
         OAuth2ClientJson clientJson =
                 createOAuth2ClientJson("OAuth2PublicClient",
@@ -254,7 +253,7 @@
     
     @Test
     public void testRegisterConfidentialClientWithRefreshTokenExpiry ()
-            throws UniformInterfaceException, ClientHandlerException,
+            throws ProcessingException,
             KustvaktException {
         int expiry = 31535000;
         OAuth2ClientJson clientJson =
@@ -272,7 +271,7 @@
     
     @Test
     public void testRegisterConfidentialClientWithInvalidRefreshTokenExpiry ()
-            throws UniformInterfaceException, ClientHandlerException,
+            throws ProcessingException,
             KustvaktException {
         OAuth2ClientJson clientJson = createOAuth2ClientJson(
                 "OAuth2 Confidential Client", OAuth2ClientType.CONFIDENTIAL,
@@ -289,7 +288,7 @@
     
     @Test
     public void testRegisterClientInvalidURL ()
-            throws UniformInterfaceException, ClientHandlerException,
+            throws ProcessingException,
             KustvaktException {
         // invalid hostname
         String url = "https://test.public.client";
@@ -318,8 +317,8 @@
     }
 
     @Test
-    public void testRegisterPublicClient () throws UniformInterfaceException,
-            ClientHandlerException, KustvaktException {
+    public void testRegisterPublicClient ()
+            throws ProcessingException, KustvaktException {
         String redirectUri = "https://public.client.com/redirect";
         OAuth2ClientJson clientJson =
                 createOAuth2ClientJson("OAuth2PublicClient",
@@ -343,7 +342,7 @@
     }
 
     private void testRegisterClientUnauthorizedScope (String clientId)
-            throws UniformInterfaceException, ClientHandlerException,
+            throws ProcessingException,
             KustvaktException {
 
         String userAuthHeader = HttpAuthorizationHandler
@@ -378,7 +377,7 @@
 
     @Test
     public void testRegisterClientUsingPlainJson ()
-            throws UniformInterfaceException, ClientHandlerException,
+            throws ProcessingException,
             KustvaktException, IOException {
 
         InputStream is = getClass().getClassLoader()
@@ -407,8 +406,8 @@
     }
 
     @Test
-    public void testRegisterDesktopApp () throws UniformInterfaceException,
-            ClientHandlerException, KustvaktException {
+    public void testRegisterDesktopApp ()
+            throws ProcessingException, KustvaktException {
         OAuth2ClientJson clientJson = createOAuth2ClientJson(
                 "OAuth2DesktopClient", OAuth2ClientType.PUBLIC,
                 "This is a desktop test client.");
@@ -429,7 +428,7 @@
 
     @Test
     public void testRegisterMultipleDesktopApps ()
-            throws UniformInterfaceException, ClientHandlerException,
+            throws ProcessingException,
             KustvaktException {
 
         // First client
@@ -502,8 +501,8 @@
     }
 
     private void testDeregisterPublicClientMissingUserAuthentication (
-            String clientId) throws UniformInterfaceException,
-            ClientHandlerException, KustvaktException {
+            String clientId) throws
+            ProcessingException, KustvaktException {
 
         Response response = target().path(API_VERSION).path("oauth2")
                 .path("client").path("deregister").path(clientId)
@@ -519,7 +518,7 @@
     }
 
     private void testDeregisterPublicClientMissingId ()
-            throws UniformInterfaceException, ClientHandlerException,
+            throws ProcessingException,
             KustvaktException {
 
         Response response = target().path(API_VERSION).path("oauth2")
@@ -534,7 +533,7 @@
     }
 
     private void testDeregisterPublicClient (String clientId, String username)
-            throws UniformInterfaceException, ClientHandlerException,
+            throws ProcessingException,
             KustvaktException {
 
         Response response = target().path(API_VERSION).path("oauth2")
@@ -548,7 +547,7 @@
     }
 
     private void testResetPublicClientSecret (String clientId)
-            throws UniformInterfaceException, ClientHandlerException,
+            throws ProcessingException,
             KustvaktException {
         Form form = new Form();
         form.param("client_id", clientId);
@@ -571,8 +570,8 @@
     }
 
     private String testResetConfidentialClientSecret (String clientId,
-            String clientSecret) throws UniformInterfaceException,
-            ClientHandlerException, KustvaktException {
+            String clientSecret) throws
+            ProcessingException, KustvaktException {
         Form form = new Form();
         form.param("client_id", clientId);
         form.param("client_secret", clientSecret);
@@ -648,7 +647,7 @@
     }
     
     private void testListConfidentialClient (String username, String clientId)
-            throws UniformInterfaceException, ClientHandlerException,
+            throws ProcessingException,
             KustvaktException {
         JsonNode node = listUserRegisteredClients(username);
         assertEquals(1, node.size());
diff --git a/full/src/test/java/de/ids_mannheim/korap/web/controller/OAuth2OpenIdControllerTest.java b/full/src/test/java/de/ids_mannheim/korap/web/controller/OAuth2OpenIdControllerTest.java
index 01f70e1..b53b90d 100644
--- a/full/src/test/java/de/ids_mannheim/korap/web/controller/OAuth2OpenIdControllerTest.java
+++ b/full/src/test/java/de/ids_mannheim/korap/web/controller/OAuth2OpenIdControllerTest.java
@@ -30,8 +30,7 @@
 import com.nimbusds.jwt.JWTClaimsSet;
 import com.nimbusds.jwt.SignedJWT;
 import com.nimbusds.oauth2.sdk.GrantType;
-import com.sun.jersey.api.client.ClientHandlerException;
-import com.sun.jersey.api.client.UniformInterfaceException;
+import javax.ws.rs.ProcessingException;
 import javax.ws.rs.core.Response;
 import javax.ws.rs.client.Entity;
 
@@ -78,7 +77,7 @@
 
     @Test
     public void testRequestAuthorizationCode ()
-            throws UniformInterfaceException, ClientHandlerException,
+            throws ProcessingException,
             KustvaktException {
 
         Form form = new Form();
diff --git a/full/src/test/java/de/ids_mannheim/korap/web/controller/OAuth2PluginTest.java b/full/src/test/java/de/ids_mannheim/korap/web/controller/OAuth2PluginTest.java
index c1cecb8..9d9a398 100644
--- a/full/src/test/java/de/ids_mannheim/korap/web/controller/OAuth2PluginTest.java
+++ b/full/src/test/java/de/ids_mannheim/korap/web/controller/OAuth2PluginTest.java
@@ -16,8 +16,7 @@
 
 import com.fasterxml.jackson.databind.JsonNode;
 import com.google.common.net.HttpHeaders;
-import com.sun.jersey.api.client.ClientHandlerException;
-import com.sun.jersey.api.client.UniformInterfaceException;
+import javax.ws.rs.ProcessingException;
 import javax.ws.rs.core.Response;
 import javax.ws.rs.core.Response.Status;
 import javax.ws.rs.client.Entity;
@@ -41,8 +40,8 @@
     private InstalledPluginDao pluginDao;
 
     @Test
-    public void testRegisterPlugin () throws UniformInterfaceException,
-            ClientHandlerException, KustvaktException {
+    public void testRegisterPlugin () throws
+            ProcessingException, KustvaktException {
         JsonNode source = JsonUtils.readTree("{ \"plugin\" : \"source\"}");
 
         int refreshTokenExpiry = TimeUtils.convertTimeToSeconds("90D");
@@ -101,8 +100,8 @@
     }
 
     private void testRetrievePluginInfo (String clientId,
-            int refreshTokenExpiry) throws UniformInterfaceException,
-            ClientHandlerException, KustvaktException {
+            int refreshTokenExpiry) throws
+            ProcessingException, KustvaktException {
         JsonNode clientInfo = retrieveClientInfo(clientId, username);
         assertEquals(clientId, clientInfo.at("/client_id").asText());
         assertEquals("Plugin", clientInfo.at("/client_name").asText());
@@ -120,7 +119,7 @@
 
     private void testListUserRegisteredPlugins (String username,
             String clientId, String clientName, int refreshTokenExpiry)
-            throws UniformInterfaceException, ClientHandlerException,
+            throws ProcessingException,
             KustvaktException {
 
         JsonNode node = listUserRegisteredClients(username);
@@ -138,7 +137,7 @@
 
     @Test
     public void testListPluginsUnauthorizedPublic ()
-            throws UniformInterfaceException, ClientHandlerException,
+            throws ProcessingException,
             KustvaktException {
         Form form = new Form();
         form.param("super_client_id", publicClientId);
@@ -147,7 +146,7 @@
 
     @Test
     public void testListPluginsUnauthorizedConfidential ()
-            throws UniformInterfaceException, ClientHandlerException,
+            throws ProcessingException,
             KustvaktException {
         Form form = new Form();
         form.param("super_client_id", confidentialClientId2);
@@ -157,7 +156,7 @@
 
     @Test
     public void testListPluginsMissingClientSecret ()
-            throws UniformInterfaceException, ClientHandlerException,
+            throws ProcessingException,
             KustvaktException {
         Form form = new Form();
         form.param("super_client_id", confidentialClientId);
@@ -181,7 +180,7 @@
 
     private void testListPluginsClientUnauthorized (
             Form form)
-            throws UniformInterfaceException, ClientHandlerException,
+            throws ProcessingException,
             KustvaktException {
         Response response = target().path(API_VERSION).path("plugins")
                 .request()
@@ -203,7 +202,7 @@
 
     @Test
     public void testListPluginsUserUnauthorized ()
-            throws UniformInterfaceException, ClientHandlerException,
+            throws ProcessingException,
             KustvaktException {
 
         Form form = getSuperClientForm();
@@ -223,8 +222,8 @@
     }
 
     @Test
-    public void testListAllPlugins () throws UniformInterfaceException,
-            ClientHandlerException, KustvaktException {
+    public void testListAllPlugins () throws
+            ProcessingException, KustvaktException {
         JsonNode node = listPlugins(false);
         assertEquals(2, node.size());
         assertFalse(node.at("/0/client_id").isMissingNode());
@@ -240,7 +239,7 @@
     }
 
     private JsonNode listPlugins (boolean permitted_only)
-            throws UniformInterfaceException, ClientHandlerException,
+            throws ProcessingException,
             KustvaktException {
 
         Form form = getSuperClientForm();
@@ -262,8 +261,8 @@
     }
 
     private void testInstallConfidentialPlugin (String superClientId,
-            String clientId, String username) throws UniformInterfaceException,
-            ClientHandlerException, KustvaktException {
+            String clientId, String username) throws
+            ProcessingException, KustvaktException {
         Form form = getSuperClientForm();
         form.param("client_id", clientId);
         Response response = installPlugin(form);
@@ -284,8 +283,8 @@
     }
 
     @Test
-    public void testInstallPublicPlugin () throws UniformInterfaceException,
-            ClientHandlerException, KustvaktException {
+    public void testInstallPublicPlugin () throws
+            ProcessingException, KustvaktException {
         Form form = getSuperClientForm();
         form.param("client_id", publicClientId2);
         Response response = installPlugin(form);
@@ -314,7 +313,7 @@
 
     private void testInstallPluginRedundant (
             Form form)
-            throws UniformInterfaceException, ClientHandlerException,
+            throws ProcessingException,
             KustvaktException {
         Response response = installPlugin(form);
         String entity = response.readEntity(String.class);
@@ -325,7 +324,7 @@
     }
 
     private void testInstallPluginNotPermitted (String clientId)
-            throws UniformInterfaceException, ClientHandlerException,
+            throws ProcessingException,
             KustvaktException {
         Form form = getSuperClientForm();
         form.param("client_id", clientId);
@@ -339,7 +338,7 @@
 
     @Test
     public void testInstallPluginMissingClientId ()
-            throws UniformInterfaceException, ClientHandlerException,
+            throws ProcessingException,
             KustvaktException {
         Form form = getSuperClientForm();
         Response response = installPlugin(form);
@@ -352,7 +351,7 @@
 
     @Test
     public void testInstallPluginInvalidClientId ()
-            throws UniformInterfaceException, ClientHandlerException,
+            throws ProcessingException,
             KustvaktException {
         Form form = getSuperClientForm();
         form.param("client_id", "unknown");
@@ -367,7 +366,7 @@
 
     @Test
     public void testInstallPluginMissingSuperClientSecret ()
-            throws UniformInterfaceException, ClientHandlerException,
+            throws ProcessingException,
             KustvaktException {
         Form form = new Form();
         form.param("super_client_id", superClientId);
@@ -385,7 +384,7 @@
 
     @Test
     public void testInstallPluginMissingSuperClientId ()
-            throws UniformInterfaceException, ClientHandlerException,
+            throws ProcessingException,
             KustvaktException {
         Form form = new Form();
         Response response = installPlugin(form);
@@ -401,7 +400,7 @@
 
     @Test
     public void testInstallPluginUnauthorizedClient ()
-            throws UniformInterfaceException, ClientHandlerException,
+            throws ProcessingException,
             KustvaktException {
         Form form = new Form();
         form.param("super_client_id", confidentialClientId);
@@ -416,7 +415,7 @@
     }
 
     private Response installPlugin (Form form)
-            throws UniformInterfaceException, ClientHandlerException,
+            throws ProcessingException,
             KustvaktException {
         return target().path(API_VERSION).path("plugins").path("install")
                 .request()
@@ -428,7 +427,7 @@
     }
 
     private Response uninstallPlugin (String clientId, String username)
-            throws UniformInterfaceException, ClientHandlerException,
+            throws ProcessingException,
             KustvaktException {
 
         Form form = getSuperClientForm();
@@ -457,7 +456,7 @@
 
     @Test
     public void testListUserInstalledPlugins ()
-            throws UniformInterfaceException, ClientHandlerException,
+            throws ProcessingException,
             KustvaktException, IOException {
 
         testInstallConfidentialPlugin(superClientId, confidentialClientId,
@@ -505,7 +504,7 @@
     }
 
     private void testUninstallNotInstalledPlugin ()
-            throws UniformInterfaceException, ClientHandlerException,
+            throws ProcessingException,
             KustvaktException {
         Response response =
                 uninstallPlugin(confidentialClientId2, username);
@@ -518,7 +517,7 @@
 
     private JsonNode retrieveUserInstalledPlugin (
             Form form)
-            throws UniformInterfaceException, ClientHandlerException,
+            throws ProcessingException,
             KustvaktException {
         Response response = target().path(API_VERSION).path("plugins")
                 .path("installed")
diff --git a/full/src/test/java/de/ids_mannheim/korap/web/controller/OAuth2TestBase.java b/full/src/test/java/de/ids_mannheim/korap/web/controller/OAuth2TestBase.java
index d1bd166..c12a921 100644
--- a/full/src/test/java/de/ids_mannheim/korap/web/controller/OAuth2TestBase.java
+++ b/full/src/test/java/de/ids_mannheim/korap/web/controller/OAuth2TestBase.java
@@ -21,8 +21,7 @@
 
 import com.fasterxml.jackson.databind.JsonNode;
 import com.google.common.net.HttpHeaders;
-import com.sun.jersey.api.client.ClientHandlerException;
-import com.sun.jersey.api.client.UniformInterfaceException;
+import javax.ws.rs.ProcessingException;
 import javax.ws.rs.core.Response;
 import javax.ws.rs.client.Entity;
 import javax.ws.rs.client.WebTarget;
@@ -250,8 +249,8 @@
     }
 
     protected Response registerClient (String username,
-            OAuth2ClientJson json) throws UniformInterfaceException,
-            ClientHandlerException, KustvaktException {
+            OAuth2ClientJson json) throws
+            ProcessingException, KustvaktException {
         return target().path(API_VERSION).path("oauth2").path("client")
                 .path("register")
                 .request()
@@ -278,7 +277,7 @@
     }
 
     protected void testConfidentialClientInfo (String clientId, String username)
-            throws UniformInterfaceException, ClientHandlerException,
+            throws ProcessingException,
             KustvaktException {
         JsonNode clientInfo = retrieveClientInfo(clientId, username);
         assertEquals(clientId, clientInfo.at("/client_id").asText());
@@ -300,8 +299,8 @@
     }
 
     protected void deregisterClient (String username,
-            String clientId) throws UniformInterfaceException,
-            ClientHandlerException, KustvaktException {
+            String clientId) throws
+            ProcessingException, KustvaktException {
 
         Response response = target().path(API_VERSION).path("oauth2")
                 .path("client").path("deregister").path(clientId)
@@ -314,7 +313,7 @@
     }
 
     protected JsonNode retrieveClientInfo (String clientId, String username)
-            throws UniformInterfaceException, ClientHandlerException,
+            throws ProcessingException,
             KustvaktException {
         Response response = target().path(API_VERSION).path("oauth2")
                 .path("client").path(clientId)
@@ -405,7 +404,7 @@
     }
 
     protected JsonNode listUserRegisteredClients (String username)
-            throws UniformInterfaceException, ClientHandlerException,
+            throws ProcessingException,
             KustvaktException {
         Form form = getSuperClientForm();
         Response response = target().path(API_VERSION).path("oauth2")
diff --git a/full/src/test/java/de/ids_mannheim/korap/web/controller/QueryReferenceControllerTest.java b/full/src/test/java/de/ids_mannheim/korap/web/controller/QueryReferenceControllerTest.java
index 9b256c7..2e5ef40 100644
--- a/full/src/test/java/de/ids_mannheim/korap/web/controller/QueryReferenceControllerTest.java
+++ b/full/src/test/java/de/ids_mannheim/korap/web/controller/QueryReferenceControllerTest.java
@@ -7,8 +7,7 @@
 
 import com.fasterxml.jackson.databind.JsonNode;
 import com.google.common.net.HttpHeaders;
-import com.sun.jersey.api.client.ClientHandlerException;
-import com.sun.jersey.api.client.UniformInterfaceException;
+import javax.ws.rs.ProcessingException;
 import javax.ws.rs.core.Response;
 import javax.ws.rs.core.Response.Status;
 import javax.ws.rs.client.Entity;
@@ -54,7 +53,7 @@
     
     private void testUpdateQuery (String qName, String qCreator,
             String username, ResourceType type)
-            throws UniformInterfaceException, ClientHandlerException,
+            throws ProcessingException,
             KustvaktException {
         String json = "{\"query\": \"Sonne\""
                 + ",\"queryLanguage\": \"poliqarp\"}";
@@ -360,15 +359,15 @@
     }
 
     @Test
-    public void testListAvailableQueryForDory () throws UniformInterfaceException,
-            ClientHandlerException, KustvaktException {
+    public void testListAvailableQueryForDory () throws
+            ProcessingException, KustvaktException {
         JsonNode node = testListAvailableQuery("dory");
         assertEquals(2, node.size());
     }
 
     @Test
     public void testListAvailableQueryForPearl ()
-            throws UniformInterfaceException, ClientHandlerException,
+            throws ProcessingException,
             KustvaktException {
         
         JsonNode node = testListAvailableQuery("pearl");
@@ -384,7 +383,7 @@
     }
 
     private JsonNode testListAvailableQuery (String username)
-            throws UniformInterfaceException, ClientHandlerException,
+            throws ProcessingException,
             KustvaktException {
 
         Response response = target().path(API_VERSION).path("query")
diff --git a/full/src/test/java/de/ids_mannheim/korap/web/controller/UserGroupControllerAdminTest.java b/full/src/test/java/de/ids_mannheim/korap/web/controller/UserGroupControllerAdminTest.java
index 617757c..07db0a2 100644
--- a/full/src/test/java/de/ids_mannheim/korap/web/controller/UserGroupControllerAdminTest.java
+++ b/full/src/test/java/de/ids_mannheim/korap/web/controller/UserGroupControllerAdminTest.java
@@ -8,8 +8,7 @@
 
 import com.fasterxml.jackson.databind.JsonNode;
 import com.google.common.net.HttpHeaders;
-import com.sun.jersey.api.client.ClientHandlerException;
-import com.sun.jersey.api.client.UniformInterfaceException;
+import javax.ws.rs.ProcessingException;
 import javax.ws.rs.core.Response;
 import javax.ws.rs.core.Response.Status;
 import javax.ws.rs.client.Entity;
@@ -32,7 +31,7 @@
     private String testUser = "UserGroupControllerAdminTest";
 
     private JsonNode listGroup (String username)
-            throws UniformInterfaceException, ClientHandlerException,
+            throws ProcessingException,
             KustvaktException {
         Response response = target().path(API_VERSION).path("group")
                 .request()
@@ -85,8 +84,8 @@
 
     // same as list user-groups of the admin
     @Test
-    public void testListWithoutUsername () throws UniformInterfaceException,
-            ClientHandlerException, KustvaktException {
+    public void testListWithoutUsername () throws
+            ProcessingException, KustvaktException {
         Response response = target().path(API_VERSION).path("group")
                 .request()
                 .header(Attributes.AUTHORIZATION, HttpAuthorizationHandler
@@ -100,8 +99,8 @@
     }
 
     @Test
-    public void testListByStatusAll () throws UniformInterfaceException,
-            ClientHandlerException, KustvaktException {
+    public void testListByStatusAll () throws
+            ProcessingException, KustvaktException {
         Response response = target().path(API_VERSION).path("group")
                 .path("list").path("system-admin")
                 .request()
@@ -124,8 +123,8 @@
     }
 
     @Test
-    public void testListByStatusHidden () throws UniformInterfaceException,
-            ClientHandlerException, KustvaktException {
+    public void testListByStatusHidden () throws
+            ProcessingException, KustvaktException {
         Response response = target().path(API_VERSION).path("group")
                 .path("list").path("system-admin")
                 .queryParam("status", "HIDDEN")
@@ -143,8 +142,8 @@
     }
 
     @Test
-    public void testUserGroup () throws UniformInterfaceException,
-            ClientHandlerException, KustvaktException {
+    public void testUserGroup () throws
+            ProcessingException, KustvaktException {
 
         String groupName = "admin-test-group";
 
@@ -173,7 +172,7 @@
     }
 
     private void testMemberRole (String memberUsername, String groupName)
-            throws UniformInterfaceException, ClientHandlerException,
+            throws ProcessingException,
             KustvaktException {
 
         // accept invitation
@@ -194,7 +193,7 @@
     }
 
     private void testAddMemberRoles (String groupName, String memberUsername)
-            throws UniformInterfaceException, ClientHandlerException,
+            throws ProcessingException,
             KustvaktException {
         Form form = new Form();
         form.param("memberUsername", memberUsername);
@@ -227,7 +226,7 @@
     }
 
     private void testDeleteMemberRoles (String groupName, String memberUsername)
-            throws UniformInterfaceException, ClientHandlerException,
+            throws ProcessingException,
             KustvaktException {
         Form form = new Form();
         form.param("memberUsername", memberUsername);
@@ -257,7 +256,7 @@
     }
 
     private JsonNode retrieveGroup (String groupName)
-            throws UniformInterfaceException, ClientHandlerException,
+            throws ProcessingException,
             KustvaktException {
         Response response = target().path(API_VERSION).path("group")
                 .path("@" + groupName)
@@ -275,7 +274,7 @@
     }
 
     private void testDeleteGroup (String groupName)
-            throws UniformInterfaceException, ClientHandlerException,
+            throws ProcessingException,
             KustvaktException {
         // delete group
         Response response = target().path(API_VERSION).path("group")
@@ -294,7 +293,7 @@
     }
 
     private void testDeleteMember (String groupName)
-            throws UniformInterfaceException, ClientHandlerException,
+            throws ProcessingException,
             KustvaktException {
         // delete marlin from group
         Response response = target().path(API_VERSION).path("group")
@@ -317,7 +316,7 @@
     }
 
     private void testInviteMember (String groupName)
-            throws UniformInterfaceException, ClientHandlerException,
+            throws ProcessingException,
             KustvaktException {
         Form form = new Form();
         form.param("members", "marlin,nemo,darla");
diff --git a/full/src/test/java/de/ids_mannheim/korap/web/controller/UserGroupControllerTest.java b/full/src/test/java/de/ids_mannheim/korap/web/controller/UserGroupControllerTest.java
index b827408..f30baa9 100644
--- a/full/src/test/java/de/ids_mannheim/korap/web/controller/UserGroupControllerTest.java
+++ b/full/src/test/java/de/ids_mannheim/korap/web/controller/UserGroupControllerTest.java
@@ -11,8 +11,7 @@
 
 import com.fasterxml.jackson.databind.JsonNode;
 import com.google.common.net.HttpHeaders;
-import com.sun.jersey.api.client.ClientHandlerException;
-import com.sun.jersey.api.client.UniformInterfaceException;
+import javax.ws.rs.ProcessingException;
 import javax.ws.rs.core.Response;
 import javax.ws.rs.core.Response.Status;
 import javax.ws.rs.client.Entity;
@@ -42,7 +41,7 @@
     private String admin = "admin";
 
     private JsonNode retrieveUserGroups (String username)
-            throws UniformInterfaceException, ClientHandlerException,
+            throws ProcessingException,
             KustvaktException {
         Response response = target().path(API_VERSION).path("group")
                 .request()
@@ -144,8 +143,8 @@
 
     
     @Test
-    public void testCreateGroupEmptyDescription () throws UniformInterfaceException,
-            ClientHandlerException, KustvaktException {
+    public void testCreateGroupEmptyDescription () throws
+            ProcessingException, KustvaktException {
         String groupName = "empty_group";
         Response response = testCreateUserGroup(groupName,"");
         assertEquals(Status.CREATED.getStatusCode(), response.getStatus());
@@ -155,8 +154,8 @@
 
     
     @Test
-    public void testCreateGroupMissingDescription () throws UniformInterfaceException,
-            ClientHandlerException, KustvaktException {
+    public void testCreateGroupMissingDescription () throws
+            ProcessingException, KustvaktException {
         String groupName = "missing-desc-group";
 
         Response response = testCreateGroupWithoutDescription(groupName);
@@ -165,7 +164,7 @@
     }
     
     private Response testCreateUserGroup (String groupName, String description)
-            throws UniformInterfaceException, ClientHandlerException,
+            throws ProcessingException,
             KustvaktException {
         Form form = new Form();
         form.param("description", description);
@@ -182,7 +181,7 @@
     }
     
     private Response testCreateGroupWithoutDescription (String groupName)
-            throws UniformInterfaceException, ClientHandlerException,
+            throws ProcessingException,
             KustvaktException {
         Response response = target().path(API_VERSION).path("group")
                 .path("@"+groupName)
@@ -196,8 +195,8 @@
     }
     
     @Test
-    public void testCreateGroupInvalidName () throws UniformInterfaceException,
-            ClientHandlerException, KustvaktException {
+    public void testCreateGroupInvalidName () throws
+            ProcessingException, KustvaktException {
         String groupName = "invalid-group-name$"; 
 
         Response response = testCreateGroupWithoutDescription(groupName);
@@ -211,8 +210,8 @@
     }
     
     @Test
-    public void testCreateGroupNameTooShort () throws UniformInterfaceException,
-            ClientHandlerException, KustvaktException {
+    public void testCreateGroupNameTooShort () throws
+            ProcessingException, KustvaktException {
         String groupName = "a"; 
 
         Response response = testCreateGroupWithoutDescription(groupName);
@@ -226,8 +225,8 @@
     }
     
     @Test
-    public void testUserGroup () throws UniformInterfaceException,
-            ClientHandlerException, KustvaktException {
+    public void testUserGroup () throws
+            ProcessingException, KustvaktException {
 
         String groupName = "new-user-group";
         String description= "This is new-user-group.";
@@ -268,7 +267,7 @@
     }
 
     private void testUpdateUserGroup (String groupName)
-            throws UniformInterfaceException, ClientHandlerException,
+            throws ProcessingException,
             KustvaktException {
         String description = "Description is updated.";
         Response response = testCreateUserGroup(groupName, description);
@@ -280,7 +279,7 @@
     }
 
     private void testDeleteMember (String groupName)
-            throws UniformInterfaceException, ClientHandlerException,
+            throws ProcessingException,
             KustvaktException {
         // delete darla from group
         Response response = target().path(API_VERSION).path("group")
@@ -305,7 +304,7 @@
     }
 
     private void testDeleteMemberUnauthorized (String groupName)
-            throws UniformInterfaceException, ClientHandlerException,
+            throws ProcessingException,
             KustvaktException {
         // nemo is a group member
         Response response = target().path(API_VERSION).path("group")
@@ -327,8 +326,8 @@
     }
 
     // EM: same as cancel invitation
-    private void testDeletePendingMember () throws UniformInterfaceException,
-            ClientHandlerException, KustvaktException {
+    private void testDeletePendingMember () throws
+            ProcessingException, KustvaktException {
         // dory delete pearl
         Response response = target().path(API_VERSION).path("group")
                 .path("@dory-group").path("~pearl")
@@ -346,8 +345,8 @@
     }
 
     @Test
-    public void testDeleteDeletedMember () throws UniformInterfaceException,
-            ClientHandlerException, KustvaktException {
+    public void testDeleteDeletedMember () throws
+            ProcessingException, KustvaktException {
         Response response = target().path(API_VERSION).path("group")
                 .path("@dory-group").path("~pearl")
                 .request()
@@ -368,7 +367,7 @@
     }
 
     private void testDeleteGroup (String groupName)
-            throws UniformInterfaceException, ClientHandlerException,
+            throws ProcessingException,
             KustvaktException {
         // delete group
         Response response = target().path(API_VERSION).path("group")
@@ -407,8 +406,8 @@
     }
 
     @Test
-    public void testDeleteGroupUnauthorized () throws UniformInterfaceException,
-            ClientHandlerException, KustvaktException {
+    public void testDeleteGroupUnauthorized () throws
+            ProcessingException, KustvaktException {
         // dory is a group admin in marlin-group
         Response response = target().path(API_VERSION).path("group")
                 .path("@marlin-group")
@@ -429,8 +428,8 @@
     }
 
     @Test
-    public void testDeleteDeletedGroup () throws UniformInterfaceException,
-            ClientHandlerException, KustvaktException {
+    public void testDeleteDeletedGroup () throws
+            ProcessingException, KustvaktException {
         Response response = target().path(API_VERSION).path("group")
                 .path("@deleted-group")
                 .request()
@@ -450,8 +449,8 @@
     }
 
     @Test
-    public void testDeleteGroupOwner () throws UniformInterfaceException,
-            ClientHandlerException, KustvaktException {
+    public void testDeleteGroupOwner () throws
+            ProcessingException, KustvaktException {
         // delete marlin from marlin-group
         // dory is a group admin in marlin-group
         Response response = target().path(API_VERSION).path("group")
@@ -472,7 +471,7 @@
     }
 
     private void testInviteMember (String groupName)
-            throws UniformInterfaceException, ClientHandlerException,
+            throws ProcessingException,
             KustvaktException {
         Form form = new Form();
         form.param("members", "darla");
@@ -507,8 +506,8 @@
         assertEquals(0, node.at("/members/1/roles").size());
     }
 
-    private void testInviteDeletedMember () throws UniformInterfaceException,
-            ClientHandlerException, KustvaktException {
+    private void testInviteDeletedMember () throws
+            ProcessingException, KustvaktException {
         Form form = new Form();
         form.param("members", "marlin");
         
@@ -532,8 +531,8 @@
     }
 
     @Test
-    public void testInviteDeletedMember2 () throws UniformInterfaceException,
-            ClientHandlerException, KustvaktException {
+    public void testInviteDeletedMember2 () throws
+            ProcessingException, KustvaktException {
         // pearl has status deleted in dory-group
         Form form = new Form();
         form.param("members", "pearl");
@@ -559,8 +558,8 @@
     }
 
     @Test
-    public void testInvitePendingMember () throws UniformInterfaceException,
-            ClientHandlerException, KustvaktException {
+    public void testInvitePendingMember () throws
+            ProcessingException, KustvaktException {
         // marlin has status PENDING in dory-group
         Form form = new Form();
         form.param("members", "marlin");
@@ -587,8 +586,8 @@
     }
 
     @Test
-    public void testInviteActiveMember () throws UniformInterfaceException,
-            ClientHandlerException, KustvaktException {
+    public void testInviteActiveMember () throws
+            ProcessingException, KustvaktException {
         // nemo has status active in dory-group
         Form form = new Form();
         form.param("members", "nemo");
@@ -617,7 +616,7 @@
 
     @Test
     public void testInviteMemberToDeletedGroup ()
-            throws UniformInterfaceException, ClientHandlerException,
+            throws ProcessingException,
             KustvaktException {
         Form form = new Form();
         form.param("members", "nemo");
@@ -753,7 +752,7 @@
     }
 
     private void testSubscribeToDeletedGroup (String groupName)
-            throws UniformInterfaceException, ClientHandlerException,
+            throws ProcessingException,
             KustvaktException {
         Response response = target().path(API_VERSION).path("group")
                 .path("@"+groupName).path("subscribe")
@@ -773,7 +772,7 @@
     }
 
     private void testUnsubscribeActiveMember (String groupName)
-            throws UniformInterfaceException, ClientHandlerException,
+            throws ProcessingException,
             KustvaktException {
         Response response = target().path(API_VERSION).path("group")
                 .path("@"+groupName).path("unsubscribe")
@@ -815,7 +814,7 @@
 
     @Test
     public void testUnsubscribeDeletedMember ()
-            throws UniformInterfaceException, ClientHandlerException,
+            throws ProcessingException,
             KustvaktException {
         // pearl unsubscribes from dory-group
         Response response = target().path(API_VERSION).path("group")
@@ -839,7 +838,7 @@
 
     @Test
     public void testUnsubscribePendingMember ()
-            throws UniformInterfaceException, ClientHandlerException,
+            throws ProcessingException,
             KustvaktException {
 
         JsonNode node = retrieveUserGroups("marlin");
@@ -919,7 +918,7 @@
     }
 
     private void testUnsubscribeToDeletedGroup (String groupName)
-            throws UniformInterfaceException, ClientHandlerException,
+            throws ProcessingException,
             KustvaktException {
 
         Response response = target().path(API_VERSION).path("group")
@@ -940,8 +939,8 @@
     }
 
     @Test
-    public void testAddSameMemberRole () throws UniformInterfaceException,
-            ClientHandlerException, KustvaktException {
+    public void testAddSameMemberRole () throws
+            ProcessingException, KustvaktException {
         Form form = new Form();
         form.param("memberUsername", "dory");
         form.param("roleId", "1");
@@ -961,8 +960,8 @@
     }
 
     @Test
-    public void testDeleteAddMemberRole () throws UniformInterfaceException,
-            ClientHandlerException, KustvaktException {
+    public void testDeleteAddMemberRole () throws
+            ProcessingException, KustvaktException {
         Form form = new Form();
         form.param("memberUsername", "dory");
         form.param("roleId", "1");
@@ -984,8 +983,8 @@
     }
 
     @Test
-    public void testEditMemberRoleEmpty () throws UniformInterfaceException,
-            ClientHandlerException, KustvaktException {
+    public void testEditMemberRoleEmpty () throws
+            ProcessingException, KustvaktException {
         Form form = new Form();
         form.param("memberUsername", "dory");
         
@@ -1006,7 +1005,7 @@
     }
 
     private void testEditMemberRole ()
-            throws UniformInterfaceException, ClientHandlerException,
+            throws ProcessingException,
             KustvaktException {
         Form form = new Form();
         form.param("memberUsername", "dory");
diff --git a/full/src/test/java/de/ids_mannheim/korap/web/controller/VirtualCorpusControllerAdminTest.java b/full/src/test/java/de/ids_mannheim/korap/web/controller/VirtualCorpusControllerAdminTest.java
index f15499a..24caf0b 100644
--- a/full/src/test/java/de/ids_mannheim/korap/web/controller/VirtualCorpusControllerAdminTest.java
+++ b/full/src/test/java/de/ids_mannheim/korap/web/controller/VirtualCorpusControllerAdminTest.java
@@ -9,8 +9,7 @@
 
 import com.fasterxml.jackson.databind.JsonNode;
 import com.google.common.net.HttpHeaders;
-import com.sun.jersey.api.client.ClientHandlerException;
-import com.sun.jersey.api.client.UniformInterfaceException;
+import javax.ws.rs.ProcessingException;
 import javax.ws.rs.core.Response;
 import javax.ws.rs.core.Response.Status;
 import javax.ws.rs.client.Entity;
@@ -31,8 +30,8 @@
     private String username = "VirtualCorpusControllerAdminTest";
 
     @Test
-    public void testSearchPrivateVC () throws UniformInterfaceException,
-            ClientHandlerException, KustvaktException {
+    public void testSearchPrivateVC () throws
+            ProcessingException, KustvaktException {
         Response response = target().path(API_VERSION).path("vc")
                 .path("~dory").path("dory-vc")
                 .request()
@@ -51,8 +50,8 @@
     }
 
     @Test
-    public void testSearchProjectVC () throws UniformInterfaceException,
-            ClientHandlerException, KustvaktException {
+    public void testSearchProjectVC () throws
+            ProcessingException, KustvaktException {
 
         Response response = target().path(API_VERSION).path("vc")
                 .path("~dory").path("group-vc")
@@ -72,8 +71,8 @@
     }
 
     @Test
-    public void testListDoryVC () throws UniformInterfaceException,
-            ClientHandlerException, KustvaktException {
+    public void testListDoryVC () throws
+            ProcessingException, KustvaktException {
         Response response = target().path(API_VERSION).path("vc")
                 .queryParam("username", "dory")
                 .request()
@@ -89,8 +88,8 @@
         assertEquals(4, node.size());
     }
 
-    private JsonNode testListSystemVC () throws UniformInterfaceException,
-            ClientHandlerException, KustvaktException {
+    private JsonNode testListSystemVC () throws
+            ProcessingException, KustvaktException {
         Response response = target().path(API_VERSION).path("vc")
                 .path("list").path("system-admin").queryParam("type", "SYSTEM")
                 .queryParam("createdBy", "system")
@@ -129,7 +128,7 @@
     }
 
     private void testDeleteSystemVC (String vcCreator, String vcName)
-            throws UniformInterfaceException, ClientHandlerException,
+            throws ProcessingException,
             KustvaktException {
         Response response = target().path(API_VERSION).path("vc")
                 .path("~system").path(vcName)
@@ -146,8 +145,8 @@
     }
 
     @Test
-    public void testPrivateVC () throws UniformInterfaceException,
-            ClientHandlerException, KustvaktException {
+    public void testPrivateVC () throws
+            ProcessingException, KustvaktException {
         String json = "{\"type\": \"PRIVATE\""
                 + ",\"queryType\": \"VIRTUAL_CORPUS\""
                 + ",\"corpusQuery\": \"corpusSigle=GOE\"}";
@@ -172,7 +171,7 @@
     }
 
     private JsonNode testListUserVC (String username)
-            throws UniformInterfaceException, ClientHandlerException,
+            throws ProcessingException,
             KustvaktException {
         Response response = target().path(API_VERSION).path("vc")
                 .path("list").path("system-admin")
@@ -190,7 +189,7 @@
     }
 
     private void testEditPrivateVC (String vcCreator, String vcName)
-            throws UniformInterfaceException, ClientHandlerException,
+            throws ProcessingException,
             KustvaktException {
 
         String json = "{\"description\": \"edited vc\"}";
@@ -211,7 +210,7 @@
     }
 
     private void testDeletePrivateVC (String vcCreator, String vcName)
-            throws UniformInterfaceException, ClientHandlerException,
+            throws ProcessingException,
             KustvaktException {
         Response response = target().path(API_VERSION).path("vc")
                 .path("~"+vcCreator).path(vcName)
@@ -269,8 +268,8 @@
     }
 
     @Test
-    public void testVCSharing () throws UniformInterfaceException,
-            ClientHandlerException, KustvaktException {
+    public void testVCSharing () throws
+            ProcessingException, KustvaktException {
         String vcCreator = "marlin";
         String vcName = "marlin-vc";
         String groupName = "marlin-group";
@@ -285,8 +284,8 @@
     }
 
     private void testCreateVCAccess (String vcCreator, String vcName,
-            String groupName) throws UniformInterfaceException,
-            ClientHandlerException, KustvaktException {
+            String groupName) throws
+            ProcessingException, KustvaktException {
         Response response;
         // share VC
         response = target().path(API_VERSION).path("vc").path("~"+vcCreator)
@@ -302,7 +301,7 @@
     }
 
     private void testDeleteVCAccess (String accessId)
-            throws UniformInterfaceException, ClientHandlerException,
+            throws ProcessingException,
             KustvaktException {
 
         Response response = target().path(API_VERSION).path("vc")
diff --git a/full/src/test/java/de/ids_mannheim/korap/web/controller/VirtualCorpusControllerTest.java b/full/src/test/java/de/ids_mannheim/korap/web/controller/VirtualCorpusControllerTest.java
index ac0ed0a..dc92a5d 100644
--- a/full/src/test/java/de/ids_mannheim/korap/web/controller/VirtualCorpusControllerTest.java
+++ b/full/src/test/java/de/ids_mannheim/korap/web/controller/VirtualCorpusControllerTest.java
@@ -17,8 +17,7 @@
 
 import com.fasterxml.jackson.databind.JsonNode;
 import com.google.common.net.HttpHeaders;
-import com.sun.jersey.api.client.ClientHandlerException;
-import com.sun.jersey.api.client.UniformInterfaceException;
+import javax.ws.rs.ProcessingException;
 import javax.ws.rs.core.Response;
 import javax.ws.rs.core.Form;
 import javax.ws.rs.core.Response.Status;
@@ -58,7 +57,7 @@
     }
 
     private JsonNode testListVC (String username)
-            throws UniformInterfaceException, ClientHandlerException,
+            throws ProcessingException,
             KustvaktException {
         Response response = target().path(API_VERSION).path("vc")
                 .request()
@@ -74,7 +73,7 @@
     }
 
     private JsonNode testListOwnerVC (String username)
-            throws UniformInterfaceException, ClientHandlerException,
+            throws ProcessingException,
             KustvaktException {
         Response response = target().path(API_VERSION).path("vc")
                 .path("~" + username)
@@ -118,8 +117,8 @@
     }
 
     @Test
-    public void testRetrieveSystemVCInfo () throws UniformInterfaceException,
-            ClientHandlerException, KustvaktException {
+    public void testRetrieveSystemVCInfo () throws
+            ProcessingException, KustvaktException {
 
         JsonNode node = testSearchVC(testUser, "system", "system-vc");
         assertEquals("system-vc", node.at("/name").asText());
@@ -131,8 +130,8 @@
     }
 
     @Test
-    public void testRetrieveSystemVCGuest () throws UniformInterfaceException,
-            ClientHandlerException, KustvaktException {
+    public void testRetrieveSystemVCGuest () throws
+            ProcessingException, KustvaktException {
 
         Response response = target().path(API_VERSION).path("vc")
                 .path("~system").path("system-vc")
@@ -150,7 +149,7 @@
 
     @Test
     public void testRetrieveOwnerPrivateVCInfo ()
-            throws UniformInterfaceException, ClientHandlerException,
+            throws ProcessingException,
             KustvaktException {
 
         JsonNode node = testSearchVC("dory", "dory", "dory-vc");
@@ -161,7 +160,7 @@
 
     @Test
     public void testRetrievePrivateVCInfoUnauthorized ()
-            throws UniformInterfaceException, ClientHandlerException,
+            throws ProcessingException,
             KustvaktException {
         Response response = target().path(API_VERSION).path("vc")
                 .path("~dory").path("dory-vc")
@@ -182,8 +181,8 @@
     }
 
     @Test
-    public void testRetrieveProjectVCInfo () throws UniformInterfaceException,
-            ClientHandlerException, KustvaktException {
+    public void testRetrieveProjectVCInfo () throws
+            ProcessingException, KustvaktException {
 
         JsonNode node = testSearchVC("nemo", "dory", "group-vc");
         assertEquals("group-vc", node.at("/name").asText());
@@ -193,7 +192,7 @@
 
     @Test
     public void testRetrieveProjectVCInfoByNonActiveMember ()
-            throws UniformInterfaceException, ClientHandlerException,
+            throws ProcessingException,
             KustvaktException {
 
         Response response = target().path(API_VERSION).path("vc")
@@ -215,8 +214,8 @@
     }
 
     @Test
-    public void testRetrievePublishedVCInfo () throws UniformInterfaceException,
-            ClientHandlerException, KustvaktException {
+    public void testRetrievePublishedVCInfo () throws
+            ProcessingException, KustvaktException {
 
         JsonNode node = testSearchVC("gill", "marlin", "published-vc");
         assertEquals("published-vc", node.at("/name").asText());
@@ -242,31 +241,31 @@
     }
 
     @Test
-    public void testListAvailableVCNemo () throws UniformInterfaceException,
-            ClientHandlerException, KustvaktException {
+    public void testListAvailableVCNemo () throws
+            ProcessingException, KustvaktException {
         JsonNode node = testListVC("nemo");
         assertEquals(3, node.size());
 
     }
 
     @Test
-    public void testListAvailableVCPearl () throws UniformInterfaceException,
-            ClientHandlerException, KustvaktException {
+    public void testListAvailableVCPearl () throws
+            ProcessingException, KustvaktException {
         JsonNode node = testListVC("pearl");
         assertEquals(2, node.size());
 
     }
 
     @Test
-    public void testListAvailableVCDory () throws UniformInterfaceException,
-            ClientHandlerException, KustvaktException {
+    public void testListAvailableVCDory () throws
+            ProcessingException, KustvaktException {
         JsonNode node = testListVC("dory");
         assertEquals(4, node.size());
     }
 
     @Test
     public void testListAvailableVCByOtherUser ()
-            throws UniformInterfaceException, ClientHandlerException,
+            throws ProcessingException,
             KustvaktException {
         Response response = target().path(API_VERSION).path("vc")
                 .path("~dory")
@@ -288,8 +287,8 @@
     }
 
     @Test
-    public void testListAvailableVCByGuest () throws UniformInterfaceException,
-            ClientHandlerException, KustvaktException {
+    public void testListAvailableVCByGuest () throws
+            ProcessingException, KustvaktException {
         Response response = target().path(API_VERSION).path("vc")
                 .request()
                 .get();
@@ -401,7 +400,7 @@
     }
 
     private JsonNode testCheckHiddenGroup (String groupName)
-            throws UniformInterfaceException, ClientHandlerException,
+            throws ProcessingException,
             KustvaktException {
         Response response = target().path(API_VERSION).path("group")
                 .path("@"+groupName)
@@ -755,8 +754,8 @@
     }
 
     @Test
-    public void testEditCorpusQuery () throws UniformInterfaceException,
-            ClientHandlerException, KustvaktException {
+    public void testEditCorpusQuery () throws
+            ProcessingException, KustvaktException {
         JsonNode node = testRetrieveKoralQuery("dory", "dory-vc");
         assertEquals("koral:docGroup", node.at("/collection/@type").asText());
         assertEquals("operation:and", node.at("/collection/operation").asText());
@@ -781,7 +780,7 @@
     }
     
     private JsonNode testRetrieveKoralQuery (String username, String vcName)
-            throws UniformInterfaceException, ClientHandlerException,
+            throws ProcessingException,
             KustvaktException {
         Response response = target().path(API_VERSION).path("vc")
                 .path("koralQuery").path("~" + username).path(vcName)
@@ -931,8 +930,8 @@
     }
 
     @Test
-    public void testCreateDeleteAccess () throws UniformInterfaceException,
-            ClientHandlerException, KustvaktException {
+    public void testCreateDeleteAccess () throws
+            ProcessingException, KustvaktException {
 
         String vcName = "marlin-vc";
         String groupName = "marlin-group";
@@ -977,8 +976,8 @@
     }
 
     private Response testShareVCByCreator (String vcCreator,
-            String vcName, String groupName) throws UniformInterfaceException,
-            ClientHandlerException, KustvaktException {
+            String vcName, String groupName) throws
+            ProcessingException, KustvaktException {
 
         return target().path(API_VERSION).path("vc").path("~"+vcCreator)
                 .path(vcName).path("share").path("@"+groupName)
@@ -990,8 +989,8 @@
     }
 
     private void testShareVCNonUniqueAccess (String vcCreator, String vcName,
-            String groupName) throws UniformInterfaceException,
-            ClientHandlerException, KustvaktException {
+            String groupName) throws
+            ProcessingException, KustvaktException {
         Response response =
                 testShareVCByCreator(vcCreator, vcName, groupName);
         JsonNode node = JsonUtils.readTree(response.readEntity(String.class));
@@ -1006,8 +1005,8 @@
     }
 
     @Test
-    public void testShareUnknownVC () throws UniformInterfaceException,
-            ClientHandlerException, KustvaktException {
+    public void testShareUnknownVC () throws
+            ProcessingException, KustvaktException {
         Response response = testShareVCByCreator("marlin",
                 "non-existing-vc", "marlin group");
         JsonNode node = JsonUtils.readTree(response.readEntity(String.class));
@@ -1017,8 +1016,8 @@
     }
 
     @Test
-    public void testShareUnknownGroup () throws UniformInterfaceException,
-            ClientHandlerException, KustvaktException {
+    public void testShareUnknownGroup () throws
+            ProcessingException, KustvaktException {
         Response response = testShareVCByCreator("marlin", "marlin-vc",
                 "non-existing-group");
         JsonNode node = JsonUtils.readTree(response.readEntity(String.class));
@@ -1028,8 +1027,8 @@
     }
 
     @Test
-    public void testShareVCByVCAAdmin () throws UniformInterfaceException,
-            ClientHandlerException, KustvaktException {
+    public void testShareVCByVCAAdmin () throws
+            ProcessingException, KustvaktException {
 
         // dory is VCA in marlin group
         Response response = target().path(API_VERSION).path("vc")
@@ -1051,8 +1050,8 @@
     }
 
     @Test
-    public void testShareVCByNonVCAAdmin () throws UniformInterfaceException,
-            ClientHandlerException, KustvaktException {
+    public void testShareVCByNonVCAAdmin () throws
+            ProcessingException, KustvaktException {
 
         // nemo is not VCA in marlin group
         Response response = target().path(API_VERSION).path("vc")
@@ -1073,7 +1072,7 @@
     }
 
     private Response testDeleteAccess (String username, String accessId)
-            throws UniformInterfaceException, ClientHandlerException,
+            throws ProcessingException,
             KustvaktException {
         Response response = target().path(API_VERSION).path("vc")
                 .path("access").path(accessId)
@@ -1087,7 +1086,7 @@
     }
 
     private void testDeleteAccessUnauthorized (String accessId)
-            throws UniformInterfaceException, ClientHandlerException,
+            throws ProcessingException,
             KustvaktException {
         Response response = target().path(API_VERSION).path("vc")
                 .path("access").path(accessId)
@@ -1108,8 +1107,8 @@
     }
 
     @Test
-    public void testDeleteNonExistingAccess () throws UniformInterfaceException,
-            ClientHandlerException, KustvaktException {
+    public void testDeleteNonExistingAccess () throws
+            ProcessingException, KustvaktException {
         Response response = testDeleteAccess("dory", "100");
         assertEquals(Status.NOT_FOUND.getStatusCode(), response.getStatus());
 
diff --git a/full/src/test/java/de/ids_mannheim/korap/web/controller/VirtualCorpusFieldTest.java b/full/src/test/java/de/ids_mannheim/korap/web/controller/VirtualCorpusFieldTest.java
index e75e700..fb44266 100644
--- a/full/src/test/java/de/ids_mannheim/korap/web/controller/VirtualCorpusFieldTest.java
+++ b/full/src/test/java/de/ids_mannheim/korap/web/controller/VirtualCorpusFieldTest.java
@@ -10,8 +10,7 @@
 
 import com.fasterxml.jackson.databind.JsonNode;
 import com.google.common.net.HttpHeaders;
-import com.sun.jersey.api.client.ClientHandlerException;
-import com.sun.jersey.api.client.UniformInterfaceException;
+import javax.ws.rs.ProcessingException;
 import javax.ws.rs.core.Response;
 import javax.ws.rs.core.Response.Status;
 
@@ -34,8 +33,8 @@
     private QueryDao dao;
 
     private JsonNode testRetrieveField (String username, String vcName,
-            String field) throws UniformInterfaceException,
-            ClientHandlerException, KustvaktException {
+            String field) throws
+            ProcessingException, KustvaktException {
         Response response = target().path(API_VERSION).path("vc")
                 .path("field").path("~" + username).path(vcName)
                 .queryParam("fieldName", field)
@@ -52,8 +51,8 @@
     }
 
     private void testRetrieveProhibitedField (String username, String vcName,
-            String field) throws UniformInterfaceException,
-            ClientHandlerException, KustvaktException {
+            String field) throws
+            ProcessingException, KustvaktException {
         Response response = target().path(API_VERSION).path("vc")
                 .path("field").path("~" + username).path(vcName)
                 .queryParam("fieldName", field)
@@ -103,8 +102,8 @@
         deleteVcFromDB("named-vc1");
     }
 
-    private void testRetrieveUnknownTokens () throws UniformInterfaceException,
-            ClientHandlerException, KustvaktException {
+    private void testRetrieveUnknownTokens () throws
+            ProcessingException, KustvaktException {
         JsonNode n = testRetrieveField("system", "named-vc1", "unknown");
         assertEquals("unknown", n.at("/corpus/key").asText());
         assertEquals(0, n.at("/corpus/value").size());
diff --git a/full/src/test/java/de/ids_mannheim/korap/web/controller/VirtualCorpusTestBase.java b/full/src/test/java/de/ids_mannheim/korap/web/controller/VirtualCorpusTestBase.java
index 403ee7c..c712030 100644
--- a/full/src/test/java/de/ids_mannheim/korap/web/controller/VirtualCorpusTestBase.java
+++ b/full/src/test/java/de/ids_mannheim/korap/web/controller/VirtualCorpusTestBase.java
@@ -6,8 +6,7 @@
 
 import com.fasterxml.jackson.databind.JsonNode;
 import com.google.common.net.HttpHeaders;
-import com.sun.jersey.api.client.ClientHandlerException;
-import com.sun.jersey.api.client.UniformInterfaceException;
+import javax.ws.rs.ProcessingException;
 import javax.ws.rs.core.Response;
 import javax.ws.rs.core.Response.Status;
 import javax.ws.rs.client.Entity;
@@ -22,7 +21,7 @@
 public abstract class VirtualCorpusTestBase extends SpringJerseyTest{
     
     protected JsonNode testSearchVC (String username, String vcCreator, String vcName)
-            throws UniformInterfaceException, ClientHandlerException,
+            throws ProcessingException,
             KustvaktException {
         Response response = target().path(API_VERSION).path("vc")
                 .path("~"+vcCreator).path(vcName)
diff --git a/lite/src/test/java/de/ids_mannheim/korap/web/service/LiteMultipleCorpusQueryTest.java b/lite/src/test/java/de/ids_mannheim/korap/web/service/LiteMultipleCorpusQueryTest.java
index 0ae5fb1..08ae5ad 100644
--- a/lite/src/test/java/de/ids_mannheim/korap/web/service/LiteMultipleCorpusQueryTest.java
+++ b/lite/src/test/java/de/ids_mannheim/korap/web/service/LiteMultipleCorpusQueryTest.java
@@ -6,9 +6,8 @@
 import org.junit.Test;
 
 import com.fasterxml.jackson.databind.JsonNode;
-import com.sun.jersey.api.client.ClientHandlerException;
-import com.sun.jersey.api.client.UniformInterfaceException;
 
+import javax.ws.rs.ProcessingException;
 import javax.ws.rs.core.Response;
 import javax.ws.rs.core.Response.Status;
 
@@ -45,7 +44,7 @@
 
     @Test
     public void testStatisticsWithMultipleCq ()
-            throws UniformInterfaceException, ClientHandlerException,
+            throws ProcessingException,
             KustvaktException {
         Response response = target().path(API_VERSION).path("statistics")
                 .queryParam("cq", "textType=Abhandlung")
@@ -66,7 +65,7 @@
 
     @Test
     public void testStatisticsWithMultipleCorpusQuery ()
-            throws UniformInterfaceException, ClientHandlerException,
+            throws ProcessingException,
             KustvaktException {
         Response response = target().path(API_VERSION).path("statistics")
                 .queryParam("corpusQuery", "textType=Autobiographie")
