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;
