diff --git a/full/src/test/java/de/ids_mannheim/korap/security/auth/KustvaktAuthenticationManagerTest.java b/full/src/test/java/de/ids_mannheim/korap/authentication/KustvaktAuthenticationManagerTest.java
similarity index 75%
rename from full/src/test/java/de/ids_mannheim/korap/security/auth/KustvaktAuthenticationManagerTest.java
rename to full/src/test/java/de/ids_mannheim/korap/authentication/KustvaktAuthenticationManagerTest.java
index efdb76e..d29960b 100644
--- a/full/src/test/java/de/ids_mannheim/korap/security/auth/KustvaktAuthenticationManagerTest.java
+++ b/full/src/test/java/de/ids_mannheim/korap/authentication/KustvaktAuthenticationManagerTest.java
@@ -1,6 +1,5 @@
-package de.ids_mannheim.korap.security.auth;
+package de.ids_mannheim.korap.authentication;
 
-import static org.junit.Assert.assertNotEquals;
 import static org.junit.Assert.assertNotNull;
 
 import org.junit.After;
@@ -10,11 +9,9 @@
 
 import de.ids_mannheim.korap.config.Attributes;
 import de.ids_mannheim.korap.config.BeanConfigTest;
-import de.ids_mannheim.korap.config.KustvaktBaseDaoInterface;
 import de.ids_mannheim.korap.config.KustvaktConfiguration;
 import de.ids_mannheim.korap.exceptions.KustvaktException;
 import de.ids_mannheim.korap.interfaces.AuthenticationManagerIface;
-import de.ids_mannheim.korap.interfaces.db.EntityHandlerIface;
 import de.ids_mannheim.korap.user.KorAPUser;
 import de.ids_mannheim.korap.user.User;
 import de.ids_mannheim.korap.user.UserDetails;
@@ -45,20 +42,6 @@
         catch (KustvaktException e) {}
     }
 
