diff --git a/src/main/java/de/ids_mannheim/korap/config/AdminSetup.java b/src/main/java/de/ids_mannheim/korap/config/AdminSetup.java
index 5c0a276..378e015 100644
--- a/src/main/java/de/ids_mannheim/korap/config/AdminSetup.java
+++ b/src/main/java/de/ids_mannheim/korap/config/AdminSetup.java
@@ -49,12 +49,14 @@
             store.setReadable(true, true);
             store.setWritable(true, true);
             store.setExecutable(false);
+            System.out.println();
             System.out
                     .println("_______________________________________________");
             System.out.println("Token created. Please make note of it!");
             System.out.println("Token: " + token);
             System.out
                     .println("_______________________________________________");
+            System.out.println();
             return setup;
         }
         catch (Exception e) {
diff --git a/src/main/java/de/ids_mannheim/korap/config/BeanConfiguration.java b/src/main/java/de/ids_mannheim/korap/config/BeanConfiguration.java
index b09140e..8081e5d 100644
--- a/src/main/java/de/ids_mannheim/korap/config/BeanConfiguration.java
+++ b/src/main/java/de/ids_mannheim/korap/config/BeanConfiguration.java
@@ -51,27 +51,6 @@
     }
 
 
-    @Deprecated
-    public static void loadAuthenticationProviders () {
-        Set<Class<? extends AuthenticationIface>> set = KustvaktClassLoader
-                .loadSubTypes(AuthenticationIface.class);
-        Set<AuthenticationIface> set2 = new HashSet<>();
-        for (Class<? extends AuthenticationIface> i : set) {
-            try {
-                set2.add(i.newInstance());
-            }
-            catch (InstantiationException | IllegalAccessException e) {
-                e.printStackTrace();
-            }
-        }
-        try {
-            getBeans().getAuthenticationManager().setProviders(set2);
-        }
-        catch (RuntimeException e) {
-            // do nothing
-        }
-    }
-
 
     public static boolean hasContext () {
         return beans != null && beans.context != null;
diff --git a/src/main/java/de/ids_mannheim/korap/config/BeansFactory.java b/src/main/java/de/ids_mannheim/korap/config/BeansFactory.java
index 6e79890..84fcde1 100644
--- a/src/main/java/de/ids_mannheim/korap/config/BeansFactory.java
+++ b/src/main/java/de/ids_mannheim/korap/config/BeansFactory.java
@@ -1,8 +1,6 @@
 package de.ids_mannheim.korap.config;
 
-import de.ids_mannheim.korap.interfaces.db.ResourceOperationIface;
 import de.ids_mannheim.korap.interfaces.db.UserDataDbIface;
-import de.ids_mannheim.korap.resources.KustvaktResource;
 import de.ids_mannheim.korap.user.Userdata;
 import de.ids_mannheim.korap.web.utils.KustvaktResponseHandler;
 import org.springframework.context.ApplicationContext;
@@ -11,6 +9,7 @@
 
 import java.lang.reflect.ParameterizedType;
 import java.lang.reflect.Type;
+import java.util.Arrays;
 import java.util.Collection;
 
 /**
@@ -43,7 +42,7 @@
 
 
     public static synchronized TypeBeanFactory getTypeFactory () {
-        return new TypeBeanFactory(beanHolder);
+        return new TypeBeanFactory();
     }
 
 
@@ -107,21 +106,11 @@
 
     public static class TypeBeanFactory {
 
-        private ContextHolder holder;
-
-
-        private TypeBeanFactory (ContextHolder holder) {
-            this.holder = holder;
-        }
-
-
-        public <T> T getTypedBean (Collection objs, Class type) {
+        public <T> T getTypeInterfaceBean (Collection objs, Class type) {
             for (Object o : objs) {
-                Type gtype = o.getClass().getGenericInterfaces()[0];
-                if (gtype instanceof ParameterizedType) {
-                    ParameterizedType ptype = (ParameterizedType) gtype;
-                    Object ctype = ptype.getActualTypeArguments()[0];
-                    if (ctype.equals(type))
+                if (o instanceof KustvaktTypeInterface) {
+                    Class t = ((KustvaktTypeInterface) o).type();
+                    if (type.equals(t))
                         return (T) o;
                 }
             }
@@ -132,9 +121,19 @@
 
 
         @Deprecated
-        public UserDataDbIface getUserDaoInstance (
-                Class<? extends Userdata> type) {
-            return getTypedBean(this.holder.getUserDataDaos(), type);
+        public <T> T getTypedBean (Collection objs, Class type) {
+            for (Object o : objs) {
+                Type gtype = o.getClass().getGenericSuperclass();
+                if (gtype instanceof ParameterizedType) {
+                    ParameterizedType ptype = (ParameterizedType) gtype;
+                    Object ctype = ptype.getActualTypeArguments()[0];
+                    if (ctype.equals(type))
+                        return (T) o;
+                }
+            }
+            throw new RuntimeException(
+                    "Could not find typed bean in context for class '" + type
+                            + "'");
         }
     }
 }
diff --git a/src/main/java/de/ids_mannheim/korap/config/ContextHolder.java b/src/main/java/de/ids_mannheim/korap/config/ContextHolder.java
index b652a19..f3f256c 100644
--- a/src/main/java/de/ids_mannheim/korap/config/ContextHolder.java
+++ b/src/main/java/de/ids_mannheim/korap/config/ContextHolder.java
@@ -84,7 +84,7 @@
     }
 
 
-    public Collection<UserDataDbIface> getUserDataDaos () {
+    public Collection<UserDataDbIface> getUserDataProviders () {
         return getBean(KUSTVAKT_USERDATA);
     }
 
@@ -115,9 +115,7 @@
     }
 
 
-    // todo: !!!!!!!!!!!!!!!!!!!!!!!!!!
-    // todo: more specific --> collection provider, document provider, etc.
-    public Collection<ResourceOperationIface> getResourceProvider () {
+    public Collection<ResourceOperationIface> getResourceProviders () {
         return getBean(KUSTVAKT_RESOURCES);
     }
 
diff --git a/src/main/java/de/ids_mannheim/korap/exceptions/StatusCodes.java b/src/main/java/de/ids_mannheim/korap/exceptions/StatusCodes.java
index 49b204e..abc4d22 100644
--- a/src/main/java/de/ids_mannheim/korap/exceptions/StatusCodes.java
+++ b/src/main/java/de/ids_mannheim/korap/exceptions/StatusCodes.java
@@ -47,10 +47,8 @@
     public static final int CLIENT_REMOVAL_FAILURE = 215;
     public static final int CLIENT_AUTHORIZATION_FAILURE = 216;
 
-    /**
-     * 500 status codes for access control related components (also
-     * policy rewrite)
-     */
+
+
     public static final int PERMISSION_DENIED = 401;
     public static final int UNSUPPORTED_RESOURCE = 402;
     public static final int UNSUPPORTED_FOUNDRY = 403;
@@ -67,7 +65,13 @@
     public static final int MISSING_POLICY_CONDITIONS = 413;
     public static final int MISSING_POLICY_PERMISSION = 414;
     public static final int RESOURCE_NOT_FOUND = 415;
+    public static final int ACCESS_DENIED_NO_RESOURCES = 416;
 
+
+    /**
+     * 500 status codes for access control related components (also
+     * policy rewrite)
+     */
     // todo: extend according to policy rewrite possible!
     // policy errors
     public static final int POLICY_ERROR_DEFAULT = 500;
diff --git a/src/main/java/de/ids_mannheim/korap/handlers/DocumentDao.java b/src/main/java/de/ids_mannheim/korap/handlers/DocumentDao.java
index 3de9412..5520ffc 100644
--- a/src/main/java/de/ids_mannheim/korap/handlers/DocumentDao.java
+++ b/src/main/java/de/ids_mannheim/korap/handlers/DocumentDao.java
@@ -16,6 +16,7 @@
 import org.springframework.jdbc.core.namedparam.MapSqlParameterSource;
 import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate;
 
+import javax.print.Doc;
 import java.sql.ResultSet;
 import java.sql.SQLException;
 import java.util.Collection;
@@ -290,4 +291,5 @@
     public Class<Document> type () {
         return Document.class;
     }
+
 }
