diff --git a/src/main/java/de/ids_mannheim/korap/config/KustvaktConfiguration.java b/src/main/java/de/ids_mannheim/korap/config/KustvaktConfiguration.java
index f2742ce..07c963a 100644
--- a/src/main/java/de/ids_mannheim/korap/config/KustvaktConfiguration.java
+++ b/src/main/java/de/ids_mannheim/korap/config/KustvaktConfiguration.java
@@ -76,7 +76,7 @@
     private String default_token;
     private String default_dep;
     private String default_const;
-    
+    @Deprecated    
     private String policyConfig;
     private ArrayList<String> foundries;
     private ArrayList<String> layers;
@@ -163,14 +163,14 @@
         
         ldapConfig = properties.getProperty("ldap.config");
         
-        // EM: replace this later with KoralQuery
+        // EM: regex for matching availability in Krill matches
         freeLicensePattern = Pattern.compile(properties.getProperty("kustvakt.regex.free",""));
         publicLicensePattern = Pattern.compile(properties.getProperty("kustvakt.regex.public",""));
         allLicensePattern = Pattern.compile(properties.getProperty("kustvakt.regex.all",""));
         
         // EM: not use in the future
-        policyConfig = properties.getProperty("policies.config");
-        setFoundriesAndLayers(policyConfig);
+        //policyConfig = properties.getProperty("policies.config");
+        //setFoundriesAndLayers(policyConfig);
         
         KUSTVAKT_USER.put(Attributes.ID, Integer.parseInt(properties.getProperty("kustvakt.init.user.id")));
         KUSTVAKT_USER.put(Attributes.USERNAME, properties.getProperty("kustvakt.init.user.username"));
diff --git a/src/main/java/de/ids_mannheim/korap/resource/rewrite/PublicCollection.java b/src/main/java/de/ids_mannheim/korap/resource/rewrite/PublicCollection.java
index b6508f5..406c342 100644
--- a/src/main/java/de/ids_mannheim/korap/resource/rewrite/PublicCollection.java
+++ b/src/main/java/de/ids_mannheim/korap/resource/rewrite/PublicCollection.java
@@ -20,14 +20,15 @@
  * @author hanl
  * @date 04/07/2015
  */
+// EM: use CollectionRewrite instead
+@Deprecated
 public class PublicCollection implements RewriteTask.RewriteQuery {
 
     public PublicCollection () {
         super();
     }
 
-
-    @Override
+    @Deprecated
     public JsonNode rewriteQuery (KoralNode node, KustvaktConfiguration config,
             User user) throws KustvaktException {
         JsonNode subnode = node.rawNode();
diff --git a/src/main/java/de/ids_mannheim/korap/security/ac/ResourceFinder.java b/src/main/java/de/ids_mannheim/korap/security/ac/ResourceFinder.java
index 6efdb4f..368a36f 100644
--- a/src/main/java/de/ids_mannheim/korap/security/ac/ResourceFinder.java
+++ b/src/main/java/de/ids_mannheim/korap/security/ac/ResourceFinder.java
@@ -96,7 +96,7 @@
                 Permissions.Permission.READ);
     }
 
-
+    @Deprecated
     public static <T extends KustvaktResource> Set<T> searchPublic (
             Class<T> clazz) throws KustvaktException {
         return searchPublicFiltered(clazz);
@@ -133,6 +133,7 @@
         return sets;
     }
     
