diff --git a/full/src/test/java/de/ids_mannheim/korap/config/AppTestConfig.java b/full/src/test/java/de/ids_mannheim/korap/config/AppTestConfig.java
deleted file mode 100644
index 591d631..0000000
--- a/full/src/test/java/de/ids_mannheim/korap/config/AppTestConfig.java
+++ /dev/null
@@ -1,140 +0,0 @@
-package de.ids_mannheim.korap.config;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.util.ArrayList;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Properties;
-import java.util.Set;
-
-import org.springframework.context.annotation.Bean;
-import org.springframework.context.annotation.Configuration;
-
-import de.ids_mannheim.korap.handlers.AdminDao;
-import de.ids_mannheim.korap.handlers.DocumentDao;
-import de.ids_mannheim.korap.handlers.EntityDao;
-import de.ids_mannheim.korap.handlers.JDBCAuditing;
-import de.ids_mannheim.korap.handlers.ResourceDao;
-import de.ids_mannheim.korap.handlers.UserDetailsDao;
-import de.ids_mannheim.korap.handlers.UserSettingsDao;
-import de.ids_mannheim.korap.interfaces.AuthenticationIface;
-import de.ids_mannheim.korap.interfaces.AuthenticationManagerIface;
-import de.ids_mannheim.korap.interfaces.EncryptionIface;
-import de.ids_mannheim.korap.interfaces.db.AdminHandlerIface;
-import de.ids_mannheim.korap.interfaces.db.AuditingIface;
-import de.ids_mannheim.korap.interfaces.db.EntityHandlerIface;
-import de.ids_mannheim.korap.interfaces.db.PersistenceClient;
-import de.ids_mannheim.korap.interfaces.db.PolicyHandlerIface;
-import de.ids_mannheim.korap.interfaces.db.ResourceOperationIface;
-import de.ids_mannheim.korap.interfaces.db.UserDataDbIface;
-import de.ids_mannheim.korap.interfaces.defaults.KustvaktEncryption;
-import de.ids_mannheim.korap.security.ac.PolicyDao;
-import de.ids_mannheim.korap.security.auth.APIAuthentication;
-import de.ids_mannheim.korap.security.auth.BasicHttpAuth;
-import de.ids_mannheim.korap.security.auth.KustvaktAuthenticationManager;
-import de.ids_mannheim.korap.security.auth.OpenIDconnectAuthentication;
-import de.ids_mannheim.korap.security.auth.SessionAuthentication;
-
-public class AppTestConfig extends AppTestConfigBase implements TestBeans {
-
-    protected PersistenceClient dataSource;
-
-    public AppTestConfig () throws InterruptedException, IOException {
-        this.dataSource = TestHelper.sqlite_db(true);
-        //this.dataSource = TestHelper.mysql_db();
-    }
-
-
-    @Bean(name = "kustvakt_db")
-    public PersistenceClient getDataSource () {
-        return this.dataSource;
-    }
-
-
-    @Bean(name = ContextHolder.KUSTVAKT_POLICIES)
-    @Override
-    public PolicyHandlerIface getPolicyDao () {
-        return new PolicyDao(this.dataSource);
-    }
-
-
-    @Bean(name = ContextHolder.KUSTVAKT_USERDB)
-    @Override
-    public EntityHandlerIface getUserDao () {
-        return new EntityDao(this.dataSource);
-    }
-
-
-    @Bean(name = ContextHolder.KUSTVAKT_ADMINDB)
-    @Override
-    public AdminHandlerIface getAdminDao () {
-        return new AdminDao(this.dataSource);
-    }
-
-
-
-    @Bean(name = ContextHolder.KUSTVAKT_AUDITING)
-    @Override
-    public AuditingIface getAuditingDao () {
-        return new JDBCAuditing(this.dataSource);
-    }
-
-
-    @Bean(name = ContextHolder.KUSTVAKT_RESOURCES)
-    @Override
-    public List<ResourceOperationIface> getResourceDaos () {
-        List<ResourceOperationIface> res = new ArrayList<>();
-        res.add(getDocumentDao());
-        res.add(getResourceDao());
-        return res;
-    }
-    
-    @Bean(name = "document_dao")
-    public DocumentDao getDocumentDao () {
-        return new DocumentDao(getDataSource());
-    }
-
-    
-    @Bean(name = "resource_dao")
-    public ResourceDao getResourceDao () {
-        return new ResourceDao(getDataSource());
-    }
-
-
-
-    @Bean(name = ContextHolder.KUSTVAKT_USERDATA)
-    @Override
-    public List<UserDataDbIface> getUserdataDaos () {
-        List<UserDataDbIface> ud = new ArrayList<>();
-        ud.add(new UserSettingsDao(getDataSource()));
-        ud.add(new UserDetailsDao(getDataSource()));
-        return ud;
-    }
-
-
-    @Bean(name = ContextHolder.KUSTVAKT_ENCRYPTION)
-    @Override
-    public EncryptionIface getCrypto () {
-        return new KustvaktEncryption(getConfig());
-    }
-
-
-    @Bean(name = ContextHolder.KUSTVAKT_AUTHENTICATION_MANAGER)
-    @Override
-    public AuthenticationManagerIface getAuthManager () {
-        AuthenticationManagerIface manager = new KustvaktAuthenticationManager(
-                getUserDao(), getAdminDao(), getCrypto(), getConfig(),
-                getAuditingDao(), getUserdataDaos());
-        Set<AuthenticationIface> pro = new HashSet<>();
-        pro.add(new BasicHttpAuth());
-        pro.add(new APIAuthentication(getConfig()));
-        pro.add(new SessionAuthentication(getConfig(), getCrypto()));
-        pro.add(new OpenIDconnectAuthentication(getConfig(), getDataSource()));
-        manager.setProviders(pro);
-        return manager;
-    }
-
-}
-
-
diff --git a/full/src/test/java/de/ids_mannheim/korap/config/BeanConfigTest.java b/full/src/test/java/de/ids_mannheim/korap/config/BeanConfigTest.java
index 868b901..ff19b62 100644
--- a/full/src/test/java/de/ids_mannheim/korap/config/BeanConfigTest.java
+++ b/full/src/test/java/de/ids_mannheim/korap/config/BeanConfigTest.java
@@ -1,57 +1,16 @@
 package de.ids_mannheim.korap.config;
 