diff --git a/src/main/java/de/ids_mannheim/korap/handlers/ResourceDao.java b/src/main/java/de/ids_mannheim/korap/handlers/ResourceDao.java
index 41b1c72..cf5701b 100644
--- a/src/main/java/de/ids_mannheim/korap/handlers/ResourceDao.java
+++ b/src/main/java/de/ids_mannheim/korap/handlers/ResourceDao.java
@@ -245,4 +245,5 @@
             return -1;
         }
     }
+
 }
diff --git a/src/main/java/de/ids_mannheim/korap/handlers/UserDetailsDao.java b/src/main/java/de/ids_mannheim/korap/handlers/UserDetailsDao.java
index 4714ca8..74a6f4a 100644
--- a/src/main/java/de/ids_mannheim/korap/handlers/UserDetailsDao.java
+++ b/src/main/java/de/ids_mannheim/korap/handlers/UserDetailsDao.java
@@ -157,4 +157,10 @@
             return -1;
         }
     }
+
+
+    @Override
+    public Class<UserDetails> type () {
+        return UserDetails.class;
+    }
 }
diff --git a/src/main/java/de/ids_mannheim/korap/handlers/UserSettingsDao.java b/src/main/java/de/ids_mannheim/korap/handlers/UserSettingsDao.java
index 2dfebdf..7d02a60 100644
--- a/src/main/java/de/ids_mannheim/korap/handlers/UserSettingsDao.java
+++ b/src/main/java/de/ids_mannheim/korap/handlers/UserSettingsDao.java
@@ -164,4 +164,10 @@
             return -1;
         }
     }
+
+
+    @Override
+    public Class<UserSettings> type () {
+        return UserSettings.class;
+    }
 }
diff --git a/src/main/java/de/ids_mannheim/korap/interfaces/db/ResourceOperationIface.java b/src/main/java/de/ids_mannheim/korap/interfaces/db/ResourceOperationIface.java
index 43124a0..565ceec 100644
--- a/src/main/java/de/ids_mannheim/korap/interfaces/db/ResourceOperationIface.java
+++ b/src/main/java/de/ids_mannheim/korap/interfaces/db/ResourceOperationIface.java
@@ -8,7 +8,6 @@
 
 import java.util.Collection;
 import java.util.List;
