diff --git a/src/main/java/de/ids_mannheim/korap/config/BeanInjectable.java b/src/main/java/de/ids_mannheim/korap/config/BeanInjectable.java
deleted file mode 100644
index 54f432e..0000000
--- a/src/main/java/de/ids_mannheim/korap/config/BeanInjectable.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package de.ids_mannheim.korap.config;
-
-/**
- * @author hanl
- * @date 26/02/2016
- */
-public interface BeanInjectable {
-
-    <T extends ContextHolder> void insertBeans (T beans);
-}
diff --git a/src/main/java/de/ids_mannheim/korap/config/BeansFactory.java b/src/main/java/de/ids_mannheim/korap/config/BeansFactory.java
deleted file mode 100644
index 2616870..0000000
--- a/src/main/java/de/ids_mannheim/korap/config/BeansFactory.java
+++ /dev/null
@@ -1,124 +0,0 @@
-package de.ids_mannheim.korap.config;
-
-import java.lang.reflect.ParameterizedType;
-import java.lang.reflect.Type;
-import java.util.Collection;
-
-import org.springframework.context.ApplicationContext;
-import org.springframework.context.support.ClassPathXmlApplicationContext;
-import org.springframework.context.support.FileSystemXmlApplicationContext;
-
-import de.ids_mannheim.korap.interfaces.KustvaktTypeInterface;
-import de.ids_mannheim.korap.web.CoreResponseHandler;
-
-/**
- * User: hanl
- * Date: 10/9/13
- * Time: 11:20 AM
- */
-public class BeansFactory {
-
-    private static ContextHolder beanHolder;
-
-    //todo: allow this for external plugin systems that are not kustvakt specific
-    @Deprecated
-    public static void setCustomBeansHolder (ContextHolder holder) {
-        beanHolder = holder;
-    }
-
-    public static synchronized ContextHolder getKustvaktContext () {
-        return beanHolder;
-    }
-
-    public static synchronized ContextHolder getKustvaktContext (int i) {
-        return beanHolder;
-    }
-
-    public static synchronized TypeBeanFactory getTypeFactory () {
-        return new TypeBeanFactory();
-    }
-
-    public static int loadClasspathContext (String ... files) {
-        ApplicationContext context;
-        if (files.length == 0)
-            throw new IllegalArgumentException(
-                    "Spring XML config file is not specified.");
-        else
-            context = new ClassPathXmlApplicationContext(files);
-        ContextHolder h = new ContextHolder(context) {};
-        BeansFactory.beanHolder = h;
-        //        return BeansFactory.beanHolder.indexOf(h);
-        return 0;
-    }
-
-    public static synchronized int addApplicationContext (
-            ApplicationContext context) {
-        ContextHolder h = new ContextHolder(context) {};
-        BeansFactory.beanHolder = h;
-        //        return BeansFactory.beanHolder.indexOf(h);
-        return 0;
-    }
-
-    public static synchronized void setKustvaktContext (ContextHolder holder) {
-        BeansFactory.beanHolder = holder;
-    }
-
-    public static synchronized int setApplicationContext (
-            ApplicationContext context) {
-        ContextHolder h = new ContextHolder(context) {};
-        BeansFactory.beanHolder = h;
-        return 0;
-    }
-
-    public static synchronized int loadFileContext (String filepath) {
-        ApplicationContext context = new FileSystemXmlApplicationContext(
-                "file:" + filepath);
-        ContextHolder h = new ContextHolder(context) {};
-        BeansFactory.beanHolder = h;
-        return 0;
-    }
-
-    public static void closeApplication () {
-        BeansFactory.beanHolder = null;
-    }
-
-    //todo: set response handler
-    @Deprecated
-    public static CoreResponseHandler getResponseHandler () {
-        return null;
-    }
-
-    public BeansFactory () {}
-
-    public static class TypeBeanFactory {
-
-        public <T> T getTypeInterfaceBean (Collection objs, Class type) {
-            for (Object o : objs) {
-                if (o instanceof KustvaktTypeInterface) {
-                    Class t = ((KustvaktTypeInterface) o).type();
-                    if (type.equals(t))
-                        return (T) o;
-                }
-            }
-            throw new RuntimeException(
-                    "Could not find typed bean in context for class '" + type
-                            + "'");
-        }
-
-        @Deprecated
-        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
deleted file mode 100644
index 3d26bcc..0000000
--- a/src/main/java/de/ids_mannheim/korap/config/ContextHolder.java
+++ /dev/null
@@ -1,72 +0,0 @@
-package de.ids_mannheim.korap.config;
-
-import org.springframework.beans.factory.NoSuchBeanDefinitionException;
-import org.springframework.context.ApplicationContext;
-
-import de.ids_mannheim.korap.web.CoreResponseHandler;
-
-/**
- * @author hanl
- * @date 26/02/2016
- */
-public abstract class ContextHolder {
-
-    public static final String KUSTVAKT_DB = "kustvakt_db";
-    public static final String KUSTVAKT_ENCRYPTION = "kustvakt_encryption";
-    public static final String KUSTVAKT_AUDITING = "kustvakt_auditing";
-    public static final String KUSTVAKT_CONFIG = "kustvakt_config";
-    public static final String KUSTVAKT_USERDATA = "kustvakt_userdata";
-    public static final String KUSTVAKT_RESOURCES = "kustvakt_resources";
-
-    public static final String KUSTVAKT_AUTHENTICATION_MANAGER = "kustvakt_authenticationmanager";
-    public static final String KUSTVAKT_AUTHPROVIDERS = "kustvakt_authproviders";
-    public static final String KUSTVAKT_USERDB = "kustvakt_userdb";
-    public static final String KUSTVAKT_ADMINDB = "kustvakt_admindb";
-    public static final String KUSTVAKT_POLICIES = "kustvakt_policies";
-
-    private ApplicationContext context = null;
-    private DefaultHandler handler;
-
-    public ContextHolder (ApplicationContext context) {
-        this.handler = new DefaultHandler();
-        this.context = context;
-        // todo: better method?!
-        new CoreResponseHandler();
-    }
-
-    protected <T> T getBean (Class<T> clazz) {
-        if (this.context != null) {
-            try {
-                return context.getBean(clazz);
-            }
-            catch (NoSuchBeanDefinitionException e) {
-                // do nothing
-            }
-        }
-        return this.handler.getDefault(clazz);
-    }
-
-    protected <T> T getBean (String name) {
-        T bean = null;
-        if (this.context != null) {
-            try {
-                bean = (T) context.getBean(name);
-            }
-            catch (NoSuchBeanDefinitionException e) {
-                // do nothing
-                bean = (T) this.handler.getDefault(name);
-            }
-        }
-
-        return bean;
-    }
-
-    @Deprecated
-    public <T extends KustvaktConfiguration> T getConfiguration () {
-        return (T) getBean(KUSTVAKT_CONFIG);
-    }
-
-    private void close () {
-        this.context = null;
-    }
-}
diff --git a/src/main/java/de/ids_mannheim/korap/config/DefaultHandler.java b/src/main/java/de/ids_mannheim/korap/config/DefaultHandler.java
deleted file mode 100644
index df7be47..0000000
--- a/src/main/java/de/ids_mannheim/korap/config/DefaultHandler.java
+++ /dev/null
@@ -1,55 +0,0 @@
-package de.ids_mannheim.korap.config;
-
-import java.util.HashMap;
-import java.util.Map;
-import java.util.Set;
-
-/**
- * @author hanl
- * @date 17/06/2015
- */
-public class DefaultHandler {
-
-    private Map<String, Object> defaults;
-
-    public DefaultHandler () {
-        this.defaults = new HashMap<>();
-        loadClasses();
-    }
-
-    private void loadClasses () {
-        Set<Class<?>> cls = KustvaktClassLoader
-                .loadFromAnnotation(Configurable.class);
-        for (Class clazz : cls) {
-            Configurable c = (Configurable) clazz
-                    .getAnnotation(Configurable.class);
-            try {
-                this.defaults.put(c.value(), clazz.newInstance());
-            }
-            catch (InstantiationException | IllegalAccessException e) {
-                throw new RuntimeException("Could not instantiate class");
-            }
-        }
-    }
-
-    public Object getDefault (String name) {
-        return this.defaults.get(name);
-    }
-
-    public <T> T getDefault (Class<T> tClass) {
-        for (Object o : this.defaults.values()) {
-            if (o.getClass().equals(tClass))
-                return (T) o;
-        }
-        return null;
-    }
-
-    public void remove (String name) {
-        this.defaults.remove(name);
-    }
-
-    @Override
-    public String toString () {
-        return defaults.toString();
-    }
-}
diff --git a/src/main/java/de/ids_mannheim/korap/encryption/DefaultEncryption.java b/src/main/java/de/ids_mannheim/korap/encryption/DefaultEncryption.java
index 6792ff3..c3d362a 100644
--- a/src/main/java/de/ids_mannheim/korap/encryption/DefaultEncryption.java
+++ b/src/main/java/de/ids_mannheim/korap/encryption/DefaultEncryption.java
@@ -4,7 +4,6 @@
 import java.security.SecureRandom;
 
 import de.ids_mannheim.korap.config.Configurable;
-import de.ids_mannheim.korap.config.ContextHolder;
 import de.ids_mannheim.korap.exceptions.KustvaktException;
 import de.ids_mannheim.korap.interfaces.EncryptionIface;
 
@@ -12,7 +11,7 @@
  * @author hanl
  * @date 05/06/2015
  */
-@Configurable(ContextHolder.KUSTVAKT_ENCRYPTION)
+@Configurable("kustvakt_encryption")
 public class DefaultEncryption implements EncryptionIface {
 
     private SecureRandom randomizer;
diff --git a/src/main/java/de/ids_mannheim/korap/rewrite/TreeConstraint.java b/src/main/java/de/ids_mannheim/korap/rewrite/TreeConstraint.java
index a7d0983..fe7abab 100644
--- a/src/main/java/de/ids_mannheim/korap/rewrite/TreeConstraint.java
+++ b/src/main/java/de/ids_mannheim/korap/rewrite/TreeConstraint.java
@@ -1,7 +1,7 @@
 package de.ids_mannheim.korap.rewrite;
 
 import com.fasterxml.jackson.databind.JsonNode;
-import de.ids_mannheim.korap.config.BeanInjectable;
+
 import de.ids_mannheim.korap.config.KustvaktConfiguration;
 import de.ids_mannheim.korap.user.User;
 
diff --git a/src/main/java/de/ids_mannheim/korap/utils/PropertyReader.java b/src/main/java/de/ids_mannheim/korap/utils/PropertyReader.java
index b377cd1..c691e74 100644
--- a/src/main/java/de/ids_mannheim/korap/utils/PropertyReader.java
+++ b/src/main/java/de/ids_mannheim/korap/utils/PropertyReader.java
@@ -1,7 +1,5 @@
 package de.ids_mannheim.korap.utils;
 
-import de.ids_mannheim.korap.config.BeanInjectable;
-
 import java.io.File;
 import java.io.FileInputStream;
 import java.io.IOException;
diff --git a/src/main/java/de/ids_mannheim/korap/web/controller/AuthenticationController.java b/src/main/java/de/ids_mannheim/korap/web/controller/AuthenticationController.java
index 99ae42c..3d76fe4 100644
--- a/src/main/java/de/ids_mannheim/korap/web/controller/AuthenticationController.java
+++ b/src/main/java/de/ids_mannheim/korap/web/controller/AuthenticationController.java
@@ -15,7 +15,6 @@
 import de.ids_mannheim.korap.authentication.http.AuthorizationData;
 import de.ids_mannheim.korap.authentication.http.HttpAuthorizationHandler;
 import de.ids_mannheim.korap.config.Attributes;
-import de.ids_mannheim.korap.config.BeansFactory;
 import de.ids_mannheim.korap.constant.AuthenticationMethod;
 import de.ids_mannheim.korap.constant.AuthenticationScheme;
 import de.ids_mannheim.korap.constant.TokenType;
@@ -23,8 +22,6 @@
 import de.ids_mannheim.korap.exceptions.StatusCodes;
 import de.ids_mannheim.korap.security.context.TokenContext;
 import de.ids_mannheim.korap.user.User;
-import de.ids_mannheim.korap.utils.JsonUtils;
-import de.ids_mannheim.korap.utils.ServiceInfo;
 import de.ids_mannheim.korap.web.KustvaktResponseHandler;
 import de.ids_mannheim.korap.web.filter.APIVersionFilter;
 import de.ids_mannheim.korap.web.filter.AuthenticationFilter;
@@ -88,24 +85,24 @@
      * 
      * @return String
      */
-    @Deprecated
-    @GET
-    @Path("bootstrap")
-    @Produces(MediaType.APPLICATION_JSON)
-    public Response bootstrap () {
-        Map m = new HashMap();
-        //        m.put("settings", new UserSettings().toObjectMap());
-        m.put("ql", BeansFactory.getKustvaktContext().getConfiguration()
-                .getQueryLanguages());
-        m.put("SortTypes", null); // types of sorting that are supported!
-        m.put("version", ServiceInfo.getInfo().getVersion());
-        try {
-            return Response.ok(JsonUtils.toJSON(m)).build();
-        }
-        catch (KustvaktException e) {
-            throw kustvaktResponseHandler.throwit(e);
-        }
-    }
+//    @Deprecated
+//    @GET
+//    @Path("bootstrap")
+//    @Produces(MediaType.APPLICATION_JSON)
+//    public Response bootstrap () {
+//        Map m = new HashMap();
+//        //        m.put("settings", new UserSettings().toObjectMap());
+//        m.put("ql", BeansFactory.getKustvaktContext().getConfiguration()
+//                .getQueryLanguages());
+//        m.put("SortTypes", null); // types of sorting that are supported!
+//        m.put("version", ServiceInfo.getInfo().getVersion());
+//        try {
+//            return Response.ok(JsonUtils.toJSON(m)).build();
+//        }
+//        catch (KustvaktException e) {
+//            throw kustvaktResponseHandler.throwit(e);
+//        }
+//    }
 
     // fixme: moved to user
     @GET