-import static org.junit.Assert.assertNotNull;
-
-import org.apache.log4j.Logger;
-import org.junit.Before;
-import org.junit.runner.RunWith;
-import org.junit.runner.notification.RunNotifier;
-import org.junit.runners.model.InitializationError;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.context.ApplicationContext;
-import org.springframework.context.support.ClassPathXmlApplicationContext;
-import org.springframework.test.annotation.DirtiesContext;
-import org.springframework.test.context.ContextConfiguration;
-import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
-
-import de.ids_mannheim.korap.exceptions.KustvaktException;
-import net.jcip.annotations.NotThreadSafe;
-
 /**
  * @author hanl
  * @date 09/03/2016
  */
-@NotThreadSafe
-@RunWith(BeanConfigTest.SpringExtendedSetupListener.class)
-//@ContextConfiguration(classes = AppTestConfig.class)
-@ContextConfiguration("classpath:test-default-config.xml")
-@DirtiesContext(classMode = DirtiesContext.ClassMode.AFTER_CLASS)
-public abstract class BeanConfigTest {
+public abstract class BeanConfigTest extends BeanConfigBaseTest{
 
-    private static Logger jlog = Logger.getLogger(BeanConfigTest.class);
-    @Autowired
-    private ApplicationContext context;
-
-
-//    @Before
-    public void init () throws Exception {
-//        context = new ClassPathXmlApplicationContext("test-default-config.xml");
-        assertNotNull("Application context must not be null!", this.context);
-        jlog.debug("running one-time before init for class "
-                + this.getClass().getSimpleName() + " ...");
-        BeansFactory.setKustvaktContext(helper().getContext());
-        assertNotNull(BeansFactory.getKustvaktContext());
-        initMethod();
+    @Override
+    protected ContextHolder getContext () {
+        return helper().getContext();
     }
 
-
-    public void close () {
-        BeansFactory.closeApplication();
-    }
-
-    public abstract void initMethod () throws KustvaktException;
-
-
     protected TestHelper helper () {
         try {
             return TestHelper.newInstance(this.context);
@@ -61,39 +20,4 @@
         }
     }
 
-
-    public static class SpringExtendedSetupListener extends
-            SpringJUnit4ClassRunner {
-
-        private BeanConfigTest instanceSetupListener;
-
-
-        public SpringExtendedSetupListener (Class<?> clazz)
-                throws InitializationError {
-            super(clazz);
-        }
-
-
-        @Override
-        protected Object createTest () throws Exception {
-            Object test = super.createTest();
-            // Note that JUnit4 will call this createTest() multiple times for each
-            // test method, so we need to ensure to call "beforeClassSetup" only once.
-            if (test instanceof BeanConfigTest && instanceSetupListener == null) {
-                instanceSetupListener = (BeanConfigTest) test;
-                instanceSetupListener.init();
-            }
-            return test;
-        }
-
-
-        @Override
-        public void run (RunNotifier notifier) {
-            super.run(notifier);
-            if (instanceSetupListener != null)
-                instanceSetupListener.close();
-        }
-
-
-    }
 }
diff --git a/full/src/test/java/de/ids_mannheim/korap/config/BeanInjectTest.java b/full/src/test/java/de/ids_mannheim/korap/config/BeanInjectTest.java
index f840d71..574efc9 100644
--- a/full/src/test/java/de/ids_mannheim/korap/config/BeanInjectTest.java
+++ b/full/src/test/java/de/ids_mannheim/korap/config/BeanInjectTest.java
@@ -21,11 +21,9 @@
  */
 public class BeanInjectTest {
 
-
-
     @Test
     public void testUserBeans () {
-        BeansFactory.loadClasspathContext("test-default-config.xml");
+        BeansFactory.loadClasspathContext("test-config.xml");
         Collection coll = BeansFactory.getKustvaktContext()
                 .getUserDataProviders();
         assertFalse(coll.isEmpty());
@@ -42,7 +40,7 @@
 
     @Test
     public void testResourceBeans () {
-        BeansFactory.loadClasspathContext("test-default-config.xml");
+        BeansFactory.loadClasspathContext("test-config.xml");
         Collection coll = BeansFactory.getKustvaktContext()
                 .getResourceProviders();
         assertFalse(coll.isEmpty());
diff --git a/full/src/test/java/de/ids_mannheim/korap/config/TestHelper.java b/full/src/test/java/de/ids_mannheim/korap/config/TestHelper.java
index a490dfe..53a5f7b 100644
--- a/full/src/test/java/de/ids_mannheim/korap/config/TestHelper.java
+++ b/full/src/test/java/de/ids_mannheim/korap/config/TestHelper.java
@@ -47,7 +47,6 @@
  */
 public class TestHelper {
 
-    private static String mainConfigurationFile = "kustvakt-test.conf";
     private static Logger jlog = LoggerFactory.getLogger(TestHelper.class);
     private static final Map<String, Object> data = new HashMap<>();
     static  {
@@ -261,7 +260,8 @@
 
     }
 
-
+    // EM: use Spring XML config
+    @Deprecated
     private static PersistenceClient mysql_db () throws IOException {
         BasicDataSource dataSource = new BasicDataSource();
         dataSource.setDriverClassName("com.mysql.jdbc.Driver");
@@ -279,7 +279,8 @@
         return client;
     }
 
-
+    // EM: use Spring XML config
+    @Deprecated
     protected static PersistenceClient sqlite_db (boolean memory)
             throws InterruptedException {
         SingleConnectionDataSource dataSource = new SingleConnectionDataSource();
@@ -308,7 +309,8 @@
         return client;
     }
 
-
+    // EM: use Spring XML config
+    @Deprecated
     public static PersistenceClient sqlite_db_norm (boolean memory) {
         BasicDataSource dataSource = new BasicDataSource();
         dataSource.setDriverClassName("org.sqlite.JDBC");
@@ -336,7 +338,8 @@
         return client;
     }
 
-
+    // EM: use Spring XML config
+    @Deprecated
     public static PersistenceClient h2_emb () throws SQLException {
         BasicDataSource dataSource = new BasicDataSource();
         dataSource.setUrl("jdbc:h2:mem:");
diff --git a/full/src/test/java/de/ids_mannheim/korap/web/service/FastJerseyTest.java b/full/src/test/java/de/ids_mannheim/korap/web/service/FastJerseyTest.java
index 0ccd639..5ba2749 100644
--- a/full/src/test/java/de/ids_mannheim/korap/web/service/FastJerseyTest.java
+++ b/full/src/test/java/de/ids_mannheim/korap/web/service/FastJerseyTest.java
@@ -2,22 +2,24 @@
 
 import org.junit.Before;
 import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.context.ApplicationContext;
-import org.springframework.test.context.ContextConfiguration;
 
-import de.ids_mannheim.korap.config.AppTestConfig;
 import de.ids_mannheim.korap.config.ContextHolder;
 import de.ids_mannheim.korap.config.TestHelper;
 
-@ContextConfiguration(classes = AppTestConfig.class)
 public abstract class FastJerseyTest extends FastJerseyBaseTest {
 
-    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 static String[] classPackages =
+            new String[] { "de.ids_mannheim.korap.web.service.full",
+                    "de.ids_mannheim.korap.web.filter",
+                    "de.ids_mannheim.korap.web.utils" };
 
 
+    @Override
+    public void close () {
+        super.close();
+        
+    }
+    
     protected TestHelper helper () {
         try {
             return TestHelper.newInstance(this.context);
@@ -26,13 +28,14 @@
             return null;
         }
     }
-    
-    
+
+
     @Override
     protected ContextHolder getContext () {
         return helper().getContext();
-    } 
-    
+    }
+
+
     public static void startServer () {
         try {
             if (testContainer != null) {
@@ -44,12 +47,14 @@
             startServer();
         }
     }
-    
+
+
     @Before
     public void startServerBeforeFirstTestRun () {
         if (testContainer == null) {
-            initServer(PORT,classPackages);
+            initServer(PORT, classPackages);
             startServer();
         }
     }
+
 }
diff --git a/full/src/test/java/de/ids_mannheim/korap/web/service/full/UserServiceTest.java b/full/src/test/java/de/ids_mannheim/korap/web/service/full/UserServiceTest.java
index 4891c0b..8d94185 100644
--- a/full/src/test/java/de/ids_mannheim/korap/web/service/full/UserServiceTest.java
+++ b/full/src/test/java/de/ids_mannheim/korap/web/service/full/UserServiceTest.java
@@ -1,32 +1,9 @@
 package de.ids_mannheim.korap.web.service.full;
 
-import com.fasterxml.jackson.databind.JsonNode;
-import com.nimbusds.jwt.SignedJWT;
-import com.sun.jersey.api.client.ClientResponse;
-import com.sun.jersey.api.client.WebResource;
-import com.sun.jersey.core.util.MultivaluedMapImpl;
-
-import de.ids_mannheim.korap.config.BeansFactory;
-import de.ids_mannheim.korap.config.JWTSigner;
-import de.ids_mannheim.korap.config.TestHelper;
-import de.ids_mannheim.korap.exceptions.KustvaktException;
-import de.ids_mannheim.korap.exceptions.StatusCodes;
-import de.ids_mannheim.korap.security.auth.BasicHttpAuth;
-import de.ids_mannheim.korap.config.Attributes;
-import de.ids_mannheim.korap.utils.JsonUtils;
-import de.ids_mannheim.korap.utils.TimeUtils;
-import de.ids_mannheim.korap.web.service.FastJerseyTest;
-
-import org.apache.commons.collections.map.HashedMap;
-import org.apache.commons.collections.map.LinkedMap;
-import org.joda.time.DateTime;
-import org.junit.Assert;
-import org.junit.BeforeClass;
-import org.junit.Ignore;
-import org.junit.Test;
-
-import javax.ws.rs.core.MediaType;
-import javax.ws.rs.core.MultivaluedMap;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
 
 import java.io.IOException;
 import java.net.URI;
@@ -34,7 +11,29 @@
 import java.util.HashMap;
 import java.util.Map;
 
-import static org.junit.Assert.*;
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.MultivaluedMap;
+
+import org.apache.commons.collections.map.LinkedMap;
+import org.junit.BeforeClass;
+import org.junit.Ignore;
+import org.junit.Test;
+
+import com.fasterxml.jackson.databind.JsonNode;
+import com.nimbusds.jwt.SignedJWT;
+import com.sun.jersey.api.client.ClientResponse;
+import com.sun.jersey.core.util.MultivaluedMapImpl;
+
+import de.ids_mannheim.korap.config.Attributes;
+import de.ids_mannheim.korap.config.BeansFactory;
+import de.ids_mannheim.korap.config.JWTSigner;
+import de.ids_mannheim.korap.config.TestHelper;
+import de.ids_mannheim.korap.exceptions.KustvaktException;
+import de.ids_mannheim.korap.exceptions.StatusCodes;
+import de.ids_mannheim.korap.security.auth.BasicHttpAuth;
+import de.ids_mannheim.korap.utils.JsonUtils;
+import de.ids_mannheim.korap.utils.TimeUtils;
+import de.ids_mannheim.korap.web.service.FastJerseyTest;
 
 /**
  * @author hanl
diff --git a/full/src/test/resources/test-default-config.xml b/full/src/test/resources/test-config.xml
similarity index 100%
rename from full/src/test/resources/test-default-config.xml
rename to full/src/test/resources/test-config.xml