-import java.util.Set;
 
 // todo: for transaction to work this should go into core module!?!
 // todo: user instance only required for auditing pointcut operations
diff --git a/src/main/java/de/ids_mannheim/korap/interfaces/db/UserDataDbIface.java b/src/main/java/de/ids_mannheim/korap/interfaces/db/UserDataDbIface.java
index 5b0cf0e..a475dae 100644
--- a/src/main/java/de/ids_mannheim/korap/interfaces/db/UserDataDbIface.java
+++ b/src/main/java/de/ids_mannheim/korap/interfaces/db/UserDataDbIface.java
@@ -1,5 +1,6 @@
 package de.ids_mannheim.korap.interfaces.db;
 
+import de.ids_mannheim.korap.config.KustvaktTypeInterface;
 import de.ids_mannheim.korap.exceptions.KustvaktException;
 import de.ids_mannheim.korap.user.User;
 import de.ids_mannheim.korap.user.Userdata;
@@ -8,7 +9,8 @@
  * @author hanl
  * @date 27/01/2016
  */
-public interface UserDataDbIface<T extends Userdata> {
+public interface UserDataDbIface<T extends Userdata> extends
+        KustvaktTypeInterface<T> {
 
     public int store (T data) throws KustvaktException;
 
diff --git a/src/main/java/de/ids_mannheim/korap/resource/rewrite/DocMatchRewrite.java b/src/main/java/de/ids_mannheim/korap/resource/rewrite/DocMatchRewrite.java
index 649f58d..5c8e568 100644
--- a/src/main/java/de/ids_mannheim/korap/resource/rewrite/DocMatchRewrite.java
+++ b/src/main/java/de/ids_mannheim/korap/resource/rewrite/DocMatchRewrite.java
@@ -4,12 +4,12 @@
 import de.ids_mannheim.korap.config.*;
 import de.ids_mannheim.korap.exceptions.KustvaktException;
 import de.ids_mannheim.korap.handlers.DocumentDao;
+import de.ids_mannheim.korap.interfaces.db.ResourceOperationIface;
 import de.ids_mannheim.korap.resources.Document;
 import de.ids_mannheim.korap.user.User;
 import net.sf.ehcache.Cache;
 import net.sf.ehcache.CacheManager;
 import net.sf.ehcache.Element;
-import org.w3c.dom.Attr;
 
 /**
  * @author hanl
@@ -19,7 +19,7 @@
 public class DocMatchRewrite implements RewriteTask.IterableRewritePath,
         BeanInjectable {
 
-    private DocumentDao docDao;
+    private ResourceOperationIface<Document> docDao;
     private Cache cache;
 
 
@@ -30,8 +30,8 @@
 
     @Override
     public void insertBeans (ContextHolder beans) {
-        this.docDao = BeansFactory.getTypeFactory().getTypedBean(
-                beans.getResourceProvider(), Document.class);
+        this.docDao = BeansFactory.getTypeFactory().getTypeInterfaceBean(
+                beans.getResourceProviders(), Document.class);
     }
 
 
diff --git a/src/main/java/de/ids_mannheim/korap/resource/rewrite/FoundryInject.java b/src/main/java/de/ids_mannheim/korap/resource/rewrite/FoundryInject.java
index 9c3762b..923e7a2 100644
--- a/src/main/java/de/ids_mannheim/korap/resource/rewrite/FoundryInject.java
+++ b/src/main/java/de/ids_mannheim/korap/resource/rewrite/FoundryInject.java
@@ -35,8 +35,8 @@
         LayerMapper mapper;
 
         if (user != null && !userdaos.isEmpty()) {
-            UserDataDbIface dao = BeansFactory.getTypeFactory().getTypedBean(
-                    userdaos, UserSettings.class);
+            UserDataDbIface dao = BeansFactory.getTypeFactory()
+                    .getTypeInterfaceBean(userdaos, UserSettings.class);
             mapper = new LayerMapper(config, dao.get(user));
         }
         else
@@ -69,6 +69,6 @@
 
     @Override
     public <T extends ContextHolder> void insertBeans (T beans) {
-        this.userdaos = beans.getUserDataDaos();
+        this.userdaos = beans.getUserDataProviders();
     }
 }
diff --git a/src/main/java/de/ids_mannheim/korap/resource/rewrite/PublicCollection.java b/src/main/java/de/ids_mannheim/korap/resource/rewrite/PublicCollection.java
index 6bd59a5..d7e32ee 100644
--- a/src/main/java/de/ids_mannheim/korap/resource/rewrite/PublicCollection.java
+++ b/src/main/java/de/ids_mannheim/korap/resource/rewrite/PublicCollection.java
@@ -29,7 +29,7 @@
 
     @Override
     public JsonNode rewriteQuery (KoralNode node, KustvaktConfiguration config,
-            User user) {
+            User user) throws KustvaktException {
         JsonNode subnode = node.rawNode();
 
         if (!subnode.at("/collection").findValuesAsText("key")
@@ -38,32 +38,28 @@
             if (subnode.has("collection"))
                 b.setBaseQuery(JsonUtils.toJSON(subnode));
 
-            try {
-                Set resources = ResourceFinder.search(user, Corpus.class);
-                ArrayList<KustvaktResource> list = new ArrayList(resources);
+            Set resources = ResourceFinder.search(user, Corpus.class);
+            ArrayList<KustvaktResource> list = new ArrayList(resources);
 
-                if (list.isEmpty())
-                    throw new KustvaktException(StatusCodes.PERMISSION_DENIED,
-                            "No resources found for user", user.getUsername());
+            if (list.isEmpty())
+                throw new KustvaktException(
+                        StatusCodes.ACCESS_DENIED_NO_RESOURCES,
+                        "Resources could not be loaded for user ",
+                        user.getUsername());
 
-                Set ids = new HashSet(resources.size());
-                for (int i = 0; i < list.size(); i++) {
-                    if (i > 0)
-                        b.or();
-                    b.with(Attributes.CORPUS_SIGLE + "="
-                            + list.get(i).getPersistentID());
-                    ids.add(list.get(i).getPersistentID());
-                }
-                JsonNode rewritten = JsonUtils.readTree(b.toJSON());
-                node.set("collection", rewritten.at("/collection"),
-                        new KoralNode.RewriteIdentifier(
-                                Attributes.CORPUS_SIGLE, ids));
-                node.at("/collection");
+            Set ids = new HashSet(resources.size());
+            for (int i = 0; i < list.size(); i++) {
+                if (i > 0)
+                    b.or();
+                b.with(Attributes.CORPUS_SIGLE + "="
+                        + list.get(i).getPersistentID());
+                ids.add(list.get(i).getPersistentID());
             }
-            catch (KustvaktException e) {
-                e.printStackTrace();
-                // todo:
-            }
+            JsonNode rewritten = JsonUtils.readTree(b.toJSON());
+            node.set("collection", rewritten.at("/collection"),
+                    new KoralNode.RewriteIdentifier(Attributes.CORPUS_SIGLE,
+                            ids));
+            node.at("/collection");
         }
 
         return node.rawNode();
diff --git a/src/main/java/de/ids_mannheim/korap/resource/rewrite/RewriteHandler.java b/src/main/java/de/ids_mannheim/korap/resource/rewrite/RewriteHandler.java
index 468fa9e..94875f4 100644
--- a/src/main/java/de/ids_mannheim/korap/resource/rewrite/RewriteHandler.java
+++ b/src/main/java/de/ids_mannheim/korap/resource/rewrite/RewriteHandler.java
@@ -115,24 +115,28 @@
 
 
 
-    public String processQuery (JsonNode root, User user) {
+    public String processQuery (JsonNode root, User user)
+            throws KustvaktException {
         RewriteProcess process = new RewriteProcess(root, user);
         JsonNode pre = process.start(false);
         return JsonUtils.toJSON(pre);
     }
 
 
-    public String processQuery (String json, User user) {
+    public String processQuery (String json, User user)
+            throws KustvaktException {
         return processQuery(JsonUtils.readTree(json), user);
     }
 
 
-    public String processResult (String json, User user) {
+    public String processResult (String json, User user)
+            throws KustvaktException {
         return processResult(JsonUtils.readTree(json), user);
     }
 
 
-    public String processResult (JsonNode node, User user) {
+    public String processResult (JsonNode node, User user)
+            throws KustvaktException {
         RewriteProcess process = new RewriteProcess(node, user);
         JsonNode pre = process.start(true);
         return JsonUtils.toJSON(pre);
@@ -167,7 +171,7 @@
 
 
         private KoralNode processNode (String key, JsonNode value,
-                boolean result) {
+                boolean result) throws KustvaktException {
             KoralNode kroot = KoralNode.wrapNode(value);
             if (value.isObject()) {
                 if (value.has("operands")) {
@@ -204,7 +208,7 @@
         }
 
 
-        private JsonNode start (boolean result) {
+        private JsonNode start (boolean result) throws KustvaktException {
             jlog.debug("Running rewrite process on query {}", root);
             if (root != null) {
                 Iterator<Map.Entry<String, JsonNode>> it = root.fields();
@@ -227,7 +231,8 @@
          *         applies if parent is an array node
          */
         private KoralNode rewrite (String rootNode, KoralNode node,
-                Collection<? extends RewriteTask> tasks, boolean result) {
+                Collection<? extends RewriteTask> tasks, boolean result)
+                throws KustvaktException {
             if (RewriteHandler.this.config == null)
                 throw new RuntimeException("KustvaktConfiguration must be set!");
 
@@ -247,21 +252,14 @@
                         continue;
                     }
                 }
-                try {
-                    if (!result && task instanceof RewriteTask.RewriteQuery) {
-                        ((RewriteTask.RewriteQuery) task).rewriteQuery(node,
-                                RewriteHandler.this.config, this.user);
-                    }
-                    else if (task instanceof RewriteTask.RewriteResult) {
-                        ((RewriteTask.RewriteResult) task).rewriteResult(node);
-                    }
+                if (!result && task instanceof RewriteTask.RewriteQuery) {
+                    ((RewriteTask.RewriteQuery) task).rewriteQuery(node,
+                            RewriteHandler.this.config, this.user);
                 }
-                catch (KustvaktException e) {
-                    jlog.error("Error in rewrite processor {} for node {}",
-                            task.getClass().getSimpleName(), node.rawNode()
-                                    .toString());
-                    e.printStackTrace();
+                else if (task instanceof RewriteTask.RewriteResult) {
+                    ((RewriteTask.RewriteResult) task).rewriteResult(node);
                 }
+
                 if (node.isRemove()) {
                     node.buildRewrites(this.root.at("/" + rootNode));
                     break;
@@ -275,7 +273,8 @@
 
         // fixme: merge with processNode!
         private void processFixedNode (JsonNode node,
-                Collection<RewriteTask> tasks, boolean post) {
+                Collection<RewriteTask> tasks, boolean post)
+                throws KustvaktException {
             for (RewriteTask task : tasks) {
                 KoralNode next = KoralNode.wrapNode(node);
                 if (task instanceof RewriteTask.RewriteNodeAt) {
@@ -284,19 +283,13 @@
                         next = next.at(rwa.at());
                 }
 
-                try {
-                    if (!post & task instanceof RewriteTask.RewriteQuery)
-                        ((RewriteTask.RewriteQuery) task).rewriteQuery(next,
-                                RewriteHandler.this.config, user);
-                    else if (task instanceof RewriteTask.RewriteResult)
-                        ((RewriteTask.RewriteResult) task).rewriteResult(next);
-                    next.buildRewrites();
-                }
-                catch (KustvaktException e) {
-                    jlog.error("Error in rewrite processor {} for node {}",
-                            task.getClass().getSimpleName(), next.toString());
-                    e.printStackTrace();
-                }
+                if (!post & task instanceof RewriteTask.RewriteQuery)
+                    ((RewriteTask.RewriteQuery) task).rewriteQuery(next,
+                            RewriteHandler.this.config, user);
+                else if (task instanceof RewriteTask.RewriteResult)
+                    ((RewriteTask.RewriteResult) task).rewriteResult(next);
+                next.buildRewrites();
+
             }
         }
 
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 d31a2f7..33cde6d 100644
--- a/src/main/java/de/ids_mannheim/korap/security/ac/ResourceFinder.java
+++ b/src/main/java/de/ids_mannheim/korap/security/ac/ResourceFinder.java
@@ -51,7 +51,7 @@
             beans = BeansFactory.getKustvaktContext();
         if (policydao == null | resourcedaos == null) {
             ResourceFinder.policydao = beans.getPolicyDbProvider();
-            for (ResourceOperationIface iface : beans.getResourceProvider())
+            for (ResourceOperationIface iface : beans.getResourceProviders())
                 resourcedaos.put(iface.type(), iface);
         }
         if (policydao == null | resourcedaos.isEmpty())
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 0bf367c..059d33b 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
@@ -70,7 +70,7 @@
             SecurityManager.crypto = beans.getEncryption();
             SecurityManager.handlers = new HashMap<>();
             Collection<ResourceOperationIface> providers = beans
-                    .getResourceProvider();
+                    .getResourceProviders();
             for (ResourceOperationIface op : providers)
                 SecurityManager.handlers.put(op.type(), op);
         }
diff --git a/src/main/java/de/ids_mannheim/korap/security/auth/KustvaktAuthenticationManager.java b/src/main/java/de/ids_mannheim/korap/security/auth/KustvaktAuthenticationManager.java
index f7387c4..918650a 100644
--- a/src/main/java/de/ids_mannheim/korap/security/auth/KustvaktAuthenticationManager.java
+++ b/src/main/java/de/ids_mannheim/korap/security/auth/KustvaktAuthenticationManager.java
@@ -13,7 +13,6 @@
 import de.ids_mannheim.korap.interfaces.db.EntityHandlerIface;
 import de.ids_mannheim.korap.interfaces.db.UserDataDbIface;
 import de.ids_mannheim.korap.user.*;
-import de.ids_mannheim.korap.utils.NamingUtils;
 import de.ids_mannheim.korap.utils.StringUtils;
 import de.ids_mannheim.korap.utils.TimeUtils;
 import net.sf.ehcache.Cache;
@@ -546,12 +545,12 @@
             settings.readDefaults(safeMap);
             settings.checkRequired();
 
-            UserDataDbIface dao = BeansFactory.getTypeFactory().getTypedBean(
-                    userdatadaos, UserDetails.class);
+            UserDataDbIface dao = BeansFactory.getTypeFactory()
+                    .getTypeInterfaceBean(userdatadaos, UserDetails.class);
             assert dao != null;
             dao.store(details);
-            dao = BeansFactory.getTypeFactory().getTypedBean(userdatadaos,
-                    UserSettings.class);
+            dao = BeansFactory.getTypeFactory().getTypeInterfaceBean(
+                    userdatadaos, UserSettings.class);
             assert dao != null;
             dao.store(settings);
         }
@@ -586,8 +585,8 @@
         d.readDefaults(attributes);
         d.checkRequired();
 
-        UserDataDbIface dao = BeansFactory.getTypeFactory().getTypedBean(
-                userdatadaos, UserDetails.class);
+        UserDataDbIface dao = BeansFactory.getTypeFactory()
+                .getTypeInterfaceBean(userdatadaos, UserDetails.class);
         assert dao != null;
         dao.store(d);
 
@@ -595,7 +594,7 @@
         s.readDefaults(attributes);
         s.checkRequired();
 
-        dao = BeansFactory.getTypeFactory().getTypedBean(userdatadaos,
+        dao = BeansFactory.getTypeFactory().getTypeInterfaceBean(userdatadaos,
                 UserSettings.class);
         assert dao != null;
         dao.store(d);
@@ -747,11 +746,10 @@
             throws WrappedException {
 
         try {
-            UserDataDbIface<T> dao = BeansFactory
-                    .getTypeFactory()
-                    .getTypedBean(
-                            BeansFactory.getKustvaktContext().getUserDataDaos(),
-                            clazz);
+            UserDataDbIface<T> dao = BeansFactory.getTypeFactory()
+                    .getTypeInterfaceBean(
+                            BeansFactory.getKustvaktContext()
+                                    .getUserDataProviders(), clazz);
             T data = null;
             if (dao != null)
                 data = dao.get(user);
@@ -775,9 +773,10 @@
         try {
 
             data.validate(this.crypto);
-            UserDataDbIface dao = BeansFactory.getTypeFactory().getTypedBean(
-                    BeansFactory.getKustvaktContext().getUserDataDaos(),
-                    data.getClass());
+            UserDataDbIface dao = BeansFactory.getTypeFactory()
+                    .getTypeInterfaceBean(
+                            BeansFactory.getKustvaktContext()
+                                    .getUserDataProviders(), data.getClass());
             if (dao != null)
                 dao.update(data);
         }
diff --git a/src/main/java/de/ids_mannheim/korap/user/UserdataFactory.java b/src/main/java/de/ids_mannheim/korap/user/UserdataFactory.java
index cae83af..c2768b4 100644
--- a/src/main/java/de/ids_mannheim/korap/user/UserdataFactory.java
+++ b/src/main/java/de/ids_mannheim/korap/user/UserdataFactory.java
@@ -32,7 +32,7 @@
     public static UserDataDbIface getDaoInstanceFromBean (
             Class<? extends Userdata> type) {
         Collection<UserDataDbIface> daos = BeansFactory.getKustvaktContext()
-                .getUserDataDaos();
+                .getUserDataProviders();
         for (UserDataDbIface o : daos) {
             Type gtype = o.getClass().getGenericInterfaces()[0];
             if (gtype instanceof ParameterizedType) {
diff --git a/src/main/java/de/ids_mannheim/korap/utils/UserPropertyReader.java b/src/main/java/de/ids_mannheim/korap/utils/UserPropertyReader.java
index 70207fe..8c94ee9 100644
--- a/src/main/java/de/ids_mannheim/korap/utils/UserPropertyReader.java
+++ b/src/main/java/de/ids_mannheim/korap/utils/UserPropertyReader.java
@@ -115,13 +115,14 @@
             set.readDefaults(vals);
             set.validate(crypto);
 
-            UserDataDbIface dao = BeansFactory.getTypeFactory().getTypedBean(
-                    BeansFactory.getKustvaktContext().getUserDataDaos(),
-                    UserDetails.class);
+            UserDataDbIface dao = BeansFactory.getTypeFactory()
+                    .getTypeInterfaceBean(
+                            BeansFactory.getKustvaktContext()
+                                    .getUserDataProviders(), UserDetails.class);
             dao.store(det);
 
-            dao = BeansFactory.getTypeFactory().getTypedBean(
-                    BeansFactory.getKustvaktContext().getUserDataDaos(),
+            dao = BeansFactory.getTypeFactory().getTypeInterfaceBean(
+                    BeansFactory.getKustvaktContext().getUserDataProviders(),
                     UserSettings.class);
             dao.store(set);
         }
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 7b3ec6a..03f051a 100644
--- a/src/main/java/de/ids_mannheim/korap/web/KustvaktBaseServer.java
+++ b/src/main/java/de/ids_mannheim/korap/web/KustvaktBaseServer.java
@@ -17,6 +17,7 @@
 import org.eclipse.jetty.util.ssl.SslContextFactory;
 
 import java.util.ArrayList;
+import java.util.HashSet;
 import java.util.List;
 import java.util.Set;
 
@@ -48,9 +49,6 @@
         KustvaktArgs kargs = new KustvaktArgs();
         for (int i = 0; i < args.length; i++) {
             switch ((args[i])) {
-                case "--debug":
-                    kargs.setDebug(true);
-                    break;
                 case "--config":
                     kargs.setConfig(args[i + 1]);
                     break;
@@ -93,32 +91,36 @@
             }
         }
         System.out.println("Found boot loading interfaces: " + list);
+
         while (!list.isEmpty()) {
-            for (BootableBeanInterface iface : new ArrayList<>(list)) {
+            loop: for (BootableBeanInterface iface : new ArrayList<>(list)) {
                 try {
+                    for (Class dep : iface.getDependencies()) {
+                        if (set.contains(dep))
+                            continue loop;
+                    }
                     iface.load(BeansFactory.getKustvaktContext());
+                    list.remove(iface);
+                    set.remove(iface.getClass());
+                    System.out.println("Done with interface "
+                            + iface.getClass().getSimpleName());
                 }
                 catch (KustvaktException e) {
                     // don't do anything!
                     System.out.println("An error occurred in class "
-                            + iface.getClass().getSimpleName() + "!\n" + e);
-                    continue;
+                            + iface.getClass().getSimpleName() + "!\n");
+                    System.exit(-1);
                 }
-                list.remove(iface);
-            }
-            if (!list.isEmpty()) {
-                System.out.println("Following bootup classes raised errors: "
-                        + list);
-                break;
             }
         }
-        AdminSetup.getInstance();
     }
 
 
     protected void startServer (KustvaktArgs kargs) {
-        if (kargs.init)
+        if (kargs.init) {
             runPreStart();
+            AdminSetup.getInstance();
+        }
 
         if (kargs.port == -1)
             kargs.setPort(BeansFactory.getKustvaktContext().getConfiguration()
@@ -162,6 +164,7 @@
         }
         catch (Exception e) {
             e.printStackTrace();
+            System.exit(-1);
         }
 
     }
@@ -169,7 +172,6 @@
     @Setter
     public static class KustvaktArgs {
 
-        private boolean debug;
         @Getter
         private String config;
         private int port;
@@ -181,7 +183,6 @@
         public KustvaktArgs () {
             this.port = -1;
             this.sslContext = null;
-            this.debug = false;
             this.config = null;
             this.init = false;
         }
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 dd29b09..e1a5278 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
@@ -462,8 +462,13 @@
         // fixme: should only apply to CQL queries per default!
         //        meta.addEntry("itemsPerResource", 1);
         serializer.setMeta(meta.raw());
-
-        String query = this.processor.processQuery(serializer.toJSON(), user);
+        String query;
+        try {
+            query = this.processor.processQuery(serializer.toJSON(), user);
+        }
+        catch (KustvaktException e) {
+            throw KustvaktResponseHandler.throwit(e);
+        }
 
         jlog.info("the serialized query {}", query);
 
@@ -696,7 +701,13 @@
         VirtualCollection tmp = resourceHandler.getCache(cache.getId(),
                 VirtualCollection.class);
         if (tmp == null) {
-            String query = this.processor.processQuery(cache.getData(), user);
+            String query;
+            try {
+                query = this.processor.processQuery(cache.getData(), user);
+            }
+            catch (KustvaktException e) {
+                throw KustvaktResponseHandler.throwit(e);
+            }
             String stats = searchKrill.getStatistics(query);
             cache.setStats(JsonUtils.readSimple(stats, Map.class));
             resourceHandler.cache(cache);
diff --git a/src/main/java/de/ids_mannheim/korap/web/service/light/LightService.java b/src/main/java/de/ids_mannheim/korap/web/service/light/LightService.java
index 7c3b346..8bd7c88 100644
--- a/src/main/java/de/ids_mannheim/korap/web/service/light/LightService.java
+++ b/src/main/java/de/ids_mannheim/korap/web/service/light/LightService.java
@@ -101,14 +101,27 @@
         ss.setMeta(meta.raw());
         if (cq != null)
             ss.setCollection(cq);
-        return Response.ok(processor.processQuery(ss.toJSON(), null)).build();
+
+        String query;
+        try {
+            query = this.processor.processQuery(ss.toJSON(), null);
+        }
+        catch (KustvaktException e) {
+            throw KustvaktResponseHandler.throwit(e);
+        }
+        return Response.ok(query).build();
     }
 
 
     @POST
     @Path("search")
     public Response queryRaw (@QueryParam("engine") String engine, String jsonld) {
-        jsonld = processor.processQuery(jsonld, null);
+        try {
+            jsonld = processor.processQuery(jsonld, null);
+        }
+        catch (KustvaktException e) {
+            throw KustvaktResponseHandler.throwit(e);
+        }
         // todo: should be possible to add the meta part to the query serialization
         jlog.info("Serialized search: {}", jsonld);
 
@@ -142,7 +155,13 @@
         if (cq != null)
             serializer.setCollection(cq);
 
-        String query = processor.processQuery(serializer.toJSON(), null);
+        String query;
+        try {
+            query = this.processor.processQuery(serializer.toJSON(), null);
+        }
+        catch (KustvaktException e) {
+            throw KustvaktResponseHandler.throwit(e);
+        }
         jlog.info("the serialized query {}", query);
 
         // This may not work with the the KoralQuery
@@ -213,7 +232,12 @@
             //                meta.addEntry("itemsPerResource", 1);
             QuerySerializer s = new QuerySerializer().setQuery(query, ql, v)
                     .setMeta(meta.raw());
-            query = processor.processQuery(s.toJSON(), null);
+            try {
+                query = this.processor.processQuery(s.toJSON(), null);
+            }
+            catch (KustvaktException e) {
+                throw KustvaktResponseHandler.throwit(e);
+            }
         }
         String result;
         try {
diff --git a/src/main/resources/default-config.xml b/src/main/resources/default-config.xml
index 1b0c72c..62d5997 100644
--- a/src/main/resources/default-config.xml
+++ b/src/main/resources/default-config.xml
@@ -1,9 +1,11 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+       xmlns:p="http://www.springframework.org/schema/p"
        xmlns:util="http://www.springframework.org/schema/util"
        xmlns:aop="http://www.springframework.org/schema/aop"
        xmlns:tx="http://www.springframework.org/schema/tx"
        xmlns="http://www.springframework.org/schema/beans"
+       xmlns:cache="http://www.springframework.org/schema/cache"
        xsi:schemaLocation="http://www.springframework.org/schema/beans
                             http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
                             http://www.springframework.org/schema/tx
@@ -15,8 +17,6 @@
                             http://www.springframework.org/schema/util
                             http://www.springframework.org/schema/util/spring-util-4.0.xsd">
 
-    <!--<cache:annotation-driven/>-->
-
     <bean id="props"
           class="org.springframework.beans.factory.config.PropertiesFactoryBean">
         <property name="ignoreResourceNotFound" value="true"/>
@@ -39,14 +39,14 @@
         </property>
     </bean>
 
-    <!--<bean id='cacheManager'-->
-    <!--class='org.springframework.cache.ehcache.EhCacheCacheManager'-->
-    <!--p:cacheManager-ref='ehcache'/>-->
+    <bean id='cacheManager'
+          class='org.springframework.cache.ehcache.EhCacheCacheManager'
+          p:cacheManager-ref='ehcache'/>
 
-    <!--<bean id='ehcache'-->
-    <!--class='org.springframework.cache.ehcache.EhCacheManagerFactoryBean'-->
-    <!--p:configLocation='classpath:ehcache.xml'-->
-    <!--p:shared='true'/>-->
+    <bean id='ehcache'
+          class='org.springframework.cache.ehcache.EhCacheManagerFactoryBean'
+          p:configLocation='classpath:ehcache.xml'
+          p:shared='true'/>
 
     <!-- props are injected from default-config.xml -->
     <bean id="kustvakt_config"
@@ -87,16 +87,6 @@
         <property name="database" value="${jdbc.database}"/>
     </bean>
 
-    <bean id="kustvakt_userdetails"
-          class="de.ids_mannheim.korap.handlers.UserDetailsDao">
-        <constructor-arg ref="kustvakt_db"/>
-    </bean>
-
-    <bean id="kustvakt_usersettings"
-          class="de.ids_mannheim.korap.handlers.UserSettingsDao">
-        <constructor-arg ref="kustvakt_db"/>
-    </bean>
-
     <bean id="kustvakt_auditing"
           class="de.ids_mannheim.korap.handlers.JDBCAuditing">
         <constructor-arg ref="kustvakt_db"/>
@@ -107,18 +97,16 @@
         <constructor-arg ref="kustvakt_db"/>
     </bean>
 
-    <!--fixme: change name according to convention -->
-    <!--<bean id="collectionProvider"-->
-    <!--class="de.ids_mannheim.korap.handlers.CollectionDao">-->
-    <!--<constructor-arg ref="kustvakt_db"/>-->
-    <!--</bean>-->
-
-    <!--fixme: change name according to convention -->
-    <bean id="resourceProvider"
+    <bean id="resource_provider"
           class="de.ids_mannheim.korap.handlers.ResourceDao">
         <constructor-arg ref="kustvakt_db"/>
     </bean>
 
+    <bean id="document_provider"
+          class="de.ids_mannheim.korap.handlers.DocumentDao">
+        <constructor-arg ref="kustvakt_db"/>
+    </bean>
+
     <bean id="kustvakt_policies"
           class="de.ids_mannheim.korap.security.ac.PolicyDao">
         <constructor-arg ref="kustvakt_db"/>
@@ -173,13 +161,12 @@
     <bean id="userdata_details"
           class="de.ids_mannheim.korap.handlers.UserDetailsDao">
         <constructor-arg
-                type="de.ids_mannheim.korap.interfaces.db.PersistenceClient"
                 ref="kustvakt_db"/>
     </bean>
+
     <bean id="userdata_settings"
-          class="de.ids_mannheim.korap.handlers.UserDetailsDao">
+          class="de.ids_mannheim.korap.handlers.UserSettingsDao">
         <constructor-arg
-                type="de.ids_mannheim.korap.interfaces.db.PersistenceClient"
                 ref="kustvakt_db"/>
     </bean>
 
@@ -189,6 +176,13 @@
         <ref bean="userdata_settings"/>
     </util:list>
 
+
+    <util:list id="kustvakt_resources"
+               value-type="de.ids_mannheim.korap.interfaces.db.ResourceOperationIface">
+        <ref bean="document_provider"/>
+        <ref bean="resource_provider"/>
+    </util:list>
+
     <!-- specify type for constructor argument -->
     <bean id="kustvakt_authenticationmanager"
           class="de.ids_mannheim.korap.security.auth.KustvaktAuthenticationManager">