-
-    @Test
-    @Ignore
-    public void testCreateUser () throws KustvaktException {
-        User user = authManager
-                .createUserAccount(KustvaktConfiguration.KUSTVAKT_USER, false);
-
-        EntityHandlerIface dao = helper().getContext().getUserDBHandler();
-        assertNotEquals(0, ((KustvaktBaseDaoInterface) dao).size());
-        User check = dao.getAccount(user.getUsername());
-        assertNotNull(check);
-    }
-
-
     @Test
     public void testBatchStore () {
         int i = 6;
@@ -73,8 +56,6 @@
     @Test
     @Ignore
     public void testUserdetailsGet () throws KustvaktException {
-        testCreateUser();
-
         User user = authManager
                 .getUser((String) KustvaktConfiguration.KUSTVAKT_USER
                         .get(Attributes.USERNAME));
@@ -87,8 +68,6 @@
     @Test
     @Ignore
     public void testUsersettingsGet () throws KustvaktException {
-        testCreateUser();
-
         User user = authManager
                 .getUser((String) KustvaktConfiguration.KUSTVAKT_USER
                         .get(Attributes.USERNAME));
@@ -100,8 +79,6 @@
 
     @Test(expected = KustvaktException.class)
     public void testUserDetailsGetNonExistent () throws KustvaktException {
-        testCreateUser();
-
         User user = new KorAPUser(10, "random");
         authManager.getUserData(user, UserDetails.class);
     }
@@ -109,19 +86,10 @@
 
     @Test(expected = KustvaktException.class)
     public void testUserSettingsGetNonExistent () throws KustvaktException {
-        testCreateUser();
-
         User user = new KorAPUser(10, "random");
         authManager.getUserData(user, UserSettings.class);
     }
 
-    @Test
-    @Ignore
-    public void testUserUpdate() throws KustvaktException {
-        testCreateUser();
-        // todo:
-    }
-
 
     @Override
     public void initMethod () throws KustvaktException {
diff --git a/full/src/test/java/de/ids_mannheim/korap/config/TestBeans.java b/full/src/test/java/de/ids_mannheim/korap/config/TestBeans.java
index 3bbdb4f..6ef8f65 100644
--- a/full/src/test/java/de/ids_mannheim/korap/config/TestBeans.java
+++ b/full/src/test/java/de/ids_mannheim/korap/config/TestBeans.java
@@ -4,9 +4,8 @@
 
 import de.ids_mannheim.korap.interfaces.AuthenticationManagerIface;
 import de.ids_mannheim.korap.interfaces.EncryptionIface;
+import de.ids_mannheim.korap.interfaces.EntityHandlerIface;
 import de.ids_mannheim.korap.interfaces.db.AuditingIface;
-import de.ids_mannheim.korap.interfaces.db.EntityHandlerIface;
-import de.ids_mannheim.korap.interfaces.db.PolicyHandlerIface;
 import de.ids_mannheim.korap.interfaces.db.ResourceOperationIface;
 import de.ids_mannheim.korap.interfaces.db.UserDataDbIface;
 
@@ -16,8 +15,6 @@
  */
 public interface TestBeans {
 
-	public  PolicyHandlerIface getPolicyDao();
-
 //	public  KustvaktConfiguration getConfig();
 
 	public  EntityHandlerIface getUserDao();
@@ -32,6 +29,4 @@
 
 	public  AuthenticationManagerIface getAuthManager();
 
-	
-
 }
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 b53cc6f..a2b9d72 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
@@ -33,7 +33,7 @@
 import de.ids_mannheim.korap.handlers.JDBCClient;
 import de.ids_mannheim.korap.handlers.ResourceDao;
 import de.ids_mannheim.korap.interfaces.EncryptionIface;
-import de.ids_mannheim.korap.interfaces.db.EntityHandlerIface;
+import de.ids_mannheim.korap.interfaces.EntityHandlerIface;
 import de.ids_mannheim.korap.interfaces.db.PersistenceClient;
 import de.ids_mannheim.korap.resources.KustvaktResource;
 import de.ids_mannheim.korap.user.User;
@@ -119,48 +119,49 @@
         return this;
     }
 
-
-    public TestHelper setupSimpleAccount (String username, String password) {
-        KustvaktBaseDaoInterface dao = getBean(ContextHolder.KUSTVAKT_USERDB);
-        EntityHandlerIface edao = (EntityHandlerIface) dao;
-        try {
-            edao.getAccount(username);
-        }
-        catch (EmptyResultException e) {
-            // do nothing
-        }
-        catch (KustvaktException ex) {
-            assertNull("Test user could not be set up", true);
-        }
-
-        Map m = new HashMap<>();
-        m.put(Attributes.USERNAME, username);
-
-        try {
-            String hash = ((EncryptionIface) getBean(ContextHolder.KUSTVAKT_ENCRYPTION))
-                    .secureHash(password);
-            m.put(Attributes.PASSWORD, hash);
-        }
-        catch (NoSuchAlgorithmException | UnsupportedEncodingException
-                | KustvaktException e) {
-            // do nohting
-            assertNotNull("Exception thrown", null);
-        }
-        assertNotNull("userdatabase handler must not be null", dao);
-
-        try {
-
-            int i = edao.createAccount(User.UserFactory.toKorAPUser(m));
-            assert BeansFactory.getKustvaktContext().getUserDBHandler()
-                    .getAccount((String) data.get(Attributes.USERNAME)) != null;
-            assertEquals(1, i);
-        }
-        catch (KustvaktException e) {
-            // do nothing
-            assertNull("Test user could not be set up", true);
-        }
-        return this;
-    }
+    // EM
+    @Deprecated
+//    public TestHelper setupSimpleAccount (String username, String password) {
+//        KustvaktBaseDaoInterface dao = getBean(ContextHolder.KUSTVAKT_USERDB);
+//        EntityHandlerIface edao = (EntityHandlerIface) dao;
+//        try {
+//            edao.getAccount(username);
+//        }
+//        catch (EmptyResultException e) {
+//            // do nothing
+//        }
+//        catch (KustvaktException ex) {
+//            assertNull("Test user could not be set up", true);
+//        }
+//
+//        Map m = new HashMap<>();
+//        m.put(Attributes.USERNAME, username);
+//
+//        try {
+//            String hash = ((EncryptionIface) getBean(ContextHolder.KUSTVAKT_ENCRYPTION))
+//                    .secureHash(password);
+//            m.put(Attributes.PASSWORD, hash);
+//        }
+//        catch (NoSuchAlgorithmException | UnsupportedEncodingException
+//                | KustvaktException e) {
+//            // do nohting
+//            assertNotNull("Exception thrown", null);
+//        }
+//        assertNotNull("userdatabase handler must not be null", dao);
+//
+//        try {
+//
+//            int i = edao.createAccount(User.UserFactory.toKorAPUser(m));
+//            assert BeansFactory.getKustvaktContext().getUserDBHandler()
+//                    .getAccount((String) data.get(Attributes.USERNAME)) != null;
+//            assertEquals(1, i);
+//        }
+//        catch (KustvaktException e) {
+//            // do nothing
+//            assertNull("Test user could not be set up", true);
+//        }
+//        return this;
+//    }
 
 
     public User getUser () {
diff --git a/full/src/test/java/de/ids_mannheim/korap/handlers/UserDaoTest.java b/full/src/test/java/de/ids_mannheim/korap/handlers/UserDaoTest.java
deleted file mode 100644
index 48b6d5c..0000000
--- a/full/src/test/java/de/ids_mannheim/korap/handlers/UserDaoTest.java
+++ /dev/null
@@ -1,116 +0,0 @@
-package de.ids_mannheim.korap.handlers;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNull;
-
-import org.junit.Ignore;
-import org.junit.Test;
-
-import de.ids_mannheim.korap.config.Attributes;
-import de.ids_mannheim.korap.config.BeansFactory;
-import de.ids_mannheim.korap.config.BeanConfigTest;
-import de.ids_mannheim.korap.config.TestHelper;
-import de.ids_mannheim.korap.exceptions.KustvaktException;
-import de.ids_mannheim.korap.interfaces.db.EntityHandlerIface;
-import de.ids_mannheim.korap.interfaces.db.UserDataDbIface;
-import de.ids_mannheim.korap.user.User;
-import de.ids_mannheim.korap.user.UserDetails;
-import de.ids_mannheim.korap.user.UserSettings;
-import de.ids_mannheim.korap.user.Userdata;
-
-/** EM: To do: not implemented in the new DB yet
- * 
- * @author hanl
- * @date 13/02/2015
- */
-@Ignore
-public class UserDaoTest extends BeanConfigTest {
-
-    @Test
-    public void userput () throws KustvaktException {
-        User user1 = helper().getContext().getUserDBHandler()
-                .getAccount((String) TestHelper.getUserCredentials().get(Attributes.USERNAME));
-        assertEquals("user creation failed", true, user1.getId() != -1);
-    }
-
-
-    @Test
-    public void userputBatch () {
-        //todo:
-    }
-
-
-    @Test
-    public void userget () throws KustvaktException {
-        User user1 = helper().getContext().getUserDBHandler()
-                .getAccount((String) TestHelper.getUserCredentials().get(Attributes.USERNAME));
-        assertEquals("User Retrieval does not work",
-                TestHelper.getUserCredentials().get(Attributes.USERNAME), user1.getUsername());
-    }
-
-
-    @Test
-    @Ignore
-    public void testUserdetailsGetNonExistent () throws KustvaktException {
-        helper().setupSimpleAccount("userdbtest", "userdbTest");
-        User user = helper().getContext().getUserDBHandler()
-                .getAccount("userdbtest");
-        UserDataDbIface dao = BeansFactory.getTypeFactory()
-                .getTypeInterfaceBean(
-                        helper().getContext().getUserDataProviders(),
-                        UserDetails.class);
-        Userdata data = dao.get(user);
-        assertNull(data);
-        helper().dropUser("userdbtest");
-    }
-
-
-    @Test
-    @Ignore
-    public void testUserSettingsGetNonExistent () throws KustvaktException {
-        helper().setupSimpleAccount("userdbtest", "userdbTest");
-        User user = helper().getContext().getUserDBHandler()
-                .getAccount("userdbtest");
-        UserDataDbIface dao = BeansFactory.getTypeFactory()
-                .getTypeInterfaceBean(
-                        helper().getContext().getUserDataProviders(),
-                        UserSettings.class);
-        Userdata data = dao.get(user);
-        assertNull(data);
-        helper().dropUser("userdbtest");
-
-    }
-
-
-    // username cannot currently be changed
-    @Test
-    @Ignore
-    public void updateUsername () throws KustvaktException {
-        User user1 = helper().getContext().getUserDBHandler()
-                .getAccount((String) TestHelper.getUserCredentials().get(Attributes.USERNAME));
-        user1.setUsername("new_user");
-        helper().getContext().getUserDBHandler().updateAccount(user1);
-        User u2 = helper().getContext().getUserDBHandler()
-                .getAccount("new_user");
-        assertEquals("not found", user1.getUsername(), u2.getUsername());
-    }
-
-
-    @Test
-    public void userupdate () throws KustvaktException {
-        EntityHandlerIface dao = helper().getContext().getUserDBHandler();
-        User user1 = dao.getAccount((String) TestHelper.getUserCredentials()
-                .get(Attributes.USERNAME));
-        user1.setAccountLocked(true);
-        dao.updateAccount(user1);
-        assertEquals("not valid", true, dao.getAccount(user1.getUsername())
-                .isAccountLocked());
-    }
-
-
-    @Override
-    public void initMethod () throws KustvaktException {
-        helper().setupAccount();
-//        helper().runBootInterfaces();
-    }
-}
diff --git a/full/src/test/java/de/ids_mannheim/korap/security/PermissionBufferTest.java b/full/src/test/java/de/ids_mannheim/korap/security/PermissionBufferTest.java
deleted file mode 100644
index 68e874a..0000000
--- a/full/src/test/java/de/ids_mannheim/korap/security/PermissionBufferTest.java
+++ /dev/null
@@ -1,209 +0,0 @@
-package de.ids_mannheim.korap.security;
-
-import de.ids_mannheim.korap.resources.Permissions;
-import org.junit.Test;
-
-import static org.junit.Assert.*;
-
-/**
- * @author hanl
- * @date 15/02/2016
- */
-public class PermissionBufferTest {
-
-    @Test
-    public void testDuplicatePermission () {
-        PermissionsBuffer buffer = new PermissionsBuffer();
-        assertEquals(0, buffer.addPermission(4));
-        assertEquals(-1, buffer.addPermission(4));
-
-        // 0 means permission was successfully added, -1 means it wasn't because it's already present
-        assertEquals(0, buffer.addPermission(1));
-        assertEquals(-1, buffer.addPermission(1));
-
-        assertEquals(0, buffer.addPermission(8));
-        assertEquals(-1, buffer.addPermission(4));
-    }
-
-
-    @Test
-    public void testPermissionsAdd () {
-        PermissionsBuffer buffer = new PermissionsBuffer();
-        buffer.addPermissions(Permissions.Permission.READ);
-        assertEquals(1, buffer.getPermissions().size());
-
-        assertTrue(buffer.containsPByte(Permissions.Permission.READ.toByte()));
-        assertFalse(buffer.containsPByte(Permissions.Permission.WRITE.toByte()));
-        assertFalse(buffer
-                .containsPByte(Permissions.Permission.DELETE.toByte()));
-        assertFalse(buffer.containsPByte(Permissions.Permission.READ_POLICY
-                .toByte()));
-        assertFalse(buffer.containsPByte(Permissions.Permission.DELETE_POLICY
-                .toByte()));
-        assertFalse(buffer.containsPByte(Permissions.Permission.MODIFY_POLICY
-                .toByte()));
-        assertFalse(buffer.containsPByte(Permissions.Permission.CREATE_POLICY
-                .toByte()));
-        assertFalse(buffer.containsPByte(Permissions.Permission.ALL.toByte()));
-
-        buffer = new PermissionsBuffer();
-        buffer.addPermissions(Permissions.Permission.WRITE);
-        buffer.addPermissions(Permissions.Permission.DELETE_POLICY);
-        assertEquals(2, buffer.getPermissions().size());
-        assertFalse(buffer.containsPByte(Permissions.Permission.READ.toByte()));
-        assertTrue(buffer.containsPByte(Permissions.Permission.WRITE.toByte()));
-        assertFalse(buffer
-                .containsPByte(Permissions.Permission.DELETE.toByte()));
-        assertFalse(buffer.containsPByte(Permissions.Permission.READ_POLICY
-                .toByte()));
-        assertTrue(buffer.containsPByte(Permissions.Permission.DELETE_POLICY
-                .toByte()));
-        assertFalse(buffer.containsPByte(Permissions.Permission.MODIFY_POLICY
-                .toByte()));
-        assertFalse(buffer.containsPByte(Permissions.Permission.CREATE_POLICY
-                .toByte()));
-        assertFalse(buffer.containsPByte(Permissions.Permission.ALL.toByte()));
-    }
-
-
-    @Test
-    public void testPermissionsAddAll2 () {
-        PermissionsBuffer buffer = new PermissionsBuffer();
-        buffer.addPermissions(Permissions.Permission.ALL);
-
-        assertEquals(Permissions.Permission.values().length, buffer
-                .getPermissions().size());
-        assertTrue(buffer.containsPByte(Permissions.Permission.READ.toByte()));
-        assertTrue(buffer.containsPByte(Permissions.Permission.WRITE.toByte()));
-        assertTrue(buffer.containsPByte(Permissions.Permission.DELETE.toByte()));
-        assertTrue(buffer.containsPByte(Permissions.Permission.READ_POLICY
-                .toByte()));
-        assertTrue(buffer.containsPByte(Permissions.Permission.DELETE_POLICY
-                .toByte()));
-        assertTrue(buffer.containsPByte(Permissions.Permission.MODIFY_POLICY
-                .toByte()));
-        assertTrue(buffer.containsPByte(Permissions.Permission.CREATE_POLICY
-                .toByte()));
-        assertTrue(buffer.containsPByte(Permissions.Permission.ALL.toByte()));
-    }
-
-
-    @Test
-    public void testPermissionsAddAll () {
-        PermissionsBuffer buffer = new PermissionsBuffer();
-        buffer.addPermissions(Permissions.Permission.DELETE_POLICY);
-        buffer.addPermissions(Permissions.Permission.CREATE_POLICY);
-        buffer.addPermissions(Permissions.Permission.READ);
-        buffer.addPermissions(Permissions.Permission.MODIFY_POLICY);
-        buffer.addPermissions(Permissions.Permission.DELETE);
-        buffer.addPermissions(Permissions.Permission.READ_POLICY);
-        buffer.addPermissions(Permissions.Permission.WRITE);
-
-        assertEquals(Permissions.Permission.values().length, buffer
-                .getPermissions().size());
-        assertTrue(buffer.containsPByte(Permissions.Permission.READ.toByte()));
-        assertTrue(buffer.containsPByte(Permissions.Permission.WRITE.toByte()));
-        assertTrue(buffer.containsPByte(Permissions.Permission.DELETE.toByte()));
-        assertTrue(buffer.containsPByte(Permissions.Permission.READ_POLICY
-                .toByte()));
-        assertTrue(buffer.containsPByte(Permissions.Permission.DELETE_POLICY
-                .toByte()));
-        assertTrue(buffer.containsPByte(Permissions.Permission.MODIFY_POLICY
-                .toByte()));
-        assertTrue(buffer.containsPByte(Permissions.Permission.CREATE_POLICY
-                .toByte()));
-        assertTrue(buffer.containsPByte(Permissions.Permission.ALL.toByte()));
-
-    }
-
-
-    @Test
-    public void testPermissionsInit () {
-        PermissionsBuffer buffer = new PermissionsBuffer((short) 1);
-        assertEquals(1, buffer.getPermissions().size());
-
-        assertTrue(buffer.containsPByte(Permissions.Permission.READ.toByte()));
-        assertFalse(buffer
-                .containsPByte(Permissions.Permission.DELETE.toByte()));
-        assertFalse(buffer.containsPByte(Permissions.Permission.WRITE.toByte()));
-        assertFalse(buffer.containsPByte(Permissions.Permission.READ_POLICY
-                .toByte()));
-        assertFalse(buffer.containsPByte(Permissions.Permission.DELETE_POLICY
-                .toByte()));
-        assertFalse(buffer.containsPByte(Permissions.Permission.MODIFY_POLICY
-                .toByte()));
-        assertFalse(buffer.containsPByte(Permissions.Permission.CREATE_POLICY
-                .toByte()));
-
-    }
-
-
-    @Test
-    public void testPermissionsStringConversion () {
-        PermissionsBuffer buffer = new PermissionsBuffer(Short.valueOf("1"));
-        assertEquals(1, buffer.getPermissions().size());
-
-        assertTrue(buffer.containsPByte(Permissions.Permission.READ.toByte()));
-        assertFalse(buffer
-                .containsPByte(Permissions.Permission.DELETE.toByte()));
-        assertFalse(buffer.containsPByte(Permissions.Permission.WRITE.toByte()));
-        assertFalse(buffer.containsPByte(Permissions.Permission.READ_POLICY
-                .toByte()));
-        assertFalse(buffer.containsPByte(Permissions.Permission.DELETE_POLICY
-                .toByte()));
-        assertFalse(buffer.containsPByte(Permissions.Permission.MODIFY_POLICY
-                .toByte()));
-        assertFalse(buffer.containsPByte(Permissions.Permission.CREATE_POLICY
-                .toByte()));
-
-        buffer = new PermissionsBuffer(Short.valueOf("5"));
-        assertTrue(buffer.containsPByte(Permissions.Permission.READ.toByte()));
-        assertTrue(buffer.containsPByte(Permissions.Permission.DELETE.toByte()));
-        assertFalse(buffer.containsPByte(Permissions.Permission.WRITE.toByte()));
-        assertFalse(buffer.containsPByte(Permissions.Permission.READ_POLICY
-                .toByte()));
-        assertFalse(buffer.containsPByte(Permissions.Permission.DELETE_POLICY
-                .toByte()));
-        assertFalse(buffer.containsPByte(Permissions.Permission.MODIFY_POLICY
-                .toByte()));
-        assertFalse(buffer.containsPByte(Permissions.Permission.CREATE_POLICY
-                .toByte()));
-
-        buffer = new PermissionsBuffer(Short.valueOf("69"));
-        assertTrue(buffer.containsPByte(Permissions.Permission.READ.toByte()));
-        assertTrue(buffer.containsPByte(Permissions.Permission.DELETE.toByte()));
-        assertFalse(buffer.containsPByte(Permissions.Permission.WRITE.toByte()));
-        assertFalse(buffer.containsPByte(Permissions.Permission.READ_POLICY
-                .toByte()));
-        assertTrue(buffer.containsPByte(Permissions.Permission.DELETE_POLICY
-                .toByte()));
-        assertFalse(buffer.containsPByte(Permissions.Permission.MODIFY_POLICY
-                .toByte()));
-        assertFalse(buffer.containsPByte(Permissions.Permission.CREATE_POLICY
-                .toByte()));
-    }
-
-
-    @Test
-    public void testPermissionRemovalOne () {
-        PermissionsBuffer buffer = new PermissionsBuffer();
-        buffer.addPermissions(Permissions.Permission.READ,
-                Permissions.Permission.DELETE,
-                Permissions.Permission.MODIFY_POLICY);
-
-        assertTrue(buffer.containsPByte(Permissions.Permission.READ.toByte()));
-        assertTrue(buffer.containsPByte(Permissions.Permission.DELETE.toByte()));
-        assertFalse(buffer.containsPByte(Permissions.Permission.WRITE.toByte()));
-        assertTrue(buffer.containsPByte(Permissions.Permission.MODIFY_POLICY
-                .toByte()));
-
-        buffer.removePermission(Permissions.Permission.MODIFY_POLICY);
-
-        assertTrue(buffer.containsPByte(Permissions.Permission.READ.toByte()));
-        assertTrue(buffer.containsPByte(Permissions.Permission.DELETE.toByte()));
-        assertFalse(buffer.containsPByte(Permissions.Permission.WRITE.toByte()));
-        assertFalse(buffer.containsPByte(Permissions.Permission.MODIFY_POLICY
-                .toByte()));
-    }
-
-}
diff --git a/full/src/test/java/de/ids_mannheim/korap/security/PolicyBenchmarkTest.java b/full/src/test/java/de/ids_mannheim/korap/security/PolicyBenchmarkTest.java
deleted file mode 100644
index 6804770..0000000
--- a/full/src/test/java/de/ids_mannheim/korap/security/PolicyBenchmarkTest.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package de.ids_mannheim.korap.security;
-
-/**
- * @author hanl
- * @date 09/02/2016
- */
-public class PolicyBenchmarkTest {
-
-
-}
diff --git a/full/src/test/java/de/ids_mannheim/korap/security/SecurityPolicyTest.java b/full/src/test/java/de/ids_mannheim/korap/security/SecurityPolicyTest.java
deleted file mode 100644
index f309543..0000000
--- a/full/src/test/java/de/ids_mannheim/korap/security/SecurityPolicyTest.java
+++ /dev/null
@@ -1,156 +0,0 @@
-package de.ids_mannheim.korap.security;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertTrue;
-
-import java.util.HashSet;
-import java.util.List;
-import java.util.Set;
-
-import org.junit.Ignore;
-import org.junit.Test;
-
-import de.ids_mannheim.korap.config.BeanConfigTest;
-import de.ids_mannheim.korap.exceptions.KustvaktException;
-import de.ids_mannheim.korap.interfaces.db.PolicyHandlerIface;
-import de.ids_mannheim.korap.resources.Corpus;
-import de.ids_mannheim.korap.resources.Permissions;
-
-/** EM: Not supported in the current implementation (new DB)
- * 
- * @author hanl
- * @date 12/02/2016
- */
-@Deprecated
-@Ignore
-public class SecurityPolicyTest extends BeanConfigTest {
-
-    @Test
-    public void testConditionUpdate () {
-        SecurityPolicy policy = new SecurityPolicy();
-        policy.addNewCondition(new PolicyCondition("test_1"));
-        policy.addNewCondition(new PolicyCondition("test_2"));
-        policy.setCreator(1);
-        policy.setTarget(new Corpus("WPD"));
-        policy.addPermission(Permissions.Permission.READ);
-
-        assertEquals(2, policy.getAdded().size());
-        policy.removeCondition(new PolicyCondition("test_1"));
-        assertEquals(1, policy.getAdded().size());
-    }
-
-
-    @Test
-    public void testConditionMapping () throws KustvaktException {
-        helper().setupResource(new Corpus("WPD_2"));
-        SecurityPolicy policy = new SecurityPolicy();
-        policy.addNewCondition(new PolicyCondition("test_1"));
-        policy.addNewCondition(new PolicyCondition("test_2"));
-        policy.setCreator(1);
-        policy.setTarget(new Corpus("WPD_2"));
-        policy.addPermission(Permissions.Permission.READ);
-
-        PolicyHandlerIface dao = helper().getContext().getPolicyDbProvider();
-        dao.createPolicy(policy, helper().getUser());
-
-        List<SecurityPolicy>[] list = dao.getPolicies("WPD_2",
-                helper().getUser(), Permissions.Permission.READ.toByte());
-        assertNotNull(list);
-        List<SecurityPolicy> policies = list[0];
-        assertNotNull(policies);
-        assertFalse(policies.isEmpty());
-        assertEquals(2, policies.size());
-        assertTrue(policies.get(0) instanceof SecurityPolicy.OwnerPolicy);
-        policy = policies.get(1);
-        assertEquals(2, policy.getConditions().size());
-        policy.removeCondition(new PolicyCondition("test_1"));
-        assertEquals(1, policy.getRemoved().size());
-        assertTrue(policy.getAdded().isEmpty());
-    }
-
-
-    @Test
-    public void testPersistingPermissionMapping () throws KustvaktException {
-        helper().setupResource(new Corpus("WPD_3"));
-        SecurityPolicy policy = new SecurityPolicy();
-        policy.addNewCondition(new PolicyCondition("test_1"));
-        policy.addNewCondition(new PolicyCondition("test_2"));
-        policy.setCreator(1);
-        policy.setTarget(new Corpus("WPD_3"));
-        policy.addPermission(Permissions.Permission.READ);
-        policy.addPermission(Permissions.Permission.WRITE);
-
-        PolicyHandlerIface dao = helper().getContext().getPolicyDbProvider();
-        dao.createPolicy(policy, helper().getUser());
-
-        List<SecurityPolicy>[] list = dao.getPolicies("WPD_3",
-                helper().getUser(), Permissions.Permission.READ.toByte());
-
-        assertNotNull(list);
-        List<SecurityPolicy> policies = list[0];
-        assertNotNull(policies);
-        assertFalse(policies.isEmpty());
-        assertEquals(2, policies.size());
-        assertTrue(policies.get(0) instanceof SecurityPolicy.OwnerPolicy);
-        policy = policies.get(1);
-
-        Set<Permissions.Permission> check = new HashSet<>();
-        check.add(Permissions.Permission.READ);
-        check.add(Permissions.Permission.WRITE);
-        assertEquals(check, policy.getPermissions());
-    }
-
-
-    @Test
-    public void testConditionRemoval () throws KustvaktException {
-        helper().setupResource(new Corpus("WPD_1"));
-        SecurityPolicy policy = new SecurityPolicy();
-        policy.addNewCondition(new PolicyCondition("test_1"));
-        policy.addNewCondition(new PolicyCondition("test_2"));
-        policy.setCreator(1);
-        policy.setTarget(new Corpus("WPD_1"));
-        policy.addPermission(Permissions.Permission.READ);
-
-        PolicyHandlerIface dao = helper().getContext().getPolicyDbProvider();
-        dao.createPolicy(policy, helper().getUser());
-
-        Object[] list = dao.getPolicies("WPD_1", helper().getUser(),
-                Permissions.Permission.READ.toByte());
-        assertNotNull(list);
-        List<SecurityPolicy> policies = (List<SecurityPolicy>) list[0];
-        assertNotNull(policies);
-        assertFalse(policies.isEmpty());
-        policy = policies.get(1);
-
-        assertEquals(2, policy.getConditions().size());
-        policy.removeCondition(new PolicyCondition("test_1"));
-        assertEquals(1, policy.getRemoved().size());
-        assertTrue(policy.getAdded().isEmpty());
-
-        dao.updatePolicy(policy, helper().getUser());
-        policies = dao.getPolicies("WPD_1", helper().getUser(),
-                Permissions.Permission.READ.toByte())[0];
-        policy = policies.get(1);
-        assertEquals(1, policy.getConditions().size());
-    }
-
-
-    @Test
-    public void testPermissionConversion () {
-        SecurityPolicy policy = new SecurityPolicy();
-        policy.setPOSIX("3");
-        Set<Permissions.Permission> perms = new HashSet<>();
-        perms.add(Permissions.Permission.READ);
-        perms.add(Permissions.Permission.WRITE);
-        assertEquals(perms, policy.getPermissions());
-    }
-
-
-    @Override
-    public void initMethod () throws KustvaktException {
-        //        helper().runBootInterfaces();
-        helper().setupAccount();
-    }
-}
diff --git a/full/src/test/java/de/ids_mannheim/korap/web/controller/PolicyServiceTest.java b/full/src/test/java/de/ids_mannheim/korap/web/controller/PolicyServiceTest.java
deleted file mode 100644
index 708259a..0000000
--- a/full/src/test/java/de/ids_mannheim/korap/web/controller/PolicyServiceTest.java
+++ /dev/null
@@ -1,175 +0,0 @@
-package de.ids_mannheim.korap.web.controller;
-
-import static org.junit.Assert.assertEquals;
-
-import java.io.IOException;
-import java.util.List;
-import java.util.UUID;
-
-import org.junit.Ignore;
-import org.junit.Test;
-import org.springframework.beans.factory.annotation.Autowired;
-
-import com.sun.jersey.api.client.ClientResponse;
-
-import de.ids_mannheim.korap.authentication.http.HttpAuthorizationHandler;
-import de.ids_mannheim.korap.config.Attributes;
-import de.ids_mannheim.korap.exceptions.KustvaktException;
-import de.ids_mannheim.korap.interfaces.db.PolicyHandlerIface;
-import de.ids_mannheim.korap.interfaces.db.ResourceOperationIface;
-import de.ids_mannheim.korap.resources.Corpus;
-import de.ids_mannheim.korap.resources.Foundry;
-import de.ids_mannheim.korap.resources.KustvaktResource;
-import de.ids_mannheim.korap.resources.Permissions;
-import de.ids_mannheim.korap.resources.Permissions.Permission;
-import de.ids_mannheim.korap.resources.VirtualCollection;
-import de.ids_mannheim.korap.security.PolicyCondition;
-import de.ids_mannheim.korap.security.SecurityPolicy;
-import de.ids_mannheim.korap.user.User;
-import de.ids_mannheim.korap.user.User.UserFactory;
-import de.ids_mannheim.korap.web.FastJerseyTest;
-
-/** Not in the new DB
- * @author margaretha
- */
-@Ignore
-@Deprecated
-public class PolicyServiceTest extends FastJerseyTest {
-
-    @Autowired
-    HttpAuthorizationHandler handler;
-    
-    private User user = UserFactory.getDemoUser();
-
-
-    @Test
-    public void testCreatePolicyForVirtualCollection ()
-            throws IOException, KustvaktException {
-        String id = UUID.randomUUID().toString();
-        ClientResponse response = resource().path(getAPIVersion()).path("admin")
-                .path("createPolicies").path(id)
-                .queryParam("type", "virtualcollection")
-                .queryParam("name", "Goethe VC")
-                .queryParam("description", "Goethe corpus")
-                .queryParam("group", "public")
-                .queryParam("perm", Permission.READ.name())
-                .queryParam("expire", "")
-                .header(Attributes.AUTHORIZATION,
-                        handler.createBasicAuthorizationHeaderValue("kustvakt", "kustvakt2015"))
-                .post(ClientResponse.class);
-
-        assertEquals(ClientResponse.Status.OK.getStatusCode(),
-                response.getStatus());
-
-        // Check the policies
-        PolicyHandlerIface dao = helper().getContext().getPolicyDbProvider();
-        List<SecurityPolicy> policies = dao.getPolicies(
-                new PolicyCondition("public"), VirtualCollection.class,
-                Permissions.Permission.READ.toByte());
-        assertEquals(2, policies.size());
-        
-        policies = dao.getPoliciesByPersistentId(
-                new PolicyCondition("public"), VirtualCollection.class,
-                Permissions.Permission.READ.toByte(),id);
-        assertEquals(1, policies.size());
-        assertEquals(id, policies.get(0).getTarget());
-
-        // Check the resource
-        List<ResourceOperationIface> providers = (List<ResourceOperationIface>) helper()
-                .getContext().getResourceProviders();
-        ResourceOperationIface resourceDao = providers.get(0);
-
-        User user = UserFactory.getDemoUser();
-        KustvaktResource resource = resourceDao.findbyId(id, user);
-        assertEquals("Goethe VC", resource.getName());
-
-    }
-
-
-    @Test
-    public void testCreatePolicyForFoundry ()
-            throws IOException, KustvaktException {
-        String id = UUID.randomUUID().toString();
-        ClientResponse response = resource().path(getAPIVersion()).path("admin")
-                .path("createPolicies").path(id).queryParam("type", "foundry")
-                .queryParam("name", "stanford")
-                .queryParam("description", "stanford parser")
-                .queryParam("group", "public")
-                .queryParam("perm", Permission.READ.name())
-                .queryParam("loc", "255.255.255.0")
-                .queryParam("expire", "30D")
-                .header(Attributes.AUTHORIZATION,
-                        handler.createBasicAuthorizationHeaderValue("kustvakt", "kustvakt2015"))
-                .post(ClientResponse.class);
-
-        assertEquals(ClientResponse.Status.OK.getStatusCode(),
-                response.getStatus());
-
-        // Check the resource store
-        List<ResourceOperationIface> providers = (List<ResourceOperationIface>) helper()
-                .getContext().getResourceProviders();
-        ResourceOperationIface resourceDao = providers.get(0);
-        KustvaktResource resource = resourceDao.findbyId(id, user);
-        assertEquals("stanford", resource.getName());
-
-        // Check the policies
-        PolicyHandlerIface dao = helper().getContext().getPolicyDbProvider();
-        List<SecurityPolicy> policies = dao.getPoliciesByPersistentId(
-                new PolicyCondition("public"), Foundry.class,
-                Permissions.Permission.READ.toByte(),id);
-        assertEquals(1, policies.size());
-        assertEquals("255.255.255.0",policies.get(0).getContext().getIpmask());
-
-    }
-
-
-    @Test
-    public void testCreatePolicyForMultiplePermissions ()
-            throws IOException, KustvaktException {
-        String id = UUID.randomUUID().toString();
-        ClientResponse response = resource().path(getAPIVersion()).path("admin")
-                .path("createPolicies").path(id).queryParam("type", "corpus")
-                .queryParam("name", "Brown")
-                .queryParam("description", "Brown corpus")
-                .queryParam("group", "public")
-                .queryParam("perm", Permission.READ.name())
-                .queryParam("perm", Permission.WRITE.name())
-                .queryParam("perm", Permission.DELETE.name())
-                .queryParam("expire", "30D")
-                .header(Attributes.AUTHORIZATION,
-                        handler.createBasicAuthorizationHeaderValue("kustvakt", "kustvakt2015"))
-                .post(ClientResponse.class);
-
-        assertEquals(ClientResponse.Status.OK.getStatusCode(),
-                response.getStatus());
-
-        // Check resource store
-        List<ResourceOperationIface> providers = (List<ResourceOperationIface>) helper()
-                .getContext().getResourceProviders();
-        ResourceOperationIface resourceDao = providers.get(0);
-
-        KustvaktResource resource = resourceDao.findbyId(id, user);
-        assertEquals("Brown", resource.getName());
-
-        // Check the policies
-        PolicyHandlerIface dao = helper().getContext().getPolicyDbProvider();
-        List<SecurityPolicy> policies = dao.getPoliciesByPersistentId(
-                new PolicyCondition("public"), Corpus.class,
-                Permissions.Permission.WRITE.toByte(),id);
-        assertEquals(1, policies.size());
-        assertEquals(id, policies.get(0).getTarget());
-        
-        policies = dao.getPoliciesByPersistentId(
-                new PolicyCondition("public"), Corpus.class,
-                Permissions.Permission.DELETE.toByte(),id);
-        assertEquals(1, policies.size());
-        assertEquals(id, policies.get(0).getTarget());
-    }
-
-
-    @Override
-    public void initMethod () throws KustvaktException {
-//        helper().runBootInterfaces();
-    }
-}
-
diff --git a/full/src/test/java/de/ids_mannheim/korap/web/controller/UserControllerTest.java b/full/src/test/java/de/ids_mannheim/korap/web/controller/UserControllerTest.java
index 3cb66f2..4ea6807 100644
--- a/full/src/test/java/de/ids_mannheim/korap/web/controller/UserControllerTest.java
+++ b/full/src/test/java/de/ids_mannheim/korap/web/controller/UserControllerTest.java
@@ -275,7 +275,7 @@
 
 	@Test
 	public void testGetUserDetailsNonExistent() throws KustvaktException {
-		helper().setupSimpleAccount("userservicetest", "servicepass");
+//		helper().setupSimpleAccount("userservicetest", "servicepass");
 
 		String enc = handler.createBasicAuthorizationHeaderValue("userservicetest", "servicepass");
 		ClientResponse response = resource().path("user").path("details")
diff --git a/full/src/test/resources/test-config.xml b/full/src/test/resources/test-config.xml
index 99b2dd7..83291a9 100644
--- a/full/src/test/resources/test-config.xml
+++ b/full/src/test/resources/test-config.xml
@@ -258,7 +258,7 @@
 	<bean id="kustvakt_authenticationmanager"
 		class="de.ids_mannheim.korap.authentication.KustvaktAuthenticationManager">
 		<constructor-arg
-			type="de.ids_mannheim.korap.interfaces.db.EntityHandlerIface" ref="kustvakt_userdb" />
+			type="de.ids_mannheim.korap.interfaces.EntityHandlerIface" ref="kustvakt_userdb" />
 		<constructor-arg type="de.ids_mannheim.korap.interfaces.EncryptionIface"
 			ref="kustvakt_encryption" />
 		<constructor-arg ref="kustvakt_config" />
