diff --git a/core/src/test/java/de/ids_mannheim/korap/web/service/FastJerseyBaseTest.java b/core/src/test/java/de/ids_mannheim/korap/web/service/FastJerseyBaseTest.java
deleted file mode 100644
index 0c45d7b..0000000
--- a/core/src/test/java/de/ids_mannheim/korap/web/service/FastJerseyBaseTest.java
+++ /dev/null
@@ -1,142 +0,0 @@
-package de.ids_mannheim.korap.web.service;
-
-import java.net.URI;
-
-import javax.ws.rs.core.UriBuilder;
-
-import org.junit.After;
-import org.junit.BeforeClass;
-import org.springframework.web.context.ContextLoaderListener;
-
-import com.sun.jersey.api.client.Client;
-import com.sun.jersey.api.client.WebResource;
-import com.sun.jersey.api.core.DefaultResourceConfig;
-import com.sun.jersey.spi.spring.container.servlet.SpringServlet;
-import com.sun.jersey.test.framework.AppDescriptor;
-import com.sun.jersey.test.framework.LowLevelAppDescriptor;
-import com.sun.jersey.test.framework.WebAppDescriptor;
-import com.sun.jersey.test.framework.spi.container.TestContainer;
-import com.sun.jersey.test.framework.spi.container.TestContainerFactory;
-import com.sun.jersey.test.framework.spi.container.grizzly.GrizzlyTestContainerFactory;
-import com.sun.jersey.test.framework.spi.container.grizzly.web.GrizzlyWebTestContainerFactory;
-
-import de.ids_mannheim.korap.config.BeanConfigBaseTest;
-
-/**
- * @author hanl
- * @date 29/07/2015
- */
-public abstract class FastJerseyBaseTest extends BeanConfigBaseTest {
-
-    private final static String API_VERSION = "v0.1";
-
-    private static DefaultResourceConfig resourceConfig =
-            new DefaultResourceConfig();
-
-    private static TestContainerFactory testContainerFactory;
-
-    protected static TestContainer testContainer;
-
-    protected static Client client;
-
-    protected static int PORT = 8089; // FB, was: 9000;
-    protected static int PORT_IT = 1;
-    protected static String containerURI = "http://localhost/";
-
-
-//    public static void addClass (Class<?> resourceClass) {
-//        resourceConfig.getClasses().add(resourceClass);
-//    }
-//
-//    public static void addSingleton (Object resourceSingleton) {
-//        resourceConfig.getSingletons().add(resourceSingleton);
-//    }
-
-
-    public String getAPIVersion () {
-        return API_VERSION;
-    }
-
-
-//    public static <T> void addProviderForContext (Class<T> contextClass,
-//            T contextObject) {
-//        addSingleton(new SingletonTypeInjectableProvider<Context, T>(
-//                contextClass, contextObject) {});
-//    }
-
-
-//    public static void addRequestFilter (Object filter) {
-//        resourceConfig.getContainerRequestFilters().add(filter);
-//    }
-//
-//
-//    public static void addResponseFilter (Object filter) {
-//        resourceConfig.getContainerResponseFilters().add(filter);
-//    }
-
-
-    public static void setTestContainerFactory (
-            TestContainerFactory newTestContainerFactory) {
-        testContainerFactory = newTestContainerFactory;
-    }
-
-
-    @BeforeClass
-    public static void cleanStaticVariables () {
-        resourceConfig = new DefaultResourceConfig();
-    }
-
-
-    protected static void initServer (int port, String[] classPackages) {
-        AppDescriptor ad;
-        if (classPackages == null)
-            ad = new LowLevelAppDescriptor.Builder(resourceConfig).build();
-        else
-            ad = new WebAppDescriptor.Builder(classPackages)
-                    .servletClass(SpringServlet.class)
-                    .contextListenerClass(ContextLoaderListener.class)
-                    .contextParam("contextConfigLocation", "classpath:test-config.xml")
-                    .build();
-
-        TestContainerFactory tcf = testContainerFactory;
-        if (tcf == null) {
-            if (classPackages == null)
-                tcf = new GrizzlyTestContainerFactory();
-            else
-                tcf = new GrizzlyWebTestContainerFactory();
-        }
-
-        testContainer = tcf.create(
-                UriBuilder.fromUri(containerURI).port(port).build(), ad);
-        client = testContainer.getClient();
-        if (client == null) {
-            client = Client.create(ad.getClientConfig());
-        }
-    }
-
-    @After
-    public void stopServer () {
-        
-        testContainer.stop();
-        testContainer = null;
-        client = null;
-    }
-
-
-    public Client client () {
-        return client;
-    }
-
-
-    public URI getBaseUri () {
-        return testContainer.getBaseUri();
-    }
-
-
-    public WebResource resource () {
-        return client.resource(getBaseUri());
-    }
-
-
-    
-}
diff --git a/full/src/test/java/de/ids_mannheim/korap/web/FastJerseyTest.java b/full/src/test/java/de/ids_mannheim/korap/web/FastJerseyTest.java
index aa7657a..3ac9366 100644
--- a/full/src/test/java/de/ids_mannheim/korap/web/FastJerseyTest.java
+++ b/full/src/test/java/de/ids_mannheim/korap/web/FastJerseyTest.java
@@ -1,20 +1,119 @@
 package de.ids_mannheim.korap.web;
 