+    @Deprecated
     public static <T extends KustvaktResource> Set<T> searchPublicFiltered (
             Class<T> clazz, String ... ids) throws KustvaktException {
         overrideProviders(null);
diff --git a/src/main/java/de/ids_mannheim/korap/web/service/CollectionLoader.java b/src/main/java/de/ids_mannheim/korap/web/service/CollectionLoader.java
index 514afcf..5485896 100644
--- a/src/main/java/de/ids_mannheim/korap/web/service/CollectionLoader.java
+++ b/src/main/java/de/ids_mannheim/korap/web/service/CollectionLoader.java
@@ -26,9 +26,11 @@
  * @date 12/01/2016
  * @lastupdate 19/04/2017
  */
+@Deprecated
 public class CollectionLoader implements BootableBeanInterface {
 
     @Override
+    @Deprecated
     public void load (ContextHolder beans) throws KustvaktException {
         SecurityManager.overrideProviders(beans);
         ResourceFinder.overrideProviders(beans);
@@ -37,33 +39,6 @@
                 .toUser(KustvaktConfiguration.KUSTVAKT_USER);
 
         KustvaktConfiguration config = beans.getConfiguration();
-
-        //        KoralCollectionQueryBuilder bui = new KoralCollectionQueryBuilder();
-        //        bui.with("creationDate since 1775 & corpusSigle=GOE");
-        //
-        //        VirtualCollection c1 = new VirtualCollection();
-        //        c1.setName("Weimarer Werke");
-        //
-        //        c1.setFields(bui.toJSON());
-        //
-        //        c1.setDescription("Goethe-Werke in Weimar (seit 1775)");
-        //
-        //        bui = new KoralCollectionQueryBuilder();
-        //        bui.with("textType=Aphorismus");
-        //
-        //        VirtualCollection c2 = new VirtualCollection();
-        //        c2.setName("Aphorismen");
-        //        c2.setFields(bui.toJSON());
-        //        c2.setDescription("Aphorismentexte Goethes");
-        //
-        //        bui = new KoralCollectionQueryBuilder();
-        //        bui.with("title ~ \"Werther\"");
-        //
-        //        VirtualCollection c3 = new VirtualCollection();
-        //        c3.setName("Werther");
-        //        c3.setFields(bui.toJSON());
-        //        c3.setDescription("Goethe - Die Leiden des jungen Werther");
-
         PolicyBuilder builder = new PolicyBuilder(user);
         String result = null;
         BufferedReader br;
diff --git a/src/main/java/de/ids_mannheim/korap/web/service/full/ResourceService.java b/src/main/java/de/ids_mannheim/korap/web/service/full/ResourceService.java
index 03421e1..fdfaf74 100644
--- a/src/main/java/de/ids_mannheim/korap/web/service/full/ResourceService.java
+++ b/src/main/java/de/ids_mannheim/korap/web/service/full/ResourceService.java
@@ -369,6 +369,8 @@
 
     // todo: does cq have any sensible worth here? --> would say no! --> is
     // useful in non type/id scenarios
+    
+    // EM: build query using the given virtual collection id
     @TRACE
     @Path("{type}/{id}/search")
     public Response buildQueryWithId (@Context Locale locale,
@@ -406,13 +408,14 @@
         String query = "";
         KustvaktResource resource;
         try {
-
             if (ctx.isDemo()) {
+                // EM: FIX ME: add CollectionRewrite? Is there public VCs? 
                 Set set = ResourceFinder.searchPublicFiltered(
                         ResourceFactory.getResourceClass(type), id);
                 resource = (KustvaktResource) set.toArray()[0];
             }
             else {
+                // EM: FIX ME: search in user VC
                 User user = controller.getUser(ctx.getUsername());
                 if (StringUtils.isInteger(id))
                     resource = this.resourceHandler
diff --git a/src/test/java/LocalQueryTest.java b/src/test/java/LocalQueryTest.java
index 0f9d007..ae0e494 100644
--- a/src/test/java/LocalQueryTest.java
+++ b/src/test/java/LocalQueryTest.java
@@ -73,7 +73,7 @@
 
     @Override
     public void initMethod () throws KustvaktException {
-        helper().runBootInterfaces();
+//        helper().runBootInterfaces();
         index = helper().getContext().getConfiguration().getIndexDir();
     }
 }
diff --git a/src/test/java/de/ids_mannheim/korap/config/BeanConfigTest.java b/src/test/java/de/ids_mannheim/korap/config/BeanConfigTest.java
index 4407fb6..0d24bcc 100644
--- a/src/test/java/de/ids_mannheim/korap/config/BeanConfigTest.java
+++ b/src/test/java/de/ids_mannheim/korap/config/BeanConfigTest.java
@@ -46,7 +46,6 @@
         BeansFactory.closeApplication();
     }
 
-
     public abstract void initMethod () throws KustvaktException;
 
 
diff --git a/src/test/java/de/ids_mannheim/korap/config/CollectionLoaderTest.java b/src/test/java/de/ids_mannheim/korap/config/CollectionLoaderTest.java
index 6f0ee8b..82af51b 100644
--- a/src/test/java/de/ids_mannheim/korap/config/CollectionLoaderTest.java
+++ b/src/test/java/de/ids_mannheim/korap/config/CollectionLoaderTest.java
@@ -5,12 +5,15 @@
 import de.ids_mannheim.korap.web.service.CollectionLoader;
 import de.ids_mannheim.korap.web.service.UserLoader;
 import org.junit.Assert;
+import org.junit.Ignore;
 import org.junit.Test;
 
 /**
  * @author hanl
  * @date 11/02/2016
  */
+@Deprecated
+@Ignore
 public class CollectionLoaderTest extends BeanConfigTest {
 
     @Test
diff --git a/src/test/java/de/ids_mannheim/korap/config/ConfigTest.java b/src/test/java/de/ids_mannheim/korap/config/ConfigTest.java
index 390ae00..eabb0a3 100644
--- a/src/test/java/de/ids_mannheim/korap/config/ConfigTest.java
+++ b/src/test/java/de/ids_mannheim/korap/config/ConfigTest.java
@@ -83,8 +83,8 @@
 
 
     @Test
-    public void testBootConfigRun () {
-        helper().runBootInterfaces();
+    public void testBootConfigRun () throws KustvaktException {
+//        helper().runBootInterfaces();
         helper().setupAccount();
         assertNotNull(helper().getUser());
 
diff --git a/src/test/java/de/ids_mannheim/korap/config/LoaderTest.java b/src/test/java/de/ids_mannheim/korap/config/LoaderTest.java
index 192c561..009a4c0 100644
--- a/src/test/java/de/ids_mannheim/korap/config/LoaderTest.java
+++ b/src/test/java/de/ids_mannheim/korap/config/LoaderTest.java
@@ -38,6 +38,8 @@
 
 
     @Test
+    @Ignore
+    @Deprecated
     public void runBootInterfaces () {
         Set<Class<? extends BootableBeanInterface>> set = new HashSet<>();
         set.add(CollectionLoader.class);
diff --git a/src/test/java/de/ids_mannheim/korap/config/PolicyLoaderTest.java b/src/test/java/de/ids_mannheim/korap/config/PolicyLoaderTest.java
index 3d3f8f7..32660bc 100644
--- a/src/test/java/de/ids_mannheim/korap/config/PolicyLoaderTest.java
+++ b/src/test/java/de/ids_mannheim/korap/config/PolicyLoaderTest.java
@@ -10,13 +10,17 @@
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertNotEquals;
 
+import org.junit.Ignore;
+
 /**
  * @author hanl
  * @date 11/02/2016
  */
+@Deprecated
 public class PolicyLoaderTest extends BeanConfigTest {
 
     @Test
+    @Ignore
     public void testPolicyLoader () {
         boolean error = false;
         UserLoader u = new UserLoader();
diff --git a/src/test/java/de/ids_mannheim/korap/config/TestHelper.java b/src/test/java/de/ids_mannheim/korap/config/TestHelper.java
index 3698e9c..8c71eae 100644
--- a/src/test/java/de/ids_mannheim/korap/config/TestHelper.java
+++ b/src/test/java/de/ids_mannheim/korap/config/TestHelper.java
@@ -113,11 +113,11 @@
     }
 
 
-    public TestHelper setupAccount () {
+    public TestHelper setupAccount () throws KustvaktException {
         KustvaktBaseDaoInterface dao = getBean(ContextHolder.KUSTVAKT_USERDB);
 
         KustvaktAuthenticationManager manager = getBean(ContextHolder.KUSTVAKT_AUTHENTICATION_MANAGER);
-
+//        manager.createUserAccount(KustvaktConfiguration.KUSTVAKT_USER, false);
         try {
             User user = getUser();
             jlog.debug("found user, skipping setup ...");
@@ -247,6 +247,7 @@
     }
 
 
+    @Deprecated
     public TestHelper runBootInterfaces () {
         Set<Class<? extends BootableBeanInterface>> set = KustvaktClassLoader
                 .loadSubTypes(BootableBeanInterface.class);
diff --git a/src/test/java/de/ids_mannheim/korap/handlers/ResourceDaoTest.java b/src/test/java/de/ids_mannheim/korap/handlers/ResourceDaoTest.java
index 02bfe4a..f21e305 100644
--- a/src/test/java/de/ids_mannheim/korap/handlers/ResourceDaoTest.java
+++ b/src/test/java/de/ids_mannheim/korap/handlers/ResourceDaoTest.java
@@ -38,7 +38,7 @@
 
     @Override
     public void initMethod () {
-        helper().setupAccount();
+//        helper().setupAccount();
 
         List<Class<? extends KustvaktResource>> classes = new ArrayList<>(
                 KustvaktClassLoader.loadSubTypes(KustvaktResource.class));
diff --git a/src/test/java/de/ids_mannheim/korap/handlers/UserDaoTest.java b/src/test/java/de/ids_mannheim/korap/handlers/UserDaoTest.java
index 8e0616e..855383f 100644
--- a/src/test/java/de/ids_mannheim/korap/handlers/UserDaoTest.java
+++ b/src/test/java/de/ids_mannheim/korap/handlers/UserDaoTest.java
@@ -110,6 +110,6 @@
     @Override
     public void initMethod () throws KustvaktException {
         helper().setupAccount();
-        helper().runBootInterfaces();
+//        helper().runBootInterfaces();
     }
 }
diff --git a/src/test/java/de/ids_mannheim/korap/resource/rewrite/CollectionRewriteTest.java b/src/test/java/de/ids_mannheim/korap/resource/rewrite/CollectionRewriteTest.java
index 90e37eb..fe35d64 100644
--- a/src/test/java/de/ids_mannheim/korap/resource/rewrite/CollectionRewriteTest.java
+++ b/src/test/java/de/ids_mannheim/korap/resource/rewrite/CollectionRewriteTest.java
@@ -27,7 +27,7 @@
 
     @Override
     public void initMethod () throws KustvaktException {
-        helper().runBootInterfaces();
+//        helper().runBootInterfaces();
         config = helper().getContext().getConfiguration();
     }
 
@@ -215,7 +215,7 @@
     public void testPublicCollectionRewriteEmptyAdd () throws KustvaktException {
         RewriteHandler handler = new RewriteHandler();
         handler.insertBeans(helper().getContext());
-        handler.add(PublicCollection.class);
+        handler.add(CollectionRewrite.class);
 
         QuerySerializer s = new QuerySerializer();
         s.setQuery(TestVariables.SIMPLE_ADD_QUERY, "poliqarp");
@@ -223,12 +223,14 @@
         JsonNode node = JsonUtils.readTree(handler.processQuery(org,
                 User.UserFactory.getUser("test_user")));
         assertNotNull(node);
-        assertEquals("corpusSigle", node.at("/collection/operands/0/key")
+        assertEquals("availability", node.at("/collection/key")
                 .asText());
-        assertEquals("corpusSigle", node.at("/collection/operands/1/key")
+        assertEquals("CC-BY.*", node.at("/collection/value")
                 .asText());
         assertEquals("koral:rewrite", node.at("/collection/rewrites/0/@type")
                 .asText());
+        assertEquals("availability(FREE)", node.at("/collection/rewrites/0/scope")
+                .asText());
         //todo:
     }
 
@@ -238,7 +240,7 @@
             throws KustvaktException {
         RewriteHandler handler = new RewriteHandler();
         handler.insertBeans(helper().getContext());
-        handler.add(PublicCollection.class);
+        handler.add(CollectionRewrite.class);
 
         QuerySerializer s = new QuerySerializer();
         s.setQuery(TestVariables.SIMPLE_ADD_QUERY, "poliqarp");
@@ -248,12 +250,18 @@
                 User.UserFactory.getUser("test_user")));
         assertNotNull(node);
         assertEquals(2, node.at("/collection/operands").size());
-        assertEquals("corpusSigle",
+        assertEquals("availability",
+                node.at("/collection/operands/0/key").asText());
+        assertEquals("CC-BY.*",
+                node.at("/collection/operands/0/value").asText());
+        assertEquals("docSigle",
                 node.at("/collection/operands/1/operands/0/key").asText());
-        assertEquals("corpusSigle",
+        assertEquals("textClass",
                 node.at("/collection/operands/1/operands/1/key").asText());
         assertEquals("koral:rewrite", node.at("/collection/rewrites/0/@type")
                 .asText());
+        assertEquals("availability(FREE)", node.at("/collection/rewrites/0/scope")
+                .asText());
     }
 
 
diff --git a/src/test/java/de/ids_mannheim/korap/security/PolicyDaoTest.java b/src/test/java/de/ids_mannheim/korap/security/PolicyDaoTest.java
index 8c2a00d..1097a70 100644
--- a/src/test/java/de/ids_mannheim/korap/security/PolicyDaoTest.java
+++ b/src/test/java/de/ids_mannheim/korap/security/PolicyDaoTest.java
@@ -31,7 +31,7 @@
     @Override
     public void initMethod () throws KustvaktException {
         helper().setupAccount();
-        helper().runBootInterfaces();
+//        helper().runBootInterfaces();
         helper().setupResource(new Corpus("WPD_1"));
     }
 
diff --git a/src/test/java/de/ids_mannheim/korap/security/ResourceFinderTest.java b/src/test/java/de/ids_mannheim/korap/security/ResourceFinderTest.java
index ce7be2b..a96378d 100644
--- a/src/test/java/de/ids_mannheim/korap/security/ResourceFinderTest.java
+++ b/src/test/java/de/ids_mannheim/korap/security/ResourceFinderTest.java
@@ -5,6 +5,8 @@
 import de.ids_mannheim.korap.resources.Corpus;
 import de.ids_mannheim.korap.resources.VirtualCollection;
 import de.ids_mannheim.korap.security.ac.ResourceFinder;
+
+import org.junit.Ignore;
 import org.junit.Test;
 
 import java.util.Set;
@@ -17,6 +19,8 @@
  * @author hanl
  * @date 06/02/2016
  */
+@Deprecated
+@Ignore
 public class ResourceFinderTest extends BeanConfigTest {
 
     @Test
@@ -36,6 +40,7 @@
 
 
     @Test
+    @Deprecated
     public void testResourcesDemoFiltered () throws KustvaktException {
         Set<Corpus> resources = ResourceFinder.searchPublicFiltered(
                 Corpus.class, "WPD13");
@@ -52,6 +57,6 @@
     @Override
     public void initMethod () throws KustvaktException {
         helper().setupAccount();
-        helper().runBootInterfaces();
+//        helper().runBootInterfaces();
     }
 }
diff --git a/src/test/java/de/ids_mannheim/korap/security/ResourcesTest.java b/src/test/java/de/ids_mannheim/korap/security/ResourcesTest.java
index 677f167..dd90bb0 100644
--- a/src/test/java/de/ids_mannheim/korap/security/ResourcesTest.java
+++ b/src/test/java/de/ids_mannheim/korap/security/ResourcesTest.java
@@ -108,6 +108,8 @@
 
 
     @Test
+    @Deprecated
+    @Ignore
     public void getDemoResources () throws KustvaktException {
         Set s = ResourceFinder.searchPublic(Corpus.class);
         assertEquals(2, s.size());
@@ -117,6 +119,8 @@
 
 
     @Test
+    @Deprecated
+    @Ignore
     public void getDemoResourceFiltered () throws KustvaktException {
         Set s = ResourceFinder.searchPublicFiltered(Corpus.class, "WPD13");
         assertEquals(1, s.size());
@@ -127,7 +131,7 @@
     public void initMethod () throws KustvaktException {
         helper().setupAccount();
         c1 = new Corpus("WPD_test");
-        helper().runBootInterfaces();
+//        helper().runBootInterfaces();
         helper().setupResource(c1);
     }
 }
diff --git a/src/test/java/de/ids_mannheim/korap/security/SecurityPolicyTest.java b/src/test/java/de/ids_mannheim/korap/security/SecurityPolicyTest.java
index 0235e81..cd3a32b 100644
--- a/src/test/java/de/ids_mannheim/korap/security/SecurityPolicyTest.java
+++ b/src/test/java/de/ids_mannheim/korap/security/SecurityPolicyTest.java
@@ -142,7 +142,7 @@
 
     @Override
     public void initMethod () throws KustvaktException {
-        helper().runBootInterfaces();
+//        helper().runBootInterfaces();
         helper().setupAccount();
     }
 }
diff --git a/src/test/java/de/ids_mannheim/korap/web/service/full/KustvaktCoreRestTest.java b/src/test/java/de/ids_mannheim/korap/web/service/full/KustvaktCoreRestTest.java
index 4c2b8fa..b5b30a8 100644
--- a/src/test/java/de/ids_mannheim/korap/web/service/full/KustvaktCoreRestTest.java
+++ b/src/test/java/de/ids_mannheim/korap/web/service/full/KustvaktCoreRestTest.java
@@ -21,8 +21,8 @@
 
 	@Override
     public void initMethod () throws KustvaktException {
-//        helper().setupAccount();
-        helper().runBootInterfaces();
+        helper().setupAccount();
+//        helper().runBootInterfaces();
     }
 	
     @BeforeClass
diff --git a/src/test/java/de/ids_mannheim/korap/web/service/full/MatchInfoServiceTest.java b/src/test/java/de/ids_mannheim/korap/web/service/full/MatchInfoServiceTest.java
index 0153e44..170ab18 100644
--- a/src/test/java/de/ids_mannheim/korap/web/service/full/MatchInfoServiceTest.java
+++ b/src/test/java/de/ids_mannheim/korap/web/service/full/MatchInfoServiceTest.java
@@ -124,6 +124,6 @@
 
     @Override
     public void initMethod () throws KustvaktException {
-        helper().runBootInterfaces();
+//        helper().runBootInterfaces();
     }
 }
diff --git a/src/test/java/de/ids_mannheim/korap/web/service/full/PolicyServiceTest.java b/src/test/java/de/ids_mannheim/korap/web/service/full/PolicyServiceTest.java
index c48f40c..ecff17b 100644
--- a/src/test/java/de/ids_mannheim/korap/web/service/full/PolicyServiceTest.java
+++ b/src/test/java/de/ids_mannheim/korap/web/service/full/PolicyServiceTest.java
@@ -28,7 +28,7 @@
 import de.ids_mannheim.korap.user.User.UserFactory;
 import de.ids_mannheim.korap.web.service.FastJerseyTest;
 
-/**
+/** FIX ME: Database restructure
  * @author margaretha
  */
 public class PolicyServiceTest extends FastJerseyTest {
@@ -171,7 +171,7 @@
 
     @Override
     public void initMethod () throws KustvaktException {
-        helper().runBootInterfaces();
+//        helper().runBootInterfaces();
     }
 }
 
diff --git a/src/test/java/de/ids_mannheim/korap/web/service/full/QuerySerializationServiceTest.java b/src/test/java/de/ids_mannheim/korap/web/service/full/QuerySerializationServiceTest.java
index fe8c672..59bc30b 100644
--- a/src/test/java/de/ids_mannheim/korap/web/service/full/QuerySerializationServiceTest.java
+++ b/src/test/java/de/ids_mannheim/korap/web/service/full/QuerySerializationServiceTest.java
@@ -2,7 +2,7 @@
 /**
  * @author hanl, margaretha
  * @lastUpdate 19/04/2017
- *
+ * EM: FIX ME: Database restructure
  */
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
@@ -27,7 +27,7 @@
 
     @Override
     public void initMethod () throws KustvaktException {
-        helper().runBootInterfaces();
+//        helper().runBootInterfaces();
     }
 
 
diff --git a/src/test/java/de/ids_mannheim/korap/web/service/full/ResourceInfoServiceTest.java b/src/test/java/de/ids_mannheim/korap/web/service/full/ResourceInfoServiceTest.java
index d31d91c..c6b7135 100644
--- a/src/test/java/de/ids_mannheim/korap/web/service/full/ResourceInfoServiceTest.java
+++ b/src/test/java/de/ids_mannheim/korap/web/service/full/ResourceInfoServiceTest.java
@@ -19,13 +19,13 @@
 /**
  * @author hanl, margaretha
  * @lastUpdate 19/04/2017
- *
+ * EM: FIX ME: Database restructure
  */
 public class ResourceInfoServiceTest extends FastJerseyTest {
 
     @Override
     public void initMethod () throws KustvaktException {
-        helper().runBootInterfaces();
+//        helper().runBootInterfaces();
     }
 
 
diff --git a/src/test/java/de/ids_mannheim/korap/web/service/full/ResourceServiceTest.java b/src/test/java/de/ids_mannheim/korap/web/service/full/ResourceServiceTest.java
index 4cdce89..b55fa73 100644
--- a/src/test/java/de/ids_mannheim/korap/web/service/full/ResourceServiceTest.java
+++ b/src/test/java/de/ids_mannheim/korap/web/service/full/ResourceServiceTest.java
@@ -381,6 +381,6 @@
 
     @Override
     public void initMethod () throws KustvaktException {
-        helper().runBootInterfaces();
+//        helper().runBootInterfaces();
     }
 }
diff --git a/src/test/java/de/ids_mannheim/korap/web/service/full/SearchServiceTest.java b/src/test/java/de/ids_mannheim/korap/web/service/full/SearchServiceTest.java
index 8786030..5c08e74 100644
--- a/src/test/java/de/ids_mannheim/korap/web/service/full/SearchServiceTest.java
+++ b/src/test/java/de/ids_mannheim/korap/web/service/full/SearchServiceTest.java
@@ -37,7 +37,8 @@
 
     @Override
     public void initMethod () throws KustvaktException {
-        helper().runBootInterfaces();
+//        helper().runBootInterfaces();
+        helper().setupAccount();
     }
 
 
diff --git a/src/test/java/de/ids_mannheim/korap/web/service/full/SearchWithAvailabilityTest.java b/src/test/java/de/ids_mannheim/korap/web/service/full/SearchWithAvailabilityTest.java
index 407dcf0..52f2487 100644
--- a/src/test/java/de/ids_mannheim/korap/web/service/full/SearchWithAvailabilityTest.java
+++ b/src/test/java/de/ids_mannheim/korap/web/service/full/SearchWithAvailabilityTest.java
@@ -20,7 +20,7 @@
 
     @Override
     public void initMethod () throws KustvaktException {
-        helper().runBootInterfaces();
+//        helper().runBootInterfaces();
     }
 
 
diff --git a/src/test/java/de/ids_mannheim/korap/web/service/full/UserServiceTest.java b/src/test/java/de/ids_mannheim/korap/web/service/full/UserServiceTest.java
index a3641b1..5502366 100644
--- a/src/test/java/de/ids_mannheim/korap/web/service/full/UserServiceTest.java
+++ b/src/test/java/de/ids_mannheim/korap/web/service/full/UserServiceTest.java
@@ -155,7 +155,7 @@
 
 	// EM: This test require VPN / IDS Intranet
 	@Test
-//	@Ignore
+	@Ignore
 	public void loginJWT() {
 		String en = BasicHttpAuth.encode(credentials[0], credentials[1]);
 		/* lauffähige Version von Hanl: */
