diff --git a/full/src/main/java/de/ids_mannheim/de/init/Initializator.java b/full/src/main/java/de/ids_mannheim/de/init/Initializator.java
deleted file mode 100644
index 0ef9dbb..0000000
--- a/full/src/main/java/de/ids_mannheim/de/init/Initializator.java
+++ /dev/null
@@ -1,19 +0,0 @@
-package de.ids_mannheim.de.init;
-
-import java.io.IOException;
-
-import de.ids_mannheim.korap.exceptions.KustvaktException;
-import de.ids_mannheim.korap.util.QueryException;
-
-/** Init methods run after spring dependency injection 
- *  
- * @author margaretha
- *
- */
-public interface Initializator {
-
-    void init () throws IOException, QueryException, KustvaktException;
-
-    void initTest () throws IOException, KustvaktException;
-
-}
\ No newline at end of file
diff --git a/full/src/main/java/de/ids_mannheim/de/init/InitializatorImpl.java b/full/src/main/java/de/ids_mannheim/de/init/InitializatorImpl.java
index 318f47e..9f0e27d 100644
--- a/full/src/main/java/de/ids_mannheim/de/init/InitializatorImpl.java
+++ b/full/src/main/java/de/ids_mannheim/de/init/InitializatorImpl.java
@@ -8,8 +8,8 @@
 import de.ids_mannheim.korap.annotation.AnnotationParser;
 import de.ids_mannheim.korap.annotation.FreeResourceParser;
 import de.ids_mannheim.korap.config.NamedVCLoader;
+import de.ids_mannheim.korap.constant.OAuth2Scope;
 import de.ids_mannheim.korap.exceptions.KustvaktException;
-import de.ids_mannheim.korap.oauth2.constant.OAuth2Scope;
 import de.ids_mannheim.korap.oauth2.dao.AccessScopeDao;
 import de.ids_mannheim.korap.util.QueryException;
 
@@ -54,7 +54,11 @@
      * @see de.ids_mannheim.de.init.Initializator#initTest()
      */
     @Override
