tests
diff --git a/src/main/java/de/ids_mannheim/korap/config/KustvaktClassLoader.java b/src/main/java/de/ids_mannheim/korap/config/KustvaktClassLoader.java
index 345dc77..8832307 100644
--- a/src/main/java/de/ids_mannheim/korap/config/KustvaktClassLoader.java
+++ b/src/main/java/de/ids_mannheim/korap/config/KustvaktClassLoader.java
@@ -1,6 +1,5 @@
 package de.ids_mannheim.korap.config;
 
-import de.ids_mannheim.korap.interfaces.db.UserDataDbIface;
 import org.reflections.Reflections;
 
 import java.lang.annotation.Annotation;
@@ -36,10 +35,9 @@
         return reflections.getTypesAnnotatedWith(annotation);
     }
 
-    public static Class<? extends UserDataDbIface> getClass(Class type,
-            Class iface) {
-        Set<Class<?>> c = KustvaktClassLoader.loadSubTypes(iface);
-        for (Class o : c) {
+    public static <T> Class<? extends T> getTypeClass(Class type, Class<T> iface) {
+        Set<Class<? extends T>> c = KustvaktClassLoader.loadSubTypes(iface);
+        for (Class<? extends T> o : c) {
             Type ctype = o.getGenericInterfaces()[0];
             if (ctype instanceof ParameterizedType) {
                 ParameterizedType ptype = (ParameterizedType) ctype;
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 d59c23e..1fa2833 100644
--- a/src/main/java/de/ids_mannheim/korap/config/KustvaktConfiguration.java
+++ b/src/main/java/de/ids_mannheim/korap/config/KustvaktConfiguration.java
@@ -95,6 +95,7 @@
             throws MalformedURLException {
         maxhits = new Integer(properties.getProperty("maxhits", "50000"));
         returnhits = new Integer(properties.getProperty("returnhits", "50000"));
+        //todo: refactor to krill.indexDir
         indexDir = properties.getProperty("lucene.indexDir", "");
         //        URL url = KustvaktConfiguration.class.getClassLoader()
         //                .getResource(idir);
diff --git a/src/main/java/de/ids_mannheim/korap/interfaces/db/PolicyHandlerIface.java b/src/main/java/de/ids_mannheim/korap/interfaces/db/PolicyHandlerIface.java
index 5b6866d..2100632 100644
--- a/src/main/java/de/ids_mannheim/korap/interfaces/db/PolicyHandlerIface.java
+++ b/src/main/java/de/ids_mannheim/korap/interfaces/db/PolicyHandlerIface.java
@@ -6,7 +6,6 @@
 import de.ids_mannheim.korap.security.PolicyCondition;
 import de.ids_mannheim.korap.security.SecurityPolicy;
 import de.ids_mannheim.korap.user.User;
-import org.springframework.transaction.annotation.Transactional;
 
 import java.util.List;
 
@@ -15,8 +14,6 @@
  * Date: 10/31/13
  * Time: 3:01 PM
  */
-// todo: this still applicable?
-@Transactional
 public interface PolicyHandlerIface {
 
     /**
@@ -34,7 +31,8 @@
      */
     List<SecurityPolicy>[] getPolicies(Integer target, User user, Byte perm);
 
-    List<SecurityPolicy>[] getPolicies(PolicyCondition condition, Byte perm);
+    List<SecurityPolicy> getPolicies(PolicyCondition condition,
+            Class<? extends KustvaktResource> clazz, Byte perm);
 
     /**
      * @param policy
diff --git a/src/main/java/de/ids_mannheim/korap/resources/Permissions.java b/src/main/java/de/ids_mannheim/korap/resources/Permissions.java
index 8602c0f..c6fc6ec 100644
--- a/src/main/java/de/ids_mannheim/korap/resources/Permissions.java
+++ b/src/main/java/de/ids_mannheim/korap/resources/Permissions.java
@@ -6,21 +6,42 @@
  */
 public class Permissions {
 
-    public enum PERMISSIONS {
+    public enum Permission {
+
         //fixme: add read_policy permission to allow read policy permissions
-        READ, WRITE, DELETE, READ_POLICY, CREATE_POLICY, MODIFY_POLICY, DELETE_POLICY, ALL
+        READ(Permissions.READ),
+
+        WRITE(Permissions.WRITE),
+
+        DELETE(Permissions.READ),
+        READ_POLICY(Permissions.READ_POLICY),
+        CREATE_POLICY(Permissions.CREATE_POLICY),
+        MODIFY_POLICY(Permissions.MODIFY_POLICY),
+        DELETE_POLICY(Permissions.DELETE_POLICY),
+        ALL(Permissions.ALL);
+
+        private final Byte b;
+
+        Permission(Byte b) {
+            this.b = b;
+        }
+
+        public Byte toByte() {
+            return this.b;
+        }
     }
 
-    public static final byte READ = 1;
-    public static final byte WRITE = 2;
-    public static final byte DELETE = 4;
-    public static final byte READ_POLICY = 8;
-    public static final byte CREATE_POLICY = 16;
-    public static final byte MODIFY_POLICY = 32;
-    public static final byte DELETE_POLICY = 64;
-    public static final byte ALL = 127;
+    private static final byte READ = 1;
+    private static final byte WRITE = 2;
+    private static final byte DELETE = 4;
+    private static final byte READ_POLICY = 8;
+    private static final byte CREATE_POLICY = 16;
+    private static final byte MODIFY_POLICY = 32;
+    private static final byte DELETE_POLICY = 64;
+    private static final byte ALL = 127;
 
-    public static Byte getByte(PERMISSIONS perm) {
+    @Deprecated
+    public static Byte getByte(Permission perm) {
         switch (perm) {
             case READ:
                 return READ;
diff --git a/src/main/java/de/ids_mannheim/korap/security/PermissionsBuffer.java b/src/main/java/de/ids_mannheim/korap/security/PermissionsBuffer.java
index a9a88df..96f1e72 100644
--- a/src/main/java/de/ids_mannheim/korap/security/PermissionsBuffer.java
+++ b/src/main/java/de/ids_mannheim/korap/security/PermissionsBuffer.java
@@ -33,7 +33,7 @@
         this.bytes = bytes;
     }
 
-    public boolean containsPermission(Permissions.PERMISSIONS p) {
+    public boolean containsPermission(Permissions.Permission p) {
         return containsPByte(Permissions.getByte(p));
     }
 
@@ -57,18 +57,17 @@
         bytes = b.array();
     }
 
-    public void addPermissions(Permissions.PERMISSIONS... perm) {
+    public void addPermissions(Permissions.Permission... perm) {
         if (perm.length > 0) {
-            for (Permissions.PERMISSIONS p : perm)
-                addPermission(Permissions.getByte(p));
+            for (Permissions.Permission p : perm)
+                addPermission(p.toByte());
         }
     }
 
-    public void removePermission(Permissions.PERMISSIONS perm) {
-        this.removePermission(Permissions.getByte(perm));
+    public void removePermission(Permissions.Permission perm) {
+        this.removePermission(perm.toByte());
     }
 
-
     public int removePermission(int b) {
         if ((bytes[1] & b) != 0)
             bytes[1] -= b;
@@ -100,7 +99,7 @@
     }
 
     public boolean leftShift(byte perm) {
-//        return pbyte & (perm << 1);
+        //        return pbyte & (perm << 1);
         System.out.println("pbyte is: " + bytes[1]);
         System.out.println("bitswise operation, left shift " + (perm << 1));
         return false;
@@ -126,24 +125,27 @@
         return this.bytes[1];
     }
 
-    public Set<Permissions.PERMISSIONS> getPermissions() {
-        Set<Permissions.PERMISSIONS> pe = new HashSet<>();
-        if (containsPByte(Permissions.READ))
-            pe.add(Permissions.PERMISSIONS.READ);
-        if (containsPByte(Permissions.WRITE))
-            pe.add(Permissions.PERMISSIONS.WRITE);
-        if (containsPByte(Permissions.DELETE))
-            pe.add(Permissions.PERMISSIONS.DELETE);
-        if (containsPByte(Permissions.CREATE_POLICY))
-            pe.add(Permissions.PERMISSIONS.CREATE_POLICY);
-        if (containsPByte(Permissions.MODIFY_POLICY))
-            pe.add(Permissions.PERMISSIONS.MODIFY_POLICY);
-        if (containsPByte(Permissions.DELETE_POLICY))
-            pe.add(Permissions.PERMISSIONS.DELETE_POLICY);
+    public Set<Permissions.Permission> getPermissions() {
+        Set<Permissions.Permission> pe = new HashSet<>();
+        for (Permissions.Permission p : Permissions.Permission.values()) {
+            if (containsPByte(p.toByte()))
+                pe.add(p);
+        }
+        //        if (containsPByte(Permissions.READ))
+        //            pe.add(Permissions.Permission.READ);
+        //        if (containsPByte(Permissions.WRITE))
+        //            pe.add(Permissions.Permission.WRITE);
+        //        if (containsPByte(Permissions.DELETE))
+        //            pe.add(Permissions.Permission.DELETE);
+        //        if (containsPByte(Permissions.CREATE_POLICY))
+        //            pe.add(Permissions.Permission.CREATE_POLICY);
+        //        if (containsPByte(Permissions.MODIFY_POLICY))
+        //            pe.add(Permissions.Permission.MODIFY_POLICY);
+        //        if (containsPByte(Permissions.DELETE_POLICY))
+        //            pe.add(Permissions.Permission.DELETE_POLICY);
         return pe;
     }
 
-
     public byte getOverride() {
         return this.bytes[0];
     }
@@ -151,10 +153,11 @@
     public String toBinary() {
         StringBuilder sb = new StringBuilder(bytes.length * Byte.SIZE);
         for (int i = 0; i < Byte.SIZE * bytes.length; i++) {
-            sb.append((bytes[i / Byte.SIZE] << i % Byte.SIZE & 0x80) == 0 ? '0' : '1');
+            sb.append((bytes[i / Byte.SIZE] << i % Byte.SIZE & 0x80) == 0 ?
+                    '0' :
+                    '1');
         }
         return sb.toString();
     }
 
-
 }
diff --git a/src/main/java/de/ids_mannheim/korap/security/SecurityPolicy.java b/src/main/java/de/ids_mannheim/korap/security/SecurityPolicy.java
index 5247b4a..dfaece7 100644
--- a/src/main/java/de/ids_mannheim/korap/security/SecurityPolicy.java
+++ b/src/main/java/de/ids_mannheim/korap/security/SecurityPolicy.java
@@ -86,8 +86,8 @@
 
     // todo ???????
     @Deprecated
-    public SecurityPolicy setOverride(Permissions.PERMISSIONS... perms) {
-        for (Permissions.PERMISSIONS p : perms)
+    public SecurityPolicy setOverride(Permissions.Permission... perms) {
+        for (Permissions.Permission p : perms)
             this.permissions.addOverride(Permissions.getByte(p));
         return this;
     }
@@ -151,7 +151,11 @@
     }
 
     public SecurityPolicy removeCondition(PolicyCondition constraint) {
-        this.removedidx.add(this.conditions.indexOf(constraint));
+        int idx = this.conditions.indexOf(constraint);
+        if (this.addedidx.contains(idx))
+            this.addedidx.remove(idx);
+        else
+            this.removedidx.add(this.conditions.indexOf(constraint));
         return this;
     }
 
@@ -181,7 +185,7 @@
         this.addedidx.clear();
     }
 
-    public boolean hasPermission(Permissions.PERMISSIONS perm) {
+    public boolean hasPermission(Permissions.Permission perm) {
         return permissions != null && permissions.containsPermission(perm);
     }
 
@@ -191,19 +195,19 @@
      * @param perms
      * @return
      */
-    public SecurityPolicy addPermission(Permissions.PERMISSIONS... perms) {
+    public SecurityPolicy addPermission(Permissions.Permission... perms) {
         permissions.addPermissions(perms);
         return this;
     }
 
-    public boolean equalsPermission(Permissions.PERMISSIONS... perms) {
+    public boolean equalsPermission(Permissions.Permission... perms) {
         PermissionsBuffer b = new PermissionsBuffer();
         b.addPermissions(perms);
         return permissions != null && permissions.getPbyte()
                 .equals(b.getPbyte());
     }
 
-    public void removePermission(Permissions.PERMISSIONS perm) {
+    public void removePermission(Permissions.Permission perm) {
         if (permissions != null)
             permissions.removePermission(perm);
     }
@@ -223,7 +227,7 @@
         return sb.toString();
     }
 
-    public Set<Permissions.PERMISSIONS> getPermissions() {
+    public Set<Permissions.Permission> getPermissions() {
         return permissions.getPermissions();
     }
 
diff --git a/src/main/java/de/ids_mannheim/korap/security/ac/ConditionManagement.java b/src/main/java/de/ids_mannheim/korap/security/ac/ConditionManagement.java
index d06764f..eab7b7f 100644
--- a/src/main/java/de/ids_mannheim/korap/security/ac/ConditionManagement.java
+++ b/src/main/java/de/ids_mannheim/korap/security/ac/ConditionManagement.java
@@ -80,7 +80,7 @@
 
     @Deprecated
     public void addUser(KustvaktResource resource, String user,
-            Permissions.PERMISSIONS... pps)
+            Permissions.Permission... pps)
             throws NotAuthorizedException, KustvaktException,
             EmptyResultException {
         addUser(resource, Arrays.asList(user), pps);
@@ -88,7 +88,7 @@
 
     @Deprecated
     public void addUser(KustvaktResource resource, List<String> users,
-            Permissions.PERMISSIONS... pps)
+            Permissions.Permission... pps)
             throws NotAuthorizedException, KustvaktException,
             EmptyResultException {
         SecurityManager policies = SecurityManager
diff --git a/src/main/java/de/ids_mannheim/korap/security/ac/PolicyBuilder.java b/src/main/java/de/ids_mannheim/korap/security/ac/PolicyBuilder.java
index 1922433..7e65b7c 100644
--- a/src/main/java/de/ids_mannheim/korap/security/ac/PolicyBuilder.java
+++ b/src/main/java/de/ids_mannheim/korap/security/ac/PolicyBuilder.java
@@ -1,11 +1,11 @@
 package de.ids_mannheim.korap.security.ac;
 
 import de.ids_mannheim.korap.exceptions.KustvaktException;
-import de.ids_mannheim.korap.exceptions.NotAuthorizedException;
 import de.ids_mannheim.korap.exceptions.StatusCodes;
 import de.ids_mannheim.korap.resources.KustvaktResource;
 import de.ids_mannheim.korap.resources.Permissions;
 import de.ids_mannheim.korap.resources.Relation;
+import de.ids_mannheim.korap.response.Notifications;
 import de.ids_mannheim.korap.security.PolicyCondition;
 import de.ids_mannheim.korap.security.PolicyContext;
 import de.ids_mannheim.korap.security.SecurityPolicy;
@@ -19,10 +19,11 @@
 // todo: also be able to create or edit relations
 public class PolicyBuilder {
 
+    private Notifications notifications;
     private User user;
     private KustvaktResource[] resources;
     private KustvaktResource[] parents;
-    private Permissions.PERMISSIONS[] permissions;
+    private Permissions.Permission[] permissions;
     private PolicyCondition[] conditions;
     //    private Map<String, ParameterSettingsHandler> settings;
     private Relation rel = null;
@@ -30,10 +31,10 @@
 
     public PolicyBuilder(User user) {
         this.user = user;
-
+        this.notifications = new Notifications();
         // fixme: other exception!?
         if (this.user.getId() == -1)
-            throw new RuntimeException("user id must be set");
+            throw new RuntimeException("user id must be a valid interger id");
     }
 
     public PolicyBuilder setResources(KustvaktResource... targets) {
@@ -77,7 +78,7 @@
     }
 
     public PolicyBuilder setPermissions(
-            Permissions.PERMISSIONS... permissions) {
+            Permissions.Permission... permissions) {
         this.permissions = permissions;
         return this;
     }
@@ -107,12 +108,12 @@
         return setConditions(condition);
     }
 
-    public void create() throws NotAuthorizedException, KustvaktException {
-        this.doIt();
+    public String create() throws KustvaktException {
+        return this.doIt();
     }
 
     // for and relations there is no way of setting parameters conjoined with the policy
-    private void doIt() throws NotAuthorizedException, KustvaktException {
+    private String doIt() throws KustvaktException {
         if (this.resources == null)
             throw new KustvaktException(user.getId(),
                     StatusCodes.ILLEGAL_ARGUMENT, "resource must be set",
@@ -172,9 +173,10 @@
                     }
                 }
             }catch (KustvaktException e) {
-                System.out.println("IF ERROR, LET OTHER RESOURCES RUN ANYWAY!");
-                e.printStackTrace();
+                this.notifications.addError(e.getStatusCode(), e.getMessage(),
+                        resources[idx].getPersistentID());
             }
         }
+        return notifications.toJsonString();
     }
 }
diff --git a/src/main/java/de/ids_mannheim/korap/security/ac/PolicyDao.java b/src/main/java/de/ids_mannheim/korap/security/ac/PolicyDao.java
index eb30029..8d87df6 100644
--- a/src/main/java/de/ids_mannheim/korap/security/ac/PolicyDao.java
+++ b/src/main/java/de/ids_mannheim/korap/security/ac/PolicyDao.java
@@ -15,6 +15,7 @@
 import de.ids_mannheim.korap.utils.BooleanUtils;
 import de.ids_mannheim.korap.utils.StringUtils;
 import de.ids_mannheim.korap.utils.TimeUtils;
+import edu.emory.mathcs.backport.java.util.Collections;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.dao.DataAccessException;
@@ -228,7 +229,7 @@
                         @Override
                         public List<SecurityPolicy>[] extractData(ResultSet rs)
                                 throws SQLException, DataAccessException {
-                            return SecurityRowMappers.mapping(rs);
+                            return SecurityRowMappers.mapResourcePolicies(rs);
                         }
                     });
         }catch (DataAccessException e) {
@@ -239,12 +240,14 @@
         }
     }
 
+    // without root policies, since these are policies from different resources!
     @Override
-    public List<SecurityPolicy>[] getPolicies(PolicyCondition condition,
-            Byte perm) {
+    public List<SecurityPolicy> getPolicies(PolicyCondition condition,
+            Class<? extends KustvaktResource> clazz, Byte perm) {
         MapSqlParameterSource param = new MapSqlParameterSource();
         param.addValue("cond", condition.getSpecifier());
         param.addValue("perm", perm);
+        param.addValue("type", ResourceFactory.getResourceMapping(clazz));
         param.addValue("en", new Timestamp(TimeUtils.getNow().getMillis()));
 
         String sql_new = "select pv.*, pv.perm & :perm as allowed, " +
@@ -255,28 +258,28 @@
                 "where " +
                 "pv.enable <= :en and (pv.expire > :en or pv.expire is NULL) and "
                 +
-                "(pv.group_id='self' or pv.group_id=:cond) and " +
+                "pv.group_id=:cond and pv.type=:type and " +
                 "(select sum(distinct depth) from resource_tree where child_id=rh.child_id) = "
                 +
                 "(select sum(distinct res.depth) from policy_view as pos inner join resource_tree as res on res.parent_id=pos.id where (pos.group_id=:cond)"
                 +
-                " or pos.group_id='self') and res.child_id=rh.child_id group by child_id)";
+                " and res.child_id=rh.child_id group by child_id)";
 
         try {
             return this.jdbcTemplate.query(sql_new, param,
-                    new ResultSetExtractor<List<SecurityPolicy>[]>() {
+                    new ResultSetExtractor<List<SecurityPolicy>>() {
 
                         @Override
-                        public List<SecurityPolicy>[] extractData(ResultSet rs)
+                        public List<SecurityPolicy> extractData(ResultSet rs)
                                 throws SQLException, DataAccessException {
-                            return SecurityRowMappers.mapping(rs);
+                            return SecurityRowMappers.mapConditionPolicies(rs);
                         }
                     });
         }catch (DataAccessException e) {
             e.printStackTrace();
             jlog.error("Permission Denied for policy retrieval for '{}'",
                     condition.getSpecifier());
-            return new List[2];
+            return Collections.emptyList();
         }
     }
 
@@ -313,7 +316,7 @@
                         @Override
                         public List<SecurityPolicy>[] extractData(ResultSet rs)
                                 throws SQLException, DataAccessException {
-                            return SecurityRowMappers.mapping(rs);
+                            return SecurityRowMappers.mapResourcePolicies(rs);
                         }
                     });
         }catch (DataAccessException e) {
@@ -356,7 +359,7 @@
                         @Override
                         public List<SecurityPolicy>[] extractData(ResultSet rs)
                                 throws SQLException, DataAccessException {
-                            return SecurityRowMappers.mapping(rs);
+                            return SecurityRowMappers.mapResourcePolicies(rs);
                         }
                     });
         }catch (DataAccessException e) {
diff --git a/src/main/java/de/ids_mannheim/korap/security/ac/PolicyEvaluator.java b/src/main/java/de/ids_mannheim/korap/security/ac/PolicyEvaluator.java
index d76848a..ed1d0af 100644
--- a/src/main/java/de/ids_mannheim/korap/security/ac/PolicyEvaluator.java
+++ b/src/main/java/de/ids_mannheim/korap/security/ac/PolicyEvaluator.java
@@ -57,7 +57,7 @@
 
     // todo: test benchmarks
     private List<SecurityPolicy> evaluate(List<SecurityPolicy>[] policies,
-            Permissions.PERMISSIONS perm) throws NotAuthorizedException {
+            Permissions.Permission perm) throws NotAuthorizedException {
         //fixme: what happens in case a parent relation does not allow changing a resource, but the owner of child per default
         //todo: receives all rights? --> test casing
         jlog.error("IS USER RESOURCE OWNER? " + isOwner());
@@ -117,10 +117,10 @@
      * @return
      */
     public boolean isAllowed() {
-        return isAllowed(Permissions.PERMISSIONS.READ);
+        return isAllowed(Permissions.Permission.READ);
     }
 
-    public boolean isAllowed(Permissions.PERMISSIONS perm) {
+    public boolean isAllowed(Permissions.Permission perm) {
         try {
             List s = evaluate(this.policies, perm);
             return s != null && !s.isEmpty();
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 822c94c..66d9f76 100755
--- a/src/main/java/de/ids_mannheim/korap/security/ac/ResourceFinder.java
+++ b/src/main/java/de/ids_mannheim/korap/security/ac/ResourceFinder.java
@@ -9,6 +9,7 @@
 import de.ids_mannheim.korap.resources.ResourceFactory;
 import de.ids_mannheim.korap.security.PermissionsBuffer;
 import de.ids_mannheim.korap.security.PolicyCondition;
+import de.ids_mannheim.korap.security.SecurityPolicy;
 import de.ids_mannheim.korap.user.Attributes;
 import de.ids_mannheim.korap.user.User;
 import org.slf4j.Logger;
@@ -24,14 +25,14 @@
     private static final Logger jlog = LoggerFactory
             .getLogger(ResourceFinder.class);
     private static PolicyHandlerIface policydao;
+    private static ResourceOperationIface resourcedao;
 
     private List<KustvaktResource.Container> containers;
     private User user;
 
     private ResourceFinder(User user) {
-        this.containers = new ArrayList<>();
+        this();
         this.user = user;
-        checkProviders();
     }
 
     private ResourceFinder() {
@@ -43,25 +44,27 @@
         if (BeanConfiguration.hasContext() && policydao == null) {
             ResourceFinder.policydao = BeanConfiguration.getBeans()
                     .getPolicyDbProvider();
+            ResourceFinder.resourcedao = BeanConfiguration.getBeans()
+                    .getResourceProvider();
         }
-        if (policydao == null)
+        if (policydao == null | resourcedao == null)
             throw new RuntimeException("provider not set!");
     }
 
     public static <T extends KustvaktResource> Set<T> search(String path,
             boolean asParent, User user, Class<T> clazz,
-            Permissions.PERMISSIONS... perms) throws KustvaktException {
+            Permissions.Permission... perms) throws KustvaktException {
         ResourceFinder cat = init(path, asParent, user, clazz, perms);
         return cat.getResources();
     }
 
     private static <T extends KustvaktResource> ResourceFinder init(String path,
             boolean asParent, User user, Class<T> clazz,
-            Permissions.PERMISSIONS... perms) throws KustvaktException {
+            Permissions.Permission... perms) throws KustvaktException {
         ResourceFinder cat = new ResourceFinder(user);
         PermissionsBuffer buffer = new PermissionsBuffer();
         if (perms.length == 0)
-            buffer.addPermissions(Permissions.PERMISSIONS.READ);
+            buffer.addPermissions(Permissions.Permission.READ);
         buffer.addPermissions(perms);
         cat.retrievePolicies(path, buffer.getPbyte(), clazz, asParent);
         return cat;
@@ -70,32 +73,34 @@
     //todo: needs to be much faster!
     public static <T extends KustvaktResource> ResourceFinder init(User user,
             Class<T> clazz) throws KustvaktException {
-        return init(null, true, user, clazz, Permissions.PERMISSIONS.READ);
+        return init(null, true, user, clazz, Permissions.Permission.READ);
     }
 
     public static <T extends KustvaktResource> Set<T> search(String name,
             boolean asParent, User user, String type) throws KustvaktException {
         return (Set<T>) search(name, asParent, user,
                 ResourceFactory.getResourceClass(type),
-                Permissions.PERMISSIONS.READ);
+                Permissions.Permission.READ);
     }
 
     public static <T extends KustvaktResource> Set<T> searchPublic(
-            Class<T> clazz) {
-        List[] list = policydao
+            Class<T> clazz) throws KustvaktException {
+        checkProviders();
+        Set<T> sets = new HashSet<>();
+        List<SecurityPolicy> policies = policydao
                 .getPolicies(new PolicyCondition(Attributes.PUBLIC_GROUP),
-                        Permissions.READ);
-        System.out.println("_____________________");
-        System.out.println("list 1 " + list[0]);
-        System.out.println("list 1 " + list[1]);
-        return new HashSet<>();
+                        clazz, Permissions.READ);
 
+        for (SecurityPolicy policy : policies)
+            sets.add((T) resourcedao.findbyId(policy.getTarget(),
+                    User.UserFactory.getDemoUser()));
+        return sets;
     }
 
     // todo: should this be working?
     public static <T extends KustvaktResource> Set<T> search(User user,
             Class<T> clazz) throws KustvaktException {
-        return search(null, true, user, clazz, Permissions.PERMISSIONS.READ);
+        return search(null, true, user, clazz, Permissions.Permission.READ);
     }
 
     private void retrievePolicies(String path, Byte b, Class type,
diff --git a/src/main/java/de/ids_mannheim/korap/security/ac/ResourceHandler.java b/src/main/java/de/ids_mannheim/korap/security/ac/ResourceHandler.java
index 85665c0..7510e23 100644
--- a/src/main/java/de/ids_mannheim/korap/security/ac/ResourceHandler.java
+++ b/src/main/java/de/ids_mannheim/korap/security/ac/ResourceHandler.java
@@ -104,7 +104,7 @@
         for (T resource : resources) {
             SecurityManager policies;
             try {
-                policies = SecurityManager.init(resource.getPersistentID(), user, Permissions.PERMISSIONS.WRITE);
+                policies = SecurityManager.init(resource.getPersistentID(), user, Permissions.Permission.WRITE);
             } catch (EmptyResultException e) {
                 return;
             }
@@ -125,7 +125,7 @@
             SecurityManager policies;
             try {
                 policies = SecurityManager.init(id, user,
-                        Permissions.PERMISSIONS.DELETE);
+                        Permissions.Permission.DELETE);
             } catch (EmptyResultException e) {
                 return;
             }
@@ -139,7 +139,7 @@
             SecurityManager policies;
             try {
                 policies = SecurityManager.findbyId(r.getPersistentID(), user, r.getClass(),
-                        Permissions.PERMISSIONS.DELETE);
+                        Permissions.Permission.DELETE);
             } catch (EmptyResultException e) {
                 return;
             }
@@ -154,7 +154,7 @@
             SecurityManager policies;
             try {
                 policies = SecurityManager.findbyId(id, user,
-                        Permissions.PERMISSIONS.DELETE);
+                        Permissions.Permission.DELETE);
             } catch (EmptyResultException e) {
                 return;
             }
diff --git a/src/main/java/de/ids_mannheim/korap/security/ac/SecurityManager.java b/src/main/java/de/ids_mannheim/korap/security/ac/SecurityManager.java
index 94d08e6..b05d810 100644
--- a/src/main/java/de/ids_mannheim/korap/security/ac/SecurityManager.java
+++ b/src/main/java/de/ids_mannheim/korap/security/ac/SecurityManager.java
@@ -10,6 +10,7 @@
 import de.ids_mannheim.korap.interfaces.db.ResourceOperationIface;
 import de.ids_mannheim.korap.resources.KustvaktResource;
 import de.ids_mannheim.korap.resources.Permissions;
+import de.ids_mannheim.korap.resources.ResourceFactory;
 import de.ids_mannheim.korap.security.Parameter;
 import de.ids_mannheim.korap.security.PermissionsBuffer;
 import de.ids_mannheim.korap.security.PolicyCondition;
@@ -96,7 +97,7 @@
      */
     //todo: implement a fall back that throws an exception when the user NULL, but the resource has restrictions!
     public static SecurityManager findbyId(String id, User user, Class type,
-            Permissions.PERMISSIONS... perms) throws KustvaktException {
+            Permissions.Permission... perms) throws KustvaktException {
         SecurityManager p = new SecurityManager(user);
         p.findPolicies(id, false, perms);
         p.resource = p.findResource(type);
@@ -104,7 +105,7 @@
     }
 
     public static SecurityManager findbyId(String id, User user,
-            Permissions.PERMISSIONS... perms) throws KustvaktException {
+            Permissions.Permission... perms) throws KustvaktException {
         SecurityManager p = new SecurityManager(user);
         p.findPolicies(id, false, perms);
         p.resource = p.findResource(null);
@@ -112,7 +113,7 @@
     }
 
     public static SecurityManager findbyId(Integer id, User user,
-            Permissions.PERMISSIONS... perms) throws KustvaktException {
+            Permissions.Permission... perms) throws KustvaktException {
         SecurityManager p = new SecurityManager(user);
         p.findPolicies(id, false, perms);
         p.resource = p.findResource(null);
@@ -120,7 +121,7 @@
     }
 
     public static SecurityManager findbyPath(String path, User user,
-            Permissions.PERMISSIONS... perms)
+            Permissions.Permission... perms)
             throws NotAuthorizedException, EmptyResultException {
         SecurityManager manager = new SecurityManager(user);
         manager.findPolicies(path, true, perms);
@@ -129,7 +130,7 @@
     }
 
     public static SecurityManager init(String id, User user,
-            Permissions.PERMISSIONS... perms)
+            Permissions.Permission... perms)
             throws NotAuthorizedException, EmptyResultException {
         SecurityManager p = new SecurityManager(user);
         p.findPolicies(id, false, perms);
@@ -143,7 +144,7 @@
      * @throws NotAuthorizedException
      */
     public final T getResource() throws NotAuthorizedException {
-        if (evaluator.isAllowed(Permissions.PERMISSIONS.READ)) {
+        if (evaluator.isAllowed(Permissions.Permission.READ)) {
             return this.resource;
         }else {
             jlog.error("Reading the resource '{}' is not allowed for user '{}'",
@@ -155,7 +156,7 @@
 
     public void updateResource(T resource)
             throws NotAuthorizedException, KustvaktException {
-        if (evaluator.isAllowed(Permissions.PERMISSIONS.WRITE)) {
+        if (evaluator.isAllowed(Permissions.Permission.WRITE)) {
             ResourceOperationIface iface = handlers.get(resource.getClass());
             if (iface != null)
                 iface.updateResource(resource, this.user);
@@ -179,7 +180,7 @@
     // todo: delete only works with find, not with init constructor!
     public void deleteResource()
             throws NotAuthorizedException, KustvaktException {
-        if (evaluator.isAllowed(Permissions.PERMISSIONS.DELETE)) {
+        if (evaluator.isAllowed(Permissions.Permission.DELETE)) {
             ResourceOperationIface iface = handlers
                     .get(this.resource.getClass());
             if (iface != null)
@@ -198,10 +199,10 @@
 
     // todo: type should be deprecated and return type of policies should be containers!
     private boolean findPolicies(Object id, boolean path,
-            Permissions.PERMISSIONS... perms) throws EmptyResultException {
+            Permissions.Permission... perms) throws EmptyResultException {
         PermissionsBuffer b = new PermissionsBuffer();
         if (perms.length == 0)
-            b.addPermission(Permissions.READ);
+            b.addPermission(Permissions.Permission.READ.toByte());
         else
             b.addPermissions(perms);
         if (id instanceof String && !path)
@@ -213,9 +214,9 @@
         if (id instanceof Integer)
             this.policies = policydao
                     .getPolicies((Integer) id, this.user, b.getPbyte());
-//        System.out.println("-------------------------------");
-//        System.out.println("LENGTH OF POLICY ARRAY " + this.policies.length);
-//        System.out.println("POLICY AT 0 " + this.policies[0]);
+        //        System.out.println("-------------------------------");
+        //        System.out.println("LENGTH OF POLICY ARRAY " + this.policies.length);
+        //        System.out.println("POLICY AT 0 " + this.policies[0]);
         this.evaluator = new PolicyEvaluator(this.user, this.policies);
 
         if (this.policies == null) {
@@ -263,7 +264,7 @@
                     // this is mostly for convenvience and database consistency, since a request query would result in not authorized, based on missing parent relation dependencies
                     // --> in order not to have a resource owner that is denied access due to missing parent relation dependency
                     SecurityManager.findbyId(resource.getParentID(), user,
-                            Permissions.PERMISSIONS.ALL);
+                            Permissions.Permission.ALL);
                 }catch (EmptyResultException e) {
                     jlog.error(
                             "No policies found for parent '{}' for user '{}'",
@@ -275,8 +276,7 @@
             // create persistent identifier for the resource
             if (resource.getPersistentID() == null || resource.getPersistentID()
                     .isEmpty()) {
-                // todo: use resource data!
-                resource.setPersistentID(p.crypto.createID());
+                ResourceFactory.createID(resource);
                 newid = true;
             }
 
@@ -300,9 +300,9 @@
             try {
                 // todo: which is better? Integer id or String persistentID?
                 p.findPolicies(resource.getPersistentID(), false,
-                        Permissions.PERMISSIONS.CREATE_POLICY,
-                        Permissions.PERMISSIONS.READ_POLICY,
-                        Permissions.PERMISSIONS.MODIFY_POLICY);
+                        Permissions.Permission.CREATE_POLICY,
+                        Permissions.Permission.READ_POLICY,
+                        Permissions.Permission.MODIFY_POLICY);
             }catch (EmptyResultException e) {
                 jlog.error(
                         "No policies found for '{}' for user '{}'. Resource could not be registered!",
@@ -332,7 +332,7 @@
     }
 
     // fixme: make protected
-    public PolicyCondition getExtensional(Permissions.PERMISSIONS... pps) {
+    public PolicyCondition getExtensional(Permissions.Permission... pps) {
         for (SecurityPolicy p : this.policies[0]) {
             if (p.equalsPermission(pps)) {
                 for (PolicyCondition c : p.getConditions()) {
@@ -370,7 +370,7 @@
             return;
         }
 
-        if (evaluator.isAllowed(Permissions.PERMISSIONS.CREATE_POLICY)) {
+        if (evaluator.isAllowed(Permissions.Permission.CREATE_POLICY)) {
             policydao.createPolicy(policy, this.user);
         }else if (silent) {
             jlog.error(
@@ -424,7 +424,7 @@
                     this.evaluator.getResourceID());
         }
         if (contains(policy) && (evaluator
-                .isAllowed(Permissions.PERMISSIONS.DELETE_POLICY))) {
+                .isAllowed(Permissions.Permission.DELETE_POLICY))) {
             policydao.deletePolicy(policy, this.user);
         }else if (silent) {
             jlog.error("Permission Denied (DELETE_POLICY) on '{}' for '{}'",
@@ -453,7 +453,7 @@
         }
 
         if (contains(policy) && (evaluator
-                .isAllowed(Permissions.PERMISSIONS.MODIFY_POLICY))) {
+                .isAllowed(Permissions.Permission.MODIFY_POLICY))) {
             policydao.updatePolicy(policy, this.user);
         }else if (silent) {
             jlog.error("Permission Denied (DELETE_POLICY) on '{}' for '{}'",
@@ -474,7 +474,7 @@
         return evaluator.isAllowed();
     }
 
-    public boolean isAllowed(Permissions.PERMISSIONS... perm) {
+    public boolean isAllowed(Permissions.Permission... perm) {
         return evaluator.isAllowed();
     }
 
diff --git a/src/main/java/de/ids_mannheim/korap/security/ac/SecurityRowMappers.java b/src/main/java/de/ids_mannheim/korap/security/ac/SecurityRowMappers.java
index 48f339a..efcc95c 100644
--- a/src/main/java/de/ids_mannheim/korap/security/ac/SecurityRowMappers.java
+++ b/src/main/java/de/ids_mannheim/korap/security/ac/SecurityRowMappers.java
@@ -70,7 +70,7 @@
         }
     }
 
-    public static List<SecurityPolicy>[] mapping(ResultSet rs)
+    public static List<SecurityPolicy>[] mapResourcePolicies(ResultSet rs)
             throws SQLException {
         List<SecurityPolicy>[] policyArray = null;
         List<Integer>[] idx = null;
@@ -126,6 +126,27 @@
         return policyArray;
     }
 
+    public static List<SecurityPolicy> mapConditionPolicies(ResultSet rs)
+            throws SQLException {
+        Map<Integer, SecurityPolicy> policyMap = new HashMap<>();
+        while (rs.next()) {
+            if (rs.getInt("allowed") == 0)
+                continue;
+
+            Integer pid = rs.getInt("pid");
+            SecurityPolicy policy;
+            if ((policy = policyMap.get(pid)) == null) {
+                policy = new SecurityRowMappers.PolicyRowMapper().mapRow(rs, 0);
+                policyMap.put(pid, policy);
+            }
+            PolicyCondition c = new PolicyCondition(rs.getString("group_id"));
+
+            if (!policy.contains(c))
+                policy.addCondition(c);
+        }
+        return new ArrayList<>(policyMap.values());
+    }
+
     @Deprecated
     public static List<SecurityPolicy>[] map(ResultSet rs) throws SQLException {
         Map<Integer, SecurityPolicy>[] policyArray = null;
@@ -148,7 +169,7 @@
                 policy = new SecurityRowMappers.PolicyRowMapper().mapRow(rs, 0);
                 cursor.put(pid, policy);
             }
-            PolicyCondition c = new PolicyCondition(rs.getString("group_ref"));
+            PolicyCondition c = new PolicyCondition(rs.getString("group_id"));
 
             if (!policy.contains(c))
                 policy.addCondition(c);
diff --git a/src/main/java/de/ids_mannheim/korap/web/KustvaktBaseServer.java b/src/main/java/de/ids_mannheim/korap/web/KustvaktBaseServer.java
index 9937c3c..4934ac8 100644
--- a/src/main/java/de/ids_mannheim/korap/web/KustvaktBaseServer.java
+++ b/src/main/java/de/ids_mannheim/korap/web/KustvaktBaseServer.java
@@ -8,7 +8,6 @@
 import de.ids_mannheim.korap.config.KustvaktClassLoader;
 import de.ids_mannheim.korap.config.KustvaktConfiguration;
 import de.ids_mannheim.korap.exceptions.KustvaktException;
-import de.ids_mannheim.korap.interfaces.db.PersistenceClient;
 import de.ids_mannheim.korap.web.service.BootupInterface;
 import lombok.Getter;
 import lombok.Setter;
@@ -88,30 +87,34 @@
                 .loadSubTypes(BootupInterface.class);
 
         List<BootupInterface> list = new ArrayList<>(set.size());
-
-        PersistenceClient client = BeanConfiguration.getBeans()
-                .getPersistenceClient();
-        if (client.checkDatabase()) {
-            for (Class cl : set) {
-                BootupInterface iface;
-                try {
-                    iface = (BootupInterface) cl.newInstance();
-                    if (iface.position() == -1 | iface.position() > set.size())
-                        list.add(iface);
-                    else
-                        list.add(0, iface);
-                }catch (InstantiationException | IllegalAccessException e) {
-                    continue;
-                }
+        for (Class cl : set) {
+            BootupInterface iface;
+            try {
+                iface = (BootupInterface) cl.newInstance();
+                list.add(iface);
+            }catch (InstantiationException | IllegalAccessException e) {
+                continue;
             }
-            System.out.println("Found boot loading interfaces: " + list);
-            for (BootupInterface iface : list) {
+        }
+        System.out.println("Found boot loading interfaces: " + list);
+        int track = list.size();
+        while (!list.isEmpty()) {
+            System.out.println("ITERATING LIST IS " + list);
+            for (BootupInterface iface : new ArrayList<>(list)) {
                 try {
                     iface.load();
                 }catch (KustvaktException e) {
                     // don't do anything!
-                    System.out.println("An error occurred! " + e);
+                    System.out.println(
+                            "An error occurred in class " + iface.getClass()
+                                    .getSimpleName() + "!\n" + e);
+                    continue;
                 }
+                list.remove(iface);
+            }
+            if (track == list.size()) {
+                System.out.println("Some or all bootup classes raised errors");
+                break;
             }
         }
     }
@@ -166,7 +169,6 @@
 
     }
 
-
     @Setter
     public static class KustvaktArgs {
 
diff --git a/src/main/java/de/ids_mannheim/korap/web/service/BootupInterface.java b/src/main/java/de/ids_mannheim/korap/web/service/BootupInterface.java
index 1eb6f36..8ed79af 100644
--- a/src/main/java/de/ids_mannheim/korap/web/service/BootupInterface.java
+++ b/src/main/java/de/ids_mannheim/korap/web/service/BootupInterface.java
@@ -9,7 +9,7 @@
 public interface BootupInterface {
 
     void load() throws KustvaktException;
-    int position();
 
+    Class<? extends BootupInterface>[] getDependencies();
 
 }
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 5ef5ee9..b676f88 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
@@ -3,12 +3,14 @@
 import de.ids_mannheim.korap.config.BeanConfiguration;
 import de.ids_mannheim.korap.config.KustvaktConfiguration;
 import de.ids_mannheim.korap.exceptions.KustvaktException;
+import de.ids_mannheim.korap.exceptions.StatusCodes;
 import de.ids_mannheim.korap.resources.Permissions;
 import de.ids_mannheim.korap.resources.VirtualCollection;
 import de.ids_mannheim.korap.security.ac.PolicyBuilder;
 import de.ids_mannheim.korap.user.Attributes;
 import de.ids_mannheim.korap.user.User;
 import de.ids_mannheim.korap.utils.CollectionQueryBuilder3;
+import de.ids_mannheim.korap.utils.JsonUtils;
 
 /**
  * @author hanl
@@ -49,19 +51,19 @@
             c3.setDescription("Goethe - Die Leiden des jungen Werther");
 
             PolicyBuilder b = new PolicyBuilder(user);
-            b.setPermissions(Permissions.PERMISSIONS.ALL);
+            b.setPermissions(Permissions.Permission.READ);
             b.setResources(c1, c2, c3);
             b.setConditions("public");
-            b.create();
+            String result = b.create();
 
-//            ConditionManagement c = new ConditionManagement(user);
-//            c.addUser(User.UserFactory.getDemoUser().getUsername(),
-//                    new PolicyCondition("public"), false);
+            if (JsonUtils.readTree(result).size() > 0)
+                throw new KustvaktException(StatusCodes.REQUEST_INVALID,
+                        "creating collections caused errors", result);
         }
     }
 
     @Override
-    public int position() {
-        return -1;
+    public Class<? extends BootupInterface>[] getDependencies() {
+        return new Class[] { UserLoader.class };
     }
 }
diff --git a/src/main/java/de/ids_mannheim/korap/web/service/PolicyLoader.java b/src/main/java/de/ids_mannheim/korap/web/service/PolicyLoader.java
index 7cf1e68..af6df90 100644
--- a/src/main/java/de/ids_mannheim/korap/web/service/PolicyLoader.java
+++ b/src/main/java/de/ids_mannheim/korap/web/service/PolicyLoader.java
@@ -22,21 +22,13 @@
             PolicyBuilder builder = new PolicyBuilder(user);
             builder.addCondition("public");
             builder.setResources(new Corpus("GOE"));
-            builder.setPermissions(Permissions.PERMISSIONS.ALL);
+            builder.setPermissions(Permissions.Permission.READ);
             builder.create();
-
-            // redundant if user is the user who created the condition for the resource
-            //        try {
-            //            ConditionManagement cm = new ConditionManagement(user);
-            ////            cm.addUser(user.getUsername(), new PolicyCondition("public"), true);
-            //        }catch (KustvaktException e) {
-            //            e.printStackTrace();
-            //        }
         }
     }
 
     @Override
-    public int position() {
-        return 1;
+    public Class<? extends BootupInterface>[] getDependencies() {
+        return new Class[] { UserLoader.class };
     }
 }
diff --git a/src/main/java/de/ids_mannheim/korap/web/service/UserLoader.java b/src/main/java/de/ids_mannheim/korap/web/service/UserLoader.java
index 991e126..ed233a1 100644
--- a/src/main/java/de/ids_mannheim/korap/web/service/UserLoader.java
+++ b/src/main/java/de/ids_mannheim/korap/web/service/UserLoader.java
@@ -4,7 +4,6 @@
 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.user.User;
 
 /**
  * @author hanl
@@ -16,16 +15,13 @@
         if (BeanConfiguration.hasContext()) {
             AuthenticationManagerIface manager = BeanConfiguration.getBeans()
                     .getAuthenticationManager();
-
-            BeanConfiguration.getBeans().getUserDBHandler()
-                    .createAccount(User.UserFactory.getDemoUser());
             manager.createUserAccount(KustvaktConfiguration.KUSTVAKT_USER,
                     false);
         }
     }
 
     @Override
-    public int position() {
-        return 0;
+    public Class<? extends BootupInterface>[] getDependencies() {
+        return new Class[0];
     }
 }
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 bae4c21..3b0691e 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
@@ -986,7 +986,7 @@
             for (String spl : new ArrayList<>(foundries)) {
                 try {
                     de.ids_mannheim.korap.security.ac.SecurityManager manager = SecurityManager
-                            .init(spl, user, Permissions.PERMISSIONS.READ);
+                            .init(spl, user, Permissions.Permission.READ);
                     if (!manager.isAllowed())
                         continue;
 
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 866a5e1..b9ea3be 100644
--- a/src/test/java/de/ids_mannheim/korap/config/PolicyLoaderTest.java
+++ b/src/test/java/de/ids_mannheim/korap/config/PolicyLoaderTest.java
@@ -27,7 +27,7 @@
     }
 
     @Test
-    public void testUserLoader() {
+    public void testPolicyLoader() {
         boolean error = false;
         UserLoader u = new UserLoader();
         CollectionLoader c = new CollectionLoader();
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 faa38ac..6ddfe1b 100644
--- a/src/test/java/de/ids_mannheim/korap/config/TestHelper.java
+++ b/src/test/java/de/ids_mannheim/korap/config/TestHelper.java
@@ -36,6 +36,7 @@
             EntityHandlerIface dao = BeanConfiguration.getBeans()
                     .getUserDBHandler();
             Map m = new HashMap<>();
+            m.put(Attributes.ID, 2);
             m.put(Attributes.USERNAME, credentials[0]);
             m.put(Attributes.PASSWORD, credentials[1]);
             m.put(Attributes.FIRSTNAME, "test");
@@ -96,6 +97,7 @@
                 return BeanConfiguration.getBeans().getUserDBHandler()
                         .getAccount(credentials[0]);
             }catch (KustvaktException e) {
+                e.printStackTrace();
             }
         }
         throw new RuntimeException("User could not be retrieved!");
@@ -166,35 +168,45 @@
                 .loadSubTypes(BootupInterface.class);
 
         List<BootupInterface> list = new ArrayList<>(set.size());
-
-        PersistenceClient client = BeanConfiguration.getBeans()
-                .getPersistenceClient();
-        if (client.checkDatabase()) {
-            for (Class cl : set) {
-                BootupInterface iface;
-                try {
-                    iface = (BootupInterface) cl.newInstance();
-                    if (iface.position() == -1 | iface.position() > set.size())
-                        list.add(iface);
-                    else
-                        list.add(0, iface);
-                }catch (InstantiationException | IllegalAccessException e) {
-                    continue;
-                }
+        for (Class cl : set) {
+            BootupInterface iface;
+            try {
+                iface = (BootupInterface) cl.newInstance();
+                list.add(iface);
+            }catch (InstantiationException | IllegalAccessException e) {
+                // do nothing
             }
-            System.out.println("Found boot loading interfaces: " + list);
-            for (BootupInterface iface : list) {
+        }
+        System.out.println("Found boot loading interfaces: " + list);
+        int i = 0;
+        while (!set.isEmpty()) {
+            out_loop:
+            for (BootupInterface iface : new ArrayList<>(list)) {
                 try {
+                    System.out.println(
+                            "Running boot instructions from class " + iface
+                                    .getClass().getSimpleName());
+                    for (Class cl : iface.getDependencies()) {
+                        if (set.contains(cl))
+                            continue out_loop;
+                    }
                     iface.load();
+                    set.remove(iface.getClass());
+                    list.remove(iface);
                 }catch (KustvaktException e) {
                     // don't do anything!
                     System.out.println(
-                            "Loader instance failed ... exiting programme!");
-                    System.exit(-1);
+                            "An error occurred in class " + iface.getClass()
+                                    .getSimpleName() + "!\n" + e);
                 }
             }
-        }else
-            throw new RuntimeException("Client not setup properly!");
+            i++;
+            if (i == set.size() * 2) {
+                System.out.println(
+                        "Could not run startup scripts. Exiting programme!");
+                System.exit(-1);
+            }
+        }
     }
 
     public static void setupResource(KustvaktResource resource, User user)
diff --git a/src/test/java/de/ids_mannheim/korap/config/UserLoaderTest.java b/src/test/java/de/ids_mannheim/korap/config/UserLoaderTest.java
index 8b33f2f..c9c4b17 100644
--- a/src/test/java/de/ids_mannheim/korap/config/UserLoaderTest.java
+++ b/src/test/java/de/ids_mannheim/korap/config/UserLoaderTest.java
@@ -34,6 +34,7 @@
         try {
             l.load();
         }catch (KustvaktException e) {
+            e.printStackTrace();
             error = true;
         }
         assert !error;