+import java.net.URI;
 import java.util.concurrent.ThreadLocalRandom;
 
-import org.junit.Before;
+import javax.ws.rs.core.UriBuilder;
 
+import org.junit.After;
+import org.junit.Before;
+import org.junit.BeforeClass;
+import org.springframework.web.context.ContextLoaderListener;
+
+import com.sun.jersey.api.client.Client;
+import com.sun.jersey.api.client.WebResource;
+import com.sun.jersey.api.core.DefaultResourceConfig;
+import com.sun.jersey.spi.spring.container.servlet.SpringServlet;
+import com.sun.jersey.test.framework.AppDescriptor;
+import com.sun.jersey.test.framework.LowLevelAppDescriptor;
+import com.sun.jersey.test.framework.WebAppDescriptor;
+import com.sun.jersey.test.framework.spi.container.TestContainer;
+import com.sun.jersey.test.framework.spi.container.TestContainerFactory;
+import com.sun.jersey.test.framework.spi.container.grizzly.GrizzlyTestContainerFactory;
+import com.sun.jersey.test.framework.spi.container.grizzly.web.GrizzlyWebTestContainerFactory;
+
+import de.ids_mannheim.korap.config.BeanConfigBaseTest;
 import de.ids_mannheim.korap.config.ContextHolder;
 import de.ids_mannheim.korap.config.TestHelper;
-import de.ids_mannheim.korap.web.service.FastJerseyBaseTest;
 