-    public void initTest () throws IOException, KustvaktException {
+    public void initTest () {
+        setInitialAccessScope();
+    }
+    
+    public void initAnnotationTest () throws IOException, KustvaktException {
         setInitialAccessScope();
         annotationParser.run();
         resourceParser.run();
diff --git a/full/src/main/java/de/ids_mannheim/de/init/LiteInitializatorImpl.java b/full/src/main/java/de/ids_mannheim/de/init/LiteInitializatorImpl.java
deleted file mode 100644
index 31d90af..0000000
--- a/full/src/main/java/de/ids_mannheim/de/init/LiteInitializatorImpl.java
+++ /dev/null
@@ -1,26 +0,0 @@
-package de.ids_mannheim.de.init;
-
-import java.io.IOException;
-
-import org.springframework.beans.factory.annotation.Autowired;
-
-import de.ids_mannheim.korap.annotation.AnnotationParser;
-import de.ids_mannheim.korap.exceptions.KustvaktException;
-import de.ids_mannheim.korap.util.QueryException;
-
-public class LiteInitializatorImpl implements Initializator {
-
-    @Autowired
-    private AnnotationParser annotationParser;
-    
-    @Override
-    public void init () throws IOException, QueryException, KustvaktException {
-        annotationParser.run();
-    }
-
-    @Override
-    public void initTest () throws IOException, KustvaktException {
-        annotationParser.run();
-    }
-
-}
diff --git a/full/src/main/java/de/ids_mannheim/korap/annotation/AnnotationParser.java b/full/src/main/java/de/ids_mannheim/korap/annotation/AnnotationParser.java
deleted file mode 100644
index 4f995cb..0000000
--- a/full/src/main/java/de/ids_mannheim/korap/annotation/AnnotationParser.java
+++ /dev/null
@@ -1,239 +0,0 @@
-package de.ids_mannheim.korap.annotation;
-
-import java.io.BufferedReader;
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.IOException;
-import java.io.InputStreamReader;
-import java.util.ArrayList;
-import java.util.HashSet;
-import java.util.Set;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-
-import org.apache.logging.log4j.LogManager;
-import org.apache.logging.log4j.Logger;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Component;
-
-import de.ids_mannheim.korap.constant.AnnotationType;
-import de.ids_mannheim.korap.dao.AnnotationDao;
-import de.ids_mannheim.korap.entity.Annotation;
-import de.ids_mannheim.korap.entity.AnnotationKey;
-import de.ids_mannheim.korap.entity.AnnotationLayer;
-
-@Component
-public class AnnotationParser {
-
-    private Logger log = LogManager.getLogger(AnnotationDao.class);
-
-    public static final Pattern quotePattern = Pattern.compile("\"([^\"]*)\"");
-
-    @Autowired
-    private AnnotationDao annotationDao;
-
-    private Annotation foundry = null;
-    private AnnotationLayer layer = null;
-    private AnnotationKey key = null;
-
-    private Set<AnnotationKey> keys = new HashSet<>();
-    private Set<Annotation> values = new HashSet<>();
-
-    public void run () throws IOException {
-        String dir = "annotation-scripts/foundries";
-        if (dir.isEmpty()) return;
-
-        File d = new File(dir);
-        if (!d.isDirectory()) {
-            throw new IOException("Directory " + dir + " is not valid");
-        }
-
-        for (File file : d.listFiles()) {
-            if (!file.exists()) {
-                throw new IOException("File " + file + " is not found.");
-            }
-            readFile(file);
-        }
-    }
-
-    private void readFile (File file) throws IOException {
-        BufferedReader br = new BufferedReader(
-                new InputStreamReader(new FileInputStream(file)), 1024);
-
-        foundry = null;
-
-        String line, annotationCode = "", annotationType = "";
-        Matcher m;
-        ArrayList<String> array;
-        while ((line = br.readLine()) != null) {
-            line = line.trim();
-            if (line.startsWith("ah")) {
-                m = quotePattern.matcher(line);
-                if (m.find()) {
-                    annotationCode = m.group(1);
-                    annotationType = computeAnnotationType(annotationCode);
-                }
-                m.reset();
-            }
-            else if (line.startsWith("];")) {
-                if (!keys.isEmpty()) {
-                    layer.setKeys(keys);
-                    annotationDao.updateAnnotationLayer(layer);
-                }
-                if (!values.isEmpty()) {
-                    key.setValues(values);
-                    annotationDao.updateAnnotationKey(key);
-                }
-                keys.clear();
-                values.clear();
-                layer = null;
-                key = null;
-            }
-            else if (line.startsWith("[")) {
-                array = computeValues(line);
-                parseArray(annotationCode, annotationType, array);
-            }
-
-        }
-        br.close();
-    }
-
-    public static ArrayList<String> computeValues (String line) {
-        ArrayList<String> values;
-        Matcher m = quotePattern.matcher(line);
-        values = new ArrayList<String>();
-        while (m.find()) {
-            values.add(m.group(1));
-        }
-        return values;
-    }
-
-    private void parseArray (String annotationCode, String annotationType,
-            ArrayList<String> array) {
-        if (annotationType.equals(AnnotationType.FOUNDRY)) {
-            String code = array.get(1).substring(0, array.get(1).length() - 1);
-            foundry = retrieveOrCreateAnnotation(code, AnnotationType.FOUNDRY,
-                    null, array.get(0));
-        }
-        else if (annotationType.equals(AnnotationType.LAYER)) {
-            String code = array.get(1);
-            if (code.endsWith("=")) {
-                code = code.substring(0, code.length() - 1);
-            }
-            Annotation layer = retrieveOrCreateAnnotation(code, annotationType,
-                    null, array.get(0));
-            try {
-                AnnotationLayer annotationLayer =
-                        annotationDao.retrieveAnnotationLayer(foundry.getCode(),
-                                layer.getCode());
-                if (annotationLayer == null) {
-                    annotationDao.createAnnotationLayer(foundry, layer);
-                }
-            }
-            catch (Exception e) {
-                log.debug("Duplicate annotation layer: " + foundry.getCode()
-                        + "/" + layer.getCode());
-            }
-        }
-        else if (annotationType.equals(AnnotationType.KEY))
-
-        {
-            if (layer == null) {
-                computeLayer(annotationCode);
-            }
-
-            Annotation annotation = null;
-            if (array.size() == 2) {
-                String code = array.get(1);
-                if (code.endsWith("=") || code.endsWith(":")) {
-                    code = code.substring(0, code.length() - 1);
-                }
-                annotation = retrieveOrCreateAnnotation(code, annotationType,
-                        null, array.get(0));
-            }
-            else if (array.size() == 3) {
-                annotation = retrieveOrCreateAnnotation(array.get(0),
-                        annotationType, array.get(1), array.get(2));
-            }
-            if (annotation != null) {
-                AnnotationKey annotationKey =
-                        annotationDao.retrieveAnnotationKey(layer, annotation);
-                if (annotationKey == null) {
-                    annotationDao.createAnnotationKey(layer, annotation);
-                }
-                this.keys.add(annotationKey);
-            }
-        }
-        else if (annotationType.equals(AnnotationType.VALUE)) {
-            if (this.key == null) {
-                computeKey(annotationCode);
-            }
-            Annotation value = retrieveOrCreateAnnotation(array.get(0),
-                    AnnotationType.VALUE, array.get(1), array.get(2));
-            if (value != null) {
-                values.add(value);
-            }
-        }
-    }
-
-    private void computeKey (String code) {
-        String[] codes = code.split("=");
-        if (codes.length > 1) {
-            computeLayer(codes[0]);
-            String keyCode = codes[1];
-            if (keyCode.endsWith(":") || keyCode.endsWith("-")) {
-                keyCode = keyCode.substring(0, keyCode.length() - 1);
-            }
-            Annotation key = annotationDao.retrieveAnnotation(keyCode,
-                    AnnotationType.KEY);
-            this.key = annotationDao.retrieveAnnotationKey(layer, key);
-        }
-
-    }
-
-    private void computeLayer (String code) {
-        String[] codes = code.split("/");
-        if (codes.length > 1) {
-            String layerCode = codes[1];
-            if (layerCode.endsWith("=")) {
-                layerCode = layerCode.substring(0, layerCode.length() - 1);
-            }
-            this.layer =
-                    annotationDao.retrieveAnnotationLayer(codes[0], layerCode);
-            if (layer == null) {
-                log.warn("Layer is null for " + code);
-            }
-        }
-    }
-
-    private Annotation retrieveOrCreateAnnotation (String code, String type,
-            String text, String description) {
-        Annotation annotation = annotationDao.retrieveAnnotation(code, type);
-        if (annotation == null) {
-            annotation = annotationDao.createAnnotation(code, type, text,
-                    description);
-        }
-        return annotation;
-    }
-
-    private String computeAnnotationType (String code) {
-        String[] codes = code.split("/");
-        if (codes.length == 1) {
-            if (codes[0].equals("-")) {
-                return AnnotationType.FOUNDRY;
-            }
-            return AnnotationType.LAYER;
-        }
-        else if (codes.length == 2) {
-            if (codes[1].endsWith(":") || codes[1].endsWith("-")) {
-                return AnnotationType.VALUE;
-            }
-            else {
-                return AnnotationType.KEY;
-            }
-        }
-
-        return "unknown";
-    }
-
-}
diff --git a/full/src/main/java/de/ids_mannheim/korap/annotation/ArrayVariables.java b/full/src/main/java/de/ids_mannheim/korap/annotation/ArrayVariables.java
deleted file mode 100644
index 55f476a..0000000
--- a/full/src/main/java/de/ids_mannheim/korap/annotation/ArrayVariables.java
+++ /dev/null
@@ -1,94 +0,0 @@
-package de.ids_mannheim.korap.annotation;
-
-import java.io.BufferedReader;
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.IOException;
-import java.io.InputStreamReader;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-
-import de.ids_mannheim.korap.constant.AnnotationType;
-import de.ids_mannheim.korap.entity.Annotation;
-
-/**
- * Helper class to parse annotation scripts variables. It prints out
- * corenlp constituency layer for each negranodes.
- * 
- * @author margaretha
- *
- */
-public class ArrayVariables {
-
-    public static HashMap<String, List<Annotation>> annotationMap =
-            new HashMap<>();
-
-    public static void main (String[] args) throws IOException {
-        ArrayVariables variables = new ArrayVariables();
-        variables.extractVariables();
-
-        List<Annotation> negranodes = annotationMap.get("negranodes");
-        for (Annotation n : negranodes) {
-            System.out.println("ah[\"corenlp/c=" + n.getCode() + "-\"] = [");
-            int i = 1;
-            List<Annotation> negraedges = annotationMap.get("negraedges");
-            for (Annotation edge : negraedges) {
-                System.out.print(
-                        "  [\"" + edge.getCode() + "\", \"" + edge.getText()
-                                + "\", \"" + edge.getDescription() + "\"]");
-                if (i < negraedges.size()) {
-                    System.out.println(",");
-                }
-                else {
-                    System.out.println();
-                }
-                i++;
-            }
-            System.out.println("];");
-            System.out.println();
-        }
-    }
-
-    public void extractVariables () throws IOException {
-        String dir = "annotation-scripts/variables";
-        if (dir.isEmpty()) return;
-
-        File d = new File(dir);
-        if (!d.isDirectory()) {
-            throw new IOException("Directory " + dir + " is not valid");
-        }
-
-        for (File file : d.listFiles()) {
-            if (!file.exists()) {
-                throw new IOException("File " + file + " is not found.");
-            }
-            readFile(file);
-        }
-
-    }
-
-    private void readFile (File file) throws IOException {
-        BufferedReader br = new BufferedReader(
-                new InputStreamReader(new FileInputStream(file)));
-
-        String line;
-        ArrayList<String> values;
-        List<Annotation> annotations = new ArrayList<>();
-        while ((line = br.readLine()) != null) {
-            line = line.trim();
-            if (line.startsWith("[")) {
-                values = AnnotationParser.computeValues(line);
-
-                Annotation annotation = new Annotation(values.get(0),
-                        AnnotationType.VALUE, values.get(1), values.get(2));
-                annotations.add(annotation);
-            }
-        }
-        br.close();
-
-        String filename = file.getName();
-        filename = filename.substring(0, filename.length() - 3);
-        annotationMap.put(filename, annotations);
-    }
-}
diff --git a/full/src/main/java/de/ids_mannheim/korap/authentication/APIAuthentication.java b/full/src/main/java/de/ids_mannheim/korap/authentication/APIAuthentication.java
index 77504a5..869b641 100644
--- a/full/src/main/java/de/ids_mannheim/korap/authentication/APIAuthentication.java
+++ b/full/src/main/java/de/ids_mannheim/korap/authentication/APIAuthentication.java
@@ -18,7 +18,6 @@
 import de.ids_mannheim.korap.constant.TokenType;
 import de.ids_mannheim.korap.exceptions.KustvaktException;
 import de.ids_mannheim.korap.exceptions.StatusCodes;
-import de.ids_mannheim.korap.interfaces.AuthenticationIface;
 import de.ids_mannheim.korap.security.context.TokenContext;
 import de.ids_mannheim.korap.user.User;
 import net.sf.ehcache.Cache;
diff --git a/full/src/main/java/de/ids_mannheim/korap/authentication/AuthenticationManager.java b/full/src/main/java/de/ids_mannheim/korap/authentication/AuthenticationManager.java
deleted file mode 100644
index e9e6764..0000000
--- a/full/src/main/java/de/ids_mannheim/korap/authentication/AuthenticationManager.java
+++ /dev/null
@@ -1,103 +0,0 @@
-package de.ids_mannheim.korap.authentication;
-
-import java.util.HashMap;
-import java.util.Map;
-import java.util.Set;
-
-import javax.ws.rs.core.HttpHeaders;
-
-import de.ids_mannheim.korap.config.KustvaktCacheable;
-import de.ids_mannheim.korap.constant.AuthenticationMethod;
-import de.ids_mannheim.korap.constant.TokenType;
-import de.ids_mannheim.korap.exceptions.KustvaktException;
-import de.ids_mannheim.korap.interfaces.AuthenticationIface;
-import de.ids_mannheim.korap.security.context.TokenContext;
-import de.ids_mannheim.korap.user.User;
-import de.ids_mannheim.korap.user.Userdata;
-
-/**
- * @author hanl
- * @date 15/06/2015
- */
-public abstract class AuthenticationManager extends KustvaktCacheable {
-
-    private Map<TokenType, AuthenticationIface> providers;
-
-    public AuthenticationManager () {
-        super("id_tokens", "key:id_tokens");
-        this.providers = new HashMap<>();
-    }
-
-    public void setProviders (Set<AuthenticationIface> providers) {
-        for (AuthenticationIface i : providers) {
-            this.providers.put(i.getTokenType(), i);
-        }
-    }
-
-    protected AuthenticationIface getProvider (TokenType scheme,
-            TokenType default_iface) {
-
-        // Debug FB: loop a Map
-
-        /*for (Map.Entry<String, AuthenticationIface> entry : this.providers.entrySet()) 
-        {
-        System.out.println("Debug: provider: Key : " + entry.getKey() + " Value : " + entry.getValue());
-        }
-        */
-        // todo: configurable authentication schema
-        if (scheme == null) {
-            return this.providers.get(default_iface);
-        }
-        else {
-            return this.providers.get(scheme);
-        }
-    }
-
-    public abstract TokenContext getTokenContext (TokenType type, String token,
-            String host, String useragent) throws KustvaktException;
-
-    public abstract User getUser (String username) throws KustvaktException;
-
-    public abstract boolean isRegistered (String id);
-
-    public abstract User authenticate (AuthenticationMethod method,
-            String username, String password, Map<String, Object> attributes)
-            throws KustvaktException;
-
-    public abstract TokenContext createTokenContext (User user,
-            Map<String, Object> attr, TokenType type) throws KustvaktException;
-
-    public abstract void setAccessAndLocation (User user, HttpHeaders headers);
-
-    public abstract void logout (TokenContext context) throws KustvaktException;
-
-    public abstract void lockAccount (User user) throws KustvaktException;
-
-    public abstract User createUserAccount (Map<String, Object> attributes,
-            boolean confirmation_required) throws KustvaktException;
-
-    public abstract boolean deleteAccount (User user) throws KustvaktException;
-
-    public abstract <T extends Userdata> T getUserData (User user,
-            Class<T> clazz) throws KustvaktException;
-
-    public abstract void updateUserData (Userdata data)
-            throws KustvaktException;
-
-    public abstract Object[] validateResetPasswordRequest (String username,
-            String email) throws KustvaktException;
-
-    public abstract void resetPassword (String uriFragment, String username,
-            String newPassphrase) throws KustvaktException;
-
-    public abstract void confirmRegistration (String uriFragment,
-            String username) throws KustvaktException;
-
-    public String providerList () {
-        return "provider list: " + this.providers.toString();
-    }
-
-    public abstract User getUser (String username, String method)
-            throws KustvaktException;
-
-}
diff --git a/full/src/main/java/de/ids_mannheim/korap/authentication/BasicAuthentication.java b/full/src/main/java/de/ids_mannheim/korap/authentication/BasicAuthentication.java
index b90406b..f94ab3f 100644
--- a/full/src/main/java/de/ids_mannheim/korap/authentication/BasicAuthentication.java
+++ b/full/src/main/java/de/ids_mannheim/korap/authentication/BasicAuthentication.java
@@ -15,7 +15,6 @@
 import de.ids_mannheim.korap.dao.UserDao;
 import de.ids_mannheim.korap.exceptions.KustvaktException;
 import de.ids_mannheim.korap.exceptions.StatusCodes;
-import de.ids_mannheim.korap.interfaces.AuthenticationIface;
 import de.ids_mannheim.korap.security.context.TokenContext;
 import de.ids_mannheim.korap.user.User;
 import de.ids_mannheim.korap.utils.StringUtils;
diff --git a/full/src/main/java/de/ids_mannheim/korap/authentication/DummyAuthenticationManager.java b/full/src/main/java/de/ids_mannheim/korap/authentication/DummyAuthenticationManager.java
deleted file mode 100644
index 0a473ac..0000000
--- a/full/src/main/java/de/ids_mannheim/korap/authentication/DummyAuthenticationManager.java
+++ /dev/null
@@ -1,136 +0,0 @@
-package de.ids_mannheim.korap.authentication;
-
-import java.util.Map;
-
-import javax.ws.rs.core.HttpHeaders;
-
-import org.springframework.beans.factory.annotation.Autowired;
-
-import de.ids_mannheim.korap.config.KustvaktConfiguration;
-import de.ids_mannheim.korap.constant.AuthenticationMethod;
-import de.ids_mannheim.korap.constant.TokenType;
-import de.ids_mannheim.korap.exceptions.KustvaktException;
-import de.ids_mannheim.korap.security.context.TokenContext;
-import de.ids_mannheim.korap.user.User;
-import de.ids_mannheim.korap.user.Userdata;
-import de.ids_mannheim.korap.utils.TimeUtils;
-
-public class DummyAuthenticationManager extends AuthenticationManager {
-
-    @Autowired
-    private KustvaktConfiguration config;
-
-    @Override
-    public TokenContext getTokenContext (TokenType type, String token,
-            String host, String useragent) throws KustvaktException {
-        TokenContext c = new TokenContext();
-        c.setUsername("guest");
-        c.setHostAddress(host);
-        c.setUserAgent(useragent);
-        c.setExpirationTime(
-                TimeUtils.plusSeconds(config.getShortTokenTTL()).getMillis());
-        c.setTokenType(TokenType.BASIC);
-        c.setToken("dummyToken");
-        return c;
-    }
-
-    @Override
-    public User getUser (String username) throws KustvaktException {
-        // TODO Auto-generated method stub
-        return null;
-    }
-
-    @Override
-    public boolean isRegistered (String id) {
-        // TODO Auto-generated method stub
-        return false;
-    }
-
-    @Override
-    public User authenticate (AuthenticationMethod method, String username,
-            String password, Map<String, Object> attributes)
-            throws KustvaktException {
-        // TODO Auto-generated method stub
-        return null;
-    }
-
-    @Override
-    public TokenContext createTokenContext (User user, Map<String, Object> attr,
-            TokenType type) throws KustvaktException {
-        // TODO Auto-generated method stub
-        return null;
-    }
-
-    @Override
-    public void setAccessAndLocation (User user, HttpHeaders headers) {
-        // TODO Auto-generated method stub
-
-    }
-
-    @Override
-    public void logout (TokenContext context) throws KustvaktException {
-        // TODO Auto-generated method stub
-
-    }
-
-    @Override
-    public void lockAccount (User user) throws KustvaktException {
-        // TODO Auto-generated method stub
-
-    }
-
-    @Override
-    public User createUserAccount (Map<String, Object> attributes,
-            boolean confirmation_required) throws KustvaktException {
-        // TODO Auto-generated method stub
-        return null;
-    }
-
-    @Override
-    public boolean deleteAccount (User user) throws KustvaktException {
-        // TODO Auto-generated method stub
-        return false;
-    }
-
-    @Override
-    public <T extends Userdata> T getUserData (User user, Class<T> clazz)
-            throws KustvaktException {
-        // TODO Auto-generated method stub
-        return null;
-    }
-
-    @Override
-    public void updateUserData (Userdata data) throws KustvaktException {
-        // TODO Auto-generated method stub
-
-    }
-
-    @Override
-    public Object[] validateResetPasswordRequest (String username, String email)
-            throws KustvaktException {
-        // TODO Auto-generated method stub
-        return null;
-    }
-
-    @Override
-    public void resetPassword (String uriFragment, String username,
-            String newPassphrase) throws KustvaktException {
-        // TODO Auto-generated method stub
-
-    }
-
-    @Override
-    public void confirmRegistration (String uriFragment, String username)
-            throws KustvaktException {
-        // TODO Auto-generated method stub
-
-    }
-
-    @Override
-    public User getUser (String username, String method)
-            throws KustvaktException {
-        // TODO Auto-generated method stub
-        return null;
-    }
-
-}
diff --git a/full/src/main/java/de/ids_mannheim/korap/authentication/KustvaktAuthenticationManager.java b/full/src/main/java/de/ids_mannheim/korap/authentication/KustvaktAuthenticationManager.java
index 6aa5b9f..e4e8ac1 100644
--- a/full/src/main/java/de/ids_mannheim/korap/authentication/KustvaktAuthenticationManager.java
+++ b/full/src/main/java/de/ids_mannheim/korap/authentication/KustvaktAuthenticationManager.java
@@ -33,7 +33,6 @@
 import de.ids_mannheim.korap.exceptions.KustvaktException;
 import de.ids_mannheim.korap.exceptions.StatusCodes;
 import de.ids_mannheim.korap.exceptions.WrappedException;
-import de.ids_mannheim.korap.interfaces.AuthenticationIface;
 import de.ids_mannheim.korap.interfaces.EncryptionIface;
 import de.ids_mannheim.korap.interfaces.EntityHandlerIface;
 import de.ids_mannheim.korap.interfaces.ValidatorIface;
@@ -74,6 +73,7 @@
 	
 	public KustvaktAuthenticationManager(EntityHandlerIface userdb, EncryptionIface crypto,
 			FullConfiguration config, AuditingIface auditer, Collection<UserDataDbIface> userdatadaos) {
+	    super("id_tokens");
 		this.entHandler = userdb;
 		this.config = config;
 		this.crypto = crypto;
diff --git a/full/src/main/java/de/ids_mannheim/korap/authentication/OAuth2Authentication.java b/full/src/main/java/de/ids_mannheim/korap/authentication/OAuth2Authentication.java
index d203b51..a180921 100644
--- a/full/src/main/java/de/ids_mannheim/korap/authentication/OAuth2Authentication.java
+++ b/full/src/main/java/de/ids_mannheim/korap/authentication/OAuth2Authentication.java
@@ -9,10 +9,9 @@
 import de.ids_mannheim.korap.constant.TokenType;
 import de.ids_mannheim.korap.exceptions.KustvaktException;
 import de.ids_mannheim.korap.exceptions.StatusCodes;
-import de.ids_mannheim.korap.interfaces.AuthenticationIface;
 import de.ids_mannheim.korap.oauth2.dao.AccessTokenDao;
 import de.ids_mannheim.korap.oauth2.entity.AccessToken;
-import de.ids_mannheim.korap.oauth2.service.OAuth2ScopeService;
+import de.ids_mannheim.korap.oauth2.service.OAuth2ScopeServiceImpl;
 import de.ids_mannheim.korap.security.context.TokenContext;
 import de.ids_mannheim.korap.user.User;
 
@@ -22,7 +21,7 @@
     @Autowired
     private AccessTokenDao accessDao;
     @Autowired
-    private OAuth2ScopeService scopeService;
+    private OAuth2ScopeServiceImpl scopeService;
 
     @Override
     public TokenContext getTokenContext (String authToken)
diff --git a/full/src/main/java/de/ids_mannheim/korap/authentication/SessionAuthentication.java b/full/src/main/java/de/ids_mannheim/korap/authentication/SessionAuthentication.java
index 1bb4c6d..af8e953 100644
--- a/full/src/main/java/de/ids_mannheim/korap/authentication/SessionAuthentication.java
+++ b/full/src/main/java/de/ids_mannheim/korap/authentication/SessionAuthentication.java
@@ -4,7 +4,6 @@
 import de.ids_mannheim.korap.constant.TokenType;
 import de.ids_mannheim.korap.exceptions.KustvaktException;
 import de.ids_mannheim.korap.exceptions.StatusCodes;
-import de.ids_mannheim.korap.interfaces.AuthenticationIface;
 import de.ids_mannheim.korap.interfaces.EncryptionIface;
 import de.ids_mannheim.korap.security.context.TokenContext;
 import de.ids_mannheim.korap.config.Attributes;
diff --git a/full/src/main/java/de/ids_mannheim/korap/authentication/http/AuthorizationData.java b/full/src/main/java/de/ids_mannheim/korap/authentication/http/AuthorizationData.java
deleted file mode 100644
index 236f26a..0000000
--- a/full/src/main/java/de/ids_mannheim/korap/authentication/http/AuthorizationData.java
+++ /dev/null
@@ -1,22 +0,0 @@
-package de.ids_mannheim.korap.authentication.http;
-
-import de.ids_mannheim.korap.constant.AuthenticationScheme;
-import lombok.Getter;
-import lombok.Setter;
-
-/** Describes the values stored in Authorization header of HTTP requests. 
- * 
- * @author margaretha
- *
- */
-@Getter
-@Setter
-public class AuthorizationData {
-
-    private String token;
-    private AuthenticationScheme authenticationScheme;
-    private String username;
-    private String password;
-
-}
-
diff --git a/full/src/main/java/de/ids_mannheim/korap/authentication/http/HttpAuthorizationHandler.java b/full/src/main/java/de/ids_mannheim/korap/authentication/http/HttpAuthorizationHandler.java
deleted file mode 100644
index 5eed64f..0000000
--- a/full/src/main/java/de/ids_mannheim/korap/authentication/http/HttpAuthorizationHandler.java
+++ /dev/null
@@ -1,58 +0,0 @@
-package de.ids_mannheim.korap.authentication.http;
-
-import org.springframework.stereotype.Component;
-
-import de.ids_mannheim.korap.constant.AuthenticationScheme;
-import de.ids_mannheim.korap.exceptions.KustvaktException;
-import de.ids_mannheim.korap.exceptions.StatusCodes;
-import de.ids_mannheim.korap.utils.ParameterChecker;
-
-/** Implementation of Basic HTTP authentication scheme (see RFC 7253 
- *  and 7617) for client asking for authorization and sending user 
- *  data.  
- * 
- * @author margaretha
- * 
- */
-@Component
-public class HttpAuthorizationHandler {
-
-    public static String createBasicAuthorizationHeaderValue (String username, 
-            String password) throws KustvaktException {
-        ParameterChecker.checkStringValue(username, "username");
-        ParameterChecker.checkStringValue(password, "password");
-
-        String credentials = TransferEncoding.encodeBase64(username, password);
-        return AuthenticationScheme.BASIC.displayName()+" " + credentials;
-    }
-
-    public AuthorizationData parseAuthorizationHeaderValue (
-            String authorizationHeader) throws KustvaktException {
-        ParameterChecker.checkStringValue(authorizationHeader,
-                "authorization header");
-
-        String[] values = authorizationHeader.split(" ");
-        if (values.length != 2) {
-            throw new KustvaktException(StatusCodes.AUTHENTICATION_FAILED,
-                    "Cannot parse authorization header value "
-                            + authorizationHeader
-                            + ". Use this format: [authentication "
-                            + "scheme] [Base64-encoded token]",
-                    authorizationHeader);
-        }
-
-        AuthorizationData data = new AuthorizationData();
-        data.setAuthenticationScheme(
-                AuthenticationScheme.valueOf(values[0].toUpperCase()));
-        data.setToken(values[1]);
-        return data;
-    }
-
-    public AuthorizationData parseBasicToken (AuthorizationData data)
-            throws KustvaktException {
-        String[] credentials = TransferEncoding.decodeBase64(data.getToken());
-        data.setUsername(credentials[0]);
-        data.setPassword(credentials[1]);
-        return data;
-    }
-}
diff --git a/full/src/main/java/de/ids_mannheim/korap/authentication/http/TransferEncoding.java b/full/src/main/java/de/ids_mannheim/korap/authentication/http/TransferEncoding.java
deleted file mode 100644
index 52d1a90..0000000
--- a/full/src/main/java/de/ids_mannheim/korap/authentication/http/TransferEncoding.java
+++ /dev/null
@@ -1,53 +0,0 @@
-package de.ids_mannheim.korap.authentication.http;
-
-import org.apache.commons.codec.binary.Base64;
-import org.springframework.stereotype.Component;
-
-import de.ids_mannheim.korap.exceptions.KustvaktException;
-import de.ids_mannheim.korap.utils.ParameterChecker;
-
-/** TransferEncoding contains encoding and decoding methods for data transfer, 
- *  e.g. transfering credentials using basic Http authentication.  
- *   
- * @author margaretha
- *
- */
-@Component
-public class TransferEncoding {
-
-    /** Encodes username and password using Base64.
-     * 
-     * @param username username
-     * @param password password
-     * @return
-     */
-    public static String encodeBase64 (String username, String password) {
-        String s = username + ":" + password;
-        return new String(Base64.encodeBase64(s.getBytes()));
-    }
-
-    /** Decodes the given string using Base64.
-     * 
-     * @param encodedStr 
-     * @return username and password as an array of strings.
-     * @throws KustvaktException 
-     */
-    public static String[] decodeBase64 (String encodedStr)
-            throws KustvaktException {
-
-        ParameterChecker.checkStringValue(encodedStr, "encoded string");
-        String decodedStr = new String(Base64.decodeBase64(encodedStr));
-
-        if (decodedStr.contains(":") && decodedStr.split(":").length == 2) {
-            String[] strArr = decodedStr.split(":");
-            if ((strArr[0] != null && !strArr[0].isEmpty())
-                    && (strArr[1] != null && !strArr[1].isEmpty())) {
-                return decodedStr.split(":");
-            }
-
-        }
-
-        throw new IllegalArgumentException(
-                "Unknown Base64 encoding format: " + decodedStr);
-    }
-}
diff --git a/full/src/main/java/de/ids_mannheim/korap/constant/AnnotationType.java b/full/src/main/java/de/ids_mannheim/korap/constant/AnnotationType.java
deleted file mode 100644
index 560d401..0000000
--- a/full/src/main/java/de/ids_mannheim/korap/constant/AnnotationType.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package de.ids_mannheim.korap.constant;
-
-public class AnnotationType {
-    public static String FOUNDRY = "foundry";
-    public static String LAYER = "layer";
-    public static String KEY = "key";
-    public static String VALUE = "value";
-}
diff --git a/full/src/main/java/de/ids_mannheim/korap/constant/AuthenticationMethod.java b/full/src/main/java/de/ids_mannheim/korap/constant/AuthenticationMethod.java
deleted file mode 100644
index 7c7dbae..0000000
--- a/full/src/main/java/de/ids_mannheim/korap/constant/AuthenticationMethod.java
+++ /dev/null
@@ -1,14 +0,0 @@
-package de.ids_mannheim.korap.constant;
-
-/** Lists possible actual authentication methods. Multiple 
- *  {@link AuthenticationScheme} may use an identical 
- *  authentication method. 
- * 
- * @author margaretha
- * 
- * @see AuthenticationScheme 
- *
- */
-public enum AuthenticationMethod {
-    LDAP, SHIBBOLETH, DATABASE, TEST; 
-}
diff --git a/full/src/main/java/de/ids_mannheim/korap/constant/AuthenticationScheme.java b/full/src/main/java/de/ids_mannheim/korap/constant/AuthenticationScheme.java
deleted file mode 100644
index 3db6a3e..0000000
--- a/full/src/main/java/de/ids_mannheim/korap/constant/AuthenticationScheme.java
+++ /dev/null
@@ -1,21 +0,0 @@
-package de.ids_mannheim.korap.constant;
-
-import org.apache.commons.lang.WordUtils;
-
-/** Lists possible authentication schemes used in the Authorization header 
- *  of HTTP requests.  
- * 
- * @author margaretha
- *
- */
-public enum AuthenticationScheme {
-    // standard http
-    BASIC, BEARER,
-    // custom
-    // SESSION, has not been supported yet 
-    API;
-
-    public String displayName () {
-        return WordUtils.capitalizeFully(name());
-    }
-}
diff --git a/full/src/main/java/de/ids_mannheim/korap/constant/TokenType.java b/full/src/main/java/de/ids_mannheim/korap/constant/TokenType.java
deleted file mode 100644
index 418be0b..0000000
--- a/full/src/main/java/de/ids_mannheim/korap/constant/TokenType.java
+++ /dev/null
@@ -1,17 +0,0 @@
-package de.ids_mannheim.korap.constant;
-
-import org.apache.commons.lang.StringUtils;
-
-public enum TokenType {
-    BASIC, API, SESSION, 
-    // openid token, e.g. within oauth2 response (json body)
-    ID_TOKEN,
-    // OAuth2 access_token
-    BEARER,
-    // OAuth2 client
-    CLIENT; 
-
-    public String displayName () {
-        return StringUtils.capitalize(name().toLowerCase());
-    }
-}
\ No newline at end of file
diff --git a/full/src/main/java/de/ids_mannheim/korap/dao/AdminDao.java b/full/src/main/java/de/ids_mannheim/korap/dao/AdminDao.java
deleted file mode 100644
index fcf32d0..0000000
--- a/full/src/main/java/de/ids_mannheim/korap/dao/AdminDao.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package de.ids_mannheim.korap.dao;
-
-import de.ids_mannheim.korap.user.User;
-
-public interface AdminDao {
-
-    void addAccount (User user);
-
-    boolean isAdmin (String userId);
-
-}
\ No newline at end of file
diff --git a/full/src/main/java/de/ids_mannheim/korap/dao/AnnotationDao.java b/full/src/main/java/de/ids_mannheim/korap/dao/AnnotationDao.java
deleted file mode 100644
index ef54fda..0000000
--- a/full/src/main/java/de/ids_mannheim/korap/dao/AnnotationDao.java
+++ /dev/null
@@ -1,215 +0,0 @@
-package de.ids_mannheim.korap.dao;
-
-import java.util.List;
-
-import javax.persistence.EntityManager;
-import javax.persistence.NoResultException;
-import javax.persistence.PersistenceContext;
-import javax.persistence.Query;
-import javax.persistence.criteria.CriteriaBuilder;
-import javax.persistence.criteria.CriteriaQuery;
-import javax.persistence.criteria.Predicate;
-import javax.persistence.criteria.Root;
-
-import org.springframework.stereotype.Repository;
-import org.springframework.transaction.annotation.Transactional;
-
-import de.ids_mannheim.korap.constant.AnnotationType;
-import de.ids_mannheim.korap.entity.Annotation;
-import de.ids_mannheim.korap.entity.AnnotationKey;
-import de.ids_mannheim.korap.entity.AnnotationKey_;
-import de.ids_mannheim.korap.entity.AnnotationLayer;
-import de.ids_mannheim.korap.entity.AnnotationLayer_;
-import de.ids_mannheim.korap.entity.Annotation_;
-import de.ids_mannheim.korap.exceptions.KustvaktException;
-import de.ids_mannheim.korap.utils.ParameterChecker;
-
-/**
- * AnnotationDao manages SQL queries regarding annotations including
- * foundry and layer pairs.
- * 
- * @author margaretha
- *
- */
-@Repository
-@Transactional
-public class AnnotationDao {
-
-    @PersistenceContext
-    private EntityManager entityManager;
-
-    /**
-     * Retrieves all foundry-layer pairs.
-     * 
-     * @return a list of foundry-layer pairs.
-     */
-    @SuppressWarnings("unchecked")
-    public List<AnnotationLayer> getAllFoundryLayerPairs () {
-        CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder();
-        CriteriaQuery<AnnotationLayer> query =
-                criteriaBuilder.createQuery(AnnotationLayer.class);
-        Root<AnnotationLayer> layer = query.from(AnnotationLayer.class);
-        layer.fetch(AnnotationLayer_.foundry);
-        layer.fetch(AnnotationLayer_.layer);
-        query.select(layer);
-        Query q = entityManager.createQuery(query);
-        return q.getResultList();
-    }
-
-    /**
-     * Retrieves foundry-layer pairs and their values for the given
-     * foundry and layer. If layer is empty, retrieves data for all
-     * layer in the given foundry. If foundry is empty, retrieves data
-     * for all foundry and layer pairs.
-     * 
-     * @param foundry
-     *            a foundry code
-     * @param layer
-     *            a layer code
-     * @return a list of foundry-layer pairs.
-     */
-    @SuppressWarnings("unchecked")
-    public List<AnnotationLayer> getAnnotationDescriptions (String foundry,
-            String layer) {
-
-        CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder();
-        CriteriaQuery<Object> query = criteriaBuilder.createQuery();
-        Root<AnnotationLayer> annotationPair =
-                query.from(AnnotationLayer.class);
-        annotationPair.fetch(AnnotationLayer_.foundry);
-        annotationPair.fetch(AnnotationLayer_.layer);
-        annotationPair.fetch(AnnotationLayer_.keys);
-
-        // EM: Hibernate bug in join n:m (see AnnotationPair.values).
-        // There should not be any redundant AnnotationPair.
-        // The redundancy can be also avoided with
-        // fetch=FetchType.EAGER
-        // because Hibernate does 2 selects.
-        query.distinct(true);
-        query = query.select(annotationPair);
-
-        if (!foundry.isEmpty()) {
-            Predicate foundryPredicate = criteriaBuilder.equal(annotationPair
-                    .get(AnnotationLayer_.foundry).get(Annotation_.code),
-                    foundry);
-            if (layer.isEmpty() || layer.equals("*")) {
-                query.where(foundryPredicate);
-            }
-            else {
-                Predicate layerPredicate = criteriaBuilder.equal(annotationPair
-                        .get(AnnotationLayer_.layer).get(Annotation_.code),
-                        layer);
-                Predicate andPredicate =
-                        criteriaBuilder.and(foundryPredicate, layerPredicate);
-                query.where(andPredicate);
-            }
-        }
-
-        Query q = entityManager.createQuery(query);
-        return q.getResultList();
-    }
-
-    public Annotation retrieveAnnotation (String code, String type) {
-        CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder();
-        CriteriaQuery<Annotation> query =
-                criteriaBuilder.createQuery(Annotation.class);
-
-        Root<Annotation> annotation = query.from(Annotation.class);
-        Predicate predicates = criteriaBuilder.and(
-                criteriaBuilder.equal(annotation.get(Annotation_.code), code),
-                criteriaBuilder.equal(annotation.get(Annotation_.type), type));
-        query.select(annotation).where(predicates);
-        Query q = entityManager.createQuery(query);
-        try {
-            return (Annotation) q.getSingleResult();
-        }
-        catch (NoResultException e) {
-            return null;
-        }
-    }
-
-    public AnnotationLayer retrieveAnnotationLayer (String foundry,
-            String layer) {
-        Annotation ann1 = retrieveAnnotation(foundry, AnnotationType.FOUNDRY);
-        Annotation ann2 = retrieveAnnotation(layer, AnnotationType.LAYER);
-
-        CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder();
-        CriteriaQuery<AnnotationLayer> query =
-                criteriaBuilder.createQuery(AnnotationLayer.class);
-
-        Root<AnnotationLayer> annotation = query.from(AnnotationLayer.class);
-        Predicate predicates = criteriaBuilder.and(
-                criteriaBuilder.equal(annotation.get(AnnotationLayer_.foundry),
-                        ann1),
-                criteriaBuilder.equal(annotation.get(AnnotationLayer_.layer),
-                        ann2));
-        query.select(annotation).where(predicates);
-        Query q = entityManager.createQuery(query);
-        try {
-            return (AnnotationLayer) q.getSingleResult();
-        }
-        catch (NoResultException e) {
-            return null;
-        }
-
-    }
-
-    public Annotation createAnnotation (String code, String type, String text,
-            String description) {
-        Annotation ann = new Annotation(code, type, text, description);
-        entityManager.persist(ann);
-        return ann;
-    }
-
-    public AnnotationLayer createAnnotationLayer (Annotation foundry,
-            Annotation layer) throws KustvaktException {
-        ParameterChecker.checkObjectValue(foundry, "foundry");
-        ParameterChecker.checkObjectValue(layer, "layer");
-
-        AnnotationLayer annotationLayer = new AnnotationLayer();
-        annotationLayer.setFoundryId(foundry.getId());
-        annotationLayer.setLayerId(layer.getId());
-        annotationLayer.setDescription(
-                foundry.getDescription() + " " + layer.getDescription());
-        entityManager.persist(annotationLayer);
-        return annotationLayer;
-    }
-
-    public void updateAnnotationLayer (AnnotationLayer layer) {
-        entityManager.merge(layer);
-    }
-
-    public void updateAnnotationKey (AnnotationKey key) {
-        entityManager.merge(key);
-    }
-
-    public AnnotationKey createAnnotationKey (AnnotationLayer layer,
-            Annotation key) {
-        AnnotationKey annotation =
-                new AnnotationKey(layer.getId(), key.getId());
-        entityManager.persist(annotation);
-        return annotation;
-    }
-
-    public AnnotationKey retrieveAnnotationKey (AnnotationLayer layer,
-            Annotation key) {
-
-        CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder();
-        CriteriaQuery<AnnotationKey> query =
-                criteriaBuilder.createQuery(AnnotationKey.class);
-
-        Root<AnnotationKey> annotation = query.from(AnnotationKey.class);
-        Predicate predicates = criteriaBuilder.and(
-                criteriaBuilder.equal(annotation.get(AnnotationKey_.layer),
-                        layer),
-                criteriaBuilder.equal(annotation.get(AnnotationKey_.key), key));
-        query.select(annotation).where(predicates);
-        Query q = entityManager.createQuery(query);
-        try {
-            return (AnnotationKey) q.getSingleResult();
-        }
-        catch (NoResultException e) {
-            return null;
-        }
-    }
-}
diff --git a/full/src/main/java/de/ids_mannheim/korap/dao/DummyAdminDaoImpl.java b/full/src/main/java/de/ids_mannheim/korap/dao/DummyAdminDaoImpl.java
deleted file mode 100644
index 0d31885..0000000
--- a/full/src/main/java/de/ids_mannheim/korap/dao/DummyAdminDaoImpl.java
+++ /dev/null
@@ -1,18 +0,0 @@
-package de.ids_mannheim.korap.dao;
-
-import de.ids_mannheim.korap.user.User;
-
-public class DummyAdminDaoImpl implements AdminDao {
-
-    @Override
-    public void addAccount (User user) {
-        // TODO Auto-generated method stub
-
-    }
-
-    @Override
-    public boolean isAdmin (String userId) {
-        return false;
-    }
-
-}
diff --git a/full/src/main/java/de/ids_mannheim/korap/dao/ResourceDao.java b/full/src/main/java/de/ids_mannheim/korap/dao/ResourceDao.java
deleted file mode 100644
index d12ff3f..0000000
--- a/full/src/main/java/de/ids_mannheim/korap/dao/ResourceDao.java
+++ /dev/null
@@ -1,82 +0,0 @@
-package de.ids_mannheim.korap.dao;
-
-import java.util.List;
-import java.util.Set;
-
-import javax.persistence.EntityManager;
-import javax.persistence.NoResultException;
-import javax.persistence.PersistenceContext;
-import javax.persistence.Query;
-import javax.persistence.TypedQuery;
-import javax.persistence.criteria.CriteriaBuilder;
-import javax.persistence.criteria.CriteriaQuery;
-import javax.persistence.criteria.Root;
-
-import org.springframework.stereotype.Repository;
-import org.springframework.transaction.annotation.Transactional;
-
-import de.ids_mannheim.korap.entity.AnnotationLayer;
-import de.ids_mannheim.korap.entity.Resource;
-import de.ids_mannheim.korap.entity.Resource_;
-import de.ids_mannheim.korap.exceptions.KustvaktException;
-import de.ids_mannheim.korap.utils.ParameterChecker;
-
-/**
- * ResourceDao manages SQL queries regarding resource info and layers.
- * 
- * @author margaretha
- *
- */
-@Transactional
-@Repository
-public class ResourceDao {
-
-    @PersistenceContext
-    private EntityManager entityManager;
-
-    /**
-     * Select all from the resource table
-     * 
-     * @return a list of resources
-     */
-    public List<Resource> getAllResources () {
-        CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder();
-        CriteriaQuery<Resource> query =
-                criteriaBuilder.createQuery(Resource.class);
-        Root<Resource> resource = query.from(Resource.class);
-        query.select(resource);
-
-        TypedQuery<Resource> q = entityManager.createQuery(query);
-        return q.getResultList();
-    }
-
-    public Resource retrieveResource (String id) {
-        CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder();
-        CriteriaQuery<Resource> query =
-                criteriaBuilder.createQuery(Resource.class);
-        Root<Resource> resource = query.from(Resource.class);
-        query.select(resource);
-        query.where(criteriaBuilder.equal(resource.get(Resource_.id), id));
-
-        Query q = entityManager.createQuery(query);
-        try {
-            return (Resource) q.getSingleResult();
-        }
-        catch (NoResultException e) {
-            return null;
-        }
-    }
-
-    public void createResource (String id, String germanTitle,
-            String englishTitle, String englishDescription,
-            Set<AnnotationLayer> layers) throws KustvaktException {
-        ParameterChecker.checkStringValue(id, "id");
-        ParameterChecker.checkStringValue(englishTitle, "en_title");
-        ParameterChecker.checkStringValue(germanTitle, "de_title");
-
-        Resource r = new Resource(id, germanTitle, englishTitle,
-                englishDescription, layers);
-        entityManager.persist(r);
-
-    }
-}
diff --git a/full/src/main/java/de/ids_mannheim/korap/dto/FoundryDto.java b/full/src/main/java/de/ids_mannheim/korap/dto/FoundryDto.java
deleted file mode 100644
index 26cf383..0000000
--- a/full/src/main/java/de/ids_mannheim/korap/dto/FoundryDto.java
+++ /dev/null
@@ -1,62 +0,0 @@
-package de.ids_mannheim.korap.dto;
-
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
-import org.codehaus.jackson.map.annotate.JsonSerialize;
-import org.codehaus.jackson.map.annotate.JsonSerialize.Inclusion;
-
-import com.fasterxml.jackson.annotation.JsonInclude;
-import com.fasterxml.jackson.annotation.JsonInclude.Include;
-
-import lombok.Getter;
-import lombok.Setter;
-
-/**
- * Data transfer object for annotation descriptions (e.g. for
- * Kalamar).
- * 
- * @author margaretha
- * 
- */
-@Getter
-@Setter
-@JsonInclude(Include.NON_EMPTY) // new fasterxml annotation, not used by current jersey version
-@JsonSerialize(include=Inclusion.NON_EMPTY) // old codehouse annotation, used by jersey
-public class FoundryDto {
-
-    private String code;
-    private String description;
-    private List<Layer> layers;
-
-    @Getter
-    @Setter
-    @JsonInclude(Include.NON_EMPTY)
-    @JsonSerialize(include=Inclusion.NON_EMPTY) // old codehouse annotation used by jersey
-    public class Layer {
-        private String code;
-        private String description;
-        private Set<Key> keys;
-    }
-
-    @Getter
-    @Setter
-    @JsonInclude(Include.NON_EMPTY)
-    @JsonSerialize(include=Inclusion.NON_EMPTY) // old codehouse annotation used by jersey
-    public class Key implements Comparable<Key>{
-
-        private String code;
-        private String description;
-        private Map<String, String> values;
-
-        public Key (String code) {
-            this.code = code;
-        }
-        
-        @Override
-        public int compareTo (Key k) {
-            return this.code.compareTo(k.code); 
-        }
-    }
-}
diff --git a/full/src/main/java/de/ids_mannheim/korap/dto/LayerDto.java b/full/src/main/java/de/ids_mannheim/korap/dto/LayerDto.java
deleted file mode 100644
index b9884d8..0000000
--- a/full/src/main/java/de/ids_mannheim/korap/dto/LayerDto.java
+++ /dev/null
@@ -1,21 +0,0 @@
-package de.ids_mannheim.korap.dto;
-
-import lombok.Getter;
-import lombok.Setter;
-
-/**
- * Data transfer object for layer description (e.g. for KorapSRU).
- * 
- * @author margaretha
- *
- */
-@Getter
-@Setter
-public class LayerDto {
-
-    private int id;
-    private String code;
-    private String layer;
-    private String foundry;
-    private String description;
-}
diff --git a/full/src/main/java/de/ids_mannheim/korap/dto/converter/AnnotationConverter.java b/full/src/main/java/de/ids_mannheim/korap/dto/converter/AnnotationConverter.java
deleted file mode 100644
index efe1c43..0000000
--- a/full/src/main/java/de/ids_mannheim/korap/dto/converter/AnnotationConverter.java
+++ /dev/null
@@ -1,156 +0,0 @@
-package de.ids_mannheim.korap.dto.converter;
-
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-import java.util.TreeMap;
-import java.util.TreeSet;
-
-import org.springframework.stereotype.Component;
-
-import de.ids_mannheim.korap.dto.FoundryDto;
-import de.ids_mannheim.korap.dto.FoundryDto.Key;
-import de.ids_mannheim.korap.dto.FoundryDto.Layer;
-import de.ids_mannheim.korap.dto.LayerDto;
-import de.ids_mannheim.korap.entity.Annotation;
-import de.ids_mannheim.korap.entity.AnnotationKey;
-import de.ids_mannheim.korap.entity.AnnotationLayer;
-
-/**
- * AnnotationConverter prepares data transfer objects (DTOs) from
- * entities. The DTOs, for instance, are serialized into JSON in the
- * controller classes and then sent as the response entity.
- * 
- * @author margaretha
- *
- */
-@Component
-public class AnnotationConverter {
-
-    /**
-     * Returns layer descriptions in a list of {@link LayerDto}s.
-     * 
-     * @param pairs
-     *            a list of {@link AnnotationLayer}s
-     * @return a list of {@link LayerDto}s
-     */
-    public List<LayerDto> convertToLayerDto (List<AnnotationLayer> pairs) {
-        List<LayerDto> layerDtos = new ArrayList<LayerDto>(pairs.size());
-        LayerDto dto;
-        String foundry, layer;
-        for (AnnotationLayer p : pairs) {
-            dto = new LayerDto();
-            dto.setId(p.getId());
-            dto.setDescription(p.getDescription());
-
-            foundry = p.getFoundry().getCode();
-            dto.setFoundry(foundry);
-
-            layer = p.getLayer().getCode();
-            dto.setLayer(layer);
-            dto.setCode(foundry + "/" + layer);
-            layerDtos.add(dto);
-        }
-
-        return layerDtos;
-    }
-
-    /**
-     * Returns foundry description in {@link FoundryDto}s
-     * 
-     * @param pairs
-     *            a list of {@link AnnotationLayer}s
-     * @param language
-     * @return a list of {@link FoundryDto}s
-     */
-    public List<FoundryDto> convertToFoundryDto (List<AnnotationLayer> pairs,
-            String language) {
-        List<FoundryDto> foundryDtos = new ArrayList<FoundryDto>(pairs.size());
-        Map<String, List<AnnotationLayer>> foundryMap = createFoundryMap(pairs);
-
-        for (String foundryCode : foundryMap.keySet()) {
-            List<AnnotationLayer> foundries = foundryMap.get(foundryCode);
-            List<Layer> layers = new ArrayList<Layer>(foundries.size());
-            FoundryDto dto = null;
-
-            for (AnnotationLayer f : foundries) {
-                if (dto == null) {
-                    Annotation foundry = f.getFoundry();
-                    dto = new FoundryDto();
-                    if (language.equals("de")) {
-                        dto.setDescription(foundry.getGermanDescription());
-                    }
-                    else {
-                        dto.setDescription(foundry.getDescription());
-                    }
-                    dto.setCode(foundry.getCode());
-                }
-
-                Annotation layer = f.getLayer();
-                Set<Key> keys = new TreeSet<>();
-
-                for (AnnotationKey ak : f.getKeys()) {
-                    Annotation a = ak.getKey();
-                    Map<String, String> values = new TreeMap<>();
-                    
-                    Key key = dto.new Key(a.getCode());
-                    if (language.equals("de")) {
-                        key.setDescription(a.getGermanDescription());
-                        for (Annotation v : ak.getValues()) {
-                            values.put(v.getCode(), v.getGermanDescription());
-                        }
-
-                    }
-                    else {
-                        key.setDescription(a.getDescription());
-                        for (Annotation v : ak.getValues()) {
-                            values.put(v.getCode(), v.getDescription());
-                        }
-                    }
-                    key.setValues(values);
-                    keys.add(key);
-                }
-
-                Layer l = dto.new Layer();
-                l.setCode(layer.getCode());
-
-                if (language.equals("de")) {
-                    l.setDescription(layer.getGermanDescription());
-                }
-                else {
-                    l.setDescription(layer.getDescription());
-                }
-
-                l.setKeys(keys);
-                layers.add(l);
-            }
-
-            dto.setLayers(layers);
-            foundryDtos.add(dto);
-        }
-
-        return foundryDtos;
-    }
-
-    private Map<String, List<AnnotationLayer>> createFoundryMap (
-            List<AnnotationLayer> pairs) {
-        Map<String, List<AnnotationLayer>> foundries =
-                new HashMap<String, List<AnnotationLayer>>();
-        for (AnnotationLayer p : pairs) {
-            String foundryCode = p.getFoundry().getCode();
-            if (foundries.containsKey(foundryCode)) {
-                foundries.get(foundryCode).add(p);
-            }
-            else {
-                List<AnnotationLayer> foundryList =
-                        new ArrayList<AnnotationLayer>();
-                foundryList.add(p);
-                foundries.put(foundryCode, foundryList);
-            }
-        }
-
-        return foundries;
-    }
-}
diff --git a/full/src/main/java/de/ids_mannheim/korap/encryption/RandomCodeGenerator.java b/full/src/main/java/de/ids_mannheim/korap/encryption/RandomCodeGenerator.java
deleted file mode 100644
index ea451aa..0000000
--- a/full/src/main/java/de/ids_mannheim/korap/encryption/RandomCodeGenerator.java
+++ /dev/null
@@ -1,71 +0,0 @@
-package de.ids_mannheim.korap.encryption;
-
-import java.security.MessageDigest;
-import java.security.NoSuchAlgorithmException;
-import java.security.SecureRandom;
-import java.util.UUID;
-
-import javax.annotation.PostConstruct;
-
-import org.apache.commons.codec.binary.Base64;
-import org.apache.commons.lang.ArrayUtils;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Component;
-
-import de.ids_mannheim.korap.config.KustvaktConfiguration;
-import de.ids_mannheim.korap.exceptions.KustvaktException;
-import de.ids_mannheim.korap.exceptions.StatusCodes;
-
-/**
- * Generates a random string that can be used for tokens, client id,
- * client secret, etc.
- * 
- * @author margaretha
- *
- */
-@Component
-public class RandomCodeGenerator {
-
-    @Autowired
-    public KustvaktConfiguration config;
-
-    public static SecureRandom secureRandom;
-
-    @PostConstruct
-    public void init () throws NoSuchAlgorithmException {
-        secureRandom =
-                SecureRandom.getInstance(config.getSecureRandomAlgorithm());
-    }
-
-    public String createRandomCode (KustvaktConfiguration c)
-            throws KustvaktException, NoSuchAlgorithmException {
-        config = c;
-        init();
-        return createRandomCode();
-    }
-
-    public String createRandomCode () throws KustvaktException {
-        UUID randomUUID = UUID.randomUUID();
-        byte[] uuidBytes = randomUUID.toString().getBytes();
-        byte[] secureBytes = new byte[3];
-        secureRandom.nextBytes(secureBytes);
-
-        byte[] bytes = ArrayUtils.addAll(uuidBytes, secureBytes);
-
-        try {
-            MessageDigest md = MessageDigest
-                    .getInstance(config.getMessageDigestAlgorithm());
-            md.update(bytes);
-            byte[] digest = md.digest();
-            String code = Base64.encodeBase64URLSafeString(digest);
-            md.reset();
-            return code;
-        }
-        catch (NoSuchAlgorithmException e) {
-            throw new KustvaktException(StatusCodes.INVALID_ALGORITHM,
-                    config.getMessageDigestAlgorithm()
-                            + "is not a valid MessageDigest algorithm");
-        }
-    }
-
-}
diff --git a/full/src/main/java/de/ids_mannheim/korap/entity/Annotation.java b/full/src/main/java/de/ids_mannheim/korap/entity/Annotation.java
deleted file mode 100644
index 35ee11d..0000000
--- a/full/src/main/java/de/ids_mannheim/korap/entity/Annotation.java
+++ /dev/null
@@ -1,52 +0,0 @@
-package de.ids_mannheim.korap.entity;
-
-import javax.persistence.Column;
-import javax.persistence.Entity;
-import javax.persistence.GeneratedValue;
-import javax.persistence.GenerationType;
-import javax.persistence.Id;
-import javax.persistence.Table;
-
-import lombok.Getter;
-import lombok.Setter;
-
-/**
- * Describes annotation tags available in the system / used in
- * annotating corpus data.
- * 
- * @author margaretha
- *
- */
-@Setter
-@Getter
-@Entity
-@Table(name = "annotation")
-public class Annotation {
-
-    @Id
-    @GeneratedValue(strategy = GenerationType.IDENTITY)
-    private int id;
-    private String code;
-    private String type;
-    private String text;
-    private String description;
-    @Column(name = "de_description")
-    private String germanDescription;
-
-    public Annotation () {}
-
-    public Annotation (String code, String type, String text,
-                       String description) {
-        this.code = code;
-        this.type = type;
-        this.text = text;
-        this.description = description;
-    }
-
-    @Override
-    public String toString () {
-        return "id=" + id + ", code= " + code + ", type= " + type
-                + ", description=" + description + ", germanDescription="
-                + germanDescription;
-    }
-}
diff --git a/full/src/main/java/de/ids_mannheim/korap/entity/AnnotationKey.java b/full/src/main/java/de/ids_mannheim/korap/entity/AnnotationKey.java
deleted file mode 100644
index d65ffb2..0000000
--- a/full/src/main/java/de/ids_mannheim/korap/entity/AnnotationKey.java
+++ /dev/null
@@ -1,61 +0,0 @@
-package de.ids_mannheim.korap.entity;
-
-import java.util.Set;
-
-import javax.persistence.Column;
-import javax.persistence.Entity;
-import javax.persistence.FetchType;
-import javax.persistence.GeneratedValue;
-import javax.persistence.GenerationType;
-import javax.persistence.Id;
-import javax.persistence.JoinColumn;
-import javax.persistence.JoinTable;
-import javax.persistence.ManyToMany;
-import javax.persistence.ManyToOne;
-import javax.persistence.Table;
-import javax.persistence.UniqueConstraint;
-
-import lombok.Getter;
-import lombok.Setter;
-
-@Setter
-@Getter
-@Entity
-@Table(name = "annotation_key", uniqueConstraints = @UniqueConstraint(
-        columnNames = { "layer_id", "key_id" }))
-public class AnnotationKey {
-
-    @Id
-    @GeneratedValue(strategy = GenerationType.IDENTITY)
-    private int id;
-    @Column(name = "key_id")
-    private int keyId;
-    @Column(name = "layer_id")
-    private int layerId;
-
-    @ManyToOne(fetch = FetchType.EAGER)
-    @JoinColumn(name = "layer_id", insertable = false, updatable = false)
-    private AnnotationLayer layer;
-
-    @ManyToOne(fetch = FetchType.EAGER)
-    @JoinColumn(name = "key_id", insertable = false, updatable = false)
-    private Annotation key;
-
-    @ManyToMany(fetch = FetchType.EAGER)
-    @JoinTable(name = "annotation_value",
-            joinColumns = @JoinColumn(name = "key_id",
-                    referencedColumnName = "id"),
-            inverseJoinColumns = @JoinColumn(name = "value_id",
-                    referencedColumnName = "id"),
-            uniqueConstraints = @UniqueConstraint(
-                    columnNames = { "key_id", "value_id" }))
-    private Set<Annotation> values;
-
-    public AnnotationKey () {}
-
-    public AnnotationKey (int layerId, int keyId) {
-        this.layerId = layerId;
-        this.keyId = keyId;
-    }
-
-}
diff --git a/full/src/main/java/de/ids_mannheim/korap/entity/AnnotationLayer.java b/full/src/main/java/de/ids_mannheim/korap/entity/AnnotationLayer.java
deleted file mode 100644
index c16abec..0000000
--- a/full/src/main/java/de/ids_mannheim/korap/entity/AnnotationLayer.java
+++ /dev/null
@@ -1,68 +0,0 @@
-package de.ids_mannheim.korap.entity;
-
-import java.util.Set;
-
-import javax.persistence.CascadeType;
-import javax.persistence.Column;
-import javax.persistence.Entity;
-import javax.persistence.FetchType;
-import javax.persistence.GeneratedValue;
-import javax.persistence.GenerationType;
-import javax.persistence.Id;
-import javax.persistence.JoinColumn;
-import javax.persistence.ManyToOne;
-import javax.persistence.OneToMany;
-import javax.persistence.Table;
-import javax.persistence.UniqueConstraint;
-
-import org.hibernate.annotations.Fetch;
-import org.hibernate.annotations.FetchMode;
-
-import lombok.Getter;
-import lombok.Setter;
-
-/**
- * Describes annotations as a pair, e.g. foundry and layer where
- * foundry denotes where the annotation comes from e.g. Tree tagger
- * parser, and layer denotes the annotation layer e.g. part of speech.
- * 
- * @author margaretha
- * @see Annotation
- */
-@Setter
-@Getter
-@Entity
-@Table(name = "annotation_layer", uniqueConstraints = @UniqueConstraint(
-        columnNames = { "foundry_id", "layer_id" }))
-public class AnnotationLayer {
-    @Id
-    @GeneratedValue(strategy = GenerationType.IDENTITY)
-    private int id;
-    @Column(name = "foundry_id")
-    private int foundryId;
-    @Column(name = "layer_id")
-    private int layerId;
-    @Column(name = "description")
-    private String description;
-
-    @Fetch(FetchMode.SELECT)
-    @ManyToOne // (fetch=FetchType.LAZY)
-    @JoinColumn(name = "foundry_id", insertable = false, updatable = false)
-    private Annotation foundry;
-
-    @Fetch(FetchMode.SELECT)
-    @ManyToOne // (fetch=FetchType.LAZY)
-    @JoinColumn(name = "layer_id", insertable = false, updatable = false)
-    private Annotation layer;
-
-    @OneToMany(mappedBy = "layer", fetch = FetchType.EAGER,
-            cascade = CascadeType.REMOVE)
-    private Set<AnnotationKey> keys;
-
-    @Override
-    public String toString () {
-        return "id=" + id + ", foundry=" + foundry + ", layer=" + layer
-                + ", description=" + description + ", keys= " + keys;
-
-    }
-}
diff --git a/full/src/main/java/de/ids_mannheim/korap/entity/Resource.java b/full/src/main/java/de/ids_mannheim/korap/entity/Resource.java
deleted file mode 100644
index 813adc5..0000000
--- a/full/src/main/java/de/ids_mannheim/korap/entity/Resource.java
+++ /dev/null
@@ -1,69 +0,0 @@
-package de.ids_mannheim.korap.entity;
-
-import java.util.Set;
-
-import javax.persistence.Column;
-import javax.persistence.Entity;
-import javax.persistence.FetchType;
-import javax.persistence.Id;
-import javax.persistence.JoinColumn;
-import javax.persistence.JoinTable;
-import javax.persistence.ManyToMany;
-import javax.persistence.Table;
-
-import lombok.Getter;
-import lombok.Setter;
-
-/**
- * Describes resources having free licenses. Primarily for
- * accommodating
- * clients in providing data without login such as KorapSRU.
- * 
- * @author margaretha
- *
- */
-@Getter
-@Setter
-@Entity
-@Table(name = "resource")
-public class Resource {
-
-    @Id
-    private String id;
-
-    @Column(name = "de_title")
-    private String germanTitle;
-
-    @Column(name = "en_title")
-    private String englishTitle;
-
-    @Column(name = "en_description")
-    private String englishDescription;
-
-    @ManyToMany(fetch = FetchType.EAGER)
-    @JoinTable(name = "resource_layer",
-            joinColumns = @JoinColumn(name = "resource_id",
-                    referencedColumnName = "id"),
-            inverseJoinColumns = @JoinColumn(name = "layer_id",
-                    referencedColumnName = "id"))
-    private Set<AnnotationLayer> layers;
-
-    public Resource () {}
-
-    public Resource (String id, String germanTitle, String englishTitle,
-                     String englishDescription, Set<AnnotationLayer> layers) {
-        this.id = id;
-        this.germanTitle = germanTitle;
-        this.englishTitle = englishTitle;
-        this.englishDescription = englishDescription;
-        this.layers = layers;
-    }
-
-    @Override
-    public String toString () {
-        return "id=" + id + ", germanTitle=" + germanTitle + ", englishTitle="
-                + englishTitle + ", description=" + englishDescription
-                + ", layers= " + layers;
-    }
-
-}
diff --git a/full/src/main/java/de/ids_mannheim/korap/interfaces/AuthenticationIface.java b/full/src/main/java/de/ids_mannheim/korap/interfaces/AuthenticationIface.java
deleted file mode 100644
index 140ef6b..0000000
--- a/full/src/main/java/de/ids_mannheim/korap/interfaces/AuthenticationIface.java
+++ /dev/null
@@ -1,27 +0,0 @@
-package de.ids_mannheim.korap.interfaces;
-
-import java.util.Map;
-
-import de.ids_mannheim.korap.constant.TokenType;
-import de.ids_mannheim.korap.exceptions.KustvaktException;
-import de.ids_mannheim.korap.security.context.TokenContext;
-import de.ids_mannheim.korap.user.User;
-
-public interface AuthenticationIface {
-
-    public TokenContext getTokenContext(String authToken) throws KustvaktException;
-
-
-    public TokenContext createTokenContext(User user, Map<String, Object> attr)
-            throws KustvaktException;
-
-
-    void removeUserSession (String token) throws KustvaktException;
-
-
-    public TokenContext refresh (TokenContext context) throws KustvaktException;
-
-
-    public TokenType getTokenType ();
-
-}
diff --git a/full/src/main/java/de/ids_mannheim/korap/interfaces/EncryptionIface.java b/full/src/main/java/de/ids_mannheim/korap/interfaces/EncryptionIface.java
deleted file mode 100644
index 134ebdb..0000000
--- a/full/src/main/java/de/ids_mannheim/korap/interfaces/EncryptionIface.java
+++ /dev/null
@@ -1,76 +0,0 @@
-package de.ids_mannheim.korap.interfaces;
-
-import de.ids_mannheim.korap.exceptions.KustvaktException;
-import de.ids_mannheim.korap.user.User;
-
-import java.io.UnsupportedEncodingException;
-import java.security.NoSuchAlgorithmException;
-import java.util.Map;
-
-public interface EncryptionIface {
-
-    public enum Encryption {
-                @Deprecated
-        SIMPLE, ESAPICYPHER, BCRYPT
-    }
-
-
-    /**
-     * One-way hashing of String input. Used to canonicalize
-     * 
-     * @param input
-     * @param salt
-     * @return
-     */
-    public String secureHash (String input, String salt)
-            throws KustvaktException;
-
-
-    public String secureHash (String input) throws NoSuchAlgorithmException,
-            UnsupportedEncodingException, KustvaktException;
-
-
-    /**
-     * @param plain
-     * @param hash
-     * @param salt
-     * @return
-     */
-    public boolean checkHash (String plain, String hash, String salt);
-
-
-    public boolean checkHash (String plain, String hash);
-
-
-    /**
-     * create random String to be used as authentication token
-     * 
-     * @return
-     */
-    public String createToken (boolean hash, Object ... obj);
-
-
-    public String createToken ();
-
-
-    /**
-     * create a random Integer to be used as ID for databases
-     * 
-     * @return
-     */
-    public String createRandomNumber (Object ... obj);
-
-
-    public String encodeBase ();
-
-
-   // @Deprecated
-    //public Map<String, Object> validateMap (Map<String, Object> map)
-    //        throws KustvaktException;
-
-
-    //@Deprecated
-    //public String validateEntry (String input, String type)
-    //        throws KustvaktException;
-
-}
diff --git a/full/src/main/java/de/ids_mannheim/korap/interfaces/EntityHandlerIface.java b/full/src/main/java/de/ids_mannheim/korap/interfaces/EntityHandlerIface.java
deleted file mode 100644
index 9bcf614..0000000
--- a/full/src/main/java/de/ids_mannheim/korap/interfaces/EntityHandlerIface.java
+++ /dev/null
@@ -1,36 +0,0 @@
-package de.ids_mannheim.korap.interfaces;
-
-import de.ids_mannheim.korap.exceptions.EmptyResultException;
-import de.ids_mannheim.korap.exceptions.KustvaktException;
-import de.ids_mannheim.korap.user.User;
-
-/**
- * User: hanl
- * Date: 8/19/13
- * Time: 11:04 AM
- */
-public interface EntityHandlerIface {
-
-    User getAccount (String username) throws EmptyResultException,
-            KustvaktException;
-
-
-    int updateAccount (User user) throws KustvaktException;
-
-
-    int createAccount (User user) throws KustvaktException;
-
-
-    int deleteAccount (Integer userid) throws KustvaktException;
-
-
-    int truncate () throws KustvaktException;
-
-
-    int resetPassphrase (String username, String uriToken, String passphrase)
-            throws KustvaktException;
-
-
-    int activateAccount (String username, String uriToken)
-            throws KustvaktException;
-}
diff --git a/full/src/main/java/de/ids_mannheim/korap/oauth2/constant/OAuth2Scope.java b/full/src/main/java/de/ids_mannheim/korap/oauth2/constant/OAuth2Scope.java
deleted file mode 100644
index 0dc20d5..0000000
--- a/full/src/main/java/de/ids_mannheim/korap/oauth2/constant/OAuth2Scope.java
+++ /dev/null
@@ -1,44 +0,0 @@
-package de.ids_mannheim.korap.oauth2.constant;
-
-public enum OAuth2Scope {
-    
-    ALL, 
-    ADMIN,
-    
-    OPENID, 
-    AUTHORIZE,
-    
-    CLIENT_INFO,
-    REGISTER_CLIENT,
-    DEREGISTER_CLIENT,
-    RESET_CLIENT_SECRET,
-    
-    SEARCH, 
-    SERIALIZE_QUERY,
-    MATCH_INFO, 
-    
-    USER_GROUP_INFO, 
-    CREATE_USER_GROUP, 
-    DELETE_USER_GROUP, 
-    
-    DELETE_USER_GROUP_MEMBER, 
-    ADD_USER_GROUP_MEMBER, 
-    
-    EDIT_USER_GROUP_MEMBER_ROLE,
-    ADD_USER_GROUP_MEMBER_ROLE,
-    DELETE_USER_GROUP_MEMBER_ROLE, 
-           
-    CREATE_VC, 
-    VC_INFO,
-    EDIT_VC, 
-    DELETE_VC, 
-    
-    SHARE_VC, 
-    DELETE_VC_ACCESS, 
-    VC_ACCESS_INFO;
-
-    @Override
-    public String toString () {
-        return super.toString().toLowerCase();
-    }
-}
diff --git a/full/src/main/java/de/ids_mannheim/korap/oauth2/dao/AccessScopeDao.java b/full/src/main/java/de/ids_mannheim/korap/oauth2/dao/AccessScopeDao.java
index aa158a3..de0cfac 100644
--- a/full/src/main/java/de/ids_mannheim/korap/oauth2/dao/AccessScopeDao.java
+++ b/full/src/main/java/de/ids_mannheim/korap/oauth2/dao/AccessScopeDao.java
@@ -13,7 +13,8 @@
 import org.springframework.stereotype.Repository;
 import org.springframework.transaction.annotation.Transactional;
 
-import de.ids_mannheim.korap.oauth2.constant.OAuth2Scope;
+import de.ids_mannheim.korap.constant.OAuth2Scope;
+import de.ids_mannheim.korap.oauth2.entity.AccessScope;
 import de.ids_mannheim.korap.oauth2.entity.AccessScope;
 
 @Repository
diff --git a/full/src/main/java/de/ids_mannheim/korap/oauth2/entity/AccessScope.java b/full/src/main/java/de/ids_mannheim/korap/oauth2/entity/AccessScope.java
index 8fb2e0d..15d9da5 100644
--- a/full/src/main/java/de/ids_mannheim/korap/oauth2/entity/AccessScope.java
+++ b/full/src/main/java/de/ids_mannheim/korap/oauth2/entity/AccessScope.java
@@ -11,7 +11,7 @@
 import javax.persistence.ManyToMany;
 import javax.persistence.Table;
 
-import de.ids_mannheim.korap.oauth2.constant.OAuth2Scope;
+import de.ids_mannheim.korap.constant.OAuth2Scope;
 import lombok.Getter;
 import lombok.Setter;
 
diff --git a/full/src/main/java/de/ids_mannheim/korap/oauth2/oltu/service/OltuTokenService.java b/full/src/main/java/de/ids_mannheim/korap/oauth2/oltu/service/OltuTokenService.java
index 591e41d..e73421b 100644
--- a/full/src/main/java/de/ids_mannheim/korap/oauth2/oltu/service/OltuTokenService.java
+++ b/full/src/main/java/de/ids_mannheim/korap/oauth2/oltu/service/OltuTokenService.java
@@ -25,6 +25,7 @@
 import de.ids_mannheim.korap.oauth2.dao.AccessTokenDao;
 import de.ids_mannheim.korap.oauth2.dao.RefreshTokenDao;
 import de.ids_mannheim.korap.oauth2.entity.AccessScope;
+import de.ids_mannheim.korap.oauth2.entity.AccessScope;
 import de.ids_mannheim.korap.oauth2.entity.AccessToken;
 import de.ids_mannheim.korap.oauth2.entity.Authorization;
 import de.ids_mannheim.korap.oauth2.entity.OAuth2Client;
diff --git a/full/src/main/java/de/ids_mannheim/korap/oauth2/service/DummyOAuth2ScopeServiceImpl.java b/full/src/main/java/de/ids_mannheim/korap/oauth2/service/DummyOAuth2ScopeServiceImpl.java
deleted file mode 100644
index 4cafce0..0000000
--- a/full/src/main/java/de/ids_mannheim/korap/oauth2/service/DummyOAuth2ScopeServiceImpl.java
+++ /dev/null
@@ -1,54 +0,0 @@
-package de.ids_mannheim.korap.oauth2.service;
-
-import java.util.Collection;
-import java.util.Set;
-
-import de.ids_mannheim.korap.exceptions.KustvaktException;
-import de.ids_mannheim.korap.oauth2.constant.OAuth2Scope;
-import de.ids_mannheim.korap.oauth2.entity.AccessScope;
-import de.ids_mannheim.korap.security.context.TokenContext;
-
-public class DummyOAuth2ScopeServiceImpl implements OAuth2ScopeService {
-
-    @Override
-    public Set<AccessScope> convertToAccessScope (Collection<String> scopes)
-            throws KustvaktException {
-        // TODO Auto-generated method stub
-        return null;
-    }
-
-    @Override
-    public String convertAccessScopesToString (Set<AccessScope> scopes) {
-        // TODO Auto-generated method stub
-        return null;
-    }
-
-    @Override
-    public Set<String> convertAccessScopesToStringSet (
-            Set<AccessScope> scopes) {
-        // TODO Auto-generated method stub
-        return null;
-    }
-
-    @Override
-    public Set<String> filterScopes (Set<String> scopes,
-            Set<String> defaultScopes) {
-        // TODO Auto-generated method stub
-        return null;
-    }
-
-    @Override
-    public void verifyScope (TokenContext context, OAuth2Scope requiredScope)
-            throws KustvaktException {
-        // TODO Auto-generated method stub
-
-    }
-
-    @Override
-    public Set<AccessScope> verifyRefreshScope (Set<String> requestScopes,
-            Set<AccessScope> originalScopes) throws KustvaktException {
-        // TODO Auto-generated method stub
-        return null;
-    }
-
-}
diff --git a/full/src/main/java/de/ids_mannheim/korap/oauth2/service/OAuth2AuthorizationService.java b/full/src/main/java/de/ids_mannheim/korap/oauth2/service/OAuth2AuthorizationService.java
index 37e89ef..227cf0e 100644
--- a/full/src/main/java/de/ids_mannheim/korap/oauth2/service/OAuth2AuthorizationService.java
+++ b/full/src/main/java/de/ids_mannheim/korap/oauth2/service/OAuth2AuthorizationService.java
@@ -28,7 +28,7 @@
     @Autowired
     protected OAuth2ClientService clientService;
     @Autowired
-    protected OAuth2ScopeService scopeService;
+    protected OAuth2ScopeServiceImpl scopeService;
     @Autowired
     private AuthorizationDao authorizationDao;
 
diff --git a/full/src/main/java/de/ids_mannheim/korap/oauth2/service/OAuth2ScopeService.java b/full/src/main/java/de/ids_mannheim/korap/oauth2/service/OAuth2ScopeService.java
deleted file mode 100644
index 46d21eb..0000000
--- a/full/src/main/java/de/ids_mannheim/korap/oauth2/service/OAuth2ScopeService.java
+++ /dev/null
@@ -1,55 +0,0 @@
-package de.ids_mannheim.korap.oauth2.service;
-
-import java.util.Collection;
-import java.util.Set;
-
-import de.ids_mannheim.korap.exceptions.KustvaktException;
-import de.ids_mannheim.korap.oauth2.constant.OAuth2Scope;
-import de.ids_mannheim.korap.oauth2.entity.AccessScope;
-import de.ids_mannheim.korap.security.context.TokenContext;
-
-public interface OAuth2ScopeService {
-
-    /**
-     * Converts a set of scope strings to a set of {@link AccessScope}
-     * 
-     * @param scopes
-     * @return
-     * @throws KustvaktException
-     */
-    Set<AccessScope> convertToAccessScope (Collection<String> scopes)
-            throws KustvaktException;
-
-    String convertAccessScopesToString (Set<AccessScope> scopes);
-
-    Set<String> convertAccessScopesToStringSet (Set<AccessScope> scopes);
-
-    /**
-     * Simple reduction of requested scopes, i.e. excluding any scopes
-     * that are not default scopes for a specific authorization grant.
-     * 
-     * @param scopes
-     * @param defaultScopes
-     * @return accepted scopes
-     */
-    Set<String> filterScopes (Set<String> scopes, Set<String> defaultScopes);
-
-    void verifyScope (TokenContext context, OAuth2Scope requiredScope)
-            throws KustvaktException;
-
-    /**
-     * Verify scopes given in a refresh request. The scopes must not
-     * include other scopes than those authorized in the original
-     * access token issued together with the refresh token.
-     * 
-     * @param requestScopes
-     *            requested scopes
-     * @param originalScopes
-     *            authorized scopes
-     * @return a set of requested {@link AccessScope}
-     * @throws KustvaktException
-     */
-    Set<AccessScope> verifyRefreshScope (Set<String> requestScopes,
-            Set<AccessScope> originalScopes) throws KustvaktException;
-
-}
\ No newline at end of file
diff --git a/full/src/main/java/de/ids_mannheim/korap/oauth2/service/OAuth2ScopeServiceImpl.java b/full/src/main/java/de/ids_mannheim/korap/oauth2/service/OAuth2ScopeServiceImpl.java
index 387bf6d..7632032 100644
--- a/full/src/main/java/de/ids_mannheim/korap/oauth2/service/OAuth2ScopeServiceImpl.java
+++ b/full/src/main/java/de/ids_mannheim/korap/oauth2/service/OAuth2ScopeServiceImpl.java
@@ -11,14 +11,15 @@
 import org.springframework.beans.factory.annotation.Autowired;
 
 import de.ids_mannheim.korap.config.Attributes;
+import de.ids_mannheim.korap.constant.OAuth2Scope;
 import de.ids_mannheim.korap.constant.TokenType;
 import de.ids_mannheim.korap.dao.AdminDao;
 import de.ids_mannheim.korap.exceptions.KustvaktException;
 import de.ids_mannheim.korap.exceptions.StatusCodes;
 import de.ids_mannheim.korap.oauth2.constant.OAuth2Error;
-import de.ids_mannheim.korap.oauth2.constant.OAuth2Scope;
 import de.ids_mannheim.korap.oauth2.dao.AccessScopeDao;
 import de.ids_mannheim.korap.oauth2.entity.AccessScope;
+import de.ids_mannheim.korap.oauth2.entity.AccessScope;
 import de.ids_mannheim.korap.security.context.TokenContext;
 
 public class OAuth2ScopeServiceImpl implements OAuth2ScopeService {
@@ -29,10 +30,13 @@
     @Autowired
     private AdminDao adminDao;
 
-    /* (non-Javadoc)
-     * @see de.ids_mannheim.korap.oauth2.service.OAuth2ScopeService#convertToAccessScope(java.util.Collection)
+    /**
+     * Converts a set of scope strings to a set of {@link AccessScope}
+     * 
+     * @param scopes
+     * @return
+     * @throws KustvaktException
      */
-    @Override
     public Set<AccessScope> convertToAccessScope (Collection<String> scopes)
             throws KustvaktException {
 
@@ -64,19 +68,11 @@
         return requestedScopes;
     }
 
-    /* (non-Javadoc)
-     * @see de.ids_mannheim.korap.oauth2.service.OAuth2ScopeService#convertAccessScopesToString(java.util.Set)
-     */
-    @Override
     public String convertAccessScopesToString (Set<AccessScope> scopes) {
         Set<String> set = convertAccessScopesToStringSet(scopes);
         return String.join(" ", set);
     }
 
-    /* (non-Javadoc)
-     * @see de.ids_mannheim.korap.oauth2.service.OAuth2ScopeService#convertAccessScopesToStringSet(java.util.Set)
-     */
-    @Override
     public Set<String> convertAccessScopesToStringSet (
             Set<AccessScope> scopes) {
         Set<String> set = scopes.stream().map(scope -> scope.toString())
@@ -84,10 +80,14 @@
         return set;
     }
 
-    /* (non-Javadoc)
-     * @see de.ids_mannheim.korap.oauth2.service.OAuth2ScopeService#filterScopes(java.util.Set, java.util.Set)
+    /**
+     * Simple reduction of requested scopes, i.e. excluding any scopes
+     * that are not default scopes for a specific authorization grant.
+     * 
+     * @param scopes
+     * @param defaultScopes
+     * @return accepted scopes
      */
-    @Override
     public Set<String> filterScopes (Set<String> scopes,
             Set<String> defaultScopes) {
         Stream<String> stream = scopes.stream();
@@ -115,10 +115,18 @@
         }
     }
 
-    /* (non-Javadoc)
-     * @see de.ids_mannheim.korap.oauth2.service.OAuth2ScopeService#verifyRefreshScope(java.util.Set, java.util.Set)
+    /**
+     * Verify scopes given in a refresh request. The scopes must not
+     * include other scopes than those authorized in the original
+     * access token issued together with the refresh token.
+     * 
+     * @param requestScopes
+     *            requested scopes
+     * @param originalScopes
+     *            authorized scopes
+     * @return a set of requested {@link AccessScope}
+     * @throws KustvaktException
      */
-    @Override
     public Set<AccessScope> verifyRefreshScope (Set<String> requestScopes,
             Set<AccessScope> originalScopes) throws KustvaktException {
         Set<AccessScope> requestedScopes = convertToAccessScope(requestScopes);
diff --git a/full/src/main/java/de/ids_mannheim/korap/oauth2/service/OAuth2TokenService.java b/full/src/main/java/de/ids_mannheim/korap/oauth2/service/OAuth2TokenService.java
index c18e96f..9647748 100644
--- a/full/src/main/java/de/ids_mannheim/korap/oauth2/service/OAuth2TokenService.java
+++ b/full/src/main/java/de/ids_mannheim/korap/oauth2/service/OAuth2TokenService.java
@@ -35,7 +35,7 @@
     private OAuth2AuthorizationService authorizationService;
 
     @Autowired
-    protected OAuth2ScopeService scopeService;
+    protected OAuth2ScopeServiceImpl scopeService;
 
     @Autowired
     protected FullConfiguration config;
diff --git a/full/src/main/java/de/ids_mannheim/korap/security/context/KustvaktContext.java b/full/src/main/java/de/ids_mannheim/korap/security/context/KustvaktContext.java
deleted file mode 100644
index 6d36199..0000000
--- a/full/src/main/java/de/ids_mannheim/korap/security/context/KustvaktContext.java
+++ /dev/null
@@ -1,46 +0,0 @@
-package de.ids_mannheim.korap.security.context;
-
-import javax.ws.rs.core.SecurityContext;
-
-import java.security.Principal;
-
-/**
- * @author hanl
- * @date 13/05/2014
- * 
- *       wrapper for REST security context
- * 
- */
-public class KustvaktContext implements SecurityContext {
-
-    private TokenContext user;
-
-
-    public KustvaktContext (final TokenContext user) {
-        this.user = user;
-    }
-
-
-    @Override
-    public Principal getUserPrincipal () {
-        return this.user;
-    }
-
-
-    @Override
-    public boolean isUserInRole (String role) {
-        throw new UnsupportedOperationException();
-    }
-
-
-    @Override
-    public boolean isSecure () {
-        return false;
-    }
-
-
-    @Override
-    public String getAuthenticationScheme () {
-        return SecurityContext.BASIC_AUTH;
-    }
-}
diff --git a/full/src/main/java/de/ids_mannheim/korap/security/context/TokenContext.java b/full/src/main/java/de/ids_mannheim/korap/security/context/TokenContext.java
deleted file mode 100644
index b31c643..0000000
--- a/full/src/main/java/de/ids_mannheim/korap/security/context/TokenContext.java
+++ /dev/null
@@ -1,173 +0,0 @@
-package de.ids_mannheim.korap.security.context;
-
-import java.io.Serializable;
-import java.time.ZonedDateTime;
-import java.util.Date;
-import java.util.HashMap;
-import java.util.Map;
-
-import com.fasterxml.jackson.databind.JsonNode;
-
-import de.ids_mannheim.korap.config.Attributes;
-import de.ids_mannheim.korap.constant.TokenType;
-import de.ids_mannheim.korap.exceptions.KustvaktException;
-import de.ids_mannheim.korap.user.User;
-import de.ids_mannheim.korap.utils.JsonUtils;
-import de.ids_mannheim.korap.utils.TimeUtils;
-import lombok.AccessLevel;
-import lombok.Data;
-import lombok.Getter;
-import lombok.Setter;
-
-/**
- * EM: 
- * - change datatype of tokenType from string to enum
- * - added authenticationTime
- * 
- * @author hanl
- * @date 27/01/2014
- */
-@Data
-public class TokenContext implements java.security.Principal, Serializable {
-
-    private ZonedDateTime authenticationTime;
-    /**
-     * session relevant data. Are never persisted into a database
-     */
-    private String username;
-    private long expirationTime;
-    // either "session_token " / "api_token
-    private TokenType tokenType;
-    private String token;
-    private boolean secureRequired;
-
-//    @Getter(AccessLevel.PRIVATE)
-    @Setter(AccessLevel.PRIVATE)
-    private Map<String, Object> parameters;
-    private String hostAddress;
-    private String userAgent;
-
-
-    public TokenContext () {
-        this.parameters = new HashMap<>();
-        this.setUsername("");
-        this.setToken("");
-        this.setSecureRequired(false);
-        this.setExpirationTime(-1);
-    }
-
-
-    private Map statusMap () {
-        Map m = new HashMap();
-        if (username != null && !username.isEmpty())
-            m.put(Attributes.USERNAME, username);
-        m.put(Attributes.TOKEN_EXPIRATION,
-                TimeUtils.format(this.expirationTime));
-        m.put(Attributes.TOKEN, this.token);
-        m.put(Attributes.TOKEN_TYPE, this.tokenType);
-        return m;
-    }
-
-
-    public Map<String, Object> params () {
-        return new HashMap<>(parameters);
-    }
-    
-    public boolean match (TokenContext other) {
-        if (other.getToken().equals(this.token))
-            if (this.getHostAddress().equals(this.hostAddress))
-                // user agent should be irrelvant -- what about os
-                // system version?
-                // if (other.getUserAgent().equals(this.userAgent))
-                return true;
-        return false;
-    }
-
-
-    public void addContextParameter (String key, String value) {
-        this.parameters.put(key, value);
-    }
-
-
-    public void addParams (Map<String, Object> map) {
-        for (Map.Entry<String, Object> e : map.entrySet())
-            this.parameters.put(e.getKey(), String.valueOf(e.getValue()));
-    }
-
-
-    public void removeContextParameter (String key) {
-        this.parameters.remove(key);
-    }
-
-
-    public void setExpirationTime (long date) {
-        this.expirationTime = date;
-    }
-
-
-    // todo: complete
-    public static TokenContext fromJSON (String s) throws KustvaktException {
-        JsonNode node = JsonUtils.readTree(s);
-        TokenContext c = new TokenContext();
-        if (node != null) {
-            c.setUsername(node.path(Attributes.USERNAME).asText());
-            c.setToken(node.path(Attributes.TOKEN).asText());
-        }
-        return c;
-    }
-
-
-    public static TokenContext fromOAuth2 (String s) throws KustvaktException {
-        JsonNode node = JsonUtils.readTree(s);
-        TokenContext c = new TokenContext();
-        if (node != null) {
-            c.setToken(node.path("token").asText());
-            c.setTokenType(TokenType.valueOf(node.path("token_type").asText()));
-            c.setExpirationTime(node.path("expires_in").asLong());
-            c.addContextParameter("refresh_token",
-                    node.path("refresh_token").asText());
-
-        }
-        return c;
-    }
-
-
-    public boolean isValid () {
-        return (this.username != null && !this.username.isEmpty())
-                && (this.token != null && !this.token.isEmpty())
-                && (this.tokenType != null);
-    }
-
-
-    public String getToken () {
-        return token;
-    }
-
-
-    public String toJson () throws KustvaktException {
-        return JsonUtils.toJSON(this.statusMap());
-    }
-
-
-    public boolean isDemo () {
-        return User.UserFactory.isDemo(this.username);
-    }
-
-
-
-    @Override
-    public String getName () {
-        return this.getUsername();
-    }
-
-
-    public ZonedDateTime getAuthenticationTime () {
-        return authenticationTime;
-    }
-
-
-    public void setAuthenticationTime (ZonedDateTime authTime) {
-        this.authenticationTime = authTime;
-    }
-
-}
diff --git a/full/src/main/java/de/ids_mannheim/korap/server/KustvaktBaseServer.java b/full/src/main/java/de/ids_mannheim/korap/server/KustvaktBaseServer.java
deleted file mode 100644
index 2af1912..0000000
--- a/full/src/main/java/de/ids_mannheim/korap/server/KustvaktBaseServer.java
+++ /dev/null
@@ -1,139 +0,0 @@
-package de.ids_mannheim.korap.server;
-
-import java.io.File;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.io.OutputStreamWriter;
-import java.nio.charset.StandardCharsets;
-import java.security.NoSuchAlgorithmException;
-
-import javax.servlet.ServletContextListener;
-
-import org.eclipse.jetty.server.Connector;
-import org.eclipse.jetty.server.Server;
-import org.eclipse.jetty.server.ServerConnector;
-import org.eclipse.jetty.server.handler.HandlerList;
-import org.eclipse.jetty.server.handler.ShutdownHandler;
-import org.eclipse.jetty.servlet.ServletContextHandler;
-import org.eclipse.jetty.servlet.ServletHolder;
-import org.springframework.web.context.ContextLoaderListener;
-
-import com.sun.jersey.spi.spring.container.servlet.SpringServlet;
-
-import de.ids_mannheim.korap.config.KustvaktConfiguration;
-import de.ids_mannheim.korap.encryption.RandomCodeGenerator;
-import de.ids_mannheim.korap.exceptions.KustvaktException;
-import lombok.Getter;
-import lombok.Setter;
-
-/**
- * @author hanl
- * @date 01/06/2015
- */
-public abstract class KustvaktBaseServer {
-
-    protected static KustvaktConfiguration config;
-
-    protected static String rootPackages;
-    protected static KustvaktArgs kargs;
-
-    public KustvaktBaseServer () {}
-
-    protected KustvaktArgs readAttributes (String[] args) {
-        KustvaktArgs kargs = new KustvaktArgs();
-        for (int i = 0; i < args.length; i++) {
-            switch ((args[i])) {
-                case "--spring-config":
-                    kargs.setSpringConfig(args[i + 1]);
-                    break;
-                case "--port":
-                    kargs.setPort(Integer.valueOf(args[i + 1]));
-                    break;
-                case "--help":
-                    StringBuffer b = new StringBuffer();
-
-                    b.append("Parameter description: \n")
-                            .append("--spring-config  <Spring XML configuration filename in classpath>\n")
-                            .append("--port  <Server port number>\n")
-                            .append("--help : This help menu\n");
-                    System.out.println(b.toString());
-                    System.out.println();
-                    return (KustvaktArgs) null;
-            }
-        }
-        return kargs;
-    }
-
-    protected void start ()
-            throws KustvaktException, IOException, NoSuchAlgorithmException {
-
-        if (kargs.port == -1) {
-            kargs.setPort(config.getPort());
-        }
-
-        Server server = new Server();
-
-        ServletContextHandler contextHandler =
-                new ServletContextHandler(ServletContextHandler.NO_SESSIONS);
-        contextHandler.setContextPath("/");
-        contextHandler.setInitParameter("contextConfigLocation",
-                "classpath:" + kargs.getSpringConfig());
-
-        ServletContextListener listener = new ContextLoaderListener();
-        contextHandler.addEventListener(listener);
-
-        ServletHolder servletHolder = new ServletHolder(new SpringServlet());
-        servletHolder.setInitParameter(
-                "com.sun.jersey.config.property.packages", rootPackages);
-        servletHolder.setInitParameter(
-                "com.sun.jersey.api.json.POJOMappingFeature", "true");
-        servletHolder.setInitOrder(1);
-        contextHandler.addServlet(servletHolder, config.getBaseURL());
-
-        ServerConnector connector = new ServerConnector(server);
-        connector.setPort(kargs.port);
-        connector.setIdleTimeout(60000);
-
-        RandomCodeGenerator random = new RandomCodeGenerator();
-        String shutdownToken = random.createRandomCode(config);
-        ShutdownHandler shutdownHandler = new ShutdownHandler(shutdownToken,true,true);
-
-        FileOutputStream fos = new FileOutputStream(new File("shutdownToken"));
-        OutputStreamWriter writer =
-                new OutputStreamWriter(fos, StandardCharsets.UTF_8.name());
-        writer.write(shutdownToken);
-        writer.flush();
-        writer.close();
-
-        HandlerList handlers = new HandlerList();
-        handlers.addHandler(shutdownHandler);
-        handlers.addHandler(contextHandler);
-
-        server.setHandler(handlers);
-
-        server.setConnectors(new Connector[] { connector });
-        try {
-            server.start();
-            server.join();
-        }
-        catch (Exception e) {
-            System.out.println("Server could not be started!");
-            System.out.println(e.getMessage());
-            e.printStackTrace();
-            System.exit(-1);
-        }
-    }
-
-    @Setter
-    public static class KustvaktArgs {
-
-        @Getter
-        private String springConfig;
-        private int port;
-
-        public KustvaktArgs () {
-            this.port = -1;
-            this.springConfig = null;
-        }
-    }
-}
diff --git a/full/src/main/java/de/ids_mannheim/korap/service/AnnotationService.java b/full/src/main/java/de/ids_mannheim/korap/service/AnnotationService.java
deleted file mode 100644
index 3e384ec..0000000
--- a/full/src/main/java/de/ids_mannheim/korap/service/AnnotationService.java
+++ /dev/null
@@ -1,88 +0,0 @@
-package de.ids_mannheim.korap.service;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.apache.logging.log4j.LogManager;
-import org.apache.logging.log4j.Logger;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Service;
-
-import de.ids_mannheim.korap.dao.AnnotationDao;
-import de.ids_mannheim.korap.dto.FoundryDto;
-import de.ids_mannheim.korap.dto.LayerDto;
-import de.ids_mannheim.korap.dto.converter.AnnotationConverter;
-import de.ids_mannheim.korap.entity.AnnotationLayer;
-import de.ids_mannheim.korap.exceptions.KustvaktException;
-import de.ids_mannheim.korap.exceptions.StatusCodes;
-import de.ids_mannheim.korap.web.controller.AnnotationController;
-
-/** AnnotationService defines the logic behind {@link AnnotationController}.
- * 
- * @author margaretha
- *
- */
-@Service
-public class AnnotationService {
-
-    private static Logger jlog =
-            LogManager.getLogger(AnnotationService.class);
-
-    @Autowired
-    private AnnotationDao annotationDao;
-
-    @Autowired
-    private AnnotationConverter annotationConverter;
-
-    public List<LayerDto> getLayerDtos () {
-        List<AnnotationLayer> layers = annotationDao.getAllFoundryLayerPairs();
-        jlog.debug("/layers " + layers.toString());
-        List<LayerDto> layerDto = annotationConverter.convertToLayerDto(layers);
-        return layerDto;
-    }
-
-    public List<FoundryDto> getFoundryDtos (List<String> codes, String language)
-            throws KustvaktException {
-        List<AnnotationLayer> annotationPairs = null;
-        String foundry = "", layer = "";
-        if (codes.contains("*")) {
-            annotationPairs =
-                    annotationDao.getAnnotationDescriptions(foundry, layer);
-        }
-        else {
-            String[] annotationCode;
-            annotationPairs = new ArrayList<AnnotationLayer>();
-            for (String code : codes) {
-                jlog.debug("code " + code);
-                annotationCode = code.split("/");
-                if (annotationCode.length == 1) {
-                    foundry = annotationCode[0];
-                }
-                else if (annotationCode.length == 2) {
-                    foundry = annotationCode[0];
-                    layer = annotationCode[1];
-                }
-                else {
-                    jlog.error("Annotation code is wrong: " + annotationCode);
-                    throw new KustvaktException(StatusCodes.INVALID_ATTRIBUTE,
-                            "Bad attribute:", code);
-                }
-
-                annotationPairs.addAll(annotationDao
-                        .getAnnotationDescriptions(foundry, layer));
-            }
-        }
-
-        if (annotationPairs != null && !annotationPairs.isEmpty()) {
-            List<FoundryDto> foundryDtos = annotationConverter
-                    .convertToFoundryDto(annotationPairs, language);
-            jlog.debug("/description " + annotationPairs.toString());
-            return foundryDtos;
-        }
-        else {
-            throw new KustvaktException(StatusCodes.NO_RESULT_FOUND,
-                    "No result found.", "");
-        }
-
-    }
-}
diff --git a/full/src/main/java/de/ids_mannheim/korap/service/SearchService.java b/full/src/main/java/de/ids_mannheim/korap/service/SearchService.java
deleted file mode 100644
index 6e7c17e..0000000
--- a/full/src/main/java/de/ids_mannheim/korap/service/SearchService.java
+++ /dev/null
@@ -1,243 +0,0 @@
-package de.ids_mannheim.korap.service;
-
-import java.util.ArrayList;
-import java.util.Set;
-import java.util.regex.Pattern;
-
-import javax.annotation.PostConstruct;
-import javax.ws.rs.core.HttpHeaders;
-import javax.ws.rs.core.MultivaluedMap;
-import javax.ws.rs.core.UriBuilder;
-
-import org.apache.logging.log4j.LogManager;
-import org.apache.logging.log4j.Logger;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Service;
-
-import com.sun.jersey.core.util.MultivaluedMapImpl;
-
-import de.ids_mannheim.korap.authentication.AuthenticationManager;
-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.query.serialize.MetaQueryBuilder;
-import de.ids_mannheim.korap.query.serialize.QuerySerializer;
-import de.ids_mannheim.korap.resource.rewrite.RewriteHandler;
-import de.ids_mannheim.korap.user.User;
-import de.ids_mannheim.korap.user.User.CorpusAccess;
-import de.ids_mannheim.korap.web.ClientsHandler;
-import de.ids_mannheim.korap.web.SearchKrill;
-
-@Service
-public class SearchService {
-
-    private static Logger jlog = LogManager.getLogger(SearchService.class);
-
-    @Autowired
-    private KustvaktConfiguration config;
-
-    @Autowired
-    private AuthenticationManager authenticationManager;
-
-    @Autowired
-    private RewriteHandler rewriteHandler;
-
-    @Autowired
-    private SearchKrill searchKrill;
-
-    private ClientsHandler graphDBhandler;
-
-    @PostConstruct
-    private void doPostConstruct () {
-        this.rewriteHandler.defaultRewriteConstraints();
-
-        UriBuilder builder = UriBuilder.fromUri("http://10.0.10.13").port(9997);
-        this.graphDBhandler = new ClientsHandler(builder.build());
-    }
-
-    @SuppressWarnings("unchecked")
-    public String serializeQuery (String q, String ql, String v, String cq,
-            Integer pageIndex, Integer startPage, Integer pageLength,
-            String context, Boolean cutoff) throws KustvaktException {
-        QuerySerializer ss = new QuerySerializer().setQuery(q, ql, v);
-        if (cq != null) ss.setCollection(cq);
-
-        MetaQueryBuilder meta = new MetaQueryBuilder();
-        if (pageIndex != null) meta.addEntry("startIndex", pageIndex);
-        if (pageIndex == null && startPage != null)
-            meta.addEntry("startPage", startPage);
-        if (pageLength != null) meta.addEntry("count", pageLength);
-        if (context != null) meta.setSpanContext(context);
-        meta.addEntry("cutOff", cutoff);
-
-        ss.setMeta(meta.raw());
-        // return ss.toJSON();
-
-        String query = ss.toJSON();
-        query = rewriteHandler.processQuery(ss.toJSON(), null);
-        return query;
-    }
-
-    private User createUser (String username, HttpHeaders headers)
-            throws KustvaktException {
-        User user = authenticationManager.getUser(username);
-        authenticationManager.setAccessAndLocation(user, headers);
-        if (user != null) {
-            jlog.debug(
-                    "Debug: /getMatchInfo/: location=" + user.locationtoString()
-                            + ", access=" + user.accesstoString());
-        }
-        return user;
-    }
-
-    public String search (String jsonld) {
-        // MH: todo: should be possible to add the meta part to
-        // the query serialization
-        // User user = controller.getUser(ctx.getUsername());
-        // jsonld = this.processor.processQuery(jsonld, user);
-        return searchKrill.search(jsonld);
-    }
-
-    @SuppressWarnings("unchecked")
-    public String search (String engine, String username, HttpHeaders headers,
-            String q, String ql, String v, String cq, Set<String> fields,
-            Integer pageIndex, Integer pageInteger, String ctx,
-            Integer pageLength, Boolean cutoff) throws KustvaktException {
-
-        KustvaktConfiguration.BACKENDS eng = this.config.chooseBackend(engine);
-        User user = createUser(username, headers);
-
-        QuerySerializer serializer = new QuerySerializer();
-        serializer.setQuery(q, ql, v);
-        if (cq != null) serializer.setCollection(cq);
-
-        MetaQueryBuilder meta = createMetaQuery(pageIndex, pageInteger, ctx,
-                pageLength, cutoff);
-        if (fields != null && !fields.isEmpty())
-            meta.addEntry("fields", fields);
-        serializer.setMeta(meta.raw());
-
-        // There is an error in query processing
-        // - either query, corpus or meta
-        if (serializer.hasErrors()) {
-            throw new KustvaktException(serializer.toJSON());
-        }
-
-        String query =
-                this.rewriteHandler.processQuery(serializer.toJSON(), user);
-        jlog.info("the serialized query " + query);
-
-        String result;
-        if (eng.equals(KustvaktConfiguration.BACKENDS.NEO4J)) {
-            result = searchNeo4J(query, pageLength, meta, false);
-        }
-        else {
-            result = searchKrill.search(query);
-        }
-        // jlog.debug("Query result: " + result);
-        return result;
-
-    }
-
-    private MetaQueryBuilder createMetaQuery (Integer pageIndex,
-            Integer pageInteger, String ctx, Integer pageLength,
-            Boolean cutoff) {
-        MetaQueryBuilder meta = new MetaQueryBuilder();
-        meta.addEntry("startIndex", pageIndex);
-        meta.addEntry("startPage", pageInteger);
-        meta.setSpanContext(ctx);
-        meta.addEntry("count", pageLength);
-        // todo: what happened to cutoff?
-        meta.addEntry("cutOff", cutoff);
-        // meta.addMeta(pageIndex, pageInteger, pageLength, ctx,
-        // cutoff);
-        // fixme: should only apply to CQL queries per default!
-        // meta.addEntry("itemsPerResource", 1);
-        return meta;
-    }
-
-    private String searchNeo4J (String query, int pageLength,
-            MetaQueryBuilder meta, boolean raw) throws KustvaktException {
-
-        if (raw) {
-            throw new KustvaktException(StatusCodes.ILLEGAL_ARGUMENT,
-                    "raw not supported!");
-        }
-
-        MultivaluedMap<String, String> map = new MultivaluedMapImpl();
-        map.add("q", query);
-        map.add("count", String.valueOf(pageLength));
-        map.add("lctxs", String.valueOf(meta.getSpanContext().getLeftSize()));
-        map.add("rctxs", String.valueOf(meta.getSpanContext().getRightSize()));
-        return this.graphDBhandler.getResponse(map, "distKwic");
-
-    }
-
-    public String retrieveMatchInfo (String corpusId, String docId,
-            String textId, String matchId, Set<String> foundries,
-            String username, HttpHeaders headers, Set<String> layers,
-            boolean spans, boolean highlights) throws KustvaktException {
-        String matchid =
-                searchKrill.getMatchId(corpusId, docId, textId, matchId);
-
-        User user = createUser(username, headers);
-        Pattern p = null;
-        if (user != null) {
-            CorpusAccess corpusAccess = user.getCorpusAccess();
-            switch (corpusAccess) {
-                case PUB:
-                    p = config.getPublicLicensePattern();
-                    break;
-                case ALL:
-                    p = config.getAllLicensePattern();
-                    break;
-                default: // FREE
-                    p = config.getFreeLicensePattern();
-                    break;
-            }
-        }
-        boolean match_only = foundries == null || foundries.isEmpty();
-        String results;
-        try {
-            if (!match_only) {
-
-                ArrayList<String> foundryList = new ArrayList<String>();
-                ArrayList<String> layerList = new ArrayList<String>();
-
-                // EM: now without user, just list all foundries and
-                // layers
-                if (foundries.contains("*")) {
-                    foundryList = config.getFoundries();
-                    layerList = config.getLayers();
-                }
-                else {
-                    foundryList.addAll(foundries);
-                    layerList.addAll(layers);
-                }
-
-                results = searchKrill.getMatch(matchid, foundryList, layerList,
-                        spans, highlights, true, p);
-            }
-            else {
-                results = searchKrill.getMatch(matchid, p);
-            }
-        }
-        catch (Exception e) {
-            jlog.error("Exception in the MatchInfo service encountered!", e);
-            throw new KustvaktException(StatusCodes.ILLEGAL_ARGUMENT,
-                    e.getMessage());
-        }
-        jlog.debug("MatchInfo results: " + results);
-        return results;
-    }
-
-    public String retrieveDocMetadata (String corpusId, String docId,
-            String textId) {
-        String textSigle = searchKrill.getTextSigle(corpusId, docId, textId);
-        return searchKrill.getFields(textSigle);
-    }
-
-    public String getCollocationBase (String query) throws KustvaktException {
-        return graphDBhandler.getResponse("distCollo", "q", query);
-    }
-}
diff --git a/full/src/main/java/de/ids_mannheim/korap/service/VirtualCorpusService.java b/full/src/main/java/de/ids_mannheim/korap/service/VirtualCorpusService.java
index a9a1fb4..8ed6c09 100644
--- a/full/src/main/java/de/ids_mannheim/korap/service/VirtualCorpusService.java
+++ b/full/src/main/java/de/ids_mannheim/korap/service/VirtualCorpusService.java
@@ -56,7 +56,7 @@
     private static Logger jlog =
             LogManager.getLogger(VirtualCorpusService.class);
 
-    public static Pattern wordPattern = Pattern.compile("[-\\w ]+");
+    public static Pattern wordPattern = Pattern.compile("[-\\w. ]+");
 
     @Autowired
     private VirtualCorpusDao vcDao;
diff --git a/full/src/main/java/de/ids_mannheim/korap/web/KustvaktResponseHandler.java b/full/src/main/java/de/ids_mannheim/korap/web/KustvaktResponseHandler.java
deleted file mode 100644
index bce194c..0000000
--- a/full/src/main/java/de/ids_mannheim/korap/web/KustvaktResponseHandler.java
+++ /dev/null
@@ -1,68 +0,0 @@
-package de.ids_mannheim.korap.web;
-
-import java.util.EnumSet;
-
-import javax.ws.rs.WebApplicationException;
-import javax.ws.rs.core.HttpHeaders;
-import javax.ws.rs.core.Response;
-import javax.ws.rs.core.Response.ResponseBuilder;
-
-import de.ids_mannheim.korap.constant.AuthenticationScheme;
-import de.ids_mannheim.korap.exceptions.KustvaktException;
-import de.ids_mannheim.korap.exceptions.StatusCodes;
-import de.ids_mannheim.korap.interfaces.db.AuditingIface;
-
-/**
- * KustvaktResponseHandler includes exceptions regarding
- * authorization.
- * 
- * @author margaretha
- *
- */
-public class KustvaktResponseHandler extends CoreResponseHandler {
-
-    public KustvaktResponseHandler (AuditingIface iface) {
-        super(iface);
-    }
-
-    @Override
-    public WebApplicationException throwit (KustvaktException e) {
-        Response r;
-
-        // KustvaktException just wraps another exception
-        if (e.getStatusCode() == null && e.hasNotification()) {
-            r = Response.status(Response.Status.BAD_REQUEST)
-                    .entity(e.getNotification()).build();
-        }
-        else if (e.getStatusCode() == StatusCodes.USER_REAUTHENTICATION_REQUIRED
-                || e.getStatusCode() == StatusCodes.AUTHORIZATION_FAILED
-                || e.getStatusCode() >= StatusCodes.AUTHENTICATION_FAILED) {
-            String notification = buildNotification(e.getStatusCode(),
-                    e.getMessage(), e.getEntity());
-            r = createUnauthenticatedResponse(notification);
-        }
-        else if (e.hasNotification()) {
-            r = Response.status(getStatus(e.getStatusCode()))
-                    .entity(e.getNotification()).build();
-        }
-        else {
-            String notification = buildNotification(e.getStatusCode(),
-                    e.getMessage(), e.getEntity());
-            r = Response.status(getStatus(e.getStatusCode()))
-                    .entity(notification).build();
-        }
-        return new WebApplicationException(r);
-    }
-
-    public Response createUnauthenticatedResponse (String notification) {
-        ResponseBuilder builder = Response.status(Response.Status.UNAUTHORIZED);
-
-        for (AuthenticationScheme s : EnumSet
-                .allOf(AuthenticationScheme.class)) {
-            builder = builder.header(HttpHeaders.WWW_AUTHENTICATE,
-                    s.displayName() + " realm=\"Kustvakt\"");
-        }
-
-        return builder.entity(notification).build();
-    }
-}
diff --git a/full/src/main/java/de/ids_mannheim/korap/web/controller/AnnotationController.java b/full/src/main/java/de/ids_mannheim/korap/web/controller/AnnotationController.java
deleted file mode 100644
index 06b9957..0000000
--- a/full/src/main/java/de/ids_mannheim/korap/web/controller/AnnotationController.java
+++ /dev/null
@@ -1,131 +0,0 @@
-package de.ids_mannheim.korap.web.controller;
-
-import java.io.IOException;
-import java.util.List;
-
-import javax.ws.rs.Consumes;
-import javax.ws.rs.GET;
-import javax.ws.rs.POST;
-import javax.ws.rs.Path;
-import javax.ws.rs.Produces;
-import javax.ws.rs.core.MediaType;
-
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Controller;
-
-import com.fasterxml.jackson.databind.JsonNode;
-import com.sun.jersey.spi.container.ResourceFilters;
-
-import de.ids_mannheim.korap.dto.FoundryDto;
-import de.ids_mannheim.korap.dto.LayerDto;
-import de.ids_mannheim.korap.exceptions.KustvaktException;
-import de.ids_mannheim.korap.exceptions.StatusCodes;
-import de.ids_mannheim.korap.service.AnnotationService;
-import de.ids_mannheim.korap.utils.JsonUtils;
-import de.ids_mannheim.korap.web.KustvaktResponseHandler;
-import de.ids_mannheim.korap.web.APIVersionFilter;
-import de.ids_mannheim.korap.web.filter.DemoUserFilter;
-import de.ids_mannheim.korap.web.filter.PiwikFilter;
-
-/**
- * Provides services regarding annotation related information.
- * 
- * @author margaretha
- *
- */
-@Controller
-@Path("/{version}/annotation/")
-@ResourceFilters({APIVersionFilter.class, DemoUserFilter.class, PiwikFilter.class })
-@Produces(MediaType.APPLICATION_JSON + ";charset=utf-8")
-public class AnnotationController {
-
-    @Autowired
-    private KustvaktResponseHandler kustvaktResponseHandler;
-
-    @Autowired
-    private AnnotationService annotationService;
-
-    /**
-     * Returns information about all supported layers
-     * 
-     * @return a json serialization of all supported layers
-     */
-    @GET
-    @Path("layers")
-    public List<LayerDto> getLayers () {
-        return annotationService.getLayerDtos();
-    }
-
-
-    /**
-     * Returns a list of foundry descriptions.
-     * 
-     * @param codes
-     *            foundry-layer code or a Kleene-star
-     * @param language
-     *            2-letter language code (description language)
-     * @return a list of foundry, layer, value information in json
-     */
-    @SuppressWarnings("unchecked")
-    @POST
-    @Path("description")
-    @Consumes(MediaType.APPLICATION_JSON)
-    public List<FoundryDto> getFoundryDescriptions (String json) {
-        if (json == null || json.isEmpty()) {
-            throw kustvaktResponseHandler
-                    .throwit(new KustvaktException(StatusCodes.MISSING_PARAMETER,
-                            "Missing a json string.", ""));
-        }
-
-        JsonNode node;
-        try {
-            node = JsonUtils.readTree(json);
-        }
-        catch (KustvaktException e1) {
-            throw kustvaktResponseHandler.throwit(e1);
-        }
-
-        String language;
-        if (!node.has("language")) {
-            language = "en";
-        }
-        else {
-            language = node.get("language").asText();
-            if (language == null || language.isEmpty()) {
-                language = "en";
-            }
-            else if (!(language.equals("en") || language.equals("de"))) {
-                throw kustvaktResponseHandler.throwit(
-                        new KustvaktException(StatusCodes.UNSUPPORTED_VALUE,
-                                "Unsupported value:", language));
-            }
-        }
-
-        List<String> codes;
-        try {
-            codes = JsonUtils.convert(node.get("codes"), List.class);
-        }
-        catch (IOException | NullPointerException e) {
-            throw kustvaktResponseHandler.throwit(new KustvaktException(
-                    StatusCodes.INVALID_ARGUMENT, "Bad argument:", json));
-        }
-        if (codes == null) {
-            throw kustvaktResponseHandler.throwit(
-                    new KustvaktException(StatusCodes.MISSING_ATTRIBUTE,
-                            "Missing attribute:", "codes"));
-        }
-        else if (codes.isEmpty()) {
-            throw kustvaktResponseHandler
-                    .throwit(new KustvaktException(StatusCodes.NO_RESULT_FOUND,
-                            "No result found.", "codes:[]"));
-        }
-
-        try {
-            return annotationService.getFoundryDtos(codes, language);
-        }
-        catch (KustvaktException e) {
-            throw kustvaktResponseHandler.throwit(e);
-        }
-    }
-}
-
diff --git a/full/src/main/java/de/ids_mannheim/korap/web/controller/OAuth2Controller.java b/full/src/main/java/de/ids_mannheim/korap/web/controller/OAuth2Controller.java
index e8047c2..d86a2b1 100644
--- a/full/src/main/java/de/ids_mannheim/korap/web/controller/OAuth2Controller.java
+++ b/full/src/main/java/de/ids_mannheim/korap/web/controller/OAuth2Controller.java
@@ -26,8 +26,8 @@
 
 import com.sun.jersey.spi.container.ResourceFilters;
 
+import de.ids_mannheim.korap.constant.OAuth2Scope;
 import de.ids_mannheim.korap.exceptions.KustvaktException;
-import de.ids_mannheim.korap.oauth2.constant.OAuth2Scope;
 import de.ids_mannheim.korap.oauth2.oltu.OAuth2AuthorizationRequest;
 import de.ids_mannheim.korap.oauth2.oltu.OAuth2RevokeTokenRequest;
 import de.ids_mannheim.korap.oauth2.oltu.service.OltuAuthorizationService;
diff --git a/full/src/main/java/de/ids_mannheim/korap/web/controller/OAuth2WithOpenIdController.java b/full/src/main/java/de/ids_mannheim/korap/web/controller/OAuth2WithOpenIdController.java
index 761c3f6..6eae61c 100644
--- a/full/src/main/java/de/ids_mannheim/korap/web/controller/OAuth2WithOpenIdController.java
+++ b/full/src/main/java/de/ids_mannheim/korap/web/controller/OAuth2WithOpenIdController.java
@@ -31,8 +31,8 @@
 import com.nimbusds.oauth2.sdk.id.State;
 import com.sun.jersey.spi.container.ResourceFilters;
 
+import de.ids_mannheim.korap.constant.OAuth2Scope;
 import de.ids_mannheim.korap.exceptions.KustvaktException;
-import de.ids_mannheim.korap.oauth2.constant.OAuth2Scope;
 import de.ids_mannheim.korap.oauth2.openid.OpenIdConfiguration;
 import de.ids_mannheim.korap.oauth2.openid.OpenIdHttpRequestWrapper;
 import de.ids_mannheim.korap.oauth2.openid.service.JWKService;
diff --git a/full/src/main/java/de/ids_mannheim/korap/web/controller/OAuthClientController.java b/full/src/main/java/de/ids_mannheim/korap/web/controller/OAuthClientController.java
index ebcfd51..ca7e168 100644
--- a/full/src/main/java/de/ids_mannheim/korap/web/controller/OAuthClientController.java
+++ b/full/src/main/java/de/ids_mannheim/korap/web/controller/OAuthClientController.java
@@ -18,8 +18,8 @@
 
 import com.sun.jersey.spi.container.ResourceFilters;
 
+import de.ids_mannheim.korap.constant.OAuth2Scope;
 import de.ids_mannheim.korap.exceptions.KustvaktException;
-import de.ids_mannheim.korap.oauth2.constant.OAuth2Scope;
 import de.ids_mannheim.korap.oauth2.dto.OAuth2ClientDto;
 import de.ids_mannheim.korap.oauth2.dto.OAuth2ClientInfoDto;
 import de.ids_mannheim.korap.oauth2.service.OAuth2ClientService;
diff --git a/full/src/main/java/de/ids_mannheim/korap/web/controller/SearchController.java b/full/src/main/java/de/ids_mannheim/korap/web/controller/SearchController.java
deleted file mode 100644
index e65ae07..0000000
--- a/full/src/main/java/de/ids_mannheim/korap/web/controller/SearchController.java
+++ /dev/null
@@ -1,327 +0,0 @@
-package de.ids_mannheim.korap.web.controller;// package
-                                             // de.ids_mannheim.korap.ext.web;
-
-import java.util.HashSet;
-import java.util.Locale;
-import java.util.Set;
-
-import javax.ws.rs.GET;
-import javax.ws.rs.POST;
-import javax.ws.rs.Path;
-import javax.ws.rs.PathParam;
-import javax.ws.rs.Produces;
-import javax.ws.rs.QueryParam;
-import javax.ws.rs.core.Context;
-import javax.ws.rs.core.HttpHeaders;
-import javax.ws.rs.core.MediaType;
-import javax.ws.rs.core.Response;
-import javax.ws.rs.core.SecurityContext;
-
-import org.apache.logging.log4j.LogManager;
-import org.apache.logging.log4j.Logger;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Controller;
-
-import com.sun.jersey.spi.container.ResourceFilters;
-
-import de.ids_mannheim.korap.exceptions.KustvaktException;
-import de.ids_mannheim.korap.oauth2.constant.OAuth2Scope;
-import de.ids_mannheim.korap.oauth2.service.OAuth2ScopeService;
-import de.ids_mannheim.korap.security.context.TokenContext;
-import de.ids_mannheim.korap.service.SearchService;
-import de.ids_mannheim.korap.web.KustvaktResponseHandler;
-import de.ids_mannheim.korap.web.APIVersionFilter;
-import de.ids_mannheim.korap.web.filter.AuthenticationFilter;
-import de.ids_mannheim.korap.web.filter.DemoUserFilter;
-import de.ids_mannheim.korap.web.filter.PiwikFilter;
-
-/**
- * 
- * @author hanl, margaretha, diewald
- * @date 29/01/2014
- * @lastUpdate 09/07/2018
- * 
- */
-@Controller
-@Path("/")
-@ResourceFilters({ APIVersionFilter.class, AuthenticationFilter.class,
-        DemoUserFilter.class, PiwikFilter.class })
-@Produces(MediaType.APPLICATION_JSON + ";charset=utf-8")
-public class SearchController {
-
-    private static Logger jlog = LogManager.getLogger(SearchController.class);
-
-    @Autowired
-    private KustvaktResponseHandler kustvaktResponseHandler;
-
-    @Autowired
-    private SearchService searchService;
-    @Autowired
-    private OAuth2ScopeService scopeService;
-
-    /**
-     * Builds a json query serialization from the given parameters.
-     * 
-     * @param locale
-     * @param securityContext
-     * @param q
-     *            query string
-     * @param ql
-     *            query language
-     * @param v
-     *            version
-     * @param context
-     * @param cutoff
-     *            true if the number of results should be limited
-     * @param pageLength
-     *            number of results per page
-     * @param pageIndex
-     * @param startPage
-     * @param cq
-     *            corpus query
-     * @return
-     */
-    // ref query parameter removed!
-    @GET
-    @Path("{version}/query")
-    public Response serializeQuery (@Context Locale locale,
-            @Context SecurityContext securityContext, @QueryParam("q") String q,
-            @QueryParam("ql") String ql, @QueryParam("v") String v,
-            @QueryParam("context") String context,
-            @QueryParam("cutoff") Boolean cutoff,
-            @QueryParam("count") Integer pageLength,
-            @QueryParam("offset") Integer pageIndex,
-            @QueryParam("page") Integer startPage,
-            @QueryParam("cq") String cq) {
-        TokenContext ctx = (TokenContext) securityContext.getUserPrincipal();
-        try {
-            scopeService.verifyScope(ctx, OAuth2Scope.SERIALIZE_QUERY);
-            String result = searchService.serializeQuery(q, ql, v, cq,
-                    pageIndex, startPage, pageLength, context, cutoff);
-            jlog.debug("Query: " + result);
-            return Response.ok(result).build();
-        }
-        catch (KustvaktException e) {
-            throw kustvaktResponseHandler.throwit(e);
-        }
-    }
-
-    @POST
-    @Path("{version}/search")
-    public Response searchPost (@Context SecurityContext context,
-            @Context Locale locale, @QueryParam("engine") String engine,
-            String jsonld) {
-        TokenContext ctx = (TokenContext) context.getUserPrincipal();
-        try {
-            scopeService.verifyScope(ctx, OAuth2Scope.SEARCH);
-        }
-        catch (KustvaktException e) {
-            throw kustvaktResponseHandler.throwit(e);
-        }
-
-        jlog.debug("Serialized search: " + jsonld);
-        String result = searchService.search(jsonld);
-        jlog.debug("The result set: " + result);
-        return Response.ok(result).build();
-    }
-
-    @GET
-    @Path("{version}/search")
-    public Response searchGet (@Context SecurityContext securityContext,
-            @Context HttpHeaders headers, @Context Locale locale,
-            @QueryParam("q") String q, @QueryParam("ql") String ql,
-            @QueryParam("v") String v, @QueryParam("context") String ctx,
-            @QueryParam("cutoff") Boolean cutoff,
-            @QueryParam("count") Integer pageLength,
-            @QueryParam("offset") Integer pageIndex,
-            @QueryParam("page") Integer pageInteger,
-            @QueryParam("fields") Set<String> fields,
-            @QueryParam("cq") String cq, @QueryParam("engine") String engine) {
-
-        TokenContext context =
-                (TokenContext) securityContext.getUserPrincipal();
-
-        String result;
-        try {
-            scopeService.verifyScope(context, OAuth2Scope.SEARCH);
-            result = searchService.search(engine, context.getUsername(),
-                    headers, q, ql, v, cq, fields, pageIndex, pageInteger, ctx,
-                    pageLength, cutoff);
-        }
-        catch (KustvaktException e) {
-            throw kustvaktResponseHandler.throwit(e);
-        }
-
-        return Response.ok(result).build();
-    }
-
-    @GET
-    @Path("{version}/corpus/{corpusId}/{docId}/{textId}/{matchId}/matchInfo")
-    public Response getMatchInfo (@Context SecurityContext ctx,
-            @Context HttpHeaders headers, @Context Locale locale,
-            @PathParam("corpusId") String corpusId,
-            @PathParam("docId") String docId,
-            @PathParam("textId") String textId,
-            @PathParam("matchId") String matchId,
-            @QueryParam("foundry") Set<String> foundries,
-            @QueryParam("layer") Set<String> layers,
-            @QueryParam("spans") Boolean spans, 
-            // Highlights may also be a list of valid highlight classes
-            @QueryParam("hls") Boolean highlights) throws KustvaktException {
-
-        TokenContext tokenContext = (TokenContext) ctx.getUserPrincipal();
-        scopeService.verifyScope(tokenContext, OAuth2Scope.MATCH_INFO);
-        spans = spans != null ? spans : false;
-        highlights = highlights != null ? highlights : false;
-        if (layers == null || layers.isEmpty()) layers = new HashSet<>();
-
-        String results = searchService.retrieveMatchInfo(corpusId, docId,
-                textId, matchId, foundries, tokenContext.getUsername(), headers,
-                layers, spans, highlights);
-        return Response.ok(results).build();
-    }
-
-    /*
-     * Returns the meta data fields of a certain document
-     */
-    // This is currently identical to LiteService#getMeta(),
-    // but may need auth code to work following policies
-    @GET
-    @Path("{version}/corpus/{corpusId}/{docId}/{textId}")
-    public Response getMetadata (@PathParam("corpusId") String corpusId,
-            @PathParam("docId") String docId, @PathParam("textId") String textId
-    // @QueryParam("fields") Set<String> fields
-    ) throws KustvaktException {
-        String results =
-                searchService.retrieveDocMetadata(corpusId, docId, textId);
-        return Response.ok(results).build();
-    }
-
-    @POST
-    @Path("{version}/colloc")
-    public Response getCollocationBase (@QueryParam("q") String query) {
-        String result;
-        try {
-            result = searchService.getCollocationBase(query);
-        }
-        catch (KustvaktException e) {
-            throw kustvaktResponseHandler.throwit(e);
-        }
-        return Response.ok(result).build();
-    }
-
-    // @GET
-    // @Path("colloc")
-    // public Response getCollocationsAll(@Context SecurityContext
-    // ctx,
-    // @Context Locale locale, @QueryParam("props") String properties,
-    // @QueryParam("sfskip") Integer sfs,
-    // @QueryParam("sflimit") Integer limit, @QueryParam("q") String
-    // query,
-    // @QueryParam("ql") String ql, @QueryParam("context") Integer
-    // context,
-    // @QueryParam("foundry") String foundry,
-    // @QueryParam("paths") Boolean wPaths) {
-    // TokenContext tokenContext = (TokenContext)
-    // ctx.getUserPrincipal();
-    // ColloQuery.ColloQueryBuilder builder;
-    // KoralCollectionQueryBuilder cquery = new
-    // KoralCollectionQueryBuilder();
-    // String result;
-    // try {
-    // User user = controller.getUser(tokenContext.getUsername());
-    // Set<VirtualCollection> resources = ResourceFinder
-    // .search(user, VirtualCollection.class);
-    // for (KustvaktResource c : resources)
-    // cquery.addResource(((VirtualCollection) c).getQuery());
-    //
-    // builder = functions
-    // .buildCollocations(query, ql, properties, context, limit,
-    // sfs, foundry, new ArrayList<Dependency>(), wPaths,
-    // cquery);
-    //
-    // result = graphDBhandler
-    // .getResponse("distCollo", "q", builder.build().toJSON());
-    // }catch (KustvaktException e) {
-    // throw KustvaktResponseHandler.throwit(e);
-    // }catch (JsonProcessingException e) {
-    // throw
-    // KustvaktResponseHandler.throwit(StatusCodes.ILLEGAL_ARGUMENT);
-    // }
-    // return Response.ok(result).build();
-    // }
-
-    // /**
-    // * @param locale
-    // * @param properties a json object string containing field, op
-    // and value
-    // for the query
-    // * @param query
-    // * @param context
-    // * @return
-    // */
-    // @GET
-    // @Path("{type}/{id}/colloc")
-    // public Response getCollocations(@Context SecurityContext ctx,
-    // @Context Locale locale, @QueryParam("props") String properties,
-    // @QueryParam("sfskip") Integer sfs,
-    // @QueryParam("sflimit") Integer limit, @QueryParam("q") String
-    // query,
-    // @QueryParam("ql") String ql, @QueryParam("context") Integer
-    // context,
-    // @QueryParam("foundry") String foundry,
-    // @QueryParam("paths") Boolean wPaths, @PathParam("id") String
-    // id,
-    // @PathParam("type") String type) {
-    // ColloQuery.ColloQueryBuilder builder;
-    // type = StringUtils.normalize(type);
-    // id = StringUtils.decodeHTML(id);
-    // TokenContext tokenContext = (TokenContext)
-    // ctx.getUserPrincipal();
-    // String result;
-    // try {
-    // KoralCollectionQueryBuilder cquery = new
-    // KoralCollectionQueryBuilder();
-    // try {
-    // User user = controller.getUser(tokenContext.getUsername());
-    //
-    // KustvaktResource resource = this.resourceHandler
-    // .findbyStrId(id, user, type);
-    //
-    // if (resource instanceof VirtualCollection)
-    // cquery.addResource(
-    // ((VirtualCollection) resource).getQuery());
-    // else if (resource instanceof Corpus)
-    // cquery.addMetaFilter("corpusID",
-    // resource.getPersistentID());
-    // else
-    // throw KustvaktResponseHandler
-    // .throwit(StatusCodes.ILLEGAL_ARGUMENT,
-    // "Type parameter not supported", type);
-    //
-    // }catch (KustvaktException e) {
-    // throw KustvaktResponseHandler.throwit(e);
-    // }catch (NumberFormatException ex) {
-    // throw KustvaktResponseHandler
-    // .throwit(StatusCodes.ILLEGAL_ARGUMENT);
-    // }
-    //
-    // builder = functions
-    // .buildCollocations(query, ql, properties, context, limit,
-    // sfs, foundry, new ArrayList<Dependency>(), wPaths,
-    // cquery);
-    //
-    // result = graphDBhandler
-    // .getResponse("distCollo", "q", builder.build().toJSON());
-    //
-    // }catch (JsonProcessingException e) {
-    // throw
-    // KustvaktResponseHandler.throwit(StatusCodes.ILLEGAL_ARGUMENT);
-    // }catch (KustvaktException e) {
-    // throw KustvaktResponseHandler.throwit(e);
-    // }
-    //
-    // return Response.ok(result).build();
-    // }
-
-}
diff --git a/full/src/main/java/de/ids_mannheim/korap/web/controller/StatisticController.java b/full/src/main/java/de/ids_mannheim/korap/web/controller/StatisticController.java
deleted file mode 100644
index 43970be..0000000
--- a/full/src/main/java/de/ids_mannheim/korap/web/controller/StatisticController.java
+++ /dev/null
@@ -1,94 +0,0 @@
-package de.ids_mannheim.korap.web.controller;
-
-import java.util.Locale;
-
-import javax.ws.rs.GET;
-import javax.ws.rs.Path;
-import javax.ws.rs.Produces;
-import javax.ws.rs.QueryParam;
-import javax.ws.rs.core.Context;
-import javax.ws.rs.core.MediaType;
-import javax.ws.rs.core.Response;
-import javax.ws.rs.core.SecurityContext;
-
-import org.apache.logging.log4j.LogManager;
-import org.apache.logging.log4j.Logger;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Controller;
-
-import com.sun.jersey.spi.container.ResourceFilters;
-
-import de.ids_mannheim.korap.exceptions.KustvaktException;
-import de.ids_mannheim.korap.exceptions.StatusCodes;
-import de.ids_mannheim.korap.utils.KoralCollectionQueryBuilder;
-import de.ids_mannheim.korap.web.CoreResponseHandler;
-import de.ids_mannheim.korap.web.SearchKrill;
-import de.ids_mannheim.korap.web.APIVersionFilter;
-import de.ids_mannheim.korap.web.filter.PiwikFilter;
-
-/**
- * Web services related to statistics
- * 
- * @author hanl
- * @author margaretha
- *
- * @date 08/11/2017
- * 
- */
-@Controller
-@Path("{version}/statistics/")
-@ResourceFilters({APIVersionFilter.class, PiwikFilter.class })
-@Produces(MediaType.APPLICATION_JSON + ";charset=utf-8")
-public class StatisticController {
-
-
-    private static Logger jlog =
-            LogManager.getLogger(StatisticController.class);
-    @Autowired
-    private CoreResponseHandler kustvaktResponseHandler;
-    @Autowired
-    private SearchKrill searchKrill;
-
-
-    /**
-     * Returns statistics of the virtual corpus defined by the given
-     * corpusQuery parameter.
-     * 
-     * @param context
-     *            SecurityContext
-     * @param locale
-     *            Locale
-     * @param corpusQuery
-     *            a collection query specifying a virtual corpus
-     * @return statistics of the virtual corpus defined by the given
-     *         corpusQuery parameter.
-     */
-    @GET
-    public Response getStatistics (@Context SecurityContext context,
-            @Context Locale locale,
-            @QueryParam("corpusQuery") String corpusQuery) {
-
-        KoralCollectionQueryBuilder builder = new KoralCollectionQueryBuilder();
-
-		String stats;
-		if (corpusQuery != null && !corpusQuery.isEmpty()) {
-			builder.with(corpusQuery);
-			String json = null;
-			try {
-				json = builder.toJSON();
-			}
-			catch (KustvaktException e) {
-				throw kustvaktResponseHandler.throwit(e);
-			}
-			stats = searchKrill.getStatistics(json);
-		}
-		else {
-			stats = searchKrill.getStatistics(null);
-		};
-
-        if (stats.contains("-1"))
-            throw kustvaktResponseHandler.throwit(StatusCodes.NO_RESULT_FOUND);
-        jlog.debug("Stats: " + stats);
-        return Response.ok(stats).build();
-    }
-}
diff --git a/full/src/main/java/de/ids_mannheim/korap/web/controller/UserGroupController.java b/full/src/main/java/de/ids_mannheim/korap/web/controller/UserGroupController.java
index 6c9427d..c356d78 100644
--- a/full/src/main/java/de/ids_mannheim/korap/web/controller/UserGroupController.java
+++ b/full/src/main/java/de/ids_mannheim/korap/web/controller/UserGroupController.java
@@ -21,11 +21,11 @@
 
 import com.sun.jersey.spi.container.ResourceFilters;
 
+import de.ids_mannheim.korap.constant.OAuth2Scope;
 import de.ids_mannheim.korap.constant.UserGroupStatus;
 import de.ids_mannheim.korap.dto.UserGroupDto;
 import de.ids_mannheim.korap.exceptions.KustvaktException;
 import de.ids_mannheim.korap.exceptions.StatusCodes;
-import de.ids_mannheim.korap.oauth2.constant.OAuth2Scope;
 import de.ids_mannheim.korap.oauth2.service.OAuth2ScopeService;
 import de.ids_mannheim.korap.security.context.TokenContext;
 import de.ids_mannheim.korap.service.UserGroupService;
diff --git a/full/src/main/java/de/ids_mannheim/korap/web/controller/VirtualCorpusController.java b/full/src/main/java/de/ids_mannheim/korap/web/controller/VirtualCorpusController.java
index 553bfb3..12ce7bf 100644
--- a/full/src/main/java/de/ids_mannheim/korap/web/controller/VirtualCorpusController.java
+++ b/full/src/main/java/de/ids_mannheim/korap/web/controller/VirtualCorpusController.java
@@ -21,12 +21,12 @@
 
 import com.sun.jersey.spi.container.ResourceFilters;
 
+import de.ids_mannheim.korap.constant.OAuth2Scope;
 import de.ids_mannheim.korap.constant.VirtualCorpusAccessStatus;
 import de.ids_mannheim.korap.constant.VirtualCorpusType;
 import de.ids_mannheim.korap.dto.VirtualCorpusAccessDto;
 import de.ids_mannheim.korap.dto.VirtualCorpusDto;
 import de.ids_mannheim.korap.exceptions.KustvaktException;
-import de.ids_mannheim.korap.oauth2.constant.OAuth2Scope;
 import de.ids_mannheim.korap.oauth2.service.OAuth2ScopeService;
 import de.ids_mannheim.korap.security.context.TokenContext;
 import de.ids_mannheim.korap.service.VirtualCorpusService;
diff --git a/full/src/main/java/de/ids_mannheim/korap/web/filter/AuthenticationFilter.java b/full/src/main/java/de/ids_mannheim/korap/web/filter/AuthenticationFilter.java
deleted file mode 100644
index d0e4562..0000000
--- a/full/src/main/java/de/ids_mannheim/korap/web/filter/AuthenticationFilter.java
+++ /dev/null
@@ -1,132 +0,0 @@
-package de.ids_mannheim.korap.web.filter;
-
-import javax.ws.rs.ext.Provider;
-
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Component;
-
-import com.sun.jersey.spi.container.ContainerRequest;
-import com.sun.jersey.spi.container.ContainerRequestFilter;
-import com.sun.jersey.spi.container.ContainerResponseFilter;
-import com.sun.jersey.spi.container.ResourceFilter;
-
-import de.ids_mannheim.korap.authentication.AuthenticationManager;
-import de.ids_mannheim.korap.authentication.http.AuthorizationData;
-import de.ids_mannheim.korap.authentication.http.HttpAuthorizationHandler;
-import de.ids_mannheim.korap.constant.TokenType;
-import de.ids_mannheim.korap.exceptions.KustvaktException;
-import de.ids_mannheim.korap.exceptions.StatusCodes;
-import de.ids_mannheim.korap.security.context.KustvaktContext;
-import de.ids_mannheim.korap.security.context.TokenContext;
-import de.ids_mannheim.korap.utils.TimeUtils;
-import de.ids_mannheim.korap.web.KustvaktResponseHandler;
-
-/**
- * @author hanl, margaretha
- * @date 28/01/2014
- * @last update 12/2017
- */
-@Component
-@Provider
-public class AuthenticationFilter
-        implements ContainerRequestFilter, ResourceFilter {
-
-    @Autowired
-    private HttpAuthorizationHandler authorizationHandler;
-
-    @Autowired
-    private AuthenticationManager authenticationManager;
-
-    @Autowired
-    private KustvaktResponseHandler kustvaktResponseHandler;
-
-    @Override
-    public ContainerRequest filter (ContainerRequest request) {
-        String host = request.getHeaderValue(ContainerRequest.HOST);
-        String ua = request.getHeaderValue(ContainerRequest.USER_AGENT);
-
-        String authorization =
-                request.getHeaderValue(ContainerRequest.AUTHORIZATION);
-
-        if (authorization != null && !authorization.isEmpty()) {
-            TokenContext context = null;
-            AuthorizationData authData;
-            try {
-                authData = authorizationHandler
-                        .parseAuthorizationHeaderValue(authorization);
-
-                switch (authData.getAuthenticationScheme()) {
-                    // EM: For testing only, must be disabled for
-                    // production
-                    case BASIC:
-                        context = authenticationManager.getTokenContext(
-                                TokenType.BASIC, authData.getToken(), host, ua);
-                        break;
-                    // EM: has not been tested yet
-                    // case SESSION:
-                    // context =
-                    // authenticationManager.getTokenContext(
-                    // TokenType.SESSION, authData.getToken(), host,
-                    // ua);
-                    // break;
-
-                    // OAuth2 authentication scheme
-                    case BEARER:
-                        context = authenticationManager.getTokenContext(
-                                TokenType.BEARER, authData.getToken(), host,
-                                ua);
-                        break;
-                    // EM: JWT token-based authentication scheme
-                    case API:
-                        context = authenticationManager.getTokenContext(
-                                TokenType.API, authData.getToken(), host, ua);
-                        break;
-                    default:
-                        throw new KustvaktException(
-                                StatusCodes.AUTHENTICATION_FAILED,
-                                "Authentication scheme is not supported.");
-                }
-                checkContext(context, request);
-                request.setSecurityContext(new KustvaktContext(context));
-            }
-            catch (KustvaktException e) {
-                throw kustvaktResponseHandler.throwit(e);
-            }
-        }
-        return request;
-    }
-
-
-    private void checkContext (TokenContext context, ContainerRequest request)
-            throws KustvaktException {
-        if (context == null) {
-            throw new KustvaktException(StatusCodes.AUTHENTICATION_FAILED,
-                    "Context is null.");
-        }
-        else if (!context.isValid()) {
-            throw new KustvaktException(StatusCodes.AUTHENTICATION_FAILED,
-                    "Context is not valid: "
-                            + "missing username, password or authentication scheme.");
-        }
-        else if (context.isSecureRequired() && !request.isSecure()) {
-            throw new KustvaktException(StatusCodes.AUTHENTICATION_FAILED,
-                    "Request is not secure.");
-        }
-        else if (TimeUtils.isExpired(context.getExpirationTime())) {
-            throw new KustvaktException(StatusCodes.EXPIRED,
-                    "Access token is expired");
-        }
-    }
-
-
-    @Override
-    public ContainerRequestFilter getRequestFilter () {
-        return this;
-    }
-
-
-    @Override
-    public ContainerResponseFilter getResponseFilter () {
-        return null;
-    }
-}
diff --git a/full/src/main/java/de/ids_mannheim/korap/web/filter/BlockingFilter.java b/full/src/main/java/de/ids_mannheim/korap/web/filter/BlockingFilter.java
deleted file mode 100644
index 8375b62..0000000
--- a/full/src/main/java/de/ids_mannheim/korap/web/filter/BlockingFilter.java
+++ /dev/null
@@ -1,65 +0,0 @@
-package de.ids_mannheim.korap.web.filter;
-
-import javax.ws.rs.ext.Provider;
-
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Component;
-
-import com.sun.jersey.spi.container.ContainerRequest;
-import com.sun.jersey.spi.container.ContainerRequestFilter;
-import com.sun.jersey.spi.container.ContainerResponseFilter;
-import com.sun.jersey.spi.container.ResourceFilter;
-
-import de.ids_mannheim.korap.exceptions.KustvaktException;
-import de.ids_mannheim.korap.exceptions.StatusCodes;
-import de.ids_mannheim.korap.security.context.TokenContext;
-import de.ids_mannheim.korap.web.KustvaktResponseHandler;
-
-/**
- * @author hanl
- * @date 11/12/2014
- *       <p/>
- *       endpoint filter to block access to an endpoint, in case no
- *       anonymous access should be allowed!
- */
-@Component
-@Provider
-public class BlockingFilter implements ContainerRequestFilter, ResourceFilter {
-
-    @Autowired
-    private KustvaktResponseHandler kustvaktResponseHandler;
-
-    @Override
-    public ContainerRequest filter (ContainerRequest request) {
-        TokenContext context;
-
-        try {
-            context = (TokenContext) request.getUserPrincipal();
-        }
-        catch (UnsupportedOperationException e) {
-            throw kustvaktResponseHandler.throwit(new KustvaktException(
-                    StatusCodes.UNSUPPORTED_OPERATION, e.getMessage(), e));
-        }
-
-        if (context == null || context.isDemo()) {
-            throw kustvaktResponseHandler.throwit(new KustvaktException(
-                    StatusCodes.AUTHORIZATION_FAILED,
-                    "Unauthorized operation for user: guest", "guest"));
-        }
-
-
-        return request;
-    }
-
-
-    @Override
-    public ContainerRequestFilter getRequestFilter () {
-        return this;
-    }
-
-
-    @Override
-    public ContainerResponseFilter getResponseFilter () {
-        return null;
-    }
-}
diff --git a/full/src/main/java/de/ids_mannheim/korap/web/filter/DemoFilter.java b/full/src/main/java/de/ids_mannheim/korap/web/filter/DemoFilter.java
deleted file mode 100644
index b15f5e3..0000000
--- a/full/src/main/java/de/ids_mannheim/korap/web/filter/DemoFilter.java
+++ /dev/null
@@ -1,67 +0,0 @@
-package de.ids_mannheim.korap.web.filter;
-
-import javax.ws.rs.core.SecurityContext;
-import javax.ws.rs.ext.Provider;
-
-import com.sun.jersey.spi.container.ContainerRequest;
-import com.sun.jersey.spi.container.ContainerRequestFilter;
-import com.sun.jersey.spi.container.ContainerResponseFilter;
-import com.sun.jersey.spi.container.ResourceFilter;
-
-import de.ids_mannheim.korap.authentication.http.HttpAuthorizationHandler;
-import de.ids_mannheim.korap.constant.TokenType;
-import de.ids_mannheim.korap.exceptions.KustvaktException;
-import de.ids_mannheim.korap.security.context.KustvaktContext;
-import de.ids_mannheim.korap.security.context.TokenContext;
-
-/**
- * @author hanl
- * @date 08/02/2016
- */
-@Provider
-public class DemoFilter implements ContainerRequestFilter, ResourceFilter {
-
-    @Override
-    public ContainerRequest filter (ContainerRequest request) {
-        String authentication =
-                request.getHeaderValue(ContainerRequest.AUTHORIZATION);
-        if (authentication == null || authentication.isEmpty()) {
-            try {
-                request.getUserPrincipal();
-            }
-            catch (UnsupportedOperationException e) {
-                request.setSecurityContext(createContext());
-            }
-        }
-        return request;
-    }
-
-
-    private SecurityContext createContext () {
-        TokenContext context = new TokenContext();
-        String token = null;
-        try {
-            token = HttpAuthorizationHandler
-                    .createBasicAuthorizationHeaderValue("demo", "demo2015");
-        }
-        catch (KustvaktException e) {
-            e.printStackTrace();
-        }
-        context.setToken(token);
-        context.setTokenType(TokenType.BASIC);
-        context.setUsername("demo");
-        return new KustvaktContext(context);
-    }
-
-
-    @Override
-    public ContainerRequestFilter getRequestFilter () {
-        return this;
-    }
-
-
-    @Override
-    public ContainerResponseFilter getResponseFilter () {
-        return null;
-    }
-}
diff --git a/full/src/main/java/de/ids_mannheim/korap/web/filter/DemoUserFilter.java b/full/src/main/java/de/ids_mannheim/korap/web/filter/DemoUserFilter.java
deleted file mode 100644
index e546c12..0000000
--- a/full/src/main/java/de/ids_mannheim/korap/web/filter/DemoUserFilter.java
+++ /dev/null
@@ -1,86 +0,0 @@
-package de.ids_mannheim.korap.web.filter;
-
-import java.security.Principal;
-
-import javax.ws.rs.core.Context;
-import javax.ws.rs.core.UriInfo;
-import javax.ws.rs.ext.Provider;
-
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Component;
-
-import com.sun.jersey.spi.container.ContainerRequest;
-import com.sun.jersey.spi.container.ContainerRequestFilter;
-import com.sun.jersey.spi.container.ContainerResponseFilter;
-import com.sun.jersey.spi.container.ResourceFilter;
-
-import de.ids_mannheim.korap.config.KustvaktConfiguration;
-import de.ids_mannheim.korap.constant.TokenType;
-import de.ids_mannheim.korap.security.context.KustvaktContext;
-import de.ids_mannheim.korap.security.context.TokenContext;
-import de.ids_mannheim.korap.user.User;
-import de.ids_mannheim.korap.utils.TimeUtils;
-
-/**
- * Created by hanl on 7/15/14.
- */
-@Provider
-@Component
-public class DemoUserFilter implements ContainerRequestFilter, ResourceFilter {
-
-    @Context
-    UriInfo info;
-    @Autowired
-    private KustvaktConfiguration config;
-
-
-    @Override
-    public ContainerRequest filter (ContainerRequest request) {
-        String host = request.getHeaderValue(ContainerRequest.HOST);
-        String ua = request.getHeaderValue(ContainerRequest.USER_AGENT);
-        String authentication = request
-                .getHeaderValue(ContainerRequest.AUTHORIZATION);
-
-        // means that this is the public service
-        if (authentication == null || authentication.isEmpty()) {
-            Principal pr = null;
-            try {
-                pr = request.getUserPrincipal();
-            }
-            catch (UnsupportedOperationException e) {
-                // do nothing
-            }
-            if (pr == null)
-                request.setSecurityContext(new KustvaktContext(
-                        createShorterToken(host, ua)));
-
-        }
-        return request;
-    }
-
-
-    private TokenContext createShorterToken (String host, String agent) {
-        User demo = User.UserFactory.getDemoUser();
-        TokenContext c = new TokenContext();
-        c.setUsername(demo.getUsername());
-        c.setHostAddress(host);
-        c.setUserAgent(agent);
-        c.setExpirationTime(TimeUtils.plusSeconds(
-                config
-                        .getShortTokenTTL()).getMillis());
-        c.setTokenType(TokenType.BASIC);
-        return c;
-    }
-
-
-    @Override
-    public ContainerRequestFilter getRequestFilter () {
-        return this;
-    }
-
-
-    @Override
-    public ContainerResponseFilter getResponseFilter () {
-        return null;
-    }
-}
diff --git a/full/src/main/java/de/ids_mannheim/korap/web/filter/NonDemoBlockingFilter.java b/full/src/main/java/de/ids_mannheim/korap/web/filter/NonDemoBlockingFilter.java
deleted file mode 100644
index 47cd086..0000000
--- a/full/src/main/java/de/ids_mannheim/korap/web/filter/NonDemoBlockingFilter.java
+++ /dev/null
@@ -1,65 +0,0 @@
-package de.ids_mannheim.korap.web.filter;
-
-import javax.ws.rs.ext.Provider;
-
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Component;
-
-import com.sun.jersey.spi.container.ContainerRequest;
-import com.sun.jersey.spi.container.ContainerRequestFilter;
-import com.sun.jersey.spi.container.ContainerResponseFilter;
-import com.sun.jersey.spi.container.ResourceFilter;
-
-import de.ids_mannheim.korap.exceptions.KustvaktException;
-import de.ids_mannheim.korap.exceptions.StatusCodes;
-import de.ids_mannheim.korap.security.context.TokenContext;
-import de.ids_mannheim.korap.web.KustvaktResponseHandler;
-
-/**
- * EM: pretty much identical to {@link BlockingFilter}, should be deleted? 
- * 
- * @author hanl
- * @date 11/12/2014
- *       <p/>
- *       endpoint filter to block access to an endpoint, in case no
- *       anonymous access should be allowed!
- */
-@Component
-@Provider
-public class NonDemoBlockingFilter
-        implements ContainerRequestFilter, ResourceFilter {
-
-    @Autowired
-    private KustvaktResponseHandler kustvaktResponseHandler;
-
-    @Override
-    public ContainerRequest filter (ContainerRequest request) {
-        TokenContext context;
-        try {
-            context = (TokenContext) request.getUserPrincipal();
-        }
-        catch (UnsupportedOperationException e) {
-            throw kustvaktResponseHandler.throwit(new KustvaktException(
-                    StatusCodes.UNSUPPORTED_OPERATION, e.getMessage(), e));
-        }
-
-        if (context == null || context.isDemo()) {
-            throw kustvaktResponseHandler.throwit(
-                    new KustvaktException(StatusCodes.AUTHORIZATION_FAILED,
-                            "Operation is not permitted for guest users"));
-        }
-        return request;
-    }
-
-
-    @Override
-    public ContainerRequestFilter getRequestFilter () {
-        return this;
-    }
-
-
-    @Override
-    public ContainerResponseFilter getResponseFilter () {
-        return null;
-    }
-}
diff --git a/full/src/main/java/de/ids_mannheim/korap/web/filter/PiwikFilter.java b/full/src/main/java/de/ids_mannheim/korap/web/filter/PiwikFilter.java
deleted file mode 100644
index 122f717..0000000
--- a/full/src/main/java/de/ids_mannheim/korap/web/filter/PiwikFilter.java
+++ /dev/null
@@ -1,164 +0,0 @@
-package de.ids_mannheim.korap.web.filter;
-
-import java.security.SecureRandom;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Locale;
-import java.util.Map;
-import java.util.Random;
-
-import javax.ws.rs.core.MultivaluedMap;
-import javax.ws.rs.core.UriBuilder;
-import javax.ws.rs.ext.Provider;
-
-import org.apache.logging.log4j.LogManager;
-import org.apache.logging.log4j.Logger;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Component;
-
-import com.sun.jersey.api.client.Client;
-import com.sun.jersey.api.client.WebResource;
-import com.sun.jersey.api.client.config.ClientConfig;
-import com.sun.jersey.api.client.config.DefaultClientConfig;
-import com.sun.jersey.api.client.filter.LoggingFilter;
-import com.sun.jersey.core.util.MultivaluedMapImpl;
-import com.sun.jersey.spi.container.ContainerRequest;
-import com.sun.jersey.spi.container.ContainerRequestFilter;
-import com.sun.jersey.spi.container.ContainerResponseFilter;
-import com.sun.jersey.spi.container.ResourceFilter;
-
-import de.ids_mannheim.korap.authentication.AuthenticationManager;
-import de.ids_mannheim.korap.config.Attributes;
-import de.ids_mannheim.korap.exceptions.KustvaktException;
-import de.ids_mannheim.korap.security.context.TokenContext;
-import de.ids_mannheim.korap.user.User;
-import de.ids_mannheim.korap.user.UserSettings;
-import de.ids_mannheim.korap.user.Userdata;
-import net.minidev.json.JSONArray;
-
-/**
- * @author hanl
- * @date 13/05/2014
- */
-@Component
-@Provider
-public class PiwikFilter implements ContainerRequestFilter, ResourceFilter {
-
-    private WebResource service;
-    //    private static final String SERVICE = "http://localhost:8888";
-    private static final String SERVICE = "http://10.0.10.13";
-    private static Logger jlog = LogManager.getLogger(PiwikFilter.class);
-    public static boolean ENABLED = false;
-    private Map<String, String> customVars;
-    @Autowired
-    private AuthenticationManager authenticationManager;
-
-
-    public PiwikFilter () {
-//        controller = BeansFactory.getKustvaktContext()
-//                .getAuthenticationManager();
-        ClientConfig config = new DefaultClientConfig();
-        Client client = Client.create(config);
-        if (jlog.isDebugEnabled())
-            client.addFilter(new LoggingFilter());
-        UriBuilder b = UriBuilder.fromUri(SERVICE);
-        service = client.resource(b.build());
-        this.customVars = new HashMap<>();
-    }
-
-
-    private void send (ContainerRequest request) {
-        Random random = new SecureRandom();
-        MultivaluedMap<String, String> params = new MultivaluedMapImpl();
-        params.add("idsite", "2");
-        params.add("rec", "1");
-        if (!customVars.isEmpty())
-            params.add("_cvar", translateCustomData());
-        params.add("cip", request.getHeaderValue("Host"));
-        params.add("cookie", "false");
-        params.add("r", String.valueOf(random.nextDouble()));
-        params.add("action_name", request.getRequestUri().toASCIIString());
-
-        Locale l = null;
-        if (request.getAcceptableLanguages() != null)
-            l = request.getAcceptableLanguages().get(0);
-        try {
-            service.path("piwik/piwik.php")
-                    .queryParam("idsite", "2")
-                    .queryParam("rec", "1")
-                    //todo check for empty container
-                    .queryParam("_cvar", translateCustomData())
-                    .queryParam("cip", request.getHeaderValue("Host"))
-                    .queryParam("cookie", "false")
-                    .queryParam("r", String.valueOf(random.nextDouble()))
-                    .queryParam("action_name",
-                            request.getRequestUri().toASCIIString())
-                    .queryParams(params).accept("text/html")
-                    .header("Host", request.getHeaderValue("Host"))
-                    .header("User-Agent", request.getHeaderValue("User-Agent"))
-                    .acceptLanguage(l).method("GET");
-        }
-        catch (Exception e) {
-            // do nothing if piwik not available!
-        }
-    }
-
-
-    private String translateCustomData () {
-        final Map<String, List<String>> customVariables = new HashMap<String, List<String>>();
-        int i = 0;
-        for (final Map.Entry<String, String> entry : this.customVars.entrySet()) {
-            i++;
-            final List<String> list = new ArrayList<String>();
-            list.add(entry.getKey());
-            list.add(entry.getValue());
-            customVariables.put(Integer.toString(i), list);
-        }
-
-        final JSONArray json = new JSONArray();
-        json.add(customVariables);
-
-        // remove unnecessary parent square brackets from JSON-string
-        String jsonString = json.toString().substring(1,
-                json.toString().length() - 1);
-        customVars.clear();
-        return jsonString;
-    }
-
-
-    @Override
-    public ContainerRequest filter (ContainerRequest request) {
-        if (ENABLED) {
-            try {
-                TokenContext context = (TokenContext) request
-                        .getUserPrincipal();
-                if (context.getUsername() != null){
-                    // since this is cached, not very expensive!
-                    User user = authenticationManager.getUser(context.getUsername());
-                    Userdata data = authenticationManager
-                            .getUserData(user, UserSettings.class);
-                    if ((Boolean) data.get(Attributes.COLLECT_AUDITING_DATA))
-                        customVars.put("username", context.getUsername());
-                }
-            }
-            catch (KustvaktException | UnsupportedOperationException e) {
-                //do nothing
-            }
-            send(request);
-        }
-        return request;
-    }
-
-
-    @Override
-    public ContainerRequestFilter getRequestFilter () {
-        return this;
-    }
-
-
-    @Override
-    public ContainerResponseFilter getResponseFilter () {
-        return null;
-    }
-}
diff --git a/full/src/main/resources/META-INF/persistence.xml b/full/src/main/resources/META-INF/persistence.xml
deleted file mode 100644
index 35b8d66..0000000
--- a/full/src/main/resources/META-INF/persistence.xml
+++ /dev/null
@@ -1,10 +0,0 @@
-<persistence xmlns="http://java.sun.com/xml/ns/persistence"
-	version="1.0">
-	<persistence-unit name="entityManagerUnit"
-		transaction-type="RESOURCE_LOCAL">
-		<exclude-unlisted-classes />
-	</persistence-unit>
-	<persistence-unit-metadata>
-		<xml-mapping-metadata-complete />
-	</persistence-unit-metadata>
-</persistence>
\ No newline at end of file
diff --git a/full/src/main/resources/db/lite-sqlite/V1__annotation_tables.sql b/full/src/main/resources/db/lite-sqlite/V1__annotation_tables.sql
deleted file mode 100644
index b0299d1..0000000
--- a/full/src/main/resources/db/lite-sqlite/V1__annotation_tables.sql
+++ /dev/null
@@ -1,53 +0,0 @@
-CREATE TABLE IF NOT EXISTS annotation(
-	id INTEGER PRIMARY KEY AUTOINCREMENT,
-	code VARCHAR(20) NOT NULL,
-	type VARCHAR(20) NOT NULL,
-	text VARCHAR(20) NULL,
-	description VARCHAR(100) NOT NULL,
-	de_description VARCHAR(100)
-);
-
-CREATE UNIQUE INDEX annotation_index ON annotation (code, type);
-
-CREATE TABLE IF NOT EXISTS annotation_layer(
-	id INTEGER PRIMARY KEY AUTOINCREMENT,
-	foundry_id INTEGER NOT NULL,
-	layer_id INTEGER NOT NULL,
-	description VARCHAR(255) NOT NULL,
-	FOREIGN KEY (foundry_id)
-		REFERENCES annotation (id)
-		ON DELETE CASCADE,
-	FOREIGN KEY (layer_id)
-		REFERENCES annotation (id)
-		ON DELETE CASCADE
-);
-
-CREATE UNIQUE INDEX annotation_layer_index ON annotation_layer (foundry_id, layer_id);
-
-CREATE TABLE IF NOT EXISTS annotation_key(
-	id INTEGER PRIMARY KEY AUTOINCREMENT,
-	layer_id INTEGER NOT NULL,
-	key_id INTEGER NOT NULL,
-	FOREIGN KEY (layer_id)
-		REFERENCES annotation_layer (id)
-		ON DELETE CASCADE,
-	FOREIGN KEY (key_id)
-		REFERENCES annotation (id)
-		ON DELETE CASCADE
-);
-
-CREATE UNIQUE INDEX annotation_key_index ON annotation_key (layer_id, key_id);
-
-CREATE TABLE IF NOT EXISTS annotation_value(
-	id INTEGER PRIMARY KEY AUTOINCREMENT,
-	key_id INTEGER NOT NULL,
-	value_id INTEGER NOT NULL,
-	FOREIGN KEY (key_id)
-		REFERENCES annotation_key (id)
-		ON DELETE CASCADE,
-	FOREIGN KEY (key_id)
-		REFERENCES annotation (id)
-		ON DELETE CASCADE
-);
-
-CREATE UNIQUE INDEX annotation_value_index ON annotation_value (key_id, value_id);
diff --git a/full/src/main/resources/kustvakt-lite.conf b/full/src/main/resources/kustvakt-lite.conf
deleted file mode 100644
index f0dd6b3..0000000
--- a/full/src/main/resources/kustvakt-lite.conf
+++ /dev/null
@@ -1,27 +0,0 @@
-# index dir
-krill.indexDir= ../sample-index
-
-krill.index.commit.count = 134217000
-krill.index.commit.log = log/krill.commit.log
-krill.index.commit.auto = 500
-krill.index.relations.max = 100
-
-krill.namedVC=vc
-
-
-# Kustvakt
-
-current.api.version = v1.0
-# multiple versions separated by space
-supported.api.version = v1.0
-
-kustvakt.base.url=/api/*
-kustvakt.default.pos = tt
-kustvakt.default.lemma = tt
-kustvakt.default.token = opennlp
-kustvakt.default.dep = mate
-kustvakt.default.const = mate
-
-# server
-server.port=8089
-server.host=localhost
diff --git a/full/src/main/resources/properties/lite-jdbc.properties b/full/src/main/resources/properties/lite-jdbc.properties
deleted file mode 100644
index 5aa9ca8..0000000
--- a/full/src/main/resources/properties/lite-jdbc.properties
+++ /dev/null
@@ -1,9 +0,0 @@
-#-------------------------------------------------------------------------------
-# Sqlite Settings
-
-jdbc.database=sqlite
-jdbc.driverClassName=org.sqlite.JDBC
-jdbc.url=jdbc:sqlite:liteDB.sqlite
-jdbc.username=pc
-jdbc.password=pc
-jdbc.schemaPath=db.lite-sqlite
\ No newline at end of file