-public abstract class FastJerseyTest extends FastJerseyBaseTest {
+public abstract class FastJerseyTest extends BeanConfigBaseTest{
 
     private static String[] classPackages =
             new String[] { "de.ids_mannheim.korap.web.service.full",
                     "de.ids_mannheim.korap.web.filter",
                     "de.ids_mannheim.korap.web.utils" };
 
+    private final static String API_VERSION = "v0.1";
+
+    private static DefaultResourceConfig resourceConfig =
+            new DefaultResourceConfig();
+
+    private static TestContainerFactory testContainerFactory;
+
+    protected static TestContainer testContainer;
+
+    protected static Client client;
+
+    protected static int PORT = 8089; // FB, was: 9000;
+    protected static int PORT_IT = 1;
+    protected static String containerURI = "http://localhost/";
+
+    public String getAPIVersion () {
+        return API_VERSION;
+    }
+
+    public static void setTestContainerFactory (
+            TestContainerFactory newTestContainerFactory) {
+        testContainerFactory = newTestContainerFactory;
+    }
+
+
+    @BeforeClass
+    public static void cleanStaticVariables () {
+        resourceConfig = new DefaultResourceConfig();
+    }
+
+
+    protected static void initServer (int port, String[] classPackages) {
+        AppDescriptor ad;
+        if (classPackages == null)
+            ad = new LowLevelAppDescriptor.Builder(resourceConfig).build();
+        else
+            ad = new WebAppDescriptor.Builder(classPackages)
+                    .servletClass(SpringServlet.class)
+                    .contextListenerClass(ContextLoaderListener.class)
+                    .contextParam("contextConfigLocation", "classpath:test-config.xml")
+                    .build();
+
+        TestContainerFactory tcf = testContainerFactory;
+        if (tcf == null) {
+            if (classPackages == null)
+                tcf = new GrizzlyTestContainerFactory();
+            else
+                tcf = new GrizzlyWebTestContainerFactory();
+        }
+
+        testContainer = tcf.create(
+                UriBuilder.fromUri(containerURI).port(port).build(), ad);
+        client = testContainer.getClient();
+        if (client == null) {
+            client = Client.create(ad.getClientConfig());
+        }
+    }
+
+    @After
+    public void stopServer () {
+        
+        testContainer.stop();
+        testContainer = null;
+        client = null;
+    }
+
+
+    public Client client () {
+        return client;
+    }
+
+
+    public URI getBaseUri () {
+        return testContainer.getBaseUri();
+    }
+
+
+    public WebResource resource () {
+        return client.resource(getBaseUri());
+    }
+    
     protected TestHelper helper () {
         try {
             return TestHelper.newInstance(this.context);
diff --git a/lite/src/main/resources/test-config.xml b/lite/src/main/resources/test-config.xml
deleted file mode 100644
index b219666..0000000
--- a/lite/src/main/resources/test-config.xml
+++ /dev/null
@@ -1,61 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-       xmlns:util="http://www.springframework.org/schema/util"
-       xmlns:context="http://www.springframework.org/schema/context"
-       xmlns="http://www.springframework.org/schema/beans"
-       xsi:schemaLocation="http://www.springframework.org/schema/beans
-           http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
-           http://www.springframework.org/schema/context
-           http://www.springframework.org/schema/context/spring-context-4.0.xsd
-           http://www.springframework.org/schema/util
-           http://www.springframework.org/schema/util/spring-util-4.0.xsd">
-
-
-    <context:component-scan base-package="de.ids_mannheim.korap" />
-	<context:annotation-config />
-
-    <bean id="properties"
-          class="org.springframework.beans.factory.config.PropertiesFactoryBean">
-        <property name="ignoreResourceNotFound" value="true"/>
-        <property name="locations">
-            <array>
-                <value>classpath:kustvakt-lite.conf</value>
-                <value>file:./kustvakt-lite.conf</value>
-            </array>
-        </property>
-    </bean>
-    
-    <bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
-		<property name="properties">
-			<ref bean="properties"/>
-		</property>
-	</bean>
-
-    <bean id="kustvakt_auditing"
-          class="de.ids_mannheim.korap.interfaces.defaults.DefaultAuditing">
-    </bean>
-    
-    <bean id="kustvakt_response"
-          class="de.ids_mannheim.korap.web.CoreResponseHandler">
-          <constructor-arg index="0" name="iface" ref="kustvakt_auditing"/>
-    </bean>
-
-    <bean id="kustvakt_config"
-          class="de.ids_mannheim.korap.config.KustvaktConfiguration">
-        <constructor-arg index="0" name="properties" ref="properties"/>
-    </bean>
-
-    <bean name="kustvakt_encryption"
-          class="de.ids_mannheim.korap.interfaces.defaults.DefaultEncryption">
-    </bean>
-    
-    <bean id="kustvakt_rewrite" class="de.ids_mannheim.korap.resource.rewrite.RewriteHandler">
-		<constructor-arg ref="kustvakt_config" />
-	</bean>
-    
-    <bean id="search_krill"
-          class="de.ids_mannheim.korap.web.SearchKrill">
-        <constructor-arg value="${krill.indexDir}"/>
-    </bean>
-    
-</beans>
\ No newline at end of file
diff --git a/lite/src/test/java/de/ids_mannheim/korap/web/service/FastJerseyLightTest.java b/lite/src/test/java/de/ids_mannheim/korap/web/service/FastJerseyLightTest.java
deleted file mode 100644
index 81ae635..0000000
--- a/lite/src/test/java/de/ids_mannheim/korap/web/service/FastJerseyLightTest.java
+++ /dev/null
@@ -1,37 +0,0 @@
-package de.ids_mannheim.korap.web.service;
-
-import org.junit.Before;
-
-import de.ids_mannheim.korap.config.ContextHolder;
-
-public abstract class FastJerseyLightTest extends FastJerseyBaseTest {
-
-    private static String[] classPackages =
-            new String[] { "de.ids_mannheim.korap.web.service.light" };
-
-
-    public static void startServer () {
-        try {
-            if (testContainer != null) {
-                testContainer.start();
-            }
-        }
-        catch (Exception e) {
-            initServer(PORT + PORT_IT++, classPackages);
-            startServer();
-        }
-    }
-
-    @Before
-    public void startServerBeforeFirstTestRun () {
-        if (testContainer == null) {
-            initServer(PORT, classPackages);
-            startServer();
-        }
-    }
-    
-    @Override
-    protected ContextHolder getContext () {
-        return new ContextHolder(this.context) {};
-    }
-}
diff --git a/lite/src/test/java/de/ids_mannheim/korap/web/service/LightServiceTest.java b/lite/src/test/java/de/ids_mannheim/korap/web/service/LightServiceTest.java
index 39213a7..3b694af 100644
--- a/lite/src/test/java/de/ids_mannheim/korap/web/service/LightServiceTest.java
+++ b/lite/src/test/java/de/ids_mannheim/korap/web/service/LightServiceTest.java
@@ -4,11 +4,21 @@
 import static org.junit.Assert.assertNotEquals;
 import static org.junit.Assert.assertNotNull;
 
+import java.util.concurrent.ThreadLocalRandom;
+
 import org.apache.lucene.LucenePackage;
 import org.junit.Test;
+import org.springframework.web.context.ContextLoaderListener;
 
 import com.fasterxml.jackson.databind.JsonNode;
 import com.sun.jersey.api.client.ClientResponse;
+import com.sun.jersey.spi.spring.container.servlet.SpringServlet;
+import com.sun.jersey.test.framework.AppDescriptor;
+import com.sun.jersey.test.framework.JerseyTest;
+import com.sun.jersey.test.framework.WebAppDescriptor;
+import com.sun.jersey.test.framework.spi.container.TestContainerException;
+import com.sun.jersey.test.framework.spi.container.TestContainerFactory;
+import com.sun.jersey.test.framework.spi.container.grizzly.web.GrizzlyWebTestContainerFactory;
 
 import de.ids_mannheim.korap.exceptions.KustvaktException;
 import de.ids_mannheim.korap.query.serialize.QuerySerializer;
@@ -18,17 +28,36 @@
  * Created by hanl on 29.04.16.
  * 
  * @author margaretha
- * @date 10/10/2017
+ * @date 17/01/2017
  * 
  * Recent changes:
- * - updated the service paths and methods of query serialization tests
- * - added statistic service test
+ * - removed test configuration using FastJerseyLightTest
  */
-public class LightServiceTest extends FastJerseyLightTest {
+public class LightServiceTest extends JerseyTest{
+
+    public static final String classPackage = "de.ids_mannheim.korap.web.service.light";
 
     @Override
-    public void initMethod () throws KustvaktException {}
+    protected TestContainerFactory getTestContainerFactory ()
+            throws TestContainerException {
+        return new GrizzlyWebTestContainerFactory();
+    }
 
+    @Override
+    protected AppDescriptor configure () {
+        return new WebAppDescriptor.Builder(classPackage)
+                .servletClass(SpringServlet.class)
+                .contextListenerClass(ContextLoaderListener.class)
+                .contextParam("contextConfigLocation",
+                        "classpath:light-config.xml")
+                .build();
+    }
+
+    @Override
+    protected int getPort (int defaultPort) {
+        return ThreadLocalRandom.current().nextInt(5000, 8000 + 1);
+    }
+    
     @Test
     public void testStatistics () throws KustvaktException{
         ClientResponse response = resource()
