diff --git a/src/main/java/de/ids_mannheim/korap/auditing/AuditRecord.java b/src/main/java/de/ids_mannheim/korap/auditing/AuditRecord.java
index 8e7169c..c2e0791 100644
--- a/src/main/java/de/ids_mannheim/korap/auditing/AuditRecord.java
+++ b/src/main/java/de/ids_mannheim/korap/auditing/AuditRecord.java
@@ -13,7 +13,8 @@
 /**
  * @author hanl
  *         <p/>
- *         Record holder for auditing requests. Holds the data until it can be persisted to a database
+ *         Record holder for auditing requests. Holds the data until
+ *         it can be persisted to a database
  */
 @Getter
 @Setter
@@ -43,16 +44,19 @@
     private String args;
     private String field_1 = "None";
 
-    private AuditRecord() {
+
+    private AuditRecord () {
         this.timestamp = TimeUtils.getNow().getMillis();
     }
 
-    public AuditRecord(CATEGORY category) {
+
+    public AuditRecord (CATEGORY category) {
         this();
         this.category = category;
     }
 
-    public AuditRecord(CATEGORY cat, Object userID, Integer status) {
+
+    public AuditRecord (CATEGORY cat, Object userID, Integer status) {
         this(cat);
         this.status = status;
         if (userID != null) {
@@ -61,14 +65,16 @@
             //                    user.getTokenContext().getUserAgent());
             this.loc = clientInfoToString("null", "null");
             userid = String.valueOf(userID);
-        }else {
+        }
+        else {
             this.loc = clientInfoToString("null", "null");
             userid = "-1";
         }
     }
 
-    public static AuditRecord serviceRecord(Object user, Integer status,
-            String... args) {
+
+    public static AuditRecord serviceRecord (Object user, Integer status,
+            String ... args) {
         AuditRecord r = new AuditRecord(CATEGORY.SERVICE);
         r.setArgs(Arrays.asList(args).toString());
         r.setUserid(String.valueOf(user));
@@ -76,8 +82,9 @@
         return r;
     }
 
-    public static AuditRecord dbRecord(Object user, Integer status,
-            String... args) {
+
+    public static AuditRecord dbRecord (Object user, Integer status,
+            String ... args) {
         AuditRecord r = new AuditRecord(CATEGORY.DATABASE);
         r.setArgs(Arrays.asList(args).toString());
         r.setUserid(String.valueOf(user));
@@ -85,7 +92,8 @@
         return r;
     }
 
-    public AuditRecord fromJson(String json) {
+
+    public AuditRecord fromJson (String json) {
         JsonNode n = JsonUtils.readTree(json);
         AuditRecord r = new AuditRecord();
         r.setCategory(CATEGORY.valueOf(n.path("category").asText()));
@@ -97,13 +105,15 @@
         return r;
     }
 
-    private String clientInfoToString(String IP, String userAgent) {
+
+    private String clientInfoToString (String IP, String userAgent) {
         return userAgent + "@" + IP;
     }
 
+
     // fixme: add id, useragent
     @Override
-    public String toString() {
+    public String toString () {
         StringBuilder b = new StringBuilder();
         b.append(category.toString().toLowerCase() + " audit : ")
                 .append(userid + "@" + new Date(timestamp)).append("\n")
@@ -116,8 +126,9 @@
         return b.toString();
     }
 
+
     @Override
-    public boolean equals(Object o) {
+    public boolean equals (Object o) {
         if (this == o)
             return true;
         if (o == null || getClass() != o.getClass())
@@ -131,24 +142,23 @@
             return false;
         if (status != null ? !status.equals(that.status) : that.status != null)
             return false;
-        if (field_1 != null ?
-                !field_1.equals(that.field_1) :
-                that.field_1 != null)
+        if (field_1 != null ? !field_1.equals(that.field_1)
+                : that.field_1 != null)
             return false;
         if (loc != null ? !loc.equals(that.loc) : that.loc != null)
             return false;
         if (target != null ? !target.equals(that.target) : that.target != null)
             return false;
-        if (timestamp != null ?
-                !timestamp.equals(that.timestamp) :
-                that.timestamp != null)
+        if (timestamp != null ? !timestamp.equals(that.timestamp)
+                : that.timestamp != null)
             return false;
 
         return true;
     }
 
+
     @Override
-    public int hashCode() {
+    public int hashCode () {
         int result = userid != null ? userid.hashCode() : 0;
         result = 31 * result + (target != null ? target.hashCode() : 0);
         result = 31 * result + category.hashCode();
diff --git a/src/main/java/de/ids_mannheim/korap/config/AuthCodeInfo.java b/src/main/java/de/ids_mannheim/korap/config/AuthCodeInfo.java
index 28b53ae..03c22d5 100644
--- a/src/main/java/de/ids_mannheim/korap/config/AuthCodeInfo.java
+++ b/src/main/java/de/ids_mannheim/korap/config/AuthCodeInfo.java
@@ -6,9 +6,9 @@
 import java.util.List;
 
 /**
-* @author hanl
-* @date 13/05/2015
-*/
+ * @author hanl
+ * @date 13/05/2015
+ */
 @Data
 public class AuthCodeInfo {
     private String clientId;
@@ -18,12 +18,14 @@
     private String code;
     private List<String> tokens;
 
-    public AuthCodeInfo() {
+
+    public AuthCodeInfo () {
         this.setStatus(true);
         this.tokens = new ArrayList<>();
     }
 
-    public AuthCodeInfo(String clientid, String authcode) {
+
+    public AuthCodeInfo (String clientid, String authcode) {
         this();
         this.clientId = clientid;
         this.code = authcode;
diff --git a/src/main/java/de/ids_mannheim/korap/config/BeanConfiguration.java b/src/main/java/de/ids_mannheim/korap/config/BeanConfiguration.java
index a9df16b..b09140e 100644
--- a/src/main/java/de/ids_mannheim/korap/config/BeanConfiguration.java
+++ b/src/main/java/de/ids_mannheim/korap/config/BeanConfiguration.java
@@ -36,42 +36,49 @@
 
     private static BeanHolderHelper beans;
 
+
     //todo: allow this for external plugin systems that are not kustvakt specific
     @Deprecated
-    public static void setCustomBeansHolder(BeanHolderHelper holder) {
+    public static void setCustomBeansHolder (BeanHolderHelper holder) {
         ApplicationContext context = beans.context;
         holder.context = context;
         BeanConfiguration.beans = holder;
     }
 
-    public static BeanHolderHelper getBeans() {
+
+    public static BeanHolderHelper getBeans () {
         return BeanConfiguration.beans;
     }
 
+
     @Deprecated
-    public static void loadAuthenticationProviders() {
+    public static void loadAuthenticationProviders () {
         Set<Class<? extends AuthenticationIface>> set = KustvaktClassLoader
                 .loadSubTypes(AuthenticationIface.class);
         Set<AuthenticationIface> set2 = new HashSet<>();
         for (Class<? extends AuthenticationIface> i : set) {
             try {
                 set2.add(i.newInstance());
-            }catch (InstantiationException | IllegalAccessException e) {
+            }
+            catch (InstantiationException | IllegalAccessException e) {
                 e.printStackTrace();
             }
         }
         try {
             getBeans().getAuthenticationManager().setProviders(set2);
-        }catch (RuntimeException e) {
+        }
+        catch (RuntimeException e) {
             // do nothing
         }
     }
 
-    public static boolean hasContext() {
+
+    public static boolean hasContext () {
         return beans != null && beans.context != null;
     }
 
-    public static void loadClasspathContext(String... files) {
+
+    public static void loadClasspathContext (String ... files) {
         if (hasContext())
             closeApplication();
 
@@ -85,7 +92,8 @@
 
     }
 
-    public static void loadFileContext(String filepath) {
+
+    public static void loadFileContext (String filepath) {
         if (!hasContext()) {
             ApplicationContext context = new FileSystemXmlApplicationContext(
                     "file:" + filepath);
@@ -93,15 +101,17 @@
         }
     }
 
-    public static void closeApplication() {
+
+    public static void closeApplication () {
         if (hasContext())
             beans.finish();
         beans = null;
     }
 
+
     //todo: set response handler
     @Deprecated
-    public static KustvaktResponseHandler getResponseHandler() {
+    public static KustvaktResponseHandler getResponseHandler () {
         return null;
     }
 
@@ -110,78 +120,94 @@
         private ApplicationContext context = null;
         private DefaultHandler handler;
 
-        private BeanHolderHelper(ApplicationContext context) {
+
+        private BeanHolderHelper (ApplicationContext context) {
             this.handler = new DefaultHandler();
             this.context = context;
             // todo: better method?!
             KustvaktResponseHandler.init(getAuditingProvider());
         }
 
-        protected <T> T getBean(Class<T> clazz) {
+
+        protected <T> T getBean (Class<T> clazz) {
             if (context != null) {
                 try {
                     return context.getBean(clazz);
-                }catch (NoSuchBeanDefinitionException e) {
+                }
+                catch (NoSuchBeanDefinitionException e) {
                     // do nothing
                 }
             }
             return this.handler.getDefault(clazz);
         }
 
-        protected <T> T getBean(String name) {
+
+        protected <T> T getBean (String name) {
             if (context != null) {
                 try {
                     return (T) context.getBean(name);
-                }catch (NoSuchBeanDefinitionException e) {
+                }
+                catch (NoSuchBeanDefinitionException e) {
                     // do nothing
                 }
             }
             return (T) this.handler.getDefault(name);
         }
 
-        public AuditingIface getAuditingProvider() {
+
+        public AuditingIface getAuditingProvider () {
             return (AuditingIface) getBean(KUSTVAKT_AUDITING);
         }
 
-        public <T extends KustvaktConfiguration> T getConfiguration() {
+
+        public <T extends KustvaktConfiguration> T getConfiguration () {
             return (T) getBean(KUSTVAKT_CONFIG);
         }
 
-        public PersistenceClient getPersistenceClient() {
+
+        public PersistenceClient getPersistenceClient () {
             return getBean(KUSTVAKT_DB);
         }
 
-        public UserDataDbIface getUserDetailsDao() {
+
+        public UserDataDbIface getUserDetailsDao () {
             return getBean(KUSTVAKT_USERDETAILS);
         }
 
-        public UserDataDbIface getUserSettingsDao() {
+
+        public UserDataDbIface getUserSettingsDao () {
             return getBean(KUSTVAKT_USERSETTINGS);
         }
 
-        public EncryptionIface getEncryption() {
+
+        public EncryptionIface getEncryption () {
             return getBean(KUSTVAKT_ENCRYPTION);
         }
 
-        public AuthenticationManagerIface getAuthenticationManager() {
+
+        public AuthenticationManagerIface getAuthenticationManager () {
             return getBean(KUSTVAKT_AUTHENTICATION_MANAGER);
         }
 
-        public EntityHandlerIface getUserDBHandler() {
+
+        public EntityHandlerIface getUserDBHandler () {
             return getBean(KUSTVAKT_USERDB);
         }
 
-        public PolicyHandlerIface getPolicyDbProvider() {
+
+        public PolicyHandlerIface getPolicyDbProvider () {
             return getBean(KUSTVAKT_POLICIES);
         }
 
+
         // todo: !!!!!!!!!!!!!!!!!!!!!!!!!!
         // todo: more specific --> collection provider, document provider, etc.
-        public ResourceOperationIface getResourceProvider() {
+        public ResourceOperationIface getResourceProvider () {
             return getBean("resourceProvider");
         }
 
-        private void finish() {
+
+        private void finish () {
             this.getAuditingProvider().finish();
             context = null;
         }
diff --git a/src/main/java/de/ids_mannheim/korap/config/BeansFactory.java b/src/main/java/de/ids_mannheim/korap/config/BeansFactory.java
index b2ea511..6e79890 100644
--- a/src/main/java/de/ids_mannheim/korap/config/BeansFactory.java
+++ b/src/main/java/de/ids_mannheim/korap/config/BeansFactory.java
@@ -24,89 +24,98 @@
 
     private static ContextHolder beanHolder;
 
+
     //todo: allow this for external plugin systems that are not kustvakt specific
     @Deprecated
-    public static void setCustomBeansHolder(ContextHolder holder) {
+    public static void setCustomBeansHolder (ContextHolder holder) {
         beanHolder = holder;
     }
 
-    public static synchronized ContextHolder getKustvaktContext() {
+
+    public static synchronized ContextHolder getKustvaktContext () {
         return beanHolder;
     }
 
-    public static synchronized ContextHolder getKustvaktContext(int i) {
+
+    public static synchronized ContextHolder getKustvaktContext (int i) {
         return beanHolder;
     }
 
-    public static synchronized TypeBeanFactory getTypeFactory() {
+
+    public static synchronized TypeBeanFactory getTypeFactory () {
         return new TypeBeanFactory(beanHolder);
     }
 
-    public static int loadClasspathContext(String... files) {
+
+    public static int loadClasspathContext (String ... files) {
         ApplicationContext context;
         if (files.length == 0)
             context = new ClassPathXmlApplicationContext(CONFIG_FILE);
         else
             context = new ClassPathXmlApplicationContext(files);
-        ContextHolder h = new ContextHolder(context) {
-        };
+        ContextHolder h = new ContextHolder(context) {};
         BeansFactory.beanHolder = h;
         //        return BeansFactory.beanHolder.indexOf(h);
         return 0;
     }
 
-    public static synchronized int addApplicationContext(
+
+    public static synchronized int addApplicationContext (
             ApplicationContext context) {
-        ContextHolder h = new ContextHolder(context) {
-        };
+        ContextHolder h = new ContextHolder(context) {};
         BeansFactory.beanHolder = h;
         //        return BeansFactory.beanHolder.indexOf(h);
         return 0;
     }
 
-    public static synchronized void setKustvaktContext(ContextHolder holder) {
+
+    public static synchronized void setKustvaktContext (ContextHolder holder) {
         BeansFactory.beanHolder = holder;
     }
 
-    public static synchronized int setApplicationContext(
+
+    public static synchronized int setApplicationContext (
             ApplicationContext context) {
-        ContextHolder h = new ContextHolder(context) {
-        };
+        ContextHolder h = new ContextHolder(context) {};
         BeansFactory.beanHolder = h;
         return 0;
     }
 
-    public static synchronized int loadFileContext(String filepath) {
+
+    public static synchronized int loadFileContext (String filepath) {
         ApplicationContext context = new FileSystemXmlApplicationContext(
                 "file:" + filepath);
-        ContextHolder h = new ContextHolder(context) {
-        };
+        ContextHolder h = new ContextHolder(context) {};
         BeansFactory.beanHolder = h;
         return 0;
     }
 
-    public static void closeApplication() {
+
+    public static void closeApplication () {
         BeansFactory.beanHolder = null;
     }
 
+
     //todo: set response handler
     @Deprecated
-    public static KustvaktResponseHandler getResponseHandler() {
+    public static KustvaktResponseHandler getResponseHandler () {
         return null;
     }
 
-    public BeansFactory() {
-    }
+
+    public BeansFactory () {}
 
     public static class TypeBeanFactory {
 
         private ContextHolder holder;
 
-        private TypeBeanFactory(ContextHolder holder) {
+
+        private TypeBeanFactory (ContextHolder holder) {
             this.holder = holder;
         }
 
-        public <T> T getTypedBean(Collection objs, Class type) {
+
+        public <T> T getTypedBean (Collection objs, Class type) {
             for (Object o : objs) {
                 Type gtype = o.getClass().getGenericInterfaces()[0];
                 if (gtype instanceof ParameterizedType) {
@@ -116,11 +125,14 @@
                         return (T) o;
                 }
             }
-            throw new RuntimeException("Could not find typed bean in context for class '"+type+"'");
+            throw new RuntimeException(
+                    "Could not find typed bean in context for class '" + type
+                            + "'");
         }
 
+
         @Deprecated
-        public UserDataDbIface getUserDaoInstance(
+        public UserDataDbIface getUserDaoInstance (
                 Class<? extends Userdata> type) {
             return getTypedBean(this.holder.getUserDataDaos(), type);
         }
diff --git a/src/main/java/de/ids_mannheim/korap/config/ClientInfo.java b/src/main/java/de/ids_mannheim/korap/config/ClientInfo.java
index fc856b4..5344b98 100644
--- a/src/main/java/de/ids_mannheim/korap/config/ClientInfo.java
+++ b/src/main/java/de/ids_mannheim/korap/config/ClientInfo.java
@@ -21,12 +21,14 @@
     private String url;
     private String redirect_uri;
 
-    public ClientInfo(String client_id, String client_secret) {
+
+    public ClientInfo (String client_id, String client_secret) {
         this.client_id = client_id;
         this.client_secret = client_secret;
     }
 
-    public String toJSON() {
+
+    public String toJSON () {
         ObjectNode node = JsonUtils.createObjectNode();
         node.put("client_id", client_id);
         node.put("client_secret", client_secret);
@@ -36,15 +38,16 @@
         return JsonUtils.toJSON(node);
     }
 
-    public String toString() {
-        return "client_id: " + client_id + "\n" +
-                "application_name: " + application_name + "\n" +
-                "url: " + url + "\n" +
-                "redirect_uri: " + redirect_uri + "\n";
+
+    public String toString () {
+        return "client_id: " + client_id + "\n" + "application_name: "
+                + application_name + "\n" + "url: " + url + "\n"
+                + "redirect_uri: " + redirect_uri + "\n";
     }
 
+
     //todo:
-    public static ClientInfo fromJSON(String json) {
+    public static ClientInfo fromJSON (String json) {
         return null;
     }
 }
diff --git a/src/main/java/de/ids_mannheim/korap/config/ContextHolder.java b/src/main/java/de/ids_mannheim/korap/config/ContextHolder.java
index 02e7232..b652a19 100644
--- a/src/main/java/de/ids_mannheim/korap/config/ContextHolder.java
+++ b/src/main/java/de/ids_mannheim/korap/config/ContextHolder.java
@@ -31,30 +31,35 @@
     private ApplicationContext context = null;
     private DefaultHandler handler;
 
-    public ContextHolder(ApplicationContext context) {
+
+    public ContextHolder (ApplicationContext context) {
         this.handler = new DefaultHandler();
         this.context = context;
         // todo: better method?!
         KustvaktResponseHandler.init(getAuditingProvider());
     }
 
-    protected <T> T getBean(Class<T> clazz) {
+
+    protected <T> T getBean (Class<T> clazz) {
         if (this.context != null) {
             try {
                 return context.getBean(clazz);
-            }catch (NoSuchBeanDefinitionException e) {
+            }
+            catch (NoSuchBeanDefinitionException e) {
                 // do nothing
             }
         }
         return this.handler.getDefault(clazz);
     }
 
-    protected <T> T getBean(String name) {
+
+    protected <T> T getBean (String name) {
         T bean = null;
         if (this.context != null) {
             try {
                 bean = (T) context.getBean(name);
-            }catch (NoSuchBeanDefinitionException e) {
+            }
+            catch (NoSuchBeanDefinitionException e) {
                 // do nothing
                 bean = (T) this.handler.getDefault(name);
             }
@@ -63,52 +68,61 @@
         return bean;
     }
 
-    public AuditingIface getAuditingProvider() {
+
+    public AuditingIface getAuditingProvider () {
         return (AuditingIface) getBean(KUSTVAKT_AUDITING);
     }
 
-    public <T extends KustvaktConfiguration> T getConfiguration() {
+
+    public <T extends KustvaktConfiguration> T getConfiguration () {
         return (T) getBean(KUSTVAKT_CONFIG);
     }
 
-    public PersistenceClient getPersistenceClient() {
+
+    public PersistenceClient getPersistenceClient () {
         return getBean(KUSTVAKT_DB);
     }
 
-    public Collection<UserDataDbIface> getUserDataDaos() {
+
+    public Collection<UserDataDbIface> getUserDataDaos () {
         return getBean(KUSTVAKT_USERDATA);
     }
 
-    public EncryptionIface getEncryption() {
+
+    public EncryptionIface getEncryption () {
         return getBean(KUSTVAKT_ENCRYPTION);
     }
 
-    public AuthenticationManagerIface getAuthenticationManager() {
+
+    public AuthenticationManagerIface getAuthenticationManager () {
         return getBean(KUSTVAKT_AUTHENTICATION_MANAGER);
     }
 
-    public EntityHandlerIface getUserDBHandler() {
+
+    public EntityHandlerIface getUserDBHandler () {
         return getBean(KUSTVAKT_USERDB);
     }
 
-    public PolicyHandlerIface getPolicyDbProvider() {
+
+    public PolicyHandlerIface getPolicyDbProvider () {
         Object b = getBean(KUSTVAKT_POLICIES);
         return (PolicyHandlerIface) b;
     }
 
 
-    public Collection<AuthenticationIface> getAuthProviders() {
+    public Collection<AuthenticationIface> getAuthProviders () {
         return getBean(KUSTVAKT_AUTHPROVIDERS);
     }
 
+
     // todo: !!!!!!!!!!!!!!!!!!!!!!!!!!
     // todo: more specific --> collection provider, document provider, etc.
-    public Collection<ResourceOperationIface> getResourceProvider() {
+    public Collection<ResourceOperationIface> getResourceProvider () {
         return getBean(KUSTVAKT_RESOURCES);
     }
 
 
-    private void finish() {
+    private void finish () {
         this.getAuditingProvider().finish();
         this.context = null;
     }
diff --git a/src/main/java/de/ids_mannheim/korap/config/DefaultHandler.java b/src/main/java/de/ids_mannheim/korap/config/DefaultHandler.java
index 38af9f3..982985f 100644
--- a/src/main/java/de/ids_mannheim/korap/config/DefaultHandler.java
+++ b/src/main/java/de/ids_mannheim/korap/config/DefaultHandler.java
@@ -12,12 +12,14 @@
 
     private Map<String, Object> defaults;
 
-    public DefaultHandler() {
+
+    public DefaultHandler () {
         this.defaults = new HashMap<>();
         loadClasses();
     }
 
-    private void loadClasses() {
+
+    private void loadClasses () {
         Set<Class<?>> cls = KustvaktClassLoader
                 .loadFromAnnotation(Configurable.class);
         for (Class clazz : cls) {
@@ -25,17 +27,20 @@
                     .getAnnotation(Configurable.class);
             try {
                 this.defaults.put(c.value(), clazz.newInstance());
-            }catch (InstantiationException | IllegalAccessException e) {
+            }
+            catch (InstantiationException | IllegalAccessException e) {
                 throw new RuntimeException("Could not instantiate class");
             }
         }
     }
 
-    public Object getDefault(String name) {
+
+    public Object getDefault (String name) {
         return this.defaults.get(name);
     }
 
-    public <T> T getDefault(Class<T> tClass) {
+
+    public <T> T getDefault (Class<T> tClass) {
         for (Object o : this.defaults.values()) {
             if (o.getClass().equals(tClass))
                 return (T) o;
@@ -43,12 +48,14 @@
         return null;
     }
 
-    public void remove(String name) {
+
+    public void remove (String name) {
         this.defaults.remove(name);
     }
 
+
     @Override
-    public String toString() {
+    public String toString () {
         return defaults.toString();
     }
 }
diff --git a/src/main/java/de/ids_mannheim/korap/config/JWTSigner.java b/src/main/java/de/ids_mannheim/korap/config/JWTSigner.java
index d959604..8d1d08b 100644
--- a/src/main/java/de/ids_mannheim/korap/config/JWTSigner.java
+++ b/src/main/java/de/ids_mannheim/korap/config/JWTSigner.java
@@ -29,23 +29,27 @@
     private JWSVerifier verifier;
     private final int defaultttl;
 
-    public JWTSigner(final byte[] secret, URL issuer, final int defaultttl) {
+
+    public JWTSigner (final byte[] secret, URL issuer, final int defaultttl) {
         this.issuer = issuer;
         this.signer = new MACSigner(secret);
         this.verifier = new MACVerifier(secret);
         this.defaultttl = defaultttl;
     }
 
-    public JWTSigner(final byte[] secret, String issuer)
+
+    public JWTSigner (final byte[] secret, String issuer)
             throws MalformedURLException {
         this(secret, new URL(issuer), 72 * 60 * 60);
     }
 
-    public SignedJWT createJWT(User user, Map<String, Object> attr) {
+
+    public SignedJWT createJWT (User user, Map<String, Object> attr) {
         return signContent(user, attr, defaultttl);
     }
 
-    public SignedJWT signContent(User user, Map<String, Object> attr, int ttl) {
+
+    public SignedJWT signContent (User user, Map<String, Object> attr, int ttl) {
         String scopes;
 
         JWTClaimsSet cs = new JWTClaimsSet();
@@ -58,33 +62,35 @@
 
         cs.setSubjectClaim(user.getUsername());
         if (attr.get(Attributes.CLIENT_ID) != null)
-            cs.setAudienceClaim(
-                    new String[] { (String) attr.get(Attributes.CLIENT_ID) });
-        cs.setExpirationTimeClaim(
-                TimeUtils.getNow().plusSeconds(ttl).getMillis());
+            cs.setAudienceClaim(new String[] { (String) attr
+                    .get(Attributes.CLIENT_ID) });
+        cs.setExpirationTimeClaim(TimeUtils.getNow().plusSeconds(ttl)
+                .getMillis());
         SignedJWT signedJWT = new SignedJWT(new JWSHeader(JWSAlgorithm.HS256),
                 cs);
         try {
             signedJWT.sign(signer);
-        }catch (JOSEException e) {
+        }
+        catch (JOSEException e) {
             return null;
         }
         return signedJWT;
     }
 
+
     /**
      * @param username
      * @param json
      * @return
      */
-    public SignedJWT signContent(String username, String userclient,
+    public SignedJWT signContent (String username, String userclient,
             String json, int ttl) {
         JWTClaimsSet cs = new JWTClaimsSet();
         cs.setSubjectClaim(username);
         if (!json.isEmpty())
             cs.setCustomClaim("data", json);
-        cs.setExpirationTimeClaim(
-                TimeUtils.getNow().plusSeconds(ttl).getMillis());
+        cs.setExpirationTimeClaim(TimeUtils.getNow().plusSeconds(ttl)
+                .getMillis());
         cs.setIssuerClaim(this.issuer.toString());
 
         if (!userclient.isEmpty())
@@ -94,27 +100,32 @@
                 cs);
         try {
             signedJWT.sign(signer);
-        }catch (JOSEException e) {
+        }
+        catch (JOSEException e) {
             return null;
         }
         return signedJWT;
     }
 
-    public SignedJWT signContent(String username, String userclient,
+
+    public SignedJWT signContent (String username, String userclient,
             String json) {
         return signContent(username, userclient, json, defaultttl);
     }
 
-    public SignedJWT createSignedToken(String username) {
+
+    public SignedJWT createSignedToken (String username) {
         return createSignedToken(username, defaultttl);
     }
 
+
     // add client info
-    public SignedJWT createSignedToken(String username, int ttl) {
+    public SignedJWT createSignedToken (String username, int ttl) {
         return signContent(username, "", "", ttl);
     }
 
-    public SignedJWT verifyToken(String token) throws KustvaktException {
+
+    public SignedJWT verifyToken (String token) throws KustvaktException {
         SignedJWT client;
         try {
             client = SignedJWT.parse(token);
@@ -125,7 +136,8 @@
                     .isAfterNow())
                 throw new KustvaktException(StatusCodes.EXPIRED,
                         "authentication token is expired", token);
-        }catch (ParseException | JOSEException e) {
+        }
+        catch (ParseException | JOSEException e) {
             //todo: message or entity, how to treat??!
             throw new KustvaktException(StatusCodes.ILLEGAL_ARGUMENT,
                     "token could not be verified", token);
@@ -133,8 +145,9 @@
         return client;
     }
 
+
     // does not care about expiration times
-    public String retrieveContent(String signedContent)
+    public String retrieveContent (String signedContent)
             throws KustvaktException {
         SignedJWT jwt;
         try {
@@ -143,22 +156,24 @@
                 throw new KustvaktException(StatusCodes.REQUEST_INVALID,
                         "token invalid", signedContent);
             return (String) jwt.getJWTClaimsSet().getCustomClaim("data");
-        }catch (ParseException | JOSEException e) {
+        }
+        catch (ParseException | JOSEException e) {
             return null;
         }
     }
 
-    public TokenContext getTokenContext(String idtoken)
-            throws ParseException, JOSEException, KustvaktException {
+
+    public TokenContext getTokenContext (String idtoken) throws ParseException,
+            JOSEException, KustvaktException {
         SignedJWT signedJWT = verifyToken(idtoken);
 
         TokenContext c = new TokenContext();
         c.setUsername(signedJWT.getJWTClaimsSet().getSubjectClaim());
         if (signedJWT.getJWTClaimsSet().getAudienceClaim() != null)
-            c.addContextParameter(Attributes.CLIENT_ID,
-                    signedJWT.getJWTClaimsSet().getAudienceClaim()[0]);
-        c.setExpirationTime(
-                signedJWT.getJWTClaimsSet().getExpirationTimeClaim());
+            c.addContextParameter(Attributes.CLIENT_ID, signedJWT
+                    .getJWTClaimsSet().getAudienceClaim()[0]);
+        c.setExpirationTime(signedJWT.getJWTClaimsSet()
+                .getExpirationTimeClaim());
         c.setToken(idtoken);
         c.addParams(signedJWT.getJWTClaimsSet().getCustomClaims());
         return c;
diff --git a/src/main/java/de/ids_mannheim/korap/config/KustvaktBaseDaoInterface.java b/src/main/java/de/ids_mannheim/korap/config/KustvaktBaseDaoInterface.java
index cc23238..2543d73 100644
--- a/src/main/java/de/ids_mannheim/korap/config/KustvaktBaseDaoInterface.java
+++ b/src/main/java/de/ids_mannheim/korap/config/KustvaktBaseDaoInterface.java
@@ -6,8 +6,9 @@
  */
 public interface KustvaktBaseDaoInterface {
 
-    int size();
+    int size ();
 
-    int truncate();
+
+    int truncate ();
 
 }
diff --git a/src/main/java/de/ids_mannheim/korap/config/KustvaktCacheManager.java b/src/main/java/de/ids_mannheim/korap/config/KustvaktCacheManager.java
index f061daa..f3bcc53 100644
--- a/src/main/java/de/ids_mannheim/korap/config/KustvaktCacheManager.java
+++ b/src/main/java/de/ids_mannheim/korap/config/KustvaktCacheManager.java
@@ -15,12 +15,14 @@
 
     private static boolean loaded = false;
 
-    public static void init() {
+
+    public static void init () {
         if (!loaded) {
             InputStream in = null;
             try {
                 in = new FileInputStream(new File("./ehcache.xml"));
-            }catch (FileNotFoundException e) {
+            }
+            catch (FileNotFoundException e) {
                 // do nothing
             }
 
diff --git a/src/main/java/de/ids_mannheim/korap/config/KustvaktClassLoader.java b/src/main/java/de/ids_mannheim/korap/config/KustvaktClassLoader.java
index 8832307..83100bc 100644
--- a/src/main/java/de/ids_mannheim/korap/config/KustvaktClassLoader.java
+++ b/src/main/java/de/ids_mannheim/korap/config/KustvaktClassLoader.java
@@ -16,26 +16,30 @@
     private static final Reflections reflections = new Reflections(
             "de.ids_mannheim.korap");
 
-    private KustvaktClassLoader() {
-    }
+
+    private KustvaktClassLoader () {}
+
 
     /**
      * loads interface implementations in current classpath
-     *
+     * 
      * @param iface
      * @param <T>
      * @return
      */
-    public static <T> Set<Class<? extends T>> loadSubTypes(Class<T> iface) {
+    public static <T> Set<Class<? extends T>> loadSubTypes (Class<T> iface) {
         return reflections.getSubTypesOf(iface);
     }
 
-    public static Set<Class<?>> loadFromAnnotation(
+
+    public static Set<Class<?>> loadFromAnnotation (
             Class<? extends Annotation> annotation) {
         return reflections.getTypesAnnotatedWith(annotation);
     }
 
-    public static <T> Class<? extends T> getTypeClass(Class type, Class<T> iface) {
+
+    public static <T> Class<? extends T> getTypeClass (Class type,
+            Class<T> iface) {
         Set<Class<? extends T>> c = KustvaktClassLoader.loadSubTypes(iface);
         for (Class<? extends T> o : c) {
             Type ctype = o.getGenericInterfaces()[0];
diff --git a/src/main/java/de/ids_mannheim/korap/config/KustvaktConfiguration.java b/src/main/java/de/ids_mannheim/korap/config/KustvaktConfiguration.java
index c2f3c0f..d9b5d8a 100644
--- a/src/main/java/de/ids_mannheim/korap/config/KustvaktConfiguration.java
+++ b/src/main/java/de/ids_mannheim/korap/config/KustvaktConfiguration.java
@@ -17,8 +17,9 @@
 import java.util.*;
 
 /**
- * if configuration class is extended, loadSubTypes method should be overriden
- *
+ * if configuration class is extended, loadSubTypes method should be
+ * overriden
+ * 
  * @author hanl
  * @date 05/02/2014
  */
@@ -85,21 +86,22 @@
     // deprec?!
     private final BACKENDS DEFAULT_ENGINE = BACKENDS.LUCENE;
 
+
     /**
      * loading of the properties and mapping to parameter variables
-     *
+     * 
      * @param properties
      * @return
      */
-    protected Properties load(Properties properties)
+    protected Properties load (Properties properties)
             throws MalformedURLException {
         maxhits = new Integer(properties.getProperty("maxhits", "50000"));
         returnhits = new Integer(properties.getProperty("returnhits", "50000"));
         indexDir = properties.getProperty("krill.indexDir", "");
         port = new Integer(properties.getProperty("server.port", "8095"));
         // server options
-        serverHost = String
-                .valueOf(properties.getProperty("server.host", "localhost"));
+        serverHost = String.valueOf(properties.getProperty("server.host",
+                "localhost"));
         String queries = properties.getProperty("korap.ql", "");
         String[] qls = queries.split(",");
         queryLanguages = new ArrayList<>();
@@ -116,81 +118,86 @@
         default_dep = properties.getProperty("kustvakt.default.dep", "mate");
         default_lemma = properties.getProperty("kustvakt.default.lemma", "tt");
         default_pos = properties.getProperty("kustvakt.default.pos", "tt");
-        default_token = properties
-                .getProperty("kustvakt.default.token", "opennlp");
+        default_token = properties.getProperty("kustvakt.default.token",
+                "opennlp");
 
         // security configuration
-        expiration = TimeUtils.convertTimeToSeconds(properties
-                .getProperty("security.absoluteTimeoutDuration", "25M"));
-        inactiveTime = TimeUtils.convertTimeToSeconds(
-                properties.getProperty("security.idleTimeoutDuration", "10M"));
-        allowMultiLogIn = Boolean
-                .valueOf(properties.getProperty("security.multipleLogIn"));
+        expiration = TimeUtils.convertTimeToSeconds(properties.getProperty(
+                "security.absoluteTimeoutDuration", "25M"));
+        inactiveTime = TimeUtils.convertTimeToSeconds(properties.getProperty(
+                "security.idleTimeoutDuration", "10M"));
+        allowMultiLogIn = Boolean.valueOf(properties
+                .getProperty("security.multipleLogIn"));
 
-        loginAttemptNum = Long.parseLong(
-                properties.getProperty("security.loginAttemptNum", "3"));
-        loginAttemptTTL = TimeUtils.convertTimeToSeconds(
-                properties.getProperty("security.authAttemptTTL", "30M"));
+        loginAttemptNum = Long.parseLong(properties.getProperty(
+                "security.loginAttemptNum", "3"));
+        loginAttemptTTL = TimeUtils.convertTimeToSeconds(properties
+                .getProperty("security.authAttemptTTL", "30M"));
 
-        loadFactor = Integer.valueOf(
-                properties.getProperty("security.encryption.loadFactor", "15"));
-        validationStringLength = Integer.valueOf(properties
-                .getProperty("security.validation.stringLength", "150"));
-        validationEmaillength = Integer.valueOf(properties
-                .getProperty("security.validation.emailLength", "40"));
+        loadFactor = Integer.valueOf(properties.getProperty(
+                "security.encryption.loadFactor", "15"));
+        validationStringLength = Integer.valueOf(properties.getProperty(
+                "security.validation.stringLength", "150"));
+        validationEmaillength = Integer.valueOf(properties.getProperty(
+                "security.validation.emailLength", "40"));
         encryption = Enum.valueOf(EncryptionIface.Encryption.class,
                 properties.getProperty("security.encryption", "BCRYPT"));
         sharedSecret = properties.getProperty("security.sharedSecret", "")
                 .getBytes();
         adminToken = properties.getProperty("security.adminToken");
 
-        longTokenTTL = TimeUtils.convertTimeToSeconds(
-                properties.getProperty("security.longTokenTTL", "100D"));
-        tokenTTL = TimeUtils.convertTimeToSeconds(
-                properties.getProperty("security.tokenTTL", "72H"));
-        shortTokenTTL = TimeUtils.convertTimeToSeconds(
-                properties.getProperty("security.shortTokenTTL", "3H"));
+        longTokenTTL = TimeUtils.convertTimeToSeconds(properties.getProperty(
+                "security.longTokenTTL", "100D"));
+        tokenTTL = TimeUtils.convertTimeToSeconds(properties.getProperty(
+                "security.tokenTTL", "72H"));
+        shortTokenTTL = TimeUtils.convertTimeToSeconds(properties.getProperty(
+                "security.shortTokenTTL", "3H"));
 
-        passcodeSaltField = properties
-                .getProperty("security.passcode.salt", "accountCreation");
+        passcodeSaltField = properties.getProperty("security.passcode.salt",
+                "accountCreation");
 
         return properties;
     }
 
+
     /**
      * set properties
-     *
+     * 
      * @param props
      */
-    public void setProperties(Properties props) throws MalformedURLException {
+    public void setProperties (Properties props) throws MalformedURLException {
         this.load(props);
     }
 
+
     /**
      * properties can be overloaded after spring init
-     *
+     * 
      * @param stream
      */
-    public void setPropertiesAsStream(InputStream stream) {
+    public void setPropertiesAsStream (InputStream stream) {
         try {
 
             Properties p = new Properties();
             p.load(stream);
             this.load(p);
-        }catch (IOException e) {
+        }
+        catch (IOException e) {
             e.printStackTrace();
         }
 
     }
 
-    public BACKENDS chooseBackend(String value) {
+
+    public BACKENDS chooseBackend (String value) {
         if (value == null || value.equals("null"))
             return DEFAULT_ENGINE;
         else
             return Enum.valueOf(BACKENDS.class, value.toUpperCase());
     }
 
-    public static void loadLog4jLogger() {
+
+    public static void loadLog4jLogger () {
         /** loadSubTypes log4j configuration file programmatically */
         Properties log4j = new Properties();
         try {
@@ -204,27 +211,28 @@
                         "./log4j.properties");
                 return;
             }
-        }catch (Exception e) {
+        }
+        catch (Exception e) {
             // do nothing
         }
         loadClassLogger();
     }
 
-    private static void loadClassLogger() {
+
+    private static void loadClassLogger () {
         Properties log4j = new Properties();
-        jlog.info(
-                "using class path logging properties file to configure logging system");
+        jlog.info("using class path logging properties file to configure logging system");
 
         try {
             log4j.load(KustvaktConfiguration.class.getClassLoader()
                     .getResourceAsStream("log4j.properties"));
-        }catch (IOException e) {
+        }
+        catch (IOException e) {
             // do nothing
         }
 
         PropertyConfigurator.configure(log4j);
-        jlog.warn(
-                "No logger properties detected. Using default logger properties");
+        jlog.warn("No logger properties detected. Using default logger properties");
     }
 
     public enum BACKENDS {
diff --git a/src/main/java/de/ids_mannheim/korap/config/KustvaktTypeInterface.java b/src/main/java/de/ids_mannheim/korap/config/KustvaktTypeInterface.java
index a5270bd..5980aa2 100644
--- a/src/main/java/de/ids_mannheim/korap/config/KustvaktTypeInterface.java
+++ b/src/main/java/de/ids_mannheim/korap/config/KustvaktTypeInterface.java
@@ -6,5 +6,5 @@
  */
 public interface KustvaktTypeInterface<T> {
 
-    Class<T> type();
+    Class<T> type ();
 }
diff --git a/src/main/java/de/ids_mannheim/korap/config/ParamFields.java b/src/main/java/de/ids_mannheim/korap/config/ParamFields.java
index 0dfa15b..2d9a255 100644
--- a/src/main/java/de/ids_mannheim/korap/config/ParamFields.java
+++ b/src/main/java/de/ids_mannheim/korap/config/ParamFields.java
@@ -12,19 +12,22 @@
 // could also be an array or list!
 public class ParamFields extends HashMap<String, ParamFields.Param> {
 
-    public void add(Param param) {
+    public void add (Param param) {
         this.put(param.getClass().getName(), param);
     }
 
-    public <T extends Param> T get(Class<T> cl) {
+
+    public <T extends Param> T get (Class<T> cl) {
         return (T) this.get(cl.getName());
     }
 
-    public <T extends Param> T remove(Class<T> cl) {
+
+    public <T extends Param> T remove (Class<T> cl) {
         return (T) this.remove(cl.getName());
     }
 
-    public void addAll(Collection<Param> params) {
+
+    public void addAll (Collection<Param> params) {
         for (Param p : params)
             super.put(p.getClass().getName(), p);
     }
@@ -32,7 +35,7 @@
     @Getter
     public abstract static class Param {
 
-        public boolean hasValues() {
+        public boolean hasValues () {
             return false;
         }
 
diff --git a/src/main/java/de/ids_mannheim/korap/config/QueryBuilderUtil.java b/src/main/java/de/ids_mannheim/korap/config/QueryBuilderUtil.java
index d0cfe19..bc21668 100644
--- a/src/main/java/de/ids_mannheim/korap/config/QueryBuilderUtil.java
+++ b/src/main/java/de/ids_mannheim/korap/config/QueryBuilderUtil.java
@@ -8,9 +8,8 @@
  */
 public class QueryBuilderUtil {
 
-    public static MetaQueryBuilder defaultMetaBuilder(Integer pageIndex,
-            Integer pageInteger, Integer pageLength, String ctx,
-            Boolean cutoff) {
+    public static MetaQueryBuilder defaultMetaBuilder (Integer pageIndex,
+            Integer pageInteger, Integer pageLength, String ctx, Boolean cutoff) {
         MetaQueryBuilder meta = new MetaQueryBuilder();
         meta.addEntry("startIndex", pageIndex)
                 .addEntry("startPage", pageInteger)
diff --git a/src/main/java/de/ids_mannheim/korap/config/Scopes.java b/src/main/java/de/ids_mannheim/korap/config/Scopes.java
index cce49e8..a280c10 100644
--- a/src/main/java/de/ids_mannheim/korap/config/Scopes.java
+++ b/src/main/java/de/ids_mannheim/korap/config/Scopes.java
@@ -29,7 +29,8 @@
     private static final Enum[] SERVICE_DEFAULTS = { Scope.account,
             Scope.preferences, Scope.search, Scope.queries };
 
-    public static Scopes getProfileScopes(Map<String, Object> values) {
+
+    public static Scopes getProfileScopes (Map<String, Object> values) {
         Scopes r = new Scopes();
         for (String key : profile) {
             Object v = values.get(key);
@@ -39,21 +40,23 @@
         return r;
     }
 
+
     /**
      * expects space separated values
-     *
+     * 
      * @param scopes
      * @return
      */
     //todo: test
-    public static Scope[] mapScopes(String scopes) {
+    public static Scope[] mapScopes (String scopes) {
         List<Enum> s = new ArrayList<>();
         for (String value : scopes.split(" "))
             s.add(Scope.valueOf(value.toLowerCase()));
         return s.toArray(new Scope[s.size()]);
     }
 
-    public static Scopes mapScopes(String scopes, Map<String, Object> details) {
+
+    public static Scopes mapScopes (String scopes, Map<String, Object> details) {
         Scopes m = new Scopes();
         if (scopes != null && !scopes.isEmpty()) {
             Scope[] scopearr = mapScopes(scopes);
@@ -71,17 +74,20 @@
 
     private Map<String, Object> _values;
 
-    private Scopes() {
+
+    private Scopes () {
         this._values = new HashMap<>();
     }
 
-    public String toEntity() {
+
+    public String toEntity () {
         if (this._values.isEmpty())
             return "";
         return JsonUtils.toJSON(this._values);
     }
 
-    public Map<String, Object> toMap() {
+
+    public Map<String, Object> toMap () {
         return new HashMap<>(this._values);
     }
 
diff --git a/src/main/java/de/ids_mannheim/korap/config/URIParam.java b/src/main/java/de/ids_mannheim/korap/config/URIParam.java
index 3ab3724..9fd7911 100644
--- a/src/main/java/de/ids_mannheim/korap/config/URIParam.java
+++ b/src/main/java/de/ids_mannheim/korap/config/URIParam.java
@@ -12,13 +12,15 @@
     private final String uriFragment;
     private final Long uriExpiration;
 
-    public URIParam(String uri, Long expire) {
+
+    public URIParam (String uri, Long expire) {
         this.uriFragment = uri;
         this.uriExpiration = expire;
     }
 
+
     @Override
-    public boolean hasValues() {
+    public boolean hasValues () {
         return this.uriFragment != null && !this.uriFragment.isEmpty()
                 && this.uriExpiration != null;
     }
diff --git a/src/main/java/de/ids_mannheim/korap/exceptions/EmptyResultException.java b/src/main/java/de/ids_mannheim/korap/exceptions/EmptyResultException.java
index f510ac5..0a4bb7b 100644
--- a/src/main/java/de/ids_mannheim/korap/exceptions/EmptyResultException.java
+++ b/src/main/java/de/ids_mannheim/korap/exceptions/EmptyResultException.java
@@ -4,14 +4,16 @@
  * @author hanl
  * @date 25/03/2014
  */
-@Deprecated // even useful anymore?
+@Deprecated
+// even useful anymore?
 public class EmptyResultException extends KustvaktException {
 
-    public EmptyResultException(String message, String entity) {
+    public EmptyResultException (String message, String entity) {
         super(StatusCodes.EMPTY_RESULTS, message, entity);
     }
 
-    public EmptyResultException(String entity) {
+
+    public EmptyResultException (String entity) {
         super(StatusCodes.EMPTY_RESULTS, "No entity found for id", entity);
     }
 
diff --git a/src/main/java/de/ids_mannheim/korap/exceptions/KustvaktException.java b/src/main/java/de/ids_mannheim/korap/exceptions/KustvaktException.java
index dc00049..68a3018 100644
--- a/src/main/java/de/ids_mannheim/korap/exceptions/KustvaktException.java
+++ b/src/main/java/de/ids_mannheim/korap/exceptions/KustvaktException.java
@@ -21,51 +21,56 @@
     private Integer statusCode;
     private String entity;
 
-    public KustvaktException(int status) {
+
+    public KustvaktException (int status) {
         this.statusCode = status;
     }
 
-    public KustvaktException(int status, String... args) {
+
+    public KustvaktException (int status, String ... args) {
         this.statusCode = status;
         this.entity = Arrays.asList(args).toString();
     }
 
-    public KustvaktException(Object userid, int status) {
+
+    public KustvaktException (Object userid, int status) {
         this(status);
         this.userid = String.valueOf(userid);
     }
 
-    public KustvaktException(Object userid, int status, String message,
-            String entity) {
+
+    public KustvaktException (Object userid, int status, String message,
+                              String entity) {
         super(message);
         this.statusCode = status;
         this.entity = entity;
         this.userid = String.valueOf(userid);
     }
 
-    public KustvaktException(int status, String message, String entity) {
+
+    public KustvaktException (int status, String message, String entity) {
         super(message);
         this.statusCode = status;
         this.entity = entity;
     }
 
-    public KustvaktException(Throwable cause, int status) {
+
+    public KustvaktException (Throwable cause, int status) {
         super(cause);
         this.statusCode = status;
     }
 
-    public KustvaktException(String message, Throwable cause, int status) {
+
+    public KustvaktException (String message, Throwable cause, int status) {
         super(message, cause);
         this.statusCode = status;
     }
 
+
     @Override
-    public String toString() {
-        return "Excpt{" +
-                "status=" + getStatusCode() +
-                ", message=" + getMessage() +
-                ", args=" + getEntity() +
-                ", userid=" + userid +
-                '}';
+    public String toString () {
+        return "Excpt{" + "status=" + getStatusCode() + ", message="
+                + getMessage() + ", args=" + getEntity() + ", userid=" + userid
+                + '}';
     }
 }
diff --git a/src/main/java/de/ids_mannheim/korap/exceptions/NotAuthorizedException.java b/src/main/java/de/ids_mannheim/korap/exceptions/NotAuthorizedException.java
index 8b8d2c5..76438b4 100644
--- a/src/main/java/de/ids_mannheim/korap/exceptions/NotAuthorizedException.java
+++ b/src/main/java/de/ids_mannheim/korap/exceptions/NotAuthorizedException.java
@@ -11,23 +11,27 @@
 @Deprecated
 public class NotAuthorizedException extends KustvaktException {
 
-    public NotAuthorizedException(int status) {
+    public NotAuthorizedException (int status) {
         super(status);
     }
 
-    public NotAuthorizedException(int status, String entity) {
+
+    public NotAuthorizedException (int status, String entity) {
         super(status, "", entity);
     }
 
-    public NotAuthorizedException(int status, String message, String entity) {
+
+    public NotAuthorizedException (int status, String message, String entity) {
         super(status, message, entity);
     }
 
-    public NotAuthorizedException(Throwable cause, int status) {
+
+    public NotAuthorizedException (Throwable cause, int status) {
         super(cause, status);
     }
 
-    public NotAuthorizedException(String message, Throwable cause, int status) {
+
+    public NotAuthorizedException (String message, Throwable cause, int status) {
         super(message, cause, status);
     }
 }
diff --git a/src/main/java/de/ids_mannheim/korap/exceptions/StatusCodes.java b/src/main/java/de/ids_mannheim/korap/exceptions/StatusCodes.java
index 4c40304..49b204e 100644
--- a/src/main/java/de/ids_mannheim/korap/exceptions/StatusCodes.java
+++ b/src/main/java/de/ids_mannheim/korap/exceptions/StatusCodes.java
@@ -48,7 +48,8 @@
     public static final int CLIENT_AUTHORIZATION_FAILURE = 216;
 
     /**
-     * 500 status codes for access control related components (also policy rewrite)
+     * 500 status codes for access control related components (also
+     * policy rewrite)
      */
     public static final int PERMISSION_DENIED = 401;
     public static final int UNSUPPORTED_RESOURCE = 402;
diff --git a/src/main/java/de/ids_mannheim/korap/exceptions/WrappedException.java b/src/main/java/de/ids_mannheim/korap/exceptions/WrappedException.java
index 70702b7..60c0715 100644
--- a/src/main/java/de/ids_mannheim/korap/exceptions/WrappedException.java
+++ b/src/main/java/de/ids_mannheim/korap/exceptions/WrappedException.java
@@ -12,21 +12,24 @@
 // is the extension of the notauthorized exception!
 public class WrappedException extends KustvaktException {
 
-    private WrappedException(Object userid, Integer status, String message,
-            String args) {
+    private WrappedException (Object userid, Integer status, String message,
+                              String args) {
         super(String.valueOf(userid), status, message, args);
     }
 
-    public WrappedException(Object userid, Integer status, String... args) {
+
+    public WrappedException (Object userid, Integer status, String ... args) {
         this(userid, status, "", Arrays.asList(args).toString());
         AuditRecord record = AuditRecord.serviceRecord(userid, status, args);
         this.records.add(record);
     }
 
-    public WrappedException(KustvaktException e, Integer status, String... args) {
+
+    public WrappedException (KustvaktException e, Integer status,
+                             String ... args) {
         this(e.getUserid(), e.getStatusCode(), e.getMessage(), e.getEntity());
-        AuditRecord record = AuditRecord
-                .serviceRecord(e.getUserid(), status, args);
+        AuditRecord record = AuditRecord.serviceRecord(e.getUserid(), status,
+                args);
         record.setField_1(e.toString());
         this.records.addAll(e.getRecords());
         this.records.add(record);
diff --git a/src/main/java/de/ids_mannheim/korap/exceptions/dbException.java b/src/main/java/de/ids_mannheim/korap/exceptions/dbException.java
index 9818648..f6fdf23 100644
--- a/src/main/java/de/ids_mannheim/korap/exceptions/dbException.java
+++ b/src/main/java/de/ids_mannheim/korap/exceptions/dbException.java
@@ -10,15 +10,15 @@
  */
 public class dbException extends KustvaktException {
 
-    private dbException(Object userid, Integer status, String message,
-            String args) {
+    private dbException (Object userid, Integer status, String message,
+                         String args) {
         super(String.valueOf(userid), status, message, args);
     }
 
-    public dbException(Object userid, String target, Integer status,
-            String... args) {
-        this(userid, status, "",
-                Arrays.asList(args).toString());
+
+    public dbException (Object userid, String target, Integer status,
+                        String ... args) {
+        this(userid, status, "", Arrays.asList(args).toString());
         AuditRecord record = new AuditRecord(AuditRecord.CATEGORY.DATABASE);
         record.setUserid(String.valueOf(userid));
         record.setStatus(status);
@@ -27,22 +27,20 @@
         this.records.add(record);
     }
 
-    public dbException(KustvaktException e, Integer status, String... args) {
+
+    public dbException (KustvaktException e, Integer status, String ... args) {
         this(e.getUserid(), e.getStatusCode(), e.getMessage(), e.getEntity());
-        AuditRecord record = AuditRecord
-                .dbRecord(e.getUserid(), status, args);
+        AuditRecord record = AuditRecord.dbRecord(e.getUserid(), status, args);
         record.setField_1(e.toString());
         this.records.addAll(e.getRecords());
         this.records.add(record);
     }
 
+
     @Override
-    public String toString() {
-        return "DBExcpt{" +
-                "status=" + getStatusCode() +
-                ", message=" + getMessage() +
-                ", args=" + getEntity() +
-                ", userid=" + this.getUserid() +
-                '}';
+    public String toString () {
+        return "DBExcpt{" + "status=" + getStatusCode() + ", message="
+                + getMessage() + ", args=" + getEntity() + ", userid="
+                + this.getUserid() + '}';
     }
 }
diff --git a/src/main/java/de/ids_mannheim/korap/handlers/BatchBuilder.java b/src/main/java/de/ids_mannheim/korap/handlers/BatchBuilder.java
index e55cae1..0a83118 100644
--- a/src/main/java/de/ids_mannheim/korap/handlers/BatchBuilder.java
+++ b/src/main/java/de/ids_mannheim/korap/handlers/BatchBuilder.java
@@ -25,11 +25,14 @@
 
     private JdbcOperations operations;
 
-    public BatchBuilder(JdbcOperations operations) {
+
+    public BatchBuilder (JdbcOperations operations) {
         this.operations = operations;
     }
 
-    public <T> List<T> selectFromIDs(String query, Collection ids, RowMapper<T> mapper) {
+
+    public <T> List<T> selectFromIDs (String query, Collection ids,
+            RowMapper<T> mapper) {
         List l = new ArrayList(ids);
         int size = ids.size();
         List<T> values = new ArrayList<>();
@@ -60,7 +63,8 @@
             l.removeAll(d);
             try {
                 values.addAll(this.operations.query(sql, args, mapper));
-            } catch (DataAccessException e) {
+            }
+            catch (DataAccessException e) {
                 log.error("Exception during database retrieval", e);
             }
 
diff --git a/src/main/java/de/ids_mannheim/korap/handlers/DocumentDao.java b/src/main/java/de/ids_mannheim/korap/handlers/DocumentDao.java
index 4d7df7d..a477d31 100644
--- a/src/main/java/de/ids_mannheim/korap/handlers/DocumentDao.java
+++ b/src/main/java/de/ids_mannheim/korap/handlers/DocumentDao.java
@@ -30,58 +30,62 @@
 
     private NamedParameterJdbcTemplate jdbcTemplate;
 
-    public DocumentDao(PersistenceClient client) {
+
+    public DocumentDao (PersistenceClient client) {
         this.jdbcTemplate = (NamedParameterJdbcTemplate) client.getSource();
     }
 
+
     @Override
-    public Document findbyId(Integer id, User user) throws KustvaktException {
+    public Document findbyId (Integer id, User user) throws KustvaktException {
         MapSqlParameterSource s = new MapSqlParameterSource();
         s.addValue("id", id);
         String sql = "select id, persistent_id, disabled, strftime('%s', created) as created from doc_store where id=:id";
         try {
-            return this.jdbcTemplate
-                    .queryForObject(sql, s, new RowMapper<Document>() {
+            return this.jdbcTemplate.queryForObject(sql, s,
+                    new RowMapper<Document>() {
                         @Override
-                        public Document mapRow(ResultSet rs, int rowNum)
+                        public Document mapRow (ResultSet rs, int rowNum)
                                 throws SQLException {
                             Document doc = null;
                             if (!rs.isClosed()) {
                                 String s = rs.getString("persistent_id");
                                 System.out.println("VALUE IS " + s);
-                                doc = new Document(
-                                        rs.getString("persistent_id"));
+                                doc = new Document(rs
+                                        .getString("persistent_id"));
                                 doc.setId(rs.getInt("id"));
-                                doc.setCreated(
-                                        rs.getTimestamp("created").getTime());
+                                doc.setCreated(rs.getTimestamp("created")
+                                        .getTime());
                                 doc.setDisabled(rs.getBoolean("disabled"));
                             }
 
                             return doc;
                         }
                     });
-        }catch (DataAccessException e) {
+        }
+        catch (DataAccessException e) {
             throw new KustvaktException(StatusCodes.CONNECTION_ERROR);
         }
     }
 
+
     // document id, consisting of corpus sigle, substring key and document number
     @Override
-    public Document findbyId(String id, User user) throws KustvaktException {
+    public Document findbyId (String id, User user) throws KustvaktException {
         MapSqlParameterSource s = new MapSqlParameterSource();
         s.addValue("id", id);
         //        strftime('%s', created) as created
         String sql = "select id, persistent_id, disabled, created from doc_store where persistent_id=:id;";
         try {
-            return this.jdbcTemplate
-                    .queryForObject(sql, s, new RowMapper<Document>() {
+            return this.jdbcTemplate.queryForObject(sql, s,
+                    new RowMapper<Document>() {
                         @Override
-                        public Document mapRow(ResultSet rs, int rowNum)
+                        public Document mapRow (ResultSet rs, int rowNum)
                                 throws SQLException {
                             Document doc = null;
                             if (!rs.isClosed()) {
-                                doc = new Document(
-                                        rs.getString("persistent_id"));
+                                doc = new Document(rs
+                                        .getString("persistent_id"));
                                 doc.setId(rs.getInt("id"));
                                 doc.setCreated(rs.getLong("created"));
                                 doc.setDisabled(rs.getBoolean("disabled"));
@@ -90,23 +94,27 @@
                             return doc;
                         }
                     });
-        }catch (EmptyResultDataAccessException em) {
+        }
+        catch (EmptyResultDataAccessException em) {
             return null;
-        }catch (DataAccessException e) {
+        }
+        catch (DataAccessException e) {
             e.printStackTrace();
             throw new KustvaktException(StatusCodes.CONNECTION_ERROR);
         }
     }
 
+
     //todo:
     @Override
-    public List<Document> getResources(Collection<Object> ids, User user)
+    public List<Document> getResources (Collection<Object> ids, User user)
             throws KustvaktException {
         return null;
     }
 
+
     @Override
-    public int updateResource(Document document, User user)
+    public int updateResource (Document document, User user)
             throws KustvaktException {
         MapSqlParameterSource source = new MapSqlParameterSource();
         source.addValue("pid", document.getPersistentID());
@@ -114,18 +122,21 @@
         final String sql = "UPDATE doc_store set disabled=:dis where persistent_id=:pid;";
         try {
             return this.jdbcTemplate.update(sql, source);
-        }catch (DataAccessException e) {
+        }
+        catch (DataAccessException e) {
             throw new KustvaktException(StatusCodes.CONNECTION_ERROR);
         }
     }
 
+
     @Override
-    public int[] updateResources(List<Document> resources, User user)
+    public int[] updateResources (List<Document> resources, User user)
             throws KustvaktException {
         return new int[0];
     }
 
-    public List<Document> findbyCorpus(String corpus, int offset, int index)
+
+    public List<Document> findbyCorpus (String corpus, int offset, int index)
             throws KustvaktException {
         MapSqlParameterSource source = new MapSqlParameterSource();
         source.addValue("corpus", corpus + "%");
@@ -134,33 +145,36 @@
         //strftime('%s', created) as
         final String sql = "select id, persistent_id, disabled, created from doc_store where (persistent_id like :corpus) limit :offset, :limit";
         try {
-            return this.jdbcTemplate
-                    .query(sql, source, new RowMapper<Document>() {
+            return this.jdbcTemplate.query(sql, source,
+                    new RowMapper<Document>() {
                         @Override
-                        public Document mapRow(ResultSet rs, int rowNum)
+                        public Document mapRow (ResultSet rs, int rowNum)
                                 throws SQLException {
                             // todo: test on empty/closed resultset!
                             if (!rs.isClosed()) {
-                                Document doc = new Document(
-                                        rs.getString("persistent_id"));
+                                Document doc = new Document(rs
+                                        .getString("persistent_id"));
                                 doc.setId(rs.getInt("id"));
-                                doc.setCreated(
-                                        rs.getTimestamp("created").getTime());
+                                doc.setCreated(rs.getTimestamp("created")
+                                        .getTime());
                                 doc.setDisabled(rs.getBoolean("disabled"));
                                 return doc;
                             }
                             return null;
                         }
                     });
-        }catch (EmptyResultDataAccessException em) {
+        }
+        catch (EmptyResultDataAccessException em) {
             em.printStackTrace();
             return Collections.emptyList();
-        }catch (DataAccessException e) {
+        }
+        catch (DataAccessException e) {
             throw new KustvaktException(StatusCodes.CONNECTION_ERROR);
         }
     }
 
-    public List<String> findbyCorpus(String corpus, boolean disabled)
+
+    public List<String> findbyCorpus (String corpus, boolean disabled)
             throws KustvaktException {
         MapSqlParameterSource s = new MapSqlParameterSource();
         s.addValue("corpus", corpus + "%");
@@ -168,17 +182,20 @@
         String sql = "SELECT persistent_id FROM doc_store WHERE (persistent_id like :corpus) AND disabled=:dis;";
         try {
             return this.jdbcTemplate.queryForList(sql, s, String.class);
-        }catch (EmptyResultDataAccessException em) {
+        }
+        catch (EmptyResultDataAccessException em) {
             em.printStackTrace();
             return Collections.emptyList();
-        }catch (DataAccessException e) {
+        }
+        catch (DataAccessException e) {
             throw new KustvaktException(StatusCodes.CONNECTION_ERROR);
         }
     }
 
+
     // parent is disabled here
     @Override
-    public int storeResource(Document resource, User user)
+    public int storeResource (Document resource, User user)
             throws KustvaktException {
         MapSqlParameterSource s = new MapSqlParameterSource();
         s.addValue("id", resource.getPersistentID());
@@ -188,43 +205,50 @@
         String sql = "INSERT INTO doc_store (persistent_id, disabled) VALUES (:id, :dis)";
         try {
             return this.jdbcTemplate.update(sql, s);
-        }catch (DataAccessException e) {
+        }
+        catch (DataAccessException e) {
             e.printStackTrace();
             throw new KustvaktException(StatusCodes.ILLEGAL_ARGUMENT,
                     "illegal argument given", resource.getPersistentID());
         }
     }
 
+
     @Override
-    public int deleteResource(String id, User user) throws KustvaktException {
+    public int deleteResource (String id, User user) throws KustvaktException {
         MapSqlParameterSource s = new MapSqlParameterSource();
         s.addValue("id", id);
         String sql = "delete from doc_store where persistent_id=:id;";
         try {
             return this.jdbcTemplate.update(sql, s);
-        }catch (DataAccessException e) {
+        }
+        catch (DataAccessException e) {
             throw new KustvaktException(StatusCodes.CONNECTION_ERROR);
         }
 
     }
 
+
     @Override
-    public int size() {
+    public int size () {
         return -1;
     }
 
+
     @Override
-    public int truncate() {
+    public int truncate () {
         String sql = "delete from doc_store;";
         try {
             return this.jdbcTemplate.update(sql, new HashMap<String, Object>());
-        }catch (DataAccessException e) {
+        }
+        catch (DataAccessException e) {
             return -1;
         }
     }
 
+
     @Override
-    public Class<Document> type() {
+    public Class<Document> type () {
         return Document.class;
     }
 }
diff --git a/src/main/java/de/ids_mannheim/korap/handlers/EntityDao.java b/src/main/java/de/ids_mannheim/korap/handlers/EntityDao.java
index aa1e725..5d58b46 100644
--- a/src/main/java/de/ids_mannheim/korap/handlers/EntityDao.java
+++ b/src/main/java/de/ids_mannheim/korap/handlers/EntityDao.java
@@ -38,24 +38,28 @@
     private static Logger jlog = LoggerFactory.getLogger(EntityDao.class);
     private NamedParameterJdbcTemplate jdbcTemplate;
 
-    public EntityDao(PersistenceClient client) {
+
+    public EntityDao (PersistenceClient client) {
         this.jdbcTemplate = (NamedParameterJdbcTemplate) client.getSource();
     }
 
+
     // usersettings are fetched plus basic account info, no details, since i rarely use them anyway!
     @Override
-    public User getAccount(String username) throws KustvaktException {
-        Map<String, String> namedParameters = Collections
-                .singletonMap("username", username);
+    public User getAccount (String username) throws KustvaktException {
+        Map<String, String> namedParameters = Collections.singletonMap(
+                "username", username);
         final String sql = "select a.* from korap_users as a where a.username=:username;";
         User user;
         try {
             user = this.jdbcTemplate.queryForObject(sql, namedParameters,
                     new RowMapperFactory.UserMapper());
-        }catch (EmptyResultDataAccessException ae) {
+        }
+        catch (EmptyResultDataAccessException ae) {
             jlog.warn("No user found for name '{}'", username);
             throw new EmptyResultException(username);
-        }catch (DataAccessException e) {
+        }
+        catch (DataAccessException e) {
             jlog.error("Could not retrieve user for name: " + username, e);
             throw new dbException(username, "korap_users",
                     StatusCodes.DB_GET_FAILED, username);
@@ -63,8 +67,9 @@
         return user;
     }
 
+
     @Override
-    public int updateAccount(User user) throws KustvaktException {
+    public int updateAccount (User user) throws KustvaktException {
         MapSqlParameterSource np = new MapSqlParameterSource();
         final String query;
         if (user instanceof KorAPUser) {
@@ -83,12 +88,13 @@
             //            }
             np.addValue("id", k.getId());
 
-            query = "UPDATE korap_users SET account_lock=:alo," +
-                    "account_link=:ali, password=:ps "
+            query = "UPDATE korap_users SET account_lock=:alo,"
+                    + "account_link=:ali, password=:ps "
                     //                    "uri_fragment=:frag," +
                     //                    "uri_expiration=:exp "
                     + "WHERE id=:id";
-        }else if (user instanceof ShibUser) {
+        }
+        else if (user instanceof ShibUser) {
             ShibUser s = (ShibUser) user;
             //todo:
             //            np.addValue("ali", s.getAccountLink());
@@ -98,14 +104,16 @@
             np.addValue("cn", s.getCn());
             np.addValue("mail", s.getMail());
 
-            query = "UPDATE shibusers SET account_link=:ali" +
-                    " eduPersonScopedAffiliation=:edu" +
-                    "mail=:mail, cn=:cn WHERE id=:id";
-        }else
+            query = "UPDATE shibusers SET account_link=:ali"
+                    + " eduPersonScopedAffiliation=:edu"
+                    + "mail=:mail, cn=:cn WHERE id=:id";
+        }
+        else
             return -1;
         try {
             return this.jdbcTemplate.update(query, np);
-        }catch (DataAccessException e) {
+        }
+        catch (DataAccessException e) {
             jlog.error(
                     "Could not update user account for user: " + user.getId(),
                     e);
@@ -115,8 +123,9 @@
         }
     }
 
+
     @Override
-    public int createAccount(User user) throws KustvaktException {
+    public int createAccount (User user) throws KustvaktException {
         final String query;
         MapSqlParameterSource np = new MapSqlParameterSource();
 
@@ -131,7 +140,8 @@
             if (param != null) {
                 np.addValue("uri", param.getUriFragment());
                 np.addValue("urie", param.getUriExpiration());
-            }else {
+            }
+            else {
                 np.addValue("uri", null);
                 np.addValue("urie", null);
             }
@@ -141,27 +151,26 @@
 
             if (user.getId() != -1)
                 query = "INSERT INTO korap_users (id, username, account_lock, "
-                        +
-                        "account_link, password, uri_fragment, " +
-                        "account_creation, " +
-                        "uri_expiration) VALUES (:id, :us, :alo, :ali, " +
-                        ":ps, :uri, :acr, :urie);";
+                        + "account_link, password, uri_fragment, "
+                        + "account_creation, "
+                        + "uri_expiration) VALUES (:id, :us, :alo, :ali, "
+                        + ":ps, :uri, :acr, :urie);";
             else
-                query = "INSERT INTO korap_users (username, account_lock, " +
-                        "account_link, password, uri_fragment, " +
-                        "account_creation, " +
-                        "uri_expiration) VALUES (:us, :alo, :ali, " +
-                        ":ps, :uri, :acr, :urie);";
+                query = "INSERT INTO korap_users (username, account_lock, "
+                        + "account_link, password, uri_fragment, "
+                        + "account_creation, "
+                        + "uri_expiration) VALUES (:us, :alo, :ali, "
+                        + ":ps, :uri, :acr, :urie);";
 
             //fixme: still applicable?
-        }else if (user instanceof ShibUser) {
+        }
+        else if (user instanceof ShibUser) {
             ShibUser s = (ShibUser) user;
 
             query = "INSERT INTO shibusers (username, type, account_link, account_creation "
-                    +
-                    "eduPersonScopedAffiliation, cn, mail) " +
-                    "VALUES (:us, :type, :ali, " +
-                    ":edu, :cn, :mail, :logs, :logft);";
+                    + "eduPersonScopedAffiliation, cn, mail) "
+                    + "VALUES (:us, :type, :ali, "
+                    + ":edu, :cn, :mail, :logs, :logft);";
             np.addValue("us", s.getUsername());
             np.addValue("ali", null);
             np.addValue("edu", s.getAffiliation());
@@ -180,17 +189,19 @@
             //            np.addValue("type", user.getType());
             //            np.addValue("alo", user.isAccountLocked());
             //            np.addValue("acr", System.currentTimeMillis());
-        }else
+        }
+        else
             return -1;
 
         KeyHolder holder = new GeneratedKeyHolder();
 
         try {
-            int r = this.jdbcTemplate
-                    .update(query, np, holder, new String[] { "id" });
+            int r = this.jdbcTemplate.update(query, np, holder,
+                    new String[] { "id" });
             user.setId(holder.getKey().intValue());
             return r;
-        }catch (DataAccessException e) {
+        }
+        catch (DataAccessException e) {
             jlog.error("Could not create user account with username: {}",
                     user.getUsername());
             throw new dbException(user.getUsername(), "korap_users",
@@ -198,15 +209,16 @@
         }
     }
 
+
     @Override
-    public int deleteAccount(final Integer userid) throws KustvaktException {
+    public int deleteAccount (final Integer userid) throws KustvaktException {
         MapSqlParameterSource s = new MapSqlParameterSource();
         s.addValue("user", userid);
 
         try {
             int r;
-            r = this.jdbcTemplate
-                    .update("DELETE FROM korap_users WHERE id=:user", s);
+            r = this.jdbcTemplate.update(
+                    "DELETE FROM korap_users WHERE id=:user", s);
             //            if (user instanceof KorAPUser)
             //                r = this.jdbcTemplate
             //                        .update("DELETE FROM korap_users WHERE username=:user",
@@ -218,7 +230,8 @@
             //            else
             //                r = -1;
             return r;
-        }catch (DataAccessException e) {
+        }
+        catch (DataAccessException e) {
             jlog.error("Could not delete account for user: " + userid, e);
             //            throw new KorAPException(e, StatusCodes.CONNECTION_ERROR);
             throw new dbException(userid, "korap_users",
@@ -227,22 +240,25 @@
 
     }
 
+
     @Override
-    public int truncate() {
+    public int truncate () {
         String sql = "DELETE FROM korap_users;";
         try {
             return this.jdbcTemplate.update(sql, new HashMap<String, Object>());
-        }catch (DataAccessException e) {
+        }
+        catch (DataAccessException e) {
             return -1;
         }
     }
 
+
     @Override
-    public int resetPassphrase(String username, String uriToken,
+    public int resetPassphrase (String username, String uriToken,
             String passphrase) throws KustvaktException {
         MapSqlParameterSource np = new MapSqlParameterSource();
-        final String query = "UPDATE korap_users SET " +
-                "uri_expiration=0, password=:pass WHERE uri_fragment=:uri AND uri_expiration > :now "
+        final String query = "UPDATE korap_users SET "
+                + "uri_expiration=0, password=:pass WHERE uri_fragment=:uri AND uri_expiration > :now "
                 + "AND username=:us AND uri_expiration > :now;";
         np.addValue("uri", uriToken);
         np.addValue("now", new Date(TimeUtils.getNow().getMillis()));
@@ -250,7 +266,8 @@
         np.addValue("us", username);
         try {
             return this.jdbcTemplate.update(query, np);
-        }catch (DataAccessException e) {
+        }
+        catch (DataAccessException e) {
             jlog.error("Could not reset password for name: " + username, e);
             throw new dbException(username, "korap_users",
                     StatusCodes.DB_UPDATE_FAILED, username, uriToken,
@@ -258,44 +275,46 @@
         }
     }
 
+
     @Override
-    public int activateAccount(String username, String uriToken)
+    public int activateAccount (String username, String uriToken)
             throws KustvaktException {
         MapSqlParameterSource np = new MapSqlParameterSource();
-        final String query = "UPDATE korap_users SET uri_fragment='', " +
-                "uri_expiration=0, account_lock=:lock WHERE uri_fragment=:uri AND username=:us AND "
-                +
-                "uri_expiration > :now;";
+        final String query = "UPDATE korap_users SET uri_fragment='', "
+                + "uri_expiration=0, account_lock=:lock WHERE uri_fragment=:uri AND username=:us AND "
+                + "uri_expiration > :now;";
         np.addValue("uri", uriToken);
         np.addValue("now", TimeUtils.getNow().getMillis());
         np.addValue("us", username);
         np.addValue("lock", BooleanUtils.getBoolean(false));
         try {
             return this.jdbcTemplate.update(query, np);
-        }catch (DataAccessException e) {
-            jlog.error("Could not confirm registration for name " + username,
-                    e);
+        }
+        catch (DataAccessException e) {
+            jlog.error("Could not confirm registration for name " + username, e);
             throw new dbException(username, "korap_users",
                     StatusCodes.DB_UPDATE_FAILED, username, uriToken);
         }
     }
 
+
     @Override
-    public int size() {
+    public int size () {
         final String query = "SELECT COUNT(*) FROM korap_users;";
-        return this.jdbcTemplate
-                .queryForObject(query, new HashMap<String, Object>(),
-                        Integer.class);
+        return this.jdbcTemplate.queryForObject(query,
+                new HashMap<String, Object>(), Integer.class);
     }
 
+
     //todo:
-    public List getAccountLinks(User user) {
+    public List getAccountLinks (User user) {
 
         return Collections.emptyList();
     }
 
+
     //todo:
-    public void setAccountParameters(User user) {
+    public void setAccountParameters (User user) {
         ParamFields fields = user.getFields();
     }
 }
diff --git a/src/main/java/de/ids_mannheim/korap/handlers/JDBCAuditing.java b/src/main/java/de/ids_mannheim/korap/handlers/JDBCAuditing.java
index 4dca815..88fc7e6 100644
--- a/src/main/java/de/ids_mannheim/korap/handlers/JDBCAuditing.java
+++ b/src/main/java/de/ids_mannheim/korap/handlers/JDBCAuditing.java
@@ -21,67 +21,72 @@
 
     private NamedParameterJdbcTemplate template;
 
-    public JDBCAuditing(PersistenceClient client) {
+
+    public JDBCAuditing (PersistenceClient client) {
         this.template = (NamedParameterJdbcTemplate) client.getSource();
     }
 
+
     @Override
-    public <T extends AuditRecord> List<T> retrieveRecords(
+    public <T extends AuditRecord> List<T> retrieveRecords (
             AuditRecord.CATEGORY category, DateTime day, DateTime until,
             boolean dayOnly, int limit) {
         MapSqlParameterSource p = new MapSqlParameterSource();
         p.addValue("limit", limit);
         p.addValue("cat", category.toString());
 
-        String sql =
-                "select * from audit_records where aud_timestamp > :today AND"
-                        + " aud_timestamp < :tomorr AND aud_category=:cat limit :limit;";
+        String sql = "select * from audit_records where aud_timestamp > :today AND"
+                + " aud_timestamp < :tomorr AND aud_category=:cat limit :limit;";
 
         if (dayOnly) {
             LocalDate today = day.toLocalDate();
             DateTime start = today.toDateTimeAtStartOfDay(day.getZone());
-            DateTime end = today.plusDays(1)
-                    .toDateTimeAtStartOfDay(day.getZone());
+            DateTime end = today.plusDays(1).toDateTimeAtStartOfDay(
+                    day.getZone());
             p.addValue("today", start.getMillis());
             p.addValue("tomorr", end.getMillis());
-        }else {
+        }
+        else {
             p.addValue("today", day.getMillis());
             p.addValue("tomorr", until.getMillis());
         }
-        return (List<T>) this.template
-                .query(sql, p, new RowMapperFactory.AuditMapper());
+        return (List<T>) this.template.query(sql, p,
+                new RowMapperFactory.AuditMapper());
     }
 
+
     @Override
-    public <T extends AuditRecord> List<T> retrieveRecords(
+    public <T extends AuditRecord> List<T> retrieveRecords (
             AuditRecord.CATEGORY category, User user, int limit) {
         MapSqlParameterSource p = new MapSqlParameterSource();
         p.addValue("limit", limit);
         p.addValue("us", user.getUsername());
         p.addValue("cat", category.toString());
 
-        String sql =
-                "select * from audit_records where aud_category=:cat and aud_user=:us "
-                        + "order by aud_timestamp desc limit :limit;";
+        String sql = "select * from audit_records where aud_category=:cat and aud_user=:us "
+                + "order by aud_timestamp desc limit :limit;";
 
-        return (List<T>) this.template
-                .query(sql, p, new RowMapperFactory.AuditMapper());
+        return (List<T>) this.template.query(sql, p,
+                new RowMapperFactory.AuditMapper());
     }
 
+
     @Override
-    public <T extends AuditRecord> List<T> retrieveRecords(LocalDate day,
+    public <T extends AuditRecord> List<T> retrieveRecords (LocalDate day,
             int hitMax) {
         return null;
     }
 
+
     @Override
-    public <T extends AuditRecord> List<T> retrieveRecords(String userID,
+    public <T extends AuditRecord> List<T> retrieveRecords (String userID,
             LocalDate start, LocalDate end, int hitMax) {
         return null;
     }
 
+
     @Override
-    public void apply() {
+    public void apply () {
         String sql;
         sql = "INSERT INTO audit_records (aud_target, aud_category, aud_user, aud_location, aud_timestamp, "
                 + "aud_status, aud_field_1, aud_args) "
@@ -105,8 +110,9 @@
         records.clear();
     }
 
+
     @Override
-    public void finish() {
+    public void finish () {
 
     }
 
diff --git a/src/main/java/de/ids_mannheim/korap/handlers/JDBCClient.java b/src/main/java/de/ids_mannheim/korap/handlers/JDBCClient.java
index 18b4e87..2d9e984 100644
--- a/src/main/java/de/ids_mannheim/korap/handlers/JDBCClient.java
+++ b/src/main/java/de/ids_mannheim/korap/handlers/JDBCClient.java
@@ -26,7 +26,8 @@
     @Setter(AccessLevel.NONE)
     private DataSource dataSource;
 
-    public JDBCClient(DataSource datasource) {
+
+    public JDBCClient (DataSource datasource) {
         NamedParameterJdbcTemplate template = new NamedParameterJdbcTemplate(
                 datasource);
         template.setCacheLimit(500);
@@ -34,19 +35,22 @@
         this.dataSource = datasource;
     }
 
-    public JDBCClient(DataSource dataSource, Resource resource)
+
+    public JDBCClient (DataSource dataSource, Resource resource)
             throws IOException {
         this(dataSource);
         this.setSchema(resource.getInputStream());
     }
 
+
     @Override
-    public void setSchema(InputStream stream) throws IOException {
+    public void setSchema (InputStream stream) throws IOException {
         super.setSchema(stream);
     }
 
+
     @Override
-    public boolean checkDatabase() {
+    public boolean checkDatabase () {
         int size;
         NamedParameterJdbcTemplate tmp = this.getSource();
         try {
@@ -54,29 +58,33 @@
             size = tmp.queryForObject(
                     "select count(*) from schema_version limit 5;",
                     new HashMap<String, Object>(), Integer.class);
-        }catch (Exception e) {
+        }
+        catch (Exception e) {
             System.out.println("No database schema found!");
             return false;
         }
         return size > 0;
     }
 
+
     @Override
-    public void setDatabase(String name) {
+    public void setDatabase (String name) {
         super.setDatabase(name);
         BooleanUtils.dbname = name;
     }
 
+
     // get schema file from configuration and create database
     @Override
-    public void createDatabase() {
+    public void createDatabase () {
         if (!checkDatabase()) {
             final ResourceDatabasePopulator rdp = new ResourceDatabasePopulator();
             rdp.addScript(new InputStreamResource(this.getSchema()));
             rdp.setSeparator("$$");
             try {
                 rdp.populate(this.dataSource.getConnection());
-            }catch (SQLException e) {
+            }
+            catch (SQLException e) {
                 // do nothing
                 e.printStackTrace();
             }
diff --git a/src/main/java/de/ids_mannheim/korap/handlers/OAuth2Handler.java b/src/main/java/de/ids_mannheim/korap/handlers/OAuth2Handler.java
index 1d571ae..c1ce959 100644
--- a/src/main/java/de/ids_mannheim/korap/handlers/OAuth2Handler.java
+++ b/src/main/java/de/ids_mannheim/korap/handlers/OAuth2Handler.java
@@ -11,7 +11,7 @@
 /**
  * extends OAuthDb to allow temporary caching of tokens
  * and authorizations (authorizations are not persisted in db)
- *
+ * 
  * @author hanl
  * @date 04/05/2015
  */
@@ -19,37 +19,42 @@
 
     private Cache cache;
 
-    public OAuth2Handler(PersistenceClient client) {
+
+    public OAuth2Handler (PersistenceClient client) {
         super(client);
         this.cache = CacheManager.getInstance().getCache("auth_codes");
     }
 
-    public AuthCodeInfo getAuthorization(String code) {
+
+    public AuthCodeInfo getAuthorization (String code) {
         Element e = this.cache.get(code);
         if (e != null)
             return (AuthCodeInfo) e.getObjectValue();
         return null;
     }
 
-    public void authorize(AuthCodeInfo code, User user)
+
+    public void authorize (AuthCodeInfo code, User user)
             throws KustvaktException {
         code.setUserId(user.getId());
         cache.put(new Element(code.getCode(), code));
     }
 
-    public boolean addToken(String code, String token, String refresh, int ttl)
+
+    public boolean addToken (String code, String token, String refresh, int ttl)
             throws KustvaktException {
         Element e = cache.get(code);
         if (e != null) {
             AuthCodeInfo info = (AuthCodeInfo) e.getObjectValue();
             cache.remove(code);
-            return super.addToken(token, refresh, info.getUserId(), info.getClientId(),
-                    info.getScopes(), ttl);
+            return super.addToken(token, refresh, info.getUserId(),
+                    info.getClientId(), info.getScopes(), ttl);
         }
         return false;
     }
 
-    public void exchangeToken(String refresh) {
+
+    public void exchangeToken (String refresh) {
 
     }
 
diff --git a/src/main/java/de/ids_mannheim/korap/handlers/OAuthDb.java b/src/main/java/de/ids_mannheim/korap/handlers/OAuthDb.java
index 9b10f96..e2ad1e2 100644
--- a/src/main/java/de/ids_mannheim/korap/handlers/OAuthDb.java
+++ b/src/main/java/de/ids_mannheim/korap/handlers/OAuthDb.java
@@ -32,65 +32,71 @@
     private static final Logger jlog = LoggerFactory.getLogger(OAuthDb.class);
     private NamedParameterJdbcTemplate jdbcTemplate;
 
-    public OAuthDb(PersistenceClient client) {
+
+    public OAuthDb (PersistenceClient client) {
         this.jdbcTemplate = (NamedParameterJdbcTemplate) client.getSource();
     }
 
-    public ClientInfo getClient(String clientid) {
+
+    public ClientInfo getClient (String clientid) {
         MapSqlParameterSource s = new MapSqlParameterSource();
         s.addValue("cl", clientid);
         String sql = "select * from oauth2_client where client_id=:cl;";
 
         try {
-            return this.jdbcTemplate
-                    .queryForObject(sql, s, new RowMapper<ClientInfo>() {
+            return this.jdbcTemplate.queryForObject(sql, s,
+                    new RowMapper<ClientInfo>() {
                         @Override
-                        public ClientInfo mapRow(ResultSet rs, int rowNum)
+                        public ClientInfo mapRow (ResultSet rs, int rowNum)
                                 throws SQLException {
-                            ClientInfo info = new ClientInfo(
-                                    rs.getString("client_id"),
-                                    rs.getString("client_secret"));
+                            ClientInfo info = new ClientInfo(rs
+                                    .getString("client_id"), rs
+                                    .getString("client_secret"));
                             info.setId(rs.getInt("id"));
                             info.setClient_type(rs.getString("client_type"));
                             info.setRedirect_uri(rs.getString("redirect_uri"));
                             info.setUrl(rs.getString("url"));
-                            info.setConfidential(
-                                    rs.getBoolean("is_confidential"));
+                            info.setConfidential(rs
+                                    .getBoolean("is_confidential"));
                             return info;
                         }
                     });
-        }catch (EmptyResultDataAccessException ex) {
+        }
+        catch (EmptyResultDataAccessException ex) {
             jlog.error("'{}' client found", clientid, ex.fillInStackTrace());
             return null;
         }
     }
 
+
     // fixme: what to delete? difference client/application table?
-    public boolean revokeToken(String token) throws KustvaktException {
+    public boolean revokeToken (String token) throws KustvaktException {
         String sql = "delete from oauth2_access_token WHERE access_token=:token;";
         MapSqlParameterSource s = new MapSqlParameterSource();
         s.addValue("token", token);
         try {
             return this.jdbcTemplate.update(sql, s) == 1;
-        }catch (DataAccessException e) {
+        }
+        catch (DataAccessException e) {
             jlog.error("token could not be revoked", e.fillInStackTrace());
             return false;
         }
     }
 
-    public boolean revokeAuthorization(ClientInfo info, User user) {
+
+    public boolean revokeAuthorization (ClientInfo info, User user) {
         MapSqlParameterSource source = new MapSqlParameterSource();
         source.addValue("us", user.getId());
         source.addValue("cls", info.getClient_secret());
         source.addValue("clid", info.getClient_id());
 
-        String tokens =
-                "delete from oauth2_access_token where user_id=:us and client_id in "
-                        + "(select client_id from oauth2_client where client_id=:clid and client_secret=:cls);";
+        String tokens = "delete from oauth2_access_token where user_id=:us and client_id in "
+                + "(select client_id from oauth2_client where client_id=:clid and client_secret=:cls);";
 
         try {
             this.jdbcTemplate.update(tokens, source);
-        }catch (DataAccessException e) {
+        }
+        catch (DataAccessException e) {
             jlog.error("authorization could not be revoked for user '{}'",
                     user.getUsername());
             return false;
@@ -99,24 +105,25 @@
         return true;
     }
 
-    public boolean addToken(String token, String refresh, Integer userid,
+
+    public boolean addToken (String token, String refresh, Integer userid,
             String client_id, String scopes, int expiration)
             throws KustvaktException {
         MapSqlParameterSource s = new MapSqlParameterSource();
         s.addValue("token", token);
         s.addValue("rt", refresh);
-        s.addValue("ex",
-                new Timestamp(TimeUtils.plusSeconds(expiration).getMillis()));
+        s.addValue("ex", new Timestamp(TimeUtils.plusSeconds(expiration)
+                .getMillis()));
         s.addValue("us", userid);
         s.addValue("sc", scopes);
         s.addValue("st", BooleanUtils.getBoolean(true));
         s.addValue("cli", client_id);
-        String sql =
-                "insert into oauth2_access_token (access_token, refresh_token, scopes, client_id, user_id, expiration, status) "
-                        + "values (:token, :rt, :sc, :cli, :us, :ex, :st);";
+        String sql = "insert into oauth2_access_token (access_token, refresh_token, scopes, client_id, user_id, expiration, status) "
+                + "values (:token, :rt, :sc, :cli, :us, :ex, :st);";
         try {
             return this.jdbcTemplate.update(sql, s) == 1;
-        }catch (DataAccessException e) {
+        }
+        catch (DataAccessException e) {
             e.printStackTrace();
             jlog.error("token '{}' could not be added for user '{}'", token,
                     userid);
@@ -124,29 +131,31 @@
         }
     }
 
+
     // returns the first token to find
-    public String getToken(String client_id, Integer userid) {
-        String sql =
-                "select access_token from oauth2_access_token where user_id=:uid"
-                        + " and status=1 and client_id=:cli limit 1;";
+    public String getToken (String client_id, Integer userid) {
+        String sql = "select access_token from oauth2_access_token where user_id=:uid"
+                + " and status=1 and client_id=:cli limit 1;";
         MapSqlParameterSource s = new MapSqlParameterSource();
         s.addValue("uid", userid);
         s.addValue("cli", client_id);
         try {
             return this.jdbcTemplate.queryForObject(sql, s, String.class);
-        }catch (EmptyResultDataAccessException ex) {
+        }
+        catch (EmptyResultDataAccessException ex) {
             jlog.error("no token found for user '{}'", userid);
             return null;
-        }catch (DataAccessException ex) {
+        }
+        catch (DataAccessException ex) {
             jlog.error("token retrieval failed for user '{}'", userid);
             return null;
         }
     }
 
-    public List<ClientInfo> getAuthorizedClients(Integer userid) {
-        String sql =
-                "select cl.* from oauth2_client as cl where cl.client_id in (select cd.client_id from oauth2_access_token as cd "
-                        + "where cd.user_id=:user) or cl.is_confidential=:conf;";
+
+    public List<ClientInfo> getAuthorizedClients (Integer userid) {
+        String sql = "select cl.* from oauth2_client as cl where cl.client_id in (select cd.client_id from oauth2_access_token as cd "
+                + "where cd.user_id=:user) or cl.is_confidential=:conf;";
 
         //todo: test query
         //        "select cl.* from oauth2_client as cl inner join oauth2_access_token as cd "
@@ -160,7 +169,7 @@
             return this.jdbcTemplate.query(sql, s, new RowMapper<ClientInfo>() {
 
                 @Override
-                public ClientInfo mapRow(ResultSet rs, int rowNum)
+                public ClientInfo mapRow (ResultSet rs, int rowNum)
                         throws SQLException {
                     ClientInfo info = new ClientInfo(rs.getString("client_id"),
                             "*****");
@@ -171,28 +180,29 @@
                     return info;
                 }
             });
-        }catch (DataAccessException e) {
+        }
+        catch (DataAccessException e) {
             jlog.error("Data access error", e);
             return Collections.emptyList();
         }
 
     }
 
+
     // todo: expired token must trigger an invalid token exception to trigger a refresh token
-    public TokenContext getContext(final String token)
+    public TokenContext getContext (final String token)
             throws KustvaktException {
-        String sql =
-                "select ko.username, oa.expiration, oa.scopes from oauth2_access_token as oa inner join korap_users as ko "
-                        + "on ko.id=oa.user_id where oa.access_token=:token and oa.expiration > :now;";
+        String sql = "select ko.username, oa.expiration, oa.scopes from oauth2_access_token as oa inner join korap_users as ko "
+                + "on ko.id=oa.user_id where oa.access_token=:token and oa.expiration > :now;";
         MapSqlParameterSource s = new MapSqlParameterSource();
         s.addValue("token", token);
         s.addValue("now", new Timestamp(TimeUtils.getNow().getMillis()));
 
         try {
-            TokenContext context = this.jdbcTemplate
-                    .queryForObject(sql, s, new RowMapper<TokenContext>() {
+            TokenContext context = this.jdbcTemplate.queryForObject(sql, s,
+                    new RowMapper<TokenContext>() {
                         @Override
-                        public TokenContext mapRow(ResultSet rs, int rowNum)
+                        public TokenContext mapRow (ResultSet rs, int rowNum)
                                 throws SQLException {
                             long exp = rs.getTimestamp("expiration").getTime();
                             TokenContext c = new TokenContext();
@@ -206,11 +216,13 @@
                         }
                     });
             return context;
-        }catch (EmptyResultDataAccessException ee) {
+        }
+        catch (EmptyResultDataAccessException ee) {
             jlog.error("no context found for token '{}'", token);
             revokeToken(token);
             throw new KustvaktException(StatusCodes.EXPIRED, "token", token);
-        }catch (DataAccessException e) {
+        }
+        catch (DataAccessException e) {
             jlog.error("token context retrieval failed for '{}'", token);
             throw new KustvaktException(StatusCodes.ILLEGAL_ARGUMENT,
                     "invalid token", token);
@@ -218,19 +230,20 @@
 
     }
 
+
     // subsequently delete all access and auth code tokens associated!
-    public void removeClient(ClientInfo info, User user)
+    public void removeClient (ClientInfo info, User user)
             throws KustvaktException {
         MapSqlParameterSource p = new MapSqlParameterSource();
         p.addValue("url", info.getUrl());
         p.addValue("cls", info.getClient_secret());
         p.addValue("clid", info.getClient_id());
-        String sql =
-                "delete from oauth2_client where client_id=:clid and client_secret=:cls and"
-                        + " url=:url;";
+        String sql = "delete from oauth2_client where client_id=:clid and client_secret=:cls and"
+                + " url=:url;";
         try {
             this.jdbcTemplate.update(sql, p);
-        }catch (DataAccessException e) {
+        }
+        catch (DataAccessException e) {
             e.printStackTrace();
             jlog.error("removing client '{}' failed", info.getClient_id());
             throw new dbException(new KustvaktException(user.getId(),
@@ -241,7 +254,8 @@
         }
     }
 
-    public void registerClient(ClientInfo info, User user)
+
+    public void registerClient (ClientInfo info, User user)
             throws KustvaktException {
         MapSqlParameterSource p = new MapSqlParameterSource();
         p.addValue("clid", info.getClient_id());
@@ -250,12 +264,12 @@
         p.addValue("clt", info.getClient_type());
         p.addValue("url", info.getUrl());
         p.addValue("r_url", info.getRedirect_uri());
-        String sql =
-                "insert into oauth2_client (client_id, client_secret, client_type, url, is_confidential, redirect_uri) "
-                        + "VALUES (:clid, :cls, :clt, :url, :con, :r_url);";
+        String sql = "insert into oauth2_client (client_id, client_secret, client_type, url, is_confidential, redirect_uri) "
+                + "VALUES (:clid, :cls, :clt, :url, :con, :r_url);";
         try {
             this.jdbcTemplate.update(sql, p);
-        }catch (DataAccessException e) {
+        }
+        catch (DataAccessException e) {
             e.printStackTrace();
             jlog.error("registering client '{}' failed", info.getClient_id());
             throw new dbException(new KustvaktException(user.getId(),
diff --git a/src/main/java/de/ids_mannheim/korap/handlers/ResourceDao.java b/src/main/java/de/ids_mannheim/korap/handlers/ResourceDao.java
index 2f62d4f..dd2657a 100644
--- a/src/main/java/de/ids_mannheim/korap/handlers/ResourceDao.java
+++ b/src/main/java/de/ids_mannheim/korap/handlers/ResourceDao.java
@@ -27,45 +27,48 @@
  * Created by hanl on 7/21/14.
  */
 //todo: auditing // testing
-public class ResourceDao<T extends KustvaktResource>
-        implements ResourceOperationIface<T> {
+public class ResourceDao<T extends KustvaktResource> implements
+        ResourceOperationIface<T> {
 
     private static Logger log = LoggerFactory.getLogger(ResourceDao.class);
     protected final NamedParameterJdbcTemplate jdbcTemplate;
 
-    public ResourceDao(PersistenceClient client) {
+
+    public ResourceDao (PersistenceClient client) {
         this.jdbcTemplate = (NamedParameterJdbcTemplate) client.getSource();
     }
 
+
     @Override
-    public Class<T> type() {
+    public Class<T> type () {
         return (Class<T>) KustvaktResource.class;
     }
 
+
     // todo: testing
     @Override
-    public List<T> getResources(Collection<Object> ids, User user)
+    public List<T> getResources (Collection<Object> ids, User user)
             throws KustvaktException {
-        String sql =
-                "SELECT rs.*, rt.name_path FROM resource_store as rs inner join resource_tree as rt"
-                        + " on rs.id=rt.child_id WHERE rs.id IN (:ids);";
+        String sql = "SELECT rs.*, rt.name_path FROM resource_store as rs inner join resource_tree as rt"
+                + " on rs.id=rt.child_id WHERE rs.id IN (:ids);";
         MapSqlParameterSource parameters = new MapSqlParameterSource();
         parameters.addValue("ids", ids);
         try {
             return (List<T>) this.jdbcTemplate.query(sql, parameters,
                     new RowMapperFactory.ResourceMapper());
-        }catch (DataAccessException e) {
-            log.error(
-                    "Exception during database retrieval for ids '" + ids + "'",
-                    e);
+        }
+        catch (DataAccessException e) {
+            log.error("Exception during database retrieval for ids '" + ids
+                    + "'", e);
             throw new dbException(user.getId(), "resource_store",
                     StatusCodes.DB_GET_FAILED, ids.toString());
         }
 
     }
 
+
     @Override
-    public int updateResource(T resource, User user) throws KustvaktException {
+    public int updateResource (T resource, User user) throws KustvaktException {
         MapSqlParameterSource source = new MapSqlParameterSource();
         source.addValue("id", resource.getPersistentID());
         source.addValue("name", resource.getName());
@@ -74,37 +77,42 @@
         final String sql = "UPDATE resource_store set name=:name, data=:data, description=:desc where persistent_id=:id;";
         try {
             return this.jdbcTemplate.update(sql, source);
-        }catch (DataAccessException e) {
-            log.error("Exception during database update for id '" + resource
-                    .getPersistentID() + "'", e);
+        }
+        catch (DataAccessException e) {
+            log.error(
+                    "Exception during database update for id '"
+                            + resource.getPersistentID() + "'", e);
             throw new dbException(user.getId(), "resource_store",
                     StatusCodes.DB_UPDATE_FAILED, resource.toString());
         }
     }
 
+
     @Override
-    public int[] updateResources(List<T> resources, User user)
+    public int[] updateResources (List<T> resources, User user)
             throws KustvaktException {
         return new int[1];
     }
 
+
     @Override
-    public <T extends KustvaktResource> T findbyId(String id, User user)
+    public <T extends KustvaktResource> T findbyId (String id, User user)
             throws KustvaktException {
         MapSqlParameterSource source = new MapSqlParameterSource();
         source.addValue("pid", id);
-        String sql =
-                "SELECT rs.*, rt.name_path FROM resource_store as rs inner join resource_tree as rt"
-                        + " on rs.id=rt.child_id WHERE rs.persistent_id=:pid group by rs.id;";
+        String sql = "SELECT rs.*, rt.name_path FROM resource_store as rs inner join resource_tree as rt"
+                + " on rs.id=rt.child_id WHERE rs.persistent_id=:pid group by rs.id;";
         try {
             return (T) this.jdbcTemplate.queryForObject(sql, source,
                     new RowMapperFactory.ResourceMapper());
-        }catch (DataAccessException e) {
+        }
+        catch (DataAccessException e) {
             return null;
         }
     }
 
-    public KustvaktResource findbyPath(String path, User user)
+
+    public KustvaktResource findbyPath (String path, User user)
             throws KustvaktException {
         MapSqlParameterSource source = new MapSqlParameterSource();
         source.addValue("path", path);
@@ -112,7 +120,8 @@
         try {
             return this.jdbcTemplate.queryForObject(sql, source,
                     new RowMapperFactory.ResourceMapper());
-        }catch (DataAccessException e) {
+        }
+        catch (DataAccessException e) {
             if (e instanceof IncorrectResultSizeDataAccessException)
                 throw new KustvaktException(StatusCodes.ILLEGAL_ARGUMENT,
                         "invalid request path given!", path);
@@ -120,18 +129,19 @@
         }
     }
 
+
     @Override
-    public <T extends KustvaktResource> T findbyId(Integer id, User user)
+    public <T extends KustvaktResource> T findbyId (Integer id, User user)
             throws KustvaktException {
         MapSqlParameterSource source = new MapSqlParameterSource();
         source.addValue("id", id);
-        String sql =
-                "SELECT rs.*, rt.name_path FROM resource_store as rs inner join resource_tree as rt on rs.id=rt.child_id "
-                        + "WHERE rs.id=:id group by rs.id order by rt.depth desc;";
+        String sql = "SELECT rs.*, rt.name_path FROM resource_store as rs inner join resource_tree as rt on rs.id=rt.child_id "
+                + "WHERE rs.id=:id group by rs.id order by rt.depth desc;";
         try {
             return (T) this.jdbcTemplate.queryForObject(sql, source,
                     new RowMapperFactory.ResourceMapper());
-        }catch (DataAccessException e) {
+        }
+        catch (DataAccessException e) {
             if (e instanceof IncorrectResultSizeDataAccessException)
                 throw new KustvaktException(StatusCodes.ILLEGAL_ARGUMENT,
                         "invalid request id given!", String.valueOf(id));
@@ -139,8 +149,9 @@
         }
     }
 
+
     @Override
-    public int storeResource(T resource, User user) throws KustvaktException {
+    public int storeResource (T resource, User user) throws KustvaktException {
         MapSqlParameterSource source = new MapSqlParameterSource();
         KeyHolder holder = new GeneratedKeyHolder();
         // parent_id necessary so trigger can be used for tree insert!
@@ -149,14 +160,14 @@
         b.insert(Attributes.NAME, Attributes.PARENT_ID,
                 Attributes.PERSISTENT_ID, Attributes.DESCRIPTION,
                 Attributes.CREATOR, Attributes.TYPE, Attributes.CREATED);
-        b.params(
-                ":name, :parent, :pid, :desc, :ow, :type, :created, :dtype, :data");
+        b.params(":name, :parent, :pid, :desc, :ow, :type, :created, :dtype, :data");
 
         if (resource.getParentID() == null) {
             sql = "INSERT INTO resource_store (name, parent_id, persistent_id, description, creator, type, created, data) "
                     + "VALUES (:name, :parent, :pid, :desc, :ow, :type, :created, :data);";
             parid = null;
-        }else {
+        }
+        else {
             // fixme: use trigger for consistency check!
             sql = "INSERT INTO resource_store (name, parent_id, persistent_id, description, creator, type, created, data) "
                     + "select :name, id, :pid, :desc, :ow, :type, :created, :data from resource_store where persistent_id=:parent;";
@@ -176,9 +187,11 @@
         try {
             this.jdbcTemplate
                     .update(sql, source, holder, new String[] { "id" });
-        }catch (DataAccessException e) {
-            log.error("Exception during database store for id '" + resource
-                    .getPersistentID() + "'", e);
+        }
+        catch (DataAccessException e) {
+            log.error(
+                    "Exception during database store for id '"
+                            + resource.getPersistentID() + "'", e);
             throw new dbException(user.getId(), "resource_store",
                     StatusCodes.DB_INSERT_FAILED, resource.toString());
         }
@@ -186,37 +199,42 @@
         return resource.getId();
     }
 
+
     @Override
-    public int deleteResource(String id, User user) throws KustvaktException {
+    public int deleteResource (String id, User user) throws KustvaktException {
         MapSqlParameterSource source = new MapSqlParameterSource();
         source.addValue("id", id);
         final String sql = "DELETE FROM resource_store WHERE persistent_id=:id;";
         try {
             return this.jdbcTemplate.update(sql, source);
-        }catch (DataAccessException e) {
+        }
+        catch (DataAccessException e) {
             throw new dbException(user.getId(), "resource_store",
                     StatusCodes.DB_DELETE_FAILED, id);
         }
     }
 
+
     @Override
-    public int size() {
+    public int size () {
         final String sql = "SELECT COUNT(*) FROM resource_store;";
         try {
-            return this.jdbcTemplate
-                    .queryForObject(sql, new HashMap<String, Object>(),
-                            Integer.class);
-        }catch (DataAccessException e) {
+            return this.jdbcTemplate.queryForObject(sql,
+                    new HashMap<String, Object>(), Integer.class);
+        }
+        catch (DataAccessException e) {
             return 0;
         }
     }
 
+
     @Override
-    public int truncate() {
+    public int truncate () {
         final String sql = "DELETE FROM resource_store;";
         try {
             return this.jdbcTemplate.update(sql, new HashMap<String, Object>());
-        }catch (DataAccessException e) {
+        }
+        catch (DataAccessException e) {
             return -1;
         }
     }
diff --git a/src/main/java/de/ids_mannheim/korap/handlers/RowMapperFactory.java b/src/main/java/de/ids_mannheim/korap/handlers/RowMapperFactory.java
index 9ed2524..43d5af5 100644
--- a/src/main/java/de/ids_mannheim/korap/handlers/RowMapperFactory.java
+++ b/src/main/java/de/ids_mannheim/korap/handlers/RowMapperFactory.java
@@ -24,7 +24,7 @@
     public static class UserMapMapper implements RowMapper<Map> {
 
         @Override
-        public Map mapRow(ResultSet rs, int rowNum) throws SQLException {
+        public Map mapRow (ResultSet rs, int rowNum) throws SQLException {
             User user = new UserMapper().mapRow(rs, rowNum);
             return user.toMap();
         }
@@ -33,7 +33,7 @@
     public static class UserMapper implements RowMapper<User> {
 
         @Override
-        public User mapRow(ResultSet rs, int rowNum) throws SQLException {
+        public User mapRow (ResultSet rs, int rowNum) throws SQLException {
             User user;
             switch (rs.getInt("type")) {
                 case 0:
@@ -45,17 +45,17 @@
                 default:
                     user = User.UserFactory.getDemoUser();
                     user.setId(rs.getInt("id"));
-                    user.setAccountCreation(
-                            rs.getTimestamp(Attributes.ACCOUNT_CREATION)
-                                    .getTime());
+                    user.setAccountCreation(rs.getTimestamp(
+                            Attributes.ACCOUNT_CREATION).getTime());
                     return user;
             }
             return user;
         }
 
-        private KorAPUser getKorAP(ResultSet rs) throws SQLException {
-            KorAPUser user = User.UserFactory
-                    .getUser(rs.getString(Attributes.USERNAME));
+
+        private KorAPUser getKorAP (ResultSet rs) throws SQLException {
+            KorAPUser user = User.UserFactory.getUser(rs
+                    .getString(Attributes.USERNAME));
             user.setPassword(rs.getString(Attributes.PASSWORD));
             user.setId(rs.getInt(Attributes.ID));
             user.setAccountLocked(rs.getBoolean(Attributes.ACCOUNTLOCK));
@@ -63,17 +63,18 @@
             user.setAccountLink(rs.getString(Attributes.ACCOUNTLINK));
             long l = rs.getLong(Attributes.URI_EXPIRATION);
 
-            URIParam param = new URIParam(rs.getString(Attributes.URI_FRAGMENT),
-                    l == 0 ? -1 : new Timestamp(l).getTime());
+            URIParam param = new URIParam(
+                    rs.getString(Attributes.URI_FRAGMENT), l == 0 ? -1
+                            : new Timestamp(l).getTime());
             user.addField(param);
             return user;
         }
 
-        private ShibUser getShib(ResultSet rs) throws SQLException {
-            ShibUser user = User.UserFactory
-                    .getShibInstance(rs.getString(Attributes.USERNAME),
-                            rs.getString(Attributes.MAIL),
-                            rs.getString(Attributes.CN));
+
+        private ShibUser getShib (ResultSet rs) throws SQLException {
+            ShibUser user = User.UserFactory.getShibInstance(
+                    rs.getString(Attributes.USERNAME),
+                    rs.getString(Attributes.MAIL), rs.getString(Attributes.CN));
             user.setId(rs.getInt(Attributes.ID));
             return user;
         }
@@ -83,10 +84,10 @@
     public static class AuditMapper implements RowMapper<AuditRecord> {
 
         @Override
-        public AuditRecord mapRow(ResultSet rs, int rowNum)
+        public AuditRecord mapRow (ResultSet rs, int rowNum)
                 throws SQLException {
-            AuditRecord r = new AuditRecord(
-                    AuditRecord.CATEGORY.valueOf(rs.getString("aud_category")));
+            AuditRecord r = new AuditRecord(AuditRecord.CATEGORY.valueOf(rs
+                    .getString("aud_category")));
             r.setUserid(rs.getString("aud_user"));
             r.setField_1(rs.getString("aud_field_1"));
             r.setTimestamp(rs.getTimestamp("aud_timestamp").getTime());
@@ -100,7 +101,7 @@
     public static class ResourceMapper implements RowMapper<KustvaktResource> {
 
         @Override
-        public KustvaktResource mapRow(ResultSet rs, int rowNum)
+        public KustvaktResource mapRow (ResultSet rs, int rowNum)
                 throws SQLException {
             KustvaktResource r = ResourceFactory.getResource(rs.getInt("type"));
             if (r != null) {
diff --git a/src/main/java/de/ids_mannheim/korap/handlers/UserDetailsDao.java b/src/main/java/de/ids_mannheim/korap/handlers/UserDetailsDao.java
index 42b0b60..4714ca8 100644
--- a/src/main/java/de/ids_mannheim/korap/handlers/UserDetailsDao.java
+++ b/src/main/java/de/ids_mannheim/korap/handlers/UserDetailsDao.java
@@ -25,12 +25,14 @@
 
     private NamedParameterJdbcTemplate jdbcTemplate;
 
-    public UserDetailsDao(PersistenceClient client) {
+
+    public UserDetailsDao (PersistenceClient client) {
         this.jdbcTemplate = (NamedParameterJdbcTemplate) client.getSource();
     }
 
+
     @Override
-    public int store(UserDetails data) {
+    public int store (UserDetails data) {
         String sql = "INSERT INTO user_details (user_id, data) VALUES (:userid, :data);";
         MapSqlParameterSource source = new MapSqlParameterSource();
         source.addValue("userid", data.getUserID());
@@ -42,14 +44,16 @@
             int id = gen.getKey().intValue();
             data.setId(id);
             return id;
-        }catch (DataAccessException e) {
+        }
+        catch (DataAccessException e) {
             e.printStackTrace();
             return -1;
         }
     }
 
+
     @Override
-    public int update(UserDetails data) {
+    public int update (UserDetails data) {
         String sql = "UPDATE user_details SET data = :data WHERE user_id=:userid;";
         MapSqlParameterSource source = new MapSqlParameterSource();
         source.addValue("userid", data.getUserID());
@@ -57,87 +61,98 @@
 
         try {
             return this.jdbcTemplate.update(sql, source);
-        }catch (DataAccessException e) {
+        }
+        catch (DataAccessException e) {
             e.printStackTrace();
             return -1;
         }
     }
 
+
     @Override
-    public UserDetails get(Integer id) throws dbException {
+    public UserDetails get (Integer id) throws dbException {
         String sql = "SELECT * FROM user_details WHERE id=:id;";
         MapSqlParameterSource source = new MapSqlParameterSource();
         source.addValue("id", id);
 
         try {
-            return this.jdbcTemplate
-                    .queryForObject(sql, source, new RowMapper<UserDetails>() {
+            return this.jdbcTemplate.queryForObject(sql, source,
+                    new RowMapper<UserDetails>() {
 
                         @Override
-                        public UserDetails mapRow(ResultSet rs, int rowNum)
+                        public UserDetails mapRow (ResultSet rs, int rowNum)
                                 throws SQLException {
-                            UserDetails details = new UserDetails(
-                                    rs.getInt("user_id"));
+                            UserDetails details = new UserDetails(rs
+                                    .getInt("user_id"));
                             details.setId(rs.getInt("id"));
                             details.setData(rs.getString("data"));
                             return details;
                         }
                     });
 
-        }catch (EmptyResultDataAccessException ex) {
+        }
+        catch (EmptyResultDataAccessException ex) {
             return null;
-        }catch (DataAccessException e) {
+        }
+        catch (DataAccessException e) {
             throw new dbException(-1, "userDetails",
                     StatusCodes.REQUEST_INVALID, String.valueOf(id));
         }
     }
 
+
     @Override
-    public UserDetails get(User user) throws dbException {
+    public UserDetails get (User user) throws dbException {
         String sql = "SELECT * FROM user_details WHERE user_id=:userid;";
         MapSqlParameterSource source = new MapSqlParameterSource();
         source.addValue("userid", user.getId());
 
         try {
-            return this.jdbcTemplate
-                    .queryForObject(sql, source, new RowMapper<UserDetails>() {
+            return this.jdbcTemplate.queryForObject(sql, source,
+                    new RowMapper<UserDetails>() {
 
                         @Override
-                        public UserDetails mapRow(ResultSet rs, int rowNum)
+                        public UserDetails mapRow (ResultSet rs, int rowNum)
                                 throws SQLException {
-                            UserDetails details = new UserDetails(
-                                    rs.getInt("user_id"));
+                            UserDetails details = new UserDetails(rs
+                                    .getInt("user_id"));
                             details.setId(rs.getInt("id"));
                             details.setData(rs.getString("data"));
                             return details;
                         }
                     });
-        }catch (EmptyResultDataAccessException ex) {
+        }
+        catch (EmptyResultDataAccessException ex) {
             return null;
-        }catch (DataAccessException e) {
+        }
+        catch (DataAccessException e) {
             throw new dbException(user.getId(), "userDetails",
                     StatusCodes.REQUEST_INVALID);
         }
     }
 
+
     @Override
-    public int delete(UserDetails data) {
+    public int delete (UserDetails data) {
         String sql = "DELETE FROM user_details WHERE id=:id";
         MapSqlParameterSource source = new MapSqlParameterSource();
         source.addValue("id", data.getId());
         try {
             return this.jdbcTemplate.update(sql, source);
-        }catch (DataAccessException e) {
+        }
+        catch (DataAccessException e) {
             return -1;
         }
     }
 
+
     @Override
-    public int deleteAll() {
+    public int deleteAll () {
         String sql = "DELETE FROM user_details;";
         try {
             return this.jdbcTemplate.update(sql, new HashMap<String, Object>());
-        }catch (DataAccessException e) {
+        }
+        catch (DataAccessException e) {
             e.printStackTrace();
             return -1;
         }
diff --git a/src/main/java/de/ids_mannheim/korap/handlers/UserSettingsDao.java b/src/main/java/de/ids_mannheim/korap/handlers/UserSettingsDao.java
index 6bb8453..2dfebdf 100644
--- a/src/main/java/de/ids_mannheim/korap/handlers/UserSettingsDao.java
+++ b/src/main/java/de/ids_mannheim/korap/handlers/UserSettingsDao.java
@@ -30,12 +30,14 @@
 
     private final NamedParameterJdbcTemplate jdbcTemplate;
 
-    public UserSettingsDao(PersistenceClient client) {
+
+    public UserSettingsDao (PersistenceClient client) {
         this.jdbcTemplate = (NamedParameterJdbcTemplate) client.getSource();
     }
 
+
     @Override
-    public int store(UserSettings data) {
+    public int store (UserSettings data) {
         String sql = "INSERT INTO user_settings (user_id, data) VALUES (:userid, :data);";
         MapSqlParameterSource source = new MapSqlParameterSource();
         source.addValue("userid", data.getUserID());
@@ -47,7 +49,8 @@
             int id = gen.getKey().intValue();
             data.setId(id);
             return id;
-        }catch (DataAccessException e) {
+        }
+        catch (DataAccessException e) {
             e.printStackTrace();
             jlog.error("couldn't store data in db for user with id '{}'",
                     data.getUserID());
@@ -55,8 +58,9 @@
         }
     }
 
+
     @Override
-    public int update(UserSettings data) {
+    public int update (UserSettings data) {
         String sql = "UPDATE user_settings SET data = :data WHERE user_id=:userid;";
         MapSqlParameterSource source = new MapSqlParameterSource();
         source.addValue("userid", data.getUserID());
@@ -64,87 +68,98 @@
 
         try {
             return this.jdbcTemplate.update(sql, source);
-        }catch (DataAccessException e) {
+        }
+        catch (DataAccessException e) {
             return -1;
         }
     }
 
+
     @Override
-    public UserSettings get(Integer id) throws dbException {
+    public UserSettings get (Integer id) throws dbException {
         String sql = "SELECT * FROM user_settings WHERE id=:id;";
         MapSqlParameterSource source = new MapSqlParameterSource();
         source.addValue("id", id);
 
         try {
-            return this.jdbcTemplate
-                    .queryForObject(sql, source, new RowMapper<UserSettings>() {
+            return this.jdbcTemplate.queryForObject(sql, source,
+                    new RowMapper<UserSettings>() {
 
                         @Override
-                        public UserSettings mapRow(ResultSet rs, int rowNum)
+                        public UserSettings mapRow (ResultSet rs, int rowNum)
                                 throws SQLException {
-                            UserSettings details = new UserSettings(
-                                    rs.getInt("user_id"));
+                            UserSettings details = new UserSettings(rs
+                                    .getInt("user_id"));
                             details.setId(rs.getInt("id"));
                             details.setData(rs.getString("data"));
                             return details;
                         }
                     });
 
-        }catch (EmptyResultDataAccessException ex) {
+        }
+        catch (EmptyResultDataAccessException ex) {
             return null;
-        }catch (DataAccessException e) {
+        }
+        catch (DataAccessException e) {
             throw new dbException(-1, "userSettings",
                     StatusCodes.REQUEST_INVALID, String.valueOf(id));
         }
     }
 
+
     @Override
-    public UserSettings get(User user) throws dbException {
+    public UserSettings get (User user) throws dbException {
         String sql = "SELECT * FROM user_settings WHERE user_id=:userid;";
         MapSqlParameterSource source = new MapSqlParameterSource();
         source.addValue("userid", user.getId());
 
         try {
-            return this.jdbcTemplate
-                    .queryForObject(sql, source, new RowMapper<UserSettings>() {
+            return this.jdbcTemplate.queryForObject(sql, source,
+                    new RowMapper<UserSettings>() {
 
                         @Override
-                        public UserSettings mapRow(ResultSet rs, int rowNum)
+                        public UserSettings mapRow (ResultSet rs, int rowNum)
                                 throws SQLException {
-                            UserSettings details = new UserSettings(
-                                    rs.getInt("user_id"));
+                            UserSettings details = new UserSettings(rs
+                                    .getInt("user_id"));
                             details.setId(rs.getInt("id"));
                             details.setData(rs.getString("data"));
                             return details;
                         }
                     });
 
-        }catch (EmptyResultDataAccessException ex) {
+        }
+        catch (EmptyResultDataAccessException ex) {
             return null;
-        }catch (DataAccessException e) {
+        }
+        catch (DataAccessException e) {
             throw new dbException(-1, "userSettings",
                     StatusCodes.REQUEST_INVALID);
         }
     }
 
+
     @Override
-    public int delete(UserSettings data) {
+    public int delete (UserSettings data) {
         String sql = "DELETE FROM user_settings WHERE id=:id";
         MapSqlParameterSource source = new MapSqlParameterSource();
         source.addValue("id", data.getId());
         try {
             return this.jdbcTemplate.update(sql, source);
-        }catch (DataAccessException e) {
+        }
+        catch (DataAccessException e) {
             return -1;
         }
     }
 
+
     @Override
-    public int deleteAll() {
+    public int deleteAll () {
         String sql = "DELETE FROM user_settings;";
         try {
             return this.jdbcTemplate.update(sql, new HashMap<String, Object>());
-        }catch (DataAccessException e) {
+        }
+        catch (DataAccessException e) {
             e.printStackTrace();
             return -1;
         }
diff --git a/src/main/java/de/ids_mannheim/korap/interfaces/AuthenticationIface.java b/src/main/java/de/ids_mannheim/korap/interfaces/AuthenticationIface.java
index 82d6737..5c5a9e8 100644
--- a/src/main/java/de/ids_mannheim/korap/interfaces/AuthenticationIface.java
+++ b/src/main/java/de/ids_mannheim/korap/interfaces/AuthenticationIface.java
@@ -8,16 +8,19 @@
 
 public interface AuthenticationIface {
 
-    TokenContext getUserStatus(String authToken) throws
-            KustvaktException;
+    TokenContext getUserStatus (String authToken) throws KustvaktException;
 
-    TokenContext createUserSession(User user, Map<String, Object> attr)
+
+    TokenContext createUserSession (User user, Map<String, Object> attr)
             throws KustvaktException;
 
-    void removeUserSession(String token) throws KustvaktException;
 
-    TokenContext refresh(TokenContext context) throws KustvaktException;
+    void removeUserSession (String token) throws KustvaktException;
 
-    String getIdentifier();
+
+    TokenContext refresh (TokenContext context) throws KustvaktException;
+
+
+    String getIdentifier ();
 
 }
diff --git a/src/main/java/de/ids_mannheim/korap/interfaces/AuthenticationManagerIface.java b/src/main/java/de/ids_mannheim/korap/interfaces/AuthenticationManagerIface.java
index ca155eb..ab39aca 100644
--- a/src/main/java/de/ids_mannheim/korap/interfaces/AuthenticationManagerIface.java
+++ b/src/main/java/de/ids_mannheim/korap/interfaces/AuthenticationManagerIface.java
@@ -17,64 +17,81 @@
 
     private Map<String, AuthenticationIface> providers;
 
-    public AuthenticationManagerIface() {
+
+    public AuthenticationManagerIface () {
         this.providers = new HashMap<>();
     }
 
-    public void setProviders(Set<AuthenticationIface> providers) {
+
+    public void setProviders (Set<AuthenticationIface> providers) {
         for (AuthenticationIface i : providers)
             this.providers.put(i.getIdentifier().toUpperCase(), i);
     }
 
-    protected AuthenticationIface getProvider(String key,
-            String default_iface) {
-        AuthenticationIface iface = this.providers
-                .get(key != null ? key.toUpperCase() : "NONE");
+
+    protected AuthenticationIface getProvider (String key, String default_iface) {
+        AuthenticationIface iface = this.providers.get(key != null ? key
+                .toUpperCase() : "NONE");
         // todo: configurable authentication schema
         if (iface == null)
             iface = this.providers.get(default_iface);
         return iface;
     }
 
-    public abstract TokenContext getTokenStatus(String token, String host,
+
+    public abstract TokenContext getTokenStatus (String token, String host,
             String useragent) throws KustvaktException;
 
-    public abstract User getUser(String username) throws KustvaktException;
 
-    public abstract User authenticate(int type, String username,
+    public abstract User getUser (String username) throws KustvaktException;
+
+
+    public abstract User authenticate (int type, String username,
             String password, Map<String, Object> attributes)
             throws KustvaktException;
 
-    public abstract TokenContext createTokenContext(User user,
+
+    public abstract TokenContext createTokenContext (User user,
             Map<String, Object> attr, String provider_key)
             throws KustvaktException;
 
-    public abstract void logout(TokenContext context) throws KustvaktException;
 
-    public abstract void lockAccount(User user) throws KustvaktException;
+    public abstract void logout (TokenContext context) throws KustvaktException;
 
-    public abstract User createUserAccount(Map<String, Object> attributes,
+
+    public abstract void lockAccount (User user) throws KustvaktException;
+
+
+    public abstract User createUserAccount (Map<String, Object> attributes,
             boolean confirmation_required) throws KustvaktException;
 
+
     //    public abstract boolean updateAccount(User user) throws KustvaktException;
 
-    public abstract boolean deleteAccount(User user) throws KustvaktException;
+    public abstract boolean deleteAccount (User user) throws KustvaktException;
 
-    public abstract <T extends Userdata> T getUserData(User user,
+
+    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,
+    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,
+
+    public abstract void resetPassword (String uriFragment, String username,
             String newPassphrase) throws KustvaktException;
 
-    public abstract void confirmRegistration(String uriFragment,
+
+    public abstract void confirmRegistration (String uriFragment,
             String username) throws KustvaktException;
 
-    public String providerList() {
+
+    public String providerList () {
         return "provider list: " + this.providers.toString();
     }
 }
diff --git a/src/main/java/de/ids_mannheim/korap/interfaces/EncryptionIface.java b/src/main/java/de/ids_mannheim/korap/interfaces/EncryptionIface.java
index ec31ed7..7007fb8 100644
--- a/src/main/java/de/ids_mannheim/korap/interfaces/EncryptionIface.java
+++ b/src/main/java/de/ids_mannheim/korap/interfaces/EncryptionIface.java
@@ -13,26 +13,31 @@
         SIMPLE, ESAPICYPHER, BCRYPT
     }
 
+
     /**
      * One-way hashing of String input. Used to canonicalize
-     *
+     * 
      * @param input
      * @param salt
      * @return
      * @throws java.security.NoSuchAlgorithmException
      * @throws java.io.UnsupportedEncodingException
      */
-    public String produceSecureHash(String input, String salt)
+    public String produceSecureHash (String input, String salt)
             throws NoSuchAlgorithmException, UnsupportedEncodingException,
             KustvaktException;
 
-    public String produceSecureHash(String input)
+
+    public String produceSecureHash (String input)
             throws NoSuchAlgorithmException, UnsupportedEncodingException,
             KustvaktException;
 
-    public String hash(String text, String salt) throws Exception;
 
-    public String hash(String text) throws Exception;
+    public String hash (String text, String salt) throws Exception;
+
+
+    public String hash (String text) throws Exception;
+
 
     /**
      * @param plain
@@ -40,36 +45,45 @@
      * @param salt
      * @return
      */
-    public boolean checkHash(String plain, String hash, String salt);
+    public boolean checkHash (String plain, String hash, String salt);
 
-    public boolean checkHash(String plain, String hash);
 
-    public String getSalt(User user);
+    public boolean checkHash (String plain, String hash);
+
+
+    public String getSalt (User user);
+
 
     /**
      * create random String to be used as authentication token
-     *
+     * 
      * @return
      */
-    public String createToken(boolean hash, Object... obj);
+    public String createToken (boolean hash, Object ... obj);
 
-    public String createToken();
+
+    public String createToken ();
+
 
     /**
      * create a random Integer to be used as ID for databases
-     *
+     * 
      * @return
      */
-    public String createID(Object... obj);
+    public String createID (Object ... obj);
 
-    public String encodeBase();
 
-    public Map<String, Object> validateMap(Map<String, Object> map) throws KustvaktException;
+    public String encodeBase ();
 
-    public String validateEntry(String input, String type)
+
+    public Map<String, Object> validateMap (Map<String, Object> map)
             throws KustvaktException;
 
 
-//    public void validate(Object instance) throws KustvaktException;
+    public String validateEntry (String input, String type)
+            throws KustvaktException;
+
+
+    //    public void validate(Object instance) throws KustvaktException;
 
 }
diff --git a/src/main/java/de/ids_mannheim/korap/interfaces/db/AuditingIface.java b/src/main/java/de/ids_mannheim/korap/interfaces/db/AuditingIface.java
index ed21e60..5e6866b 100644
--- a/src/main/java/de/ids_mannheim/korap/interfaces/db/AuditingIface.java
+++ b/src/main/java/de/ids_mannheim/korap/interfaces/db/AuditingIface.java
@@ -22,26 +22,31 @@
             .synchronizedList(new ArrayList<>(BATCH_SIZE + 5));
     private final List<AuditRecord> buffer = new ArrayList<>(BATCH_SIZE + 5);
 
-    public abstract <T extends AuditRecord> List<T> retrieveRecords(
+
+    public abstract <T extends AuditRecord> List<T> retrieveRecords (
             AuditRecord.CATEGORY category, DateTime day, DateTime until,
             boolean exact, int limit);
 
-    public abstract <T extends AuditRecord> List<T> retrieveRecords(
+
+    public abstract <T extends AuditRecord> List<T> retrieveRecords (
             AuditRecord.CATEGORY category, User user, int limit);
 
-    public abstract <T extends AuditRecord> List<T> retrieveRecords(
+
+    public abstract <T extends AuditRecord> List<T> retrieveRecords (
             LocalDate day, int hitMax);
 
-    public abstract <T extends AuditRecord> List<T> retrieveRecords(
+
+    public abstract <T extends AuditRecord> List<T> retrieveRecords (
             String userID, LocalDate start, LocalDate end, int hitMax);
 
-    private void addAndRun(AuditRecord record) {
+
+    private void addAndRun (AuditRecord record) {
         if (buffer.size() > BATCH_SIZE) {
             records.clear();
             records.addAll(buffer);
             new Thread(new Runnable() {
                 @Override
-                public void run() {
+                public void run () {
                     apply();
                 }
             }).start();
@@ -51,21 +56,25 @@
             buffer.add(record);
     }
 
-    public <T extends AuditRecord> void audit(T request) {
+
+    public <T extends AuditRecord> void audit (T request) {
         addAndRun(request);
     }
 
-    public <T extends AuditRecord> void audit(List<T> requests) {
+
+    public <T extends AuditRecord> void audit (List<T> requests) {
         for (T rec : requests)
             addAndRun(rec);
     }
 
-    public abstract void apply();
 
-    protected List<AuditRecord> getRecordsToSave() {
+    public abstract void apply ();
+
+
+    protected List<AuditRecord> getRecordsToSave () {
         return this.records;
     }
 
 
-    public abstract void finish();
+    public abstract void finish ();
 }
diff --git a/src/main/java/de/ids_mannheim/korap/interfaces/db/EntityHandlerIface.java b/src/main/java/de/ids_mannheim/korap/interfaces/db/EntityHandlerIface.java
index a844fbc..456b385 100644
--- a/src/main/java/de/ids_mannheim/korap/interfaces/db/EntityHandlerIface.java
+++ b/src/main/java/de/ids_mannheim/korap/interfaces/db/EntityHandlerIface.java
@@ -11,20 +11,26 @@
  */
 public interface EntityHandlerIface {
 
-    User getAccount(String username)
-            throws EmptyResultException, KustvaktException;
+    User getAccount (String username) throws EmptyResultException,
+            KustvaktException;
 
-    int updateAccount(User user) throws KustvaktException;
 
-    int createAccount(User user) throws KustvaktException;
+    int updateAccount (User user) throws KustvaktException;
 
-    int deleteAccount(Integer userid) throws KustvaktException;
 
-    int truncate() throws KustvaktException;
+    int createAccount (User user) throws KustvaktException;
 
-    int resetPassphrase(String username, String uriToken, String passphrase)
+
+    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)
+
+    int activateAccount (String username, String uriToken)
             throws KustvaktException;
 }
diff --git a/src/main/java/de/ids_mannheim/korap/interfaces/db/PersistenceClient.java b/src/main/java/de/ids_mannheim/korap/interfaces/db/PersistenceClient.java
index 573d346..9fd0f79 100644
--- a/src/main/java/de/ids_mannheim/korap/interfaces/db/PersistenceClient.java
+++ b/src/main/java/de/ids_mannheim/korap/interfaces/db/PersistenceClient.java
@@ -13,39 +13,47 @@
     protected String database;
     private InputStream schema;
 
-    public PersistenceClient(String database, TYPE type) {
+
+    public PersistenceClient (String database, TYPE type) {
         this.type = type;
         this.database = database;
     }
 
-    public PersistenceClient(TYPE type) {
+
+    public PersistenceClient (TYPE type) {
         this.type = type;
     }
 
-    public PersistenceClient() {
-    }
 
-    protected void setSource(SOURCE conn) {
+    public PersistenceClient () {}
+
+
+    protected void setSource (SOURCE conn) {
         this.source = conn;
     }
 
-    public void setDatabase(String name) {
+
+    public void setDatabase (String name) {
         this.database = name;
     }
 
-    public void setSchema(String schema_path) throws FileNotFoundException {
+
+    public void setSchema (String schema_path) throws FileNotFoundException {
         this.schema = new FileInputStream(new File(schema_path));
     }
 
+
     // for spring configuration
     @Deprecated
-    public void setSchema(InputStream schema) throws IOException {
+    public void setSchema (InputStream schema) throws IOException {
         this.schema = schema;
     }
 
-    public abstract boolean checkDatabase();
 
-    public abstract void createDatabase() throws IOException;
+    public abstract boolean checkDatabase ();
+
+
+    public abstract void createDatabase () throws IOException;
 
     public enum TYPE {
         SQL, CASSANDRA
diff --git a/src/main/java/de/ids_mannheim/korap/interfaces/db/PolicyHandlerIface.java b/src/main/java/de/ids_mannheim/korap/interfaces/db/PolicyHandlerIface.java
index b251de1..8c55953 100644
--- a/src/main/java/de/ids_mannheim/korap/interfaces/db/PolicyHandlerIface.java
+++ b/src/main/java/de/ids_mannheim/korap/interfaces/db/PolicyHandlerIface.java
@@ -21,7 +21,9 @@
      * @param user
      * @throws KustvaktException
      */
-    int createPolicy(SecurityPolicy policy, User user) throws KustvaktException;
+    int createPolicy (SecurityPolicy policy, User user)
+            throws KustvaktException;
+
 
     /**
      * @param target
@@ -29,16 +31,20 @@
      * @param perm
      * @return
      */
-    List<SecurityPolicy>[] getPolicies(Integer target, User user, Byte perm);
+    List<SecurityPolicy>[] getPolicies (Integer target, User user, Byte perm);
 
-    List<SecurityPolicy> getPolicies(PolicyCondition condition,Class<? extends KustvaktResource> clazz, Byte perm);
+
+    List<SecurityPolicy> getPolicies (PolicyCondition condition,
+            Class<? extends KustvaktResource> clazz, Byte perm);
+
 
     /**
      * @param policy
      * @return
      * @throws KustvaktException
      */
-    void mapConstraints(SecurityPolicy policy) throws KustvaktException;
+    void mapConstraints (SecurityPolicy policy) throws KustvaktException;
+
 
     /**
      * @param target
@@ -46,7 +52,8 @@
      * @param perm
      * @return
      */
-    List<SecurityPolicy>[] getPolicies(String target, User user, Byte perm);
+    List<SecurityPolicy>[] getPolicies (String target, User user, Byte perm);
+
 
     /**
      * @param path
@@ -55,7 +62,8 @@
      * @return
      */
     // todo: refactor
-    List<SecurityPolicy>[] findPolicies(String path, User user, Byte perm);
+    List<SecurityPolicy>[] findPolicies (String path, User user, Byte perm);
+
 
     /**
      * @param path
@@ -65,10 +73,11 @@
      * @return
      * @throws KustvaktException
      */
-    List<KustvaktResource.Container> getDescending(String path, User user,
+    List<KustvaktResource.Container> getDescending (String path, User user,
             Byte b, Class<? extends KustvaktResource> clazz)
             throws KustvaktException;
 
+
     /**
      * @param path
      * @param user
@@ -77,15 +86,17 @@
      * @return
      * @throws KustvaktException
      */
-    List<KustvaktResource.Container> getAscending(String path, User user,
+    List<KustvaktResource.Container> getAscending (String path, User user,
             Byte b, Class<? extends KustvaktResource> clazz)
             throws KustvaktException;
 
+
     /**
      * @param id
      * @param user
      */
-    int deleteResourcePolicies(String id, User user) throws KustvaktException;
+    int deleteResourcePolicies (String id, User user) throws KustvaktException;
+
 
     /**
      * @param policy
@@ -93,7 +104,9 @@
      * @return
      * @throws KustvaktException
      */
-    int deletePolicy(SecurityPolicy policy, User user) throws KustvaktException;
+    int deletePolicy (SecurityPolicy policy, User user)
+            throws KustvaktException;
+
 
     /**
      * @param policy
@@ -101,16 +114,19 @@
      * @return
      * @throws KustvaktException
      */
-    int updatePolicy(SecurityPolicy policy, User user) throws KustvaktException;
+    int updatePolicy (SecurityPolicy policy, User user)
+            throws KustvaktException;
+
 
     /**
      * checks if a similar policy already exists
-     *
+     * 
      * @param policy
      * @return
      * @throws KustvaktException
      */
-    int checkPolicy(SecurityPolicy policy, User user) throws KustvaktException;
+    int checkPolicy (SecurityPolicy policy, User user) throws KustvaktException;
+
 
     /**
      * @param user
@@ -119,9 +135,10 @@
      * @return
      * @throws KustvaktException
      */
-    int matchCondition(User user, String name, boolean owner)
+    int matchCondition (User user, String name, boolean owner)
             throws KustvaktException;
 
+
     /**
      * @param username
      * @param condition
@@ -129,9 +146,10 @@
      * @return
      * @throws KustvaktException
      */
-    int addToCondition(String username, PolicyCondition condition,
+    int addToCondition (String username, PolicyCondition condition,
             boolean admin) throws KustvaktException;
 
+
     /**
      * @param usernames
      * @param condition
@@ -140,37 +158,42 @@
      */
 
     //todo: add a handler user id, to skip the matching step in the corpusmanagement segment!
-    int[] addToCondition(List<String> usernames, PolicyCondition condition,
+    int[] addToCondition (List<String> usernames, PolicyCondition condition,
             boolean status) throws KustvaktException;
 
+
     /**
      * @param usernames
      * @param condition
      * @throws KustvaktException
      */
-    void removeFromCondition(List<String> usernames, PolicyCondition condition)
+    void removeFromCondition (List<String> usernames, PolicyCondition condition)
             throws KustvaktException;
 
+
     /**
      * @param param
      * @throws KustvaktException
      */
-    int createParamBinding(Parameter param) throws KustvaktException;
+    int createParamBinding (Parameter param) throws KustvaktException;
+
 
     /**
      * @param condition
      * @return
      * @throws KustvaktException
      */
-    List<String> getUsersFromCondition(PolicyCondition condition)
+    List<String> getUsersFromCondition (PolicyCondition condition)
             throws KustvaktException;
 
+
     /**
      * @param policy
      * @throws KustvaktException
      */
-    int removeParamBinding(SecurityPolicy policy) throws KustvaktException;
+    int removeParamBinding (SecurityPolicy policy) throws KustvaktException;
 
-    int size();
+
+    int size ();
 
 }
diff --git a/src/main/java/de/ids_mannheim/korap/interfaces/db/ResourceOperationIface.java b/src/main/java/de/ids_mannheim/korap/interfaces/db/ResourceOperationIface.java
index 6666d49..f13e254 100644
--- a/src/main/java/de/ids_mannheim/korap/interfaces/db/ResourceOperationIface.java
+++ b/src/main/java/de/ids_mannheim/korap/interfaces/db/ResourceOperationIface.java
@@ -11,32 +11,38 @@
 
 // todo: for transaction to work this should go into core module!?!
 // todo: user instance only required for auditing pointcut operations
-public interface ResourceOperationIface<T extends KustvaktResource>
-        extends KustvaktTypeInterface<T>, KustvaktBaseDaoInterface {
+public interface ResourceOperationIface<T extends KustvaktResource> extends
+        KustvaktTypeInterface<T>, KustvaktBaseDaoInterface {
 
-    <T extends KustvaktResource> T findbyId(String id, User user)
+    <T extends KustvaktResource> T findbyId (String id, User user)
             throws KustvaktException;
 
-    <T extends KustvaktResource> T findbyId(Integer id, User user)
+
+    <T extends KustvaktResource> T findbyId (Integer id, User user)
             throws KustvaktException;
 
-    List<T> getResources(Collection<Object> ids, User user)
+
+    List<T> getResources (Collection<Object> ids, User user)
             throws KustvaktException;
 
-    int updateResource(T resource, User user) throws KustvaktException;
 
-    int[] updateResources(List<T> resources, User user)
+    int updateResource (T resource, User user) throws KustvaktException;
+
+
+    int[] updateResources (List<T> resources, User user)
             throws KustvaktException;
 
+
     /**
      * store a resource and return the id of the inserted value
-     *
+     * 
      * @param resource
      * @return
      * @throws KustvaktException
      */
-    int storeResource(T resource, User user) throws KustvaktException;
+    int storeResource (T resource, User user) throws KustvaktException;
+
 
     //    public void deleteResource(Integer id, User user) throws KorAPException;
-    int deleteResource(String id, User user) throws KustvaktException;
+    int deleteResource (String id, User user) throws KustvaktException;
 }
diff --git a/src/main/java/de/ids_mannheim/korap/interfaces/db/UserDataDbIface.java b/src/main/java/de/ids_mannheim/korap/interfaces/db/UserDataDbIface.java
index e1812ff..5b0cf0e 100644
--- a/src/main/java/de/ids_mannheim/korap/interfaces/db/UserDataDbIface.java
+++ b/src/main/java/de/ids_mannheim/korap/interfaces/db/UserDataDbIface.java
@@ -10,16 +10,21 @@
  */
 public interface UserDataDbIface<T extends Userdata> {
 
-    public int store(T data) throws KustvaktException;
+    public int store (T data) throws KustvaktException;
 
-    public int update(T data) throws KustvaktException;
 
-    public T get(Integer id) throws KustvaktException;
+    public int update (T data) throws KustvaktException;
 
-    public T get(User user) throws KustvaktException;
 
-    public int delete(T data) throws KustvaktException;
+    public T get (Integer id) throws KustvaktException;
 
-    public int deleteAll() throws KustvaktException;
+
+    public T get (User user) throws KustvaktException;
+
+
+    public int delete (T data) throws KustvaktException;
+
+
+    public int deleteAll () throws KustvaktException;
 
 }
diff --git a/src/main/java/de/ids_mannheim/korap/interfaces/defaults/DefaultAuditing.java b/src/main/java/de/ids_mannheim/korap/interfaces/defaults/DefaultAuditing.java
index ef76c8c..86e533e 100644
--- a/src/main/java/de/ids_mannheim/korap/interfaces/defaults/DefaultAuditing.java
+++ b/src/main/java/de/ids_mannheim/korap/interfaces/defaults/DefaultAuditing.java
@@ -23,58 +23,68 @@
 
     private FileOutputStream stream;
 
-    public DefaultAuditing() {
+
+    public DefaultAuditing () {
         try {
             File f = new File("logs");
             f.mkdirs();
             stream = new FileOutputStream(new File(f, "default_audit.log"));
-        }catch (FileNotFoundException e) {
+        }
+        catch (FileNotFoundException e) {
             e.printStackTrace();
         }
     }
 
+
     @Override
-    public <T extends AuditRecord> List<T> retrieveRecords(
+    public <T extends AuditRecord> List<T> retrieveRecords (
             AuditRecord.CATEGORY category, DateTime day, DateTime until,
             boolean exact, int limit) {
         throw new UnsupportedOperationException("Operation not supported!");
     }
 
+
     @Override
-    public <T extends AuditRecord> List<T> retrieveRecords(
+    public <T extends AuditRecord> List<T> retrieveRecords (
             AuditRecord.CATEGORY category, User user, int limit) {
         throw new UnsupportedOperationException("Operation not supported!");
     }
 
+
     @Override
-    public <T extends AuditRecord> List<T> retrieveRecords(LocalDate day,
+    public <T extends AuditRecord> List<T> retrieveRecords (LocalDate day,
             int hitMax) {
         throw new UnsupportedOperationException("Operation not supported!");
     }
 
+
     @Override
-    public <T extends AuditRecord> List<T> retrieveRecords(String userID,
+    public <T extends AuditRecord> List<T> retrieveRecords (String userID,
             LocalDate start, LocalDate end, int hitMax) {
         throw new UnsupportedOperationException("Operation not supported!");
     }
 
+
     @Override
-    public void apply() {
+    public void apply () {
         List<AuditRecord> rcs = getRecordsToSave();
         try {
             for (AuditRecord r : rcs)
                 stream.write((r.toString() + "\n").getBytes());
-        }catch (IOException e) {
+        }
+        catch (IOException e) {
             e.printStackTrace();
         }
     }
 
+
     @Override
-    public void finish() {
+    public void finish () {
         try {
             stream.flush();
             stream.close();
-        }catch (IOException e) {
+        }
+        catch (IOException e) {
             e.printStackTrace();
         }
     }
diff --git a/src/main/java/de/ids_mannheim/korap/interfaces/defaults/DefaultEncryption.java b/src/main/java/de/ids_mannheim/korap/interfaces/defaults/DefaultEncryption.java
index 108188e..96d5c52 100644
--- a/src/main/java/de/ids_mannheim/korap/interfaces/defaults/DefaultEncryption.java
+++ b/src/main/java/de/ids_mannheim/korap/interfaces/defaults/DefaultEncryption.java
@@ -21,77 +21,91 @@
 
     private SecureRandom randomizer;
 
-    public DefaultEncryption() {
+
+    public DefaultEncryption () {
         randomizer = new SecureRandom();
     }
 
+
     @Override
-    public String produceSecureHash(String input, String salt)
+    public String produceSecureHash (String input, String salt)
             throws NoSuchAlgorithmException, UnsupportedEncodingException,
             KustvaktException {
         return null;
     }
 
+
     @Override
-    public String produceSecureHash(String input)
+    public String produceSecureHash (String input)
             throws NoSuchAlgorithmException, UnsupportedEncodingException,
             KustvaktException {
         return null;
     }
 
+
     @Override
-    public String hash(String text, String salt) throws Exception {
+    public String hash (String text, String salt) throws Exception {
         return null;
     }
 
+
     @Override
-    public String hash(String value) {
+    public String hash (String value) {
         return null;
     }
 
+
     @Override
-    public boolean checkHash(String plain, String hash, String salt) {
+    public boolean checkHash (String plain, String hash, String salt) {
         return false;
     }
 
+
     @Override
-    public boolean checkHash(String plain, String hash) {
+    public boolean checkHash (String plain, String hash) {
         return false;
     }
 
+
     @Override
-    public String getSalt(User user) {
+    public String getSalt (User user) {
         return null;
     }
 
+
     @Override
-    public String createToken(boolean hash, Object... obj) {
+    public String createToken (boolean hash, Object ... obj) {
         return createToken();
 
     }
 
+
     @Override
-    public String createToken() {
+    public String createToken () {
         return new BigInteger(100, randomizer).toString(20);
     }
 
+
     @Override
-    public String createID(Object... obj) {
+    public String createID (Object ... obj) {
         return createToken();
     }
 
+
     @Override
-    public String encodeBase() {
+    public String encodeBase () {
         return null;
     }
 
+
     @Override
-    public Map validateMap(Map map) throws KustvaktException {
+    public Map validateMap (Map map) throws KustvaktException {
         return null;
     }
 
+
     @Override
-    public String validateEntry(String input, String type)
+    public String validateEntry (String input, String type)
             throws KustvaktException {
         return input;
     }
diff --git a/src/main/java/de/ids_mannheim/korap/interfaces/defaults/KustvaktEncryption.java b/src/main/java/de/ids_mannheim/korap/interfaces/defaults/KustvaktEncryption.java
index 1707616..632b0e4 100644
--- a/src/main/java/de/ids_mannheim/korap/interfaces/defaults/KustvaktEncryption.java
+++ b/src/main/java/de/ids_mannheim/korap/interfaces/defaults/KustvaktEncryption.java
@@ -43,7 +43,8 @@
     private final Randomizer randomizer;
     private KustvaktConfiguration config;
 
-    public KustvaktEncryption(KustvaktConfiguration config) {
+
+    public KustvaktEncryption (KustvaktConfiguration config) {
         jlog.info("initializing KorAPEncryption implementation");
         this.nullable = false;
         this.validator = DefaultValidator.getInstance();
@@ -51,7 +52,8 @@
         this.config = config;
     }
 
-    public static boolean matchTokenByteCode(Object param) {
+
+    public static boolean matchTokenByteCode (Object param) {
         if (!(param instanceof String))
             return false;
         String token = (String) param;
@@ -59,34 +61,41 @@
         return 64 == bytes.length;
     }
 
-    private String encodeBase(byte[] bytes) throws EncoderException {
+
+    private String encodeBase (byte[] bytes) throws EncoderException {
         return Base64.encodeBase64String(bytes);
     }
 
+
     @Override
-    public String encodeBase() {
+    public String encodeBase () {
         try {
             return encodeBase(this.createSecureRandom(24));
-        }catch (EncoderException e) {
+        }
+        catch (EncoderException e) {
             return "";
         }
     }
 
-    public String produceSecureHash(String input) {
+
+    public String produceSecureHash (String input) {
         return produceSecureHash(input, "");
     }
 
+
     @Override
-    public String produceSecureHash(String input, String salt) {
+    public String produceSecureHash (String input, String salt) {
         String hashString = "";
         switch (config.getEncryption()) {
             case ESAPICYPHER:
                 try {
                     hashString = hash(input, salt);
-                }catch (NoSuchAlgorithmException e) {
+                }
+                catch (NoSuchAlgorithmException e) {
                     jlog.error("there was an encryption error!", e);
                     return null;
-                }catch (Exception e) {
+                }
+                catch (Exception e) {
                     jlog.error("there was an error!", e);
                     return null;
                 }
@@ -99,7 +108,8 @@
 
                     for (byte b : digest)
                         hashString += String.format("%02x", b);
-                }catch (UnsupportedEncodingException | NoSuchAlgorithmException e) {
+                }
+                catch (UnsupportedEncodingException | NoSuchAlgorithmException e) {
                     e.printStackTrace();
                 }
                 break;
@@ -113,7 +123,8 @@
         return hashString;
     }
 
-    public String hash(String text, String salt) throws Exception {
+
+    public String hash (String text, String salt) throws Exception {
         byte[] bytes;
 
         MessageDigest md = MessageDigest.getInstance(ALGORITHM);
@@ -131,16 +142,19 @@
         return coding;
     }
 
+
     @Override
-    public String hash(String input) {
+    public String hash (String input) {
         String hashString = "";
         MessageDigest md;
         try {
             md = MessageDigest.getInstance("SHA-256");
             md.update(input.getBytes("UTF-8"));
-        }catch (NoSuchAlgorithmException e) {
+        }
+        catch (NoSuchAlgorithmException e) {
             return "";
-        }catch (UnsupportedEncodingException e) {
+        }
+        catch (UnsupportedEncodingException e) {
             return "";
         }
 
@@ -152,8 +166,10 @@
         return hashString;
     }
 
+
     /**
-     * // some sort of algorithm to create token and isSystem regularly the integrity
+     * // some sort of algorithm to create token and isSystem
+     * regularly the integrity
      * // of the token
      * public String createAuthToken() {
      * final byte[] rNumber = SecureRGenerator
@@ -161,19 +177,21 @@
      * String hash;
      * try {
      * hash = produceSimpleHash(SecureRGenerator.toHex(rNumber));
-     * } catch (NoSuchAlgorithmException | UnsupportedEncodingException e) {
+     * } catch (NoSuchAlgorithmException |
+     * UnsupportedEncodingException e) {
      * return "";
      * }
      * return hash;
      * }
      */
 
-    private byte[] createSecureRandom(int size) {
+    private byte[] createSecureRandom (int size) {
         return SecureRGenerator.getNextSecureRandom(size);
     }
 
+
     @Override
-    public String createToken(boolean hash, Object... obj) {
+    public String createToken (boolean hash, Object ... obj) {
         StringBuffer b = new StringBuffer();
         try {
             for (Object o : obj) {
@@ -184,41 +202,45 @@
                 return encodeBase(hash(b.toString().trim()).getBytes());
             else
                 return encodeBase(b.toString().trim().getBytes());
-        }catch (EncoderException e) {
+        }
+        catch (EncoderException e) {
             return "";
         }
 
     }
 
+
     @Override
-    public String createToken() {
+    public String createToken () {
         String encoded;
-        String v = randomizer
-                .getRandomString(SecureRGenerator.TOKEN_RANDOM_SIZE,
-                        SecureRGenerator.toHex(createSecureRandom(64))
-                                .toCharArray());
+        String v = randomizer.getRandomString(
+                SecureRGenerator.TOKEN_RANDOM_SIZE,
+                SecureRGenerator.toHex(createSecureRandom(64)).toCharArray());
         encoded = hash(v);
         jlog.trace("creating new token {}", encoded);
         return encoded;
     }
 
+
     @Override
-    public String createID(Object... obj) {
+    public String createID (Object ... obj) {
         final byte[] rNumber = SecureRGenerator
                 .getNextSecureRandom(SecureRGenerator.CORPUS_RANDOM_SIZE);
         if (obj.length != 0) {
             ArrayList s = new ArrayList();
             Collections.addAll(s, obj);
             obj = s.toArray();
-        }else {
+        }
+        else {
             obj = new Object[1];
             obj[0] = rNumber;
         }
         return createToken(false, obj);
     }
 
+
     @Override
-    public boolean checkHash(String plain, String hash, String salt) {
+    public boolean checkHash (String plain, String hash, String salt) {
         String pw = "";
         switch (config.getEncryption()) {
             case ESAPICYPHER:
@@ -227,7 +249,8 @@
             case BCRYPT:
                 try {
                     return BCrypt.checkpw(plain, hash);
-                }catch (IllegalArgumentException e) {
+                }
+                catch (IllegalArgumentException e) {
                     return false;
                 }
             case SIMPLE:
@@ -237,15 +260,17 @@
         return pw.equals(hash);
     }
 
+
     @Override
-    public boolean checkHash(String plain, String hash) {
+    public boolean checkHash (String plain, String hash) {
         switch (config.getEncryption()) {
             case ESAPICYPHER:
                 return produceSecureHash(plain).equals(hash);
             case BCRYPT:
                 try {
                     return BCrypt.checkpw(plain, hash);
-                }catch (IllegalArgumentException e) {
+                }
+                catch (IllegalArgumentException e) {
                     return false;
                 }
             case SIMPLE:
@@ -254,16 +279,19 @@
         return false;
     }
 
+
     @Override
-    public String getSalt(User user) {
+    public String getSalt (User user) {
         Class u = user.getClass();
         Field field;
         try {
             field = u.getSuperclass().getDeclaredField(PASSWORD_SALT_FIELD);
-        }catch (NoSuchFieldException e) {
+        }
+        catch (NoSuchFieldException e) {
             try {
                 field = u.getDeclaredField(PASSWORD_SALT_FIELD);
-            }catch (NoSuchFieldException e1) {
+            }
+            catch (NoSuchFieldException e1) {
                 // do nothing
                 e.printStackTrace();
                 return null;
@@ -274,16 +302,18 @@
             String value = String.valueOf(field.get(user));
             field.setAccessible(false);
             return value;
-        }catch (IllegalAccessException e) {
+        }
+        catch (IllegalAccessException e) {
             // do nothing
             e.printStackTrace();
         }
         return null;
     }
 
+
     // todo: where applied?
     @Override
-    public Map<String, Object> validateMap(Map<String, Object> map)
+    public Map<String, Object> validateMap (Map<String, Object> map)
             throws KustvaktException {
         Map<String, Object> safeMap = new HashMap<>();
         KustvaktMap kmap = new KustvaktMap(map);
@@ -294,13 +324,15 @@
                     String value = validateEntry(kmap.get(key), key);
                     safeMap.put(key, value);
                 }
-            }else {
+            }
+            else {
                 for (String key : kmap.keySet()) {
                     Object value = kmap.getRaw(key);
                     if (value instanceof String) {
                         value = validateEntry((String) value, key);
 
-                    }else if (value instanceof List) {
+                    }
+                    else if (value instanceof List) {
                         List list = (List) value;
                         for (Object v : list) {
                             if (v instanceof String)
@@ -319,13 +351,15 @@
         return safeMap;
     }
 
+
     @Deprecated
-    private String validateString(String descr, String input, String type,
+    private String validateString (String descr, String input, String type,
             int length, boolean nullable) throws KustvaktException {
         String s;
         try {
             s = validator.getValidInput(descr, input, type, length, nullable);
-        }catch (ValidationException e) {
+        }
+        catch (ValidationException e) {
             jlog.error(
                     "String value did not validate ('{}') with validation type {}",
                     new Object[] { input, type, e.getMessage() });
@@ -335,8 +369,9 @@
         return s;
     }
 
+
     @Override
-    public String validateEntry(String input, String type)
+    public String validateEntry (String input, String type)
             throws KustvaktException {
         try {
             if (type != null) {
@@ -345,32 +380,34 @@
                     jlog.debug("validating email entry '{}'", input.hashCode());
                     return validator.getValidInput("Email", input, "email",
                             config.getValidationEmaillength(), false);
-                }else if (type.equals(Attributes.USERNAME)) {
+                }
+                else if (type.equals(Attributes.USERNAME)) {
                     jlog.debug("validating username entry '{}'",
                             input.hashCode());
-                    return validator
-                            .getValidInput("Username", input, "username",
-                                    config.getValidationEmaillength(), false);
-                }else if (type.equals(Attributes.IP_RANG)) {
+                    return validator.getValidInput("Username", input,
+                            "username", config.getValidationEmaillength(),
+                            false);
+                }
+                else if (type.equals(Attributes.IP_RANG)) {
                     jlog.debug("validating ip address entry '{}'",
                             input.hashCode());
-                    return validator
-                            .getValidInput("IP Address", input, "ipaddress",
-                                    config.getValidationStringLength(),
-                                    nullable);
-                }else if (type.equals(Attributes.PASSWORD)) {
+                    return validator.getValidInput("IP Address", input,
+                            "ipaddress", config.getValidationStringLength(),
+                            nullable);
+                }
+                else if (type.equals(Attributes.PASSWORD)) {
                     jlog.debug("validating password entry '{}'",
                             input.hashCode());
-                    return validator
-                            .getValidInput("Password", input, "password",
-                                    config.getValidationStringLength(),
-                                    nullable);
+                    return validator.getValidInput("Password", input,
+                            "password", config.getValidationStringLength(),
+                            nullable);
                 }
             }
             jlog.debug("validating string entry '{}'", input.hashCode());
             return validator.getValidInput("Safe String", input, "SafeString",
                     config.getValidationStringLength(), nullable);
-        }catch (ValidationException ex) {
+        }
+        catch (ValidationException ex) {
             jlog.error("Validation failed! Value '{}' with type '{}'",
                     new Object[] { input, type });
             throw new KustvaktException(StatusCodes.PARAMETER_VALIDATION_ERROR,
@@ -378,26 +415,28 @@
         }
     }
 
-    public void validate(Object instance) throws KustvaktException {
+
+    public void validate (Object instance) throws KustvaktException {
         if (instance == null)
             return;
         try {
             validateStringField(instance.getClass().getDeclaredFields(),
                     instance);
-            validateStringField(
-                    instance.getClass().getSuperclass().getDeclaredFields(),
-                    instance);
-        }catch (IllegalAccessException e) {
+            validateStringField(instance.getClass().getSuperclass()
+                    .getDeclaredFields(), instance);
+        }
+        catch (IllegalAccessException e) {
             jlog.error("object value did not validate", e.getMessage());
             throw new KustvaktException(StatusCodes.PARAMETER_VALIDATION_ERROR,
                     "object could not be validated", instance.toString());
         }
     }
 
+
     //FIXME: currently all sets are skipped during validation (since users should not be allowed to edit those sets anyway,
     //I think we will be safe here
     @Deprecated
-    private void validateStringField(Field[] fields, Object instance)
+    private void validateStringField (Field[] fields, Object instance)
             throws KustvaktException, IllegalAccessException {
         for (Field field : fields) {
             boolean priv = false;
@@ -406,8 +445,8 @@
                     priv = true;
                     field.setAccessible(true);
                 }
-                if (field.getName().equals("password") | Modifier
-                        .isFinal(field.getModifiers()))
+                if (field.getName().equals("password")
+                        | Modifier.isFinal(field.getModifiers()))
                     continue;
                 String val = (String) field.get(instance);
                 if (val != null) {
@@ -431,14 +470,16 @@
         }
     }
 
-    private String bcryptHash(String text, String salt) {
+
+    private String bcryptHash (String text, String salt) {
         if (salt == null || salt.isEmpty())
             salt = BCrypt.gensalt(config.getLoadFactor());
         return BCrypt.hashpw(text, salt);
     }
 
+
     @Override
-    public String toString() {
+    public String toString () {
         return this.getClass().getCanonicalName();
     }
 
@@ -449,19 +490,21 @@
         protected static final int USERID_RANDOM_SIZE = 64;
         protected static final int CORPUS_RANDOM_SIZE = 48;
         private static final char[] HEX_DIGIT = { '0', '1', '2', '3', '4', '5',
-                '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f', 'z', 'x', 'h',
-                'q', 'w' };
+                '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f', 'z', 'x',
+                'h', 'q', 'w' };
         private static final SecureRandom sRandom__;
 
         static {
             try {
                 sRandom__ = SecureRandom.getInstance("SHA1PRNG");
-            }catch (NoSuchAlgorithmException e) {
+            }
+            catch (NoSuchAlgorithmException e) {
                 throw new Error(e);
             }
         }
 
-        public static byte[] getNextSecureRandom(int bits) {
+
+        public static byte[] getNextSecureRandom (int bits) {
             if (bits % 8 != 0) {
                 throw new IllegalArgumentException(
                         "Size is not divisible by 8!");
@@ -474,7 +517,8 @@
             return bytes;
         }
 
-        public static String toHex(byte[] bytes) {
+
+        public static String toHex (byte[] bytes) {
             if (bytes == null) {
                 return null;
             }
@@ -487,7 +531,8 @@
             return buffer.toString();
         }
 
-        private static String byteToHex(byte b) {
+
+        private static String byteToHex (byte b) {
             char[] array = { HEX_DIGIT[(b >> 4 & 0xF)], HEX_DIGIT[(b & 0xF)] };
             return new String(array);
         }
diff --git a/src/main/java/de/ids_mannheim/korap/resource/LayerMapper.java b/src/main/java/de/ids_mannheim/korap/resource/LayerMapper.java
index 25bfd38..ebe4a2e 100644
--- a/src/main/java/de/ids_mannheim/korap/resource/LayerMapper.java
+++ b/src/main/java/de/ids_mannheim/korap/resource/LayerMapper.java
@@ -13,25 +13,29 @@
     private Userdata settings;
     private KustvaktConfiguration config;
 
-    public LayerMapper(KustvaktConfiguration config, Userdata settings) {
+
+    public LayerMapper (KustvaktConfiguration config, Userdata settings) {
         this.settings = settings;
         this.config = config;
     }
 
-    public LayerMapper(KustvaktConfiguration config) {
+
+    public LayerMapper (KustvaktConfiguration config) {
         this.config = config;
     }
 
+
     /**
-     * find foundry entry in settings specific settings. Includes a call to #translateLayer to get the
+     * find foundry entry in settings specific settings. Includes a
+     * call to #translateLayer to get the
      * correct mapping for the layer denomination!
-     *
+     * 
      * @param layer
      * @return
      */
 
     //todo: make mapping configurable!
-    public String findFoundry(String layer) {
+    public String findFoundry (String layer) {
         if (settings != null) {
             switch (translateLayer(layer.toLowerCase().trim())) {
                 case "d":
@@ -53,7 +57,8 @@
                     // like orth or other tokenization layers
                     return "opennlp";
             }
-        }else {
+        }
+        else {
             switch (translateLayer(layer.toLowerCase().trim())) {
                 case "d":
                     return config.getDefault_dep();
@@ -65,7 +70,7 @@
                     return config.getDefault_lemma();
                 case "surface":
                     return config.getDefault_token();
-                // refers to "structure" and is used for paragraphs or sentence boundaries
+                    // refers to "structure" and is used for paragraphs or sentence boundaries
                 case "s":
                     return "base";
                 default:
@@ -76,16 +81,17 @@
         }
     }
 
+
     // relevance: map to access control id references. p is usually mapped to pos, l to lemma, etc.
-    public String translateLayer(String layer) {
+    public String translateLayer (String layer) {
         switch (layer.toLowerCase().trim()) {
-            //            case "pos":
-            //                return "p";
-            //            case "lemma":
-            //                return "l";
+        //            case "pos":
+        //                return "p";
+        //            case "lemma":
+        //                return "l";
             case "m":
                 return "msd";
-            //todo the orth layer does not need a foundry entry
+                //todo the orth layer does not need a foundry entry
             case "orth":
                 return "surface";
             case "t":
diff --git a/src/main/java/de/ids_mannheim/korap/resource/rewrite/CollectionCleanupFilter.java b/src/main/java/de/ids_mannheim/korap/resource/rewrite/CollectionCleanupFilter.java
index f1c8500..14fcf15 100644
--- a/src/main/java/de/ids_mannheim/korap/resource/rewrite/CollectionCleanupFilter.java
+++ b/src/main/java/de/ids_mannheim/korap/resource/rewrite/CollectionCleanupFilter.java
@@ -14,16 +14,16 @@
  * @author hanl
  * @date 28/07/2015
  */
-public class CollectionCleanupFilter
-        implements RewriteTask.RewriteNodeAt {
+public class CollectionCleanupFilter implements RewriteTask.RewriteNodeAt {
 
     @Override
-    public JsonNode preProcess(KoralNode node, KustvaktConfiguration config,
+    public JsonNode preProcess (KoralNode node, KustvaktConfiguration config,
             User user) {
         return process(node.rawNode());
     }
 
-    private JsonNode process(JsonNode root) {
+
+    private JsonNode process (JsonNode root) {
         JsonNode sub = root;
         if (root.isObject()) {
             if (root.has("operands")) {
@@ -40,9 +40,8 @@
                 // remove group element and replace with single doc
                 if (count == 1)
                     sub = node.path(0);
-                    // indicate empty group
-                else if (count
-                        == 0) // can't do anything here -- fixme: edge case?!
+                // indicate empty group
+                else if (count == 0) // can't do anything here -- fixme: edge case?!
                     return null;
             }
 
@@ -58,9 +57,10 @@
         return root;
     }
 
+
     // return null deletes node, if node return replace at level -1
     @Deprecated
-    private JsonNode processNodes(JsonNode jsonNode) {
+    private JsonNode processNodes (JsonNode jsonNode) {
         if (jsonNode.isObject()) {
             if (jsonNode.has("operands")) {
                 JsonNode node = jsonNode.at("/operands");
@@ -68,7 +68,8 @@
                 if (count == 1) {
                     // move to super node if any
                     return node.path(0);
-                }else if (count == 0) {
+                }
+                else if (count == 0) {
                     // remove container
                     return null;
                 }
@@ -78,13 +79,15 @@
         return JsonUtils.createArrayNode();
     }
 
+
     @Override
-    public JsonNode postProcess(KoralNode node) {
+    public JsonNode postProcess (KoralNode node) {
         return null;
     }
 
+
     @Override
-    public String at() {
+    public String at () {
         return "/collection";
     }
 }
diff --git a/src/main/java/de/ids_mannheim/korap/resource/rewrite/CollectionConstraint.java b/src/main/java/de/ids_mannheim/korap/resource/rewrite/CollectionConstraint.java
index 8cd37e1..4173bbd 100644
--- a/src/main/java/de/ids_mannheim/korap/resource/rewrite/CollectionConstraint.java
+++ b/src/main/java/de/ids_mannheim/korap/resource/rewrite/CollectionConstraint.java
@@ -14,11 +14,10 @@
  * @author hanl
  * @date 03/07/2015
  */
-public class CollectionConstraint
-        implements RewriteTask.IterableRewriteAt {
+public class CollectionConstraint implements RewriteTask.IterableRewriteAt {
 
     @Override
-    public JsonNode preProcess(KoralNode node, KustvaktConfiguration config,
+    public JsonNode preProcess (KoralNode node, KustvaktConfiguration config,
             User user) {
         if (node.get("@type").equals("koral:doc")) {
             if (node.get("key").equals("corpusID") && !check(node, user)) {
@@ -29,12 +28,13 @@
         return node.rawNode();
     }
 
+
     /**
      * @param node
      * @param user
      * @return boolean if true access granted
      */
-    private boolean check(KoralNode node, User user) {
+    private boolean check (KoralNode node, User user) {
         // todo: can be used to circumvent access control if public filter not applied
         if (user == null)
             return true;
@@ -45,19 +45,22 @@
             SecurityManager m = SecurityManager
                     .findbyId(id, user, Corpus.class);
             corpus = m.getResource();
-        }catch (RuntimeException | KustvaktException e) {
+        }
+        catch (RuntimeException | KustvaktException e) {
             return false;
         }
         return corpus != null;
     }
 
+
     @Override
-    public JsonNode postProcess(KoralNode node) {
+    public JsonNode postProcess (KoralNode node) {
         return null;
     }
 
+
     @Override
-    public String path() {
+    public String path () {
         return "collection";
     }
 }
diff --git a/src/main/java/de/ids_mannheim/korap/resource/rewrite/DocMatchRewrite.java b/src/main/java/de/ids_mannheim/korap/resource/rewrite/DocMatchRewrite.java
index a15d536..fb4ba86 100644
--- a/src/main/java/de/ids_mannheim/korap/resource/rewrite/DocMatchRewrite.java
+++ b/src/main/java/de/ids_mannheim/korap/resource/rewrite/DocMatchRewrite.java
@@ -18,24 +18,27 @@
  * @date 12/11/2015
  */
 //todo : test
-public class DocMatchRewrite
-        implements RewriteTask.IterableRewriteAt, BeanInjectable {
+public class DocMatchRewrite implements RewriteTask.IterableRewriteAt,
+        BeanInjectable {
 
     private DocumentDao docDao;
     private Cache cache;
 
-    public DocMatchRewrite() {
+
+    public DocMatchRewrite () {
         this.cache = CacheManager.getInstance().getCache("documents");
     }
 
-    @Override
-    public void insertBeans(ContextHolder beans) {
-        this.docDao = BeansFactory.getTypeFactory()
-                .getTypedBean(beans.getResourceProvider(), Document.class);
-    }
 
     @Override
-    public JsonNode postProcess(KoralNode node) throws KustvaktException {
+    public void insertBeans (ContextHolder beans) {
+        this.docDao = BeansFactory.getTypeFactory().getTypedBean(
+                beans.getResourceProvider(), Document.class);
+    }
+
+
+    @Override
+    public JsonNode postProcess (KoralNode node) throws KustvaktException {
         Document doc = null;
         if (this.docDao == null)
             throw new RuntimeException("Document dao must be set!");
@@ -47,7 +50,8 @@
                 doc = docDao.findbyId(docID, null);
                 if (doc != null)
                     this.cache.put(new Element(docID, doc));
-            }else
+            }
+            else
                 doc = (Document) e.getObjectValue();
 
             if (doc != null && doc.isDisabled())
@@ -56,13 +60,15 @@
         return node.rawNode();
     }
 
+
     @Override
-    public String path() {
+    public String path () {
         return "matches";
     }
 
+
     @Override
-    public JsonNode preProcess(KoralNode node, KustvaktConfiguration config,
+    public JsonNode preProcess (KoralNode node, KustvaktConfiguration config,
             User user) {
         return null;
     }
diff --git a/src/main/java/de/ids_mannheim/korap/resource/rewrite/FoundryInject.java b/src/main/java/de/ids_mannheim/korap/resource/rewrite/FoundryInject.java
index 1bb0174..19d4145 100644
--- a/src/main/java/de/ids_mannheim/korap/resource/rewrite/FoundryInject.java
+++ b/src/main/java/de/ids_mannheim/korap/resource/rewrite/FoundryInject.java
@@ -19,26 +19,28 @@
  * @author hanl
  * @date 30/06/2015
  */
-public class FoundryInject
-        implements RewriteTask.IterableRewriteAt, BeanInjectable {
+public class FoundryInject implements RewriteTask.IterableRewriteAt,
+        BeanInjectable {
 
     private Collection userdaos;
 
-    public FoundryInject() {
+
+    public FoundryInject () {
         this.userdaos = Collections.emptyList();
     }
 
 
     @Override
-    public JsonNode preProcess(KoralNode node, KustvaktConfiguration config,
+    public JsonNode preProcess (KoralNode node, KustvaktConfiguration config,
             User user) throws KustvaktException {
         LayerMapper mapper;
 
         if (user != null && !userdaos.isEmpty()) {
-            UserDataDbIface dao = BeansFactory.getTypeFactory()
-                    .getTypedBean(userdaos, UserSettings.class);
+            UserDataDbIface dao = BeansFactory.getTypeFactory().getTypedBean(
+                    userdaos, UserSettings.class);
             mapper = new LayerMapper(config, dao.get(user));
-        }else
+        }
+        else
             mapper = new LayerMapper(config);
 
         if (node.get("@type").equals("koral:term") && !node.has("foundry")) {
@@ -53,18 +55,21 @@
         return node.rawNode();
     }
 
+
     @Override
-    public String path() {
+    public String path () {
         return "query";
     }
 
+
     @Override
-    public JsonNode postProcess(KoralNode node) {
+    public JsonNode postProcess (KoralNode node) {
         return null;
     }
 
+
     @Override
-    public <T extends ContextHolder> void insertBeans(T beans) {
+    public <T extends ContextHolder> void insertBeans (T beans) {
         this.userdaos = beans.getUserDataDaos();
     }
 }
diff --git a/src/main/java/de/ids_mannheim/korap/resource/rewrite/IdWriter.java b/src/main/java/de/ids_mannheim/korap/resource/rewrite/IdWriter.java
index 66c2e53..86026aa 100644
--- a/src/main/java/de/ids_mannheim/korap/resource/rewrite/IdWriter.java
+++ b/src/main/java/de/ids_mannheim/korap/resource/rewrite/IdWriter.java
@@ -10,17 +10,18 @@
  * @author hanl
  * @date 25/09/2015
  */
-public class IdWriter
-        implements RewriteTask.RewriteKoralToken {
+public class IdWriter implements RewriteTask.RewriteKoralToken {
 
     private int counter;
 
-    public IdWriter() {
+
+    public IdWriter () {
         this.counter = 0;
     }
 
+
     @Override
-    public JsonNode preProcess(KoralNode node, KustvaktConfiguration config,
+    public JsonNode preProcess (KoralNode node, KustvaktConfiguration config,
             User user) {
         if (node.get("@type").equals("koral:token")) {
             String s = extractToken(node.rawNode());
@@ -30,8 +31,9 @@
         return node.rawNode();
     }
 
+
     // fixme: koral token --> how does grouping behave?!
-    private String extractToken(JsonNode token) {
+    private String extractToken (JsonNode token) {
         JsonNode wrap = token.path("wrap");
         if (!wrap.isMissingNode())
             return wrap.path("key").asText();
diff --git a/src/main/java/de/ids_mannheim/korap/resource/rewrite/KoralNode.java b/src/main/java/de/ids_mannheim/korap/resource/rewrite/KoralNode.java
index 94dd6c7..fe3f6cb 100644
--- a/src/main/java/de/ids_mannheim/korap/resource/rewrite/KoralNode.java
+++ b/src/main/java/de/ids_mannheim/korap/resource/rewrite/KoralNode.java
@@ -20,25 +20,28 @@
     private boolean remove;
     private final String target;
 
-    private KoralNode(String target, JsonNode node) {
+
+    private KoralNode (String target, JsonNode node) {
         this.node = node;
         this.target = target;
         this.builder = new KoralRewriteBuilder();
         this.remove = false;
     }
 
-    public static KoralNode wrapNode(JsonNode node) {
-        return new KoralNode(null, node) {
-        };
+
+    public static KoralNode wrapNode (JsonNode node) {
+        return new KoralNode(null, node) {};
     }
 
+
     @Override
-    public String toString() {
+    public String toString () {
         return this.node.toString();
     }
 
+
     @Deprecated
-    public boolean setNode(Object path) {
+    public boolean setNode (Object path) {
         JsonNode n = null;
         if (this.node.isObject() && this.node.has((String) path))
             n = this.node.path((String) path);
@@ -52,7 +55,8 @@
         return false;
     }
 
-    public void put(String name, Object value) {
+
+    public void put (String name, Object value) {
 
         if (this.node.isObject() && this.node.path(name).isMissingNode()) {
             ObjectNode node = (ObjectNode) this.node;
@@ -62,18 +66,21 @@
                 node.put(name, (Integer) value);
             builder.setOperation("injection");
             builder.build(this.node);
-        }else
+        }
+        else
             throw new UnsupportedOperationException(
                     "node doesn't support this operation");
     }
 
-    public void remove(Object identifier) {
+
+    public void remove (Object identifier) {
         boolean set = false;
         if (this.node.isObject() && identifier instanceof String) {
             ObjectNode n = (ObjectNode) this.node;
             n.remove((String) identifier);
             set = true;
-        }else if (this.node.isArray() && identifier instanceof Integer) {
+        }
+        else if (this.node.isArray() && identifier instanceof Integer) {
             ArrayNode n = (ArrayNode) this.node;
             n.remove((Integer) identifier);
             set = true;
@@ -84,7 +91,8 @@
         }
     }
 
-    public void replace(String name, String value) {
+
+    public void replace (String name, String value) {
         if (this.node.isObject() && this.node.has(name)) {
             ObjectNode n = (ObjectNode) this.node;
             n.put(name, value);
@@ -93,17 +101,20 @@
         }
     }
 
-    public String get(String name) {
+
+    public String get (String name) {
         if (this.node.isObject())
             return this.node.path(name).asText();
         return null;
     }
 
-    public JsonNode at(String name) {
+
+    public JsonNode at (String name) {
         return this.node.at(name);
     }
 
-    public boolean has(Object ident) {
+
+    public boolean has (Object ident) {
         if (ident instanceof String)
             return this.node.has((String) ident);
         else if (ident instanceof Integer)
@@ -111,19 +122,23 @@
         return false;
     }
 
-    public JsonNode rawNode() {
+
+    public JsonNode rawNode () {
         return this.node;
     }
 
-    public void removeNode() {
+
+    public void removeNode () {
         this.remove = true;
     }
 
-    public boolean isRemove() {
+
+    public boolean isRemove () {
         return this.remove;
     }
 
-    public final String target() {
+
+    public final String target () {
         return this.target;
     }
 
@@ -132,25 +147,29 @@
 
         private Map<String, String> map;
 
-        public KoralRewriteBuilder() {
+
+        public KoralRewriteBuilder () {
             this.map = new LinkedHashMap<>();
             this.map.put("@type", "koral:rewrite");
             this.map.put("src", "Kustvakt");
         }
 
-        public KoralRewriteBuilder setOperation(String op) {
+
+        public KoralRewriteBuilder setOperation (String op) {
             if (!op.startsWith("operation:"))
                 op = "operation:" + op;
             this.map.put("operation", op);
             return this;
         }
 
-        public KoralRewriteBuilder setScope(String scope) {
+
+        public KoralRewriteBuilder setScope (String scope) {
             this.map.put("scope", scope);
             return this;
         }
 
-        public JsonNode build(JsonNode node) {
+
+        public JsonNode build (JsonNode node) {
             if (this.map.get("operation") == null)
                 throw new UnsupportedOperationException(
                         "operation not set properly");
@@ -158,7 +177,8 @@
             if (node.has("rewrites")) {
                 ArrayNode n = (ArrayNode) node.path("rewrites");
                 n.add(JsonUtils.valueToTree(this.map));
-            }else {
+            }
+            else {
                 ObjectNode n = (ObjectNode) node;
                 List l = new LinkedList<>();
                 l.add(JsonUtils.valueToTree(this.map));
@@ -169,7 +189,3 @@
 
     }
 }
-
-
-
-
diff --git a/src/main/java/de/ids_mannheim/korap/resource/rewrite/MetaConstraint.java b/src/main/java/de/ids_mannheim/korap/resource/rewrite/MetaConstraint.java
index 4899fcf..3158af0 100644
--- a/src/main/java/de/ids_mannheim/korap/resource/rewrite/MetaConstraint.java
+++ b/src/main/java/de/ids_mannheim/korap/resource/rewrite/MetaConstraint.java
@@ -9,12 +9,11 @@
  * @author hanl
  * @date 04/07/2015
  */
-public class MetaConstraint
-        implements RewriteTask.RewriteNodeAt {
+public class MetaConstraint implements RewriteTask.RewriteNodeAt {
 
 
     @Override
-    public JsonNode preProcess(KoralNode node, KustvaktConfiguration config,
+    public JsonNode preProcess (KoralNode node, KustvaktConfiguration config,
             User user) {
         // redundant
         if (node.rawNode().has("meta")) {
@@ -25,14 +24,15 @@
         return node.rawNode();
     }
 
+
     @Override
-    public JsonNode postProcess(KoralNode node) {
+    public JsonNode postProcess (KoralNode node) {
         return null;
     }
 
 
     @Override
-    public String at() {
+    public String at () {
         return "/meta";
     }
 
diff --git a/src/main/java/de/ids_mannheim/korap/resource/rewrite/PublicCollection.java b/src/main/java/de/ids_mannheim/korap/resource/rewrite/PublicCollection.java
index f6a847e..597a407 100644
--- a/src/main/java/de/ids_mannheim/korap/resource/rewrite/PublicCollection.java
+++ b/src/main/java/de/ids_mannheim/korap/resource/rewrite/PublicCollection.java
@@ -15,16 +15,16 @@
  * @author hanl
  * @date 04/07/2015
  */
-public class PublicCollection
-        implements RewriteTask.RewriteNodeAt {
+public class PublicCollection implements RewriteTask.RewriteNodeAt {
 
-    public PublicCollection() {
+    public PublicCollection () {
         super();
     }
 
+
     // todo: where to inject the array node into? --> super group with and relation plus subgroup with ids and or operator
     @Override
-    public JsonNode preProcess(KoralNode node, KustvaktConfiguration config,
+    public JsonNode preProcess (KoralNode node, KustvaktConfiguration config,
             User user) {
         JsonNode subnode = node.rawNode();
         // todo: test
@@ -33,11 +33,12 @@
             //todo: inject public collection node
             if (user != null) {
                 try {
-                    ResourceFinder finder = ResourceFinder
-                            .init(user, Corpus.class);
+                    ResourceFinder finder = ResourceFinder.init(user,
+                            Corpus.class);
                     Set<String> ids = finder.getIds();
                     createNode(ids);
-                }catch (KustvaktException e) {
+                }
+                catch (KustvaktException e) {
                     e.printStackTrace();
                     //todo: 20.10.15 - 21.10.15
                 }
@@ -46,19 +47,22 @@
         return subnode;
     }
 
+
     //todo: 20.10.15
-    private JsonNode createNode(Set<String> ids) {
+    private JsonNode createNode (Set<String> ids) {
         JsonNode node = CollectionQueryBuilder3.Utils.buildDocGroup();
         return node;
     }
 
+
     @Override
-    public JsonNode postProcess(KoralNode node) {
+    public JsonNode postProcess (KoralNode node) {
         return null;
     }
 
+
     @Override
-    public String at() {
+    public String at () {
         return "/collection";
     }
 
diff --git a/src/main/java/de/ids_mannheim/korap/resource/rewrite/RewriteHandler.java b/src/main/java/de/ids_mannheim/korap/resource/rewrite/RewriteHandler.java
index 90bebd4..3569834 100644
--- a/src/main/java/de/ids_mannheim/korap/resource/rewrite/RewriteHandler.java
+++ b/src/main/java/de/ids_mannheim/korap/resource/rewrite/RewriteHandler.java
@@ -31,12 +31,14 @@
     private KustvaktConfiguration config;
     private ContextHolder beans;
 
-    public RewriteHandler(KustvaktConfiguration config) {
+
+    public RewriteHandler (KustvaktConfiguration config) {
         this();
         this.config = config;
     }
 
-    public RewriteHandler() {
+
+    public RewriteHandler () {
         this.node_processors = new HashSet<>();
         this.token_node_processors = new HashSet<>();
         this.query_processors = new HashSet<>();
@@ -45,7 +47,7 @@
     }
 
 
-    public void defaultRewriteConstraints() {
+    public void defaultRewriteConstraints () {
         this.add(FoundryInject.class);
         this.add(PublicCollection.class);
         this.add(IdWriter.class);
@@ -53,11 +55,13 @@
         this.add(CollectionCleanupFilter.class);
     }
 
-    public Set getFailedProcessors() {
+
+    public Set getFailedProcessors () {
         return this.failed_task_registration;
     }
 
-    public boolean addProcessor(RewriteTask rewriter) {
+
+    public boolean addProcessor (RewriteTask rewriter) {
         if (rewriter instanceof RewriteTask.RewriteKoralToken)
             return this.token_node_processors
                     .add((RewriteTask.RewriteKoralToken) rewriter);
@@ -72,8 +76,9 @@
         return false;
     }
 
+
     @Override
-    public String toString() {
+    public String toString () {
         StringBuilder b = new StringBuilder();
         b.append("--------------------------");
         b.append("pre/post: " + this.node_processors.toString()).append("\n")
@@ -85,18 +90,22 @@
         return b.toString();
     }
 
+
     /**
-     * expects extended RewriteNode/Query class with empty default constructor
-     *
+     * expects extended RewriteNode/Query class with empty default
+     * constructor
+     * 
      * @param rewriter
-     * @return boolean if rewriter class was successfully added to rewrite handler!
+     * @return boolean if rewriter class was successfully added to
+     *         rewrite handler!
      */
-    public boolean add(Class<? extends RewriteTask> rewriter) {
+    public boolean add (Class<? extends RewriteTask> rewriter) {
         RewriteTask task;
         try {
             Constructor c = rewriter.getConstructor();
             task = (RewriteTask) c.newInstance();
-        }catch (NoSuchMethodException | InvocationTargetException
+        }
+        catch (NoSuchMethodException | InvocationTargetException
                 | IllegalAccessException | InstantiationException e) {
             this.failed_task_registration.add(rewriter);
             return false;
@@ -104,14 +113,15 @@
         return addProcessor(task);
     }
 
-    public void clear() {
+
+    public void clear () {
         this.node_processors.clear();
         this.query_processors.clear();
         this.token_node_processors.clear();
     }
 
-    private boolean process(String name, JsonNode root, User user,
-            boolean post) {
+
+    private boolean process (String name, JsonNode root, User user, boolean post) {
         if (root.isObject()) {
             if (root.has("operands")) {
                 JsonNode ops = root.at("/operands");
@@ -121,16 +131,19 @@
                     if (process(name, next, user, post))
                         it.remove();
                 }
-            }else if (root.path("@type").asText().equals("koral:token")) {
+            }
+            else if (root.path("@type").asText().equals("koral:token")) {
                 // todo: koral:token nodes cannot be flagged for deletion --> creates the possibility for empty koral:token nodes
                 processNode(name, KoralNode.wrapNode(root), user,
                         this.token_node_processors, post);
                 return process(name, root.path("wrap"), user, post);
-            }else {
+            }
+            else {
                 return processNode(name, KoralNode.wrapNode(root), user,
                         this.node_processors, post);
             }
-        }else if (root.isArray()) {
+        }
+        else if (root.isArray()) {
             Iterator<JsonNode> it = root.elements();
             while (it.hasNext()) {
                 JsonNode next = it.next();
@@ -141,9 +154,10 @@
         return false;
     }
 
-    private JsonNode process(JsonNode root, User user, boolean post) {
+
+    private JsonNode process (JsonNode root, User user, boolean post) {
         jlog.debug("Running rewrite process on query {}", root);
-        if (root!= null) {
+        if (root != null) {
             Iterator<Map.Entry<String, JsonNode>> it = root.fields();
             while (it.hasNext()) {
                 Map.Entry<String, JsonNode> next = it.next();
@@ -154,34 +168,39 @@
         return root;
     }
 
-    public JsonNode preProcess(JsonNode root, User user) {
+
+    public JsonNode preProcess (JsonNode root, User user) {
         return process(root, user, false);
     }
 
-    public String preProcess(String json, User user) {
+
+    public String preProcess (String json, User user) {
         return JsonUtils.toJSON(preProcess(JsonUtils.readTree(json), user));
     }
 
-    public JsonNode postProcess(JsonNode root, User user) {
+
+    public JsonNode postProcess (JsonNode root, User user) {
         return process(root, user, true);
     }
 
-    public String postProcess(String json, User user) {
+
+    public String postProcess (String json, User user) {
         return JsonUtils.toJSON(postProcess(JsonUtils.readTree(json), user));
     }
 
+
     /**
      * @param node
      * @param user
      * @param tasks
-     * @return boolean true if node is to be removed from parent! Only applies if parent is an array node
+     * @return boolean true if node is to be removed from parent! Only
+     *         applies if parent is an array node
      */
     // todo: integrate notifications into system!
-    private boolean processNode(String rootNode, KoralNode node, User user,
+    private boolean processNode (String rootNode, KoralNode node, User user,
             Collection<? extends RewriteTask> tasks, boolean post) {
         if (this.config == null)
-            throw new RuntimeException(
-                    "KustvaktConfiguration must be set!");
+            throw new RuntimeException("KustvaktConfiguration must be set!");
 
         for (RewriteTask task : tasks) {
             jlog.debug("running processor on node: " + node);
@@ -199,15 +218,16 @@
             }
             try {
                 if (!post && task instanceof RewriteTask.RewriteBefore) {
-                    ((RewriteTask.RewriteBefore) task)
-                            .preProcess(node, this.config, user);
-                }else if (task instanceof RewriteTask.RewriteAfter) {
+                    ((RewriteTask.RewriteBefore) task).preProcess(node,
+                            this.config, user);
+                }
+                else if (task instanceof RewriteTask.RewriteAfter) {
                     ((RewriteTask.RewriteAfter) task).postProcess(node);
                 }
-            }catch (KustvaktException e) {
-                jlog.error("Error in rewrite processor {} for node {}",
-                        task.getClass().getSimpleName(),
-                        node.rawNode().toString());
+            }
+            catch (KustvaktException e) {
+                jlog.error("Error in rewrite processor {} for node {}", task
+                        .getClass().getSimpleName(), node.rawNode().toString());
                 e.printStackTrace();
             }
             if (node.isRemove())
@@ -216,7 +236,8 @@
         return node.isRemove();
     }
 
-    private void processFixedNode(JsonNode node, User user,
+
+    private void processFixedNode (JsonNode node, User user,
             Collection<RewriteTask> tasks, boolean post) {
         for (RewriteTask task : tasks) {
             JsonNode next = node;
@@ -227,22 +248,23 @@
             }
             try {
                 if (!post && task instanceof RewriteTask.RewriteBefore)
-                    ((RewriteTask.RewriteBefore) task)
-                            .preProcess(KoralNode.wrapNode(next), this.config,
-                                    user);
+                    ((RewriteTask.RewriteBefore) task).preProcess(
+                            KoralNode.wrapNode(next), this.config, user);
                 else
-                    ((RewriteTask.RewriteAfter) task)
-                            .postProcess(KoralNode.wrapNode(next));
-            }catch (KustvaktException e) {
-                jlog.error("Error in rewrite processor {} for node {}",
-                        task.getClass().getSimpleName(), node.toString());
+                    ((RewriteTask.RewriteAfter) task).postProcess(KoralNode
+                            .wrapNode(next));
+            }
+            catch (KustvaktException e) {
+                jlog.error("Error in rewrite processor {} for node {}", task
+                        .getClass().getSimpleName(), node.toString());
                 e.printStackTrace();
             }
         }
     }
 
+
     @Override
-    public <T extends ContextHolder> void insertBeans(T beans) {
+    public <T extends ContextHolder> void insertBeans (T beans) {
         this.beans = beans;
         this.config = beans.getConfiguration();
     }
diff --git a/src/main/java/de/ids_mannheim/korap/resource/rewrite/RewriteTask.java b/src/main/java/de/ids_mannheim/korap/resource/rewrite/RewriteTask.java
index 308f524..d9a3e4b 100644
--- a/src/main/java/de/ids_mannheim/korap/resource/rewrite/RewriteTask.java
+++ b/src/main/java/de/ids_mannheim/korap/resource/rewrite/RewriteTask.java
@@ -13,68 +13,84 @@
 
     interface RewriteBefore extends RewriteTask {
         /**
-         * @param node   Json node in KoralNode wrapper
-         * @param config {@link KustvaktConfiguration} singleton instance to use default configuration parameters
-         * @param user   injected by rewrite handler if available. Might cause {@link NullPointerException} if not checked properly
+         * @param node
+         *            Json node in KoralNode wrapper
+         * @param config
+         *            {@link KustvaktConfiguration} singleton instance
+         *            to use default configuration parameters
+         * @param user
+         *            injected by rewrite handler if available. Might
+         *            cause {@link NullPointerException} if not
+         *            checked properly
          * @return
          */
-        JsonNode preProcess(KoralNode node, KustvaktConfiguration config,
+        JsonNode preProcess (KoralNode node, KustvaktConfiguration config,
                 User user) throws KustvaktException;
 
     }
 
     /**
      * Post processor targeted at result sets for queries
-     * {@link de.ids_mannheim.korap.resource.rewrite.RewriteTask.RewriteAfter} queries will run
-     * after {@link de.ids_mannheim.korap.resource.rewrite.RewriteTask.IterableRewriteAt} have been processed
+     * {@link de.ids_mannheim.korap.resource.rewrite.RewriteTask.RewriteAfter}
+     * queries will run
+     * after
+     * {@link de.ids_mannheim.korap.resource.rewrite.RewriteTask.IterableRewriteAt}
+     * have been processed
      */
     interface RewriteAfter extends RewriteTask {
-        JsonNode postProcess(KoralNode node) throws KustvaktException;
+        JsonNode postProcess (KoralNode node) throws KustvaktException;
     }
 
     /**
      * nodes subject to rewrites at fixed json pointer location.
-     * Json-pointer based rewrites are processed after iterable rewrites
-     * Deletion via KoralNode not allowed. Supports pre- and post-processing
+     * Json-pointer based rewrites are processed after iterable
+     * rewrites
+     * Deletion via KoralNode not allowed. Supports pre- and
+     * post-processing
      */
     interface RewriteNodeAt extends RewriteBefore, RewriteAfter {
-        String at();
+        String at ();
     }
 
     /**
-     * terminal object nodes that are subject to rewrites through node iteration
+     * terminal object nodes that are subject to rewrites through node
+     * iteration
      * (both object and array node iteration supported)
      */
     interface IterableRewriteAt extends RewriteBefore, RewriteAfter {
-        String path();
+        String path ();
     }
 
     /**
      * koral token nodes that are subject to rewrites
-     * Be aware that node rewrites are processed before query rewrites. Thus query rewrite may override previous node rewrites
-     * {@link RewriteKoralToken} rewrite DOES NOT support the deletion of the respective node
+     * Be aware that node rewrites are processed before query
+     * rewrites. Thus query rewrite may override previous node
+     * rewrites {@link RewriteKoralToken} rewrite DOES NOT support the
+     * deletion of the respective node
      */
-    interface RewriteKoralToken extends RewriteBefore {
-    }
+    interface RewriteKoralToken extends RewriteBefore {}
 
     /**
-     * query rewrites get injected the entire query from root containing all child nodes
-     * <p/>
-     * {@link RewriteQuery} does not allow the deletion of the root node or subnode through KoralNode.
-     * The {@link de.ids_mannheim.korap.resource.rewrite.RewriteHandler} will igonore respecitve invalid requests
+     * query rewrites get injected the entire query from root
+     * containing all child nodes
+     * <p/> {@link RewriteQuery} does not allow the deletion of the
+     * root node or subnode through KoralNode.
+     * The
+     * {@link de.ids_mannheim.korap.resource.rewrite.RewriteHandler}
+     * will igonore respecitve invalid requests
      */
     @Deprecated
-    interface RewriteQuery extends RewriteBefore, RewriteAfter {
-    }
+    interface RewriteQuery extends RewriteBefore, RewriteAfter {}
 
     /**
      * Koral term nodes that are subject to rewrites
-     * Be aware that node rewrites are processed before query rewrites. Thus query rewrite may override previous node rewrites
-     * <p/>
-     * {@link RewriteNode} rewrite supports the deletion of the respective node by simply setting the node invalid in KoralNode
+     * Be aware that node rewrites are processed before query
+     * rewrites. Thus query rewrite may override previous node
+     * rewrites
+     * <p/> {@link RewriteNode} rewrite supports the deletion of the
+     * respective node by simply setting the node invalid in KoralNode
      */
     @Deprecated
-    interface RewriteNode extends RewriteBefore {
-    }
+    interface RewriteNode extends RewriteBefore {}
 
 }
diff --git a/src/main/java/de/ids_mannheim/korap/resource/rewrite/TreeConstraint.java b/src/main/java/de/ids_mannheim/korap/resource/rewrite/TreeConstraint.java
index d569223..e4f134a 100644
--- a/src/main/java/de/ids_mannheim/korap/resource/rewrite/TreeConstraint.java
+++ b/src/main/java/de/ids_mannheim/korap/resource/rewrite/TreeConstraint.java
@@ -9,7 +9,8 @@
  * #ELEM(W ANA=N)
  * <p/>
  * {
- * "@context": "http://korap.ids-mannheim.de/ns/koral/0.3/context.jsonld",
+ * "@context":
+ * "http://korap.ids-mannheim.de/ns/koral/0.3/context.jsonld",
  * "errors": [],
  * "warnings": [],
  * "messages": [],
@@ -30,43 +31,51 @@
  * <p/>
  * email reference:
  * Hallo Michael,
- * mir fiel gestern bei der neuen KoralQuery Serialisierung noch ein Fall
- * für default-Werte ein, die zumindest für viele Beispiele, die wir haben,
- * relevant ist: Wenn ein koral:term in einem koral:span gewrappt ist, dann
- * kann er eventuell nur einen Schlüssel haben ("s" oder "p" von "<s>" oder
- * "<p>". In diesem Fall wäre der default layer "s" und die default foundry
+ * mir fiel gestern bei der neuen KoralQuery Serialisierung noch ein
+ * Fall
+ * für default-Werte ein, die zumindest für viele Beispiele, die wir
+ * haben,
+ * relevant ist: Wenn ein koral:term in einem koral:span gewrappt ist,
+ * dann
+ * kann er eventuell nur einen Schlüssel haben ("s" oder "p" von "<s>"
+ * oder
+ * "<p>". In diesem Fall wäre der default layer "s" und die default
+ * foundry
  * "base". (Im alten KoralQuery wurden spans nicht gewrappt - der Fall
  * sollte aber erstmal weiter unterstützt werden.)
  * Viele Grüße,
  * Nils
- *
+ * 
  * @author hanl
  * @date 02/07/2015
  */
-public class TreeConstraint
-        implements RewriteTask.RewriteNodeAt {
+public class TreeConstraint implements RewriteTask.RewriteNodeAt {
 
     private String pointer;
 
-    public TreeConstraint() {
+
+    public TreeConstraint () {
         super();
     }
 
+
     @Override
-    public JsonNode preProcess(KoralNode node, KustvaktConfiguration config,
+    public JsonNode preProcess (KoralNode node, KustvaktConfiguration config,
             User user) {
         System.out.println("FIND PATH " + node.rawNode().findParent(pointer));
 
         return node.rawNode();
     }
 
+
     @Override
-    public JsonNode postProcess(KoralNode node) {
+    public JsonNode postProcess (KoralNode node) {
         return null;
     }
 
+
     @Override
-    public String at() {
+    public String at () {
         return null;
     }
 }
diff --git a/src/main/java/de/ids_mannheim/korap/resources/Corpus.java b/src/main/java/de/ids_mannheim/korap/resources/Corpus.java
index fdd9660..914fa1e 100644
--- a/src/main/java/de/ids_mannheim/korap/resources/Corpus.java
+++ b/src/main/java/de/ids_mannheim/korap/resources/Corpus.java
@@ -18,20 +18,24 @@
     @Deprecated
     private Map stats;
 
-    public Corpus() {
+
+    public Corpus () {
         super();
     }
 
-    public Corpus(String pers) {
+
+    public Corpus (String pers) {
         super(pers);
     }
 
-    public Corpus(Integer id) {
+
+    public Corpus (Integer id) {
         super(id);
     }
 
+
     @Override
-    public Map toMap() {
+    public Map toMap () {
         Map res = super.toMap();
         if (stats != null && !stats.isEmpty())
             res.put("statistics", stats);
diff --git a/src/main/java/de/ids_mannheim/korap/resources/Document.java b/src/main/java/de/ids_mannheim/korap/resources/Document.java
index 3700a1b..9f86444 100644
--- a/src/main/java/de/ids_mannheim/korap/resources/Document.java
+++ b/src/main/java/de/ids_mannheim/korap/resources/Document.java
@@ -14,37 +14,39 @@
     private String corpus;
     private boolean disabled;
 
-    public Document(String persistentID) {
+
+    public Document (String persistentID) {
         this.setId(-1);
         this.setPersistentID(persistentID);
         this.corpus = getCorpusID();
         this.setDisabled(true);
     }
 
-    public Document(String persistentID, boolean disabled) {
+
+    public Document (String persistentID, boolean disabled) {
         this(persistentID);
         this.setDisabled(disabled);
     }
 
-    private String getCorpusID() {
+
+    private String getCorpusID () {
         //WPD_SSS.07367
         if (this.getPersistentID() != null)
             return this.getPersistentID().split("_")[0];
         return null;
     }
 
-    @Override
-    public String toString() {
-        return "Document{" +
-                "id='" + this.getId() + "'" +
-                "persistentid='" + this.getPersistentID() + "'" +
-                "corpus='" + corpus + '\'' +
-                ", disabled=" + disabled +
-                '}';
-    }
 
     @Override
-    public boolean equals(Object o) {
+    public String toString () {
+        return "Document{" + "id='" + this.getId() + "'" + "persistentid='"
+                + this.getPersistentID() + "'" + "corpus='" + corpus + '\''
+                + ", disabled=" + disabled + '}';
+    }
+
+
+    @Override
+    public boolean equals (Object o) {
         if (this == o)
             return true;
         if (o == null || getClass() != o.getClass())
@@ -60,8 +62,9 @@
         return true;
     }
 
+
     @Override
-    public int hashCode() {
+    public int hashCode () {
         int result = getPersistentID().hashCode();
         result = 31 * result + (disabled ? 1 : 0);
         return result;
diff --git a/src/main/java/de/ids_mannheim/korap/resources/Foundry.java b/src/main/java/de/ids_mannheim/korap/resources/Foundry.java
index 11753d5..e2cba4d 100644
--- a/src/main/java/de/ids_mannheim/korap/resources/Foundry.java
+++ b/src/main/java/de/ids_mannheim/korap/resources/Foundry.java
@@ -6,15 +6,17 @@
  */
 public class Foundry extends KustvaktResource {
 
-    public Foundry() {
+    public Foundry () {
         super();
     }
 
-    public Foundry(Integer id) {
+
+    public Foundry (Integer id) {
         super(id);
     }
 
-    public Foundry(String persistentID) {
+
+    public Foundry (String persistentID) {
         super(persistentID);
     }
 
diff --git a/src/main/java/de/ids_mannheim/korap/resources/KustvaktResource.java b/src/main/java/de/ids_mannheim/korap/resources/KustvaktResource.java
index 7c25292..ebe6910 100644
--- a/src/main/java/de/ids_mannheim/korap/resources/KustvaktResource.java
+++ b/src/main/java/de/ids_mannheim/korap/resources/KustvaktResource.java
@@ -40,26 +40,30 @@
     @Getter(AccessLevel.PROTECTED)
     private Map<String, Object> fields;
 
-    public KustvaktResource() {
+
+    public KustvaktResource () {
         this.created = TimeUtils.getNow().getMillis();
         this.id = -1;
         this.parentID = null;
         this.fields = new HashMap<>();
     }
 
-    public KustvaktResource(Integer id) {
+
+    public KustvaktResource (Integer id) {
         this.created = TimeUtils.getNow().getMillis();
         this.id = id;
         this.parentID = null;
         this.fields = new HashMap<>();
     }
 
+
     // todo: move creator to builder instance for policies
-    public KustvaktResource(String persistentID) {
+    public KustvaktResource (String persistentID) {
         this();
         this.persistentID = persistentID;
     }
 
+
     //    public void setData(int type, Object data) {
     //        this.data = new Object[2];
     //        this.data[0] = type;
@@ -70,15 +74,17 @@
     //        return this.data != null ? (int) this.data[0] : -1;
     //    }
 
-    public void addField(String key, Object value) {
+    public void addField (String key, Object value) {
         this.fields.put(key, value);
     }
 
-    public void setFields(Map<String, Object> fields) {
+
+    public void setFields (Map<String, Object> fields) {
         this.fields = fields;
     }
 
-    public void setFields(String fields) {
+
+    public void setFields (String fields) {
         Map s = JsonUtils.readSimple(fields, Map.class);
         if (s == null)
             throw new RuntimeException(
@@ -87,53 +93,53 @@
         this.fields = s;
     }
 
-    public Object getField(String key) {
+
+    public Object getField (String key) {
         return this.fields.get(key);
     }
 
-    public String getData() {
+
+    public String getData () {
         return JsonUtils.toJSON(this.fields);
     }
 
-    @Override
-    public boolean equals(Object other) {
-        return other instanceof KustvaktResource && this.id
-                .equals(((KustvaktResource) other).getId());
-    }
 
     @Override
-    public int hashCode() {
+    public boolean equals (Object other) {
+        return other instanceof KustvaktResource
+                && this.id.equals(((KustvaktResource) other).getId());
+    }
+
+
+    @Override
+    public int hashCode () {
         int result = id.hashCode();
         return result;
     }
 
+
     /**
      * Merges another resource with this resource instance
-     * Every implementation of KorAPResource should override this method!
-     *
+     * Every implementation of KorAPResource should override this
+     * method!
+     * 
      * @param other
      */
-    public void merge(KustvaktResource other) {
+    public void merge (KustvaktResource other) {
         if (other == null)
             return;
 
-        this.setId(this.getId() == null || this.getId() == -1 ?
-                other.getId() :
-                other.getId());
-        this.setPersistentID(this.getPersistentID() == null ?
-                other.getPersistentID() :
-                this.getPersistentID());
-        this.setName(this.getName() == null || this.getName().isEmpty() ?
-                other.getName() :
-                this.getName());
-        this.setDescription(
-                this.getDescription() == null || this.getDescription()
-                        .isEmpty() ?
-                        other.getDescription() :
-                        this.getDescription());
-        this.setCreated(this.getCreated() < other.getCreated() ?
-                this.getCreated() :
-                other.getCreated());
+        this.setId(this.getId() == null || this.getId() == -1 ? other.getId()
+                : other.getId());
+        this.setPersistentID(this.getPersistentID() == null ? other
+                .getPersistentID() : this.getPersistentID());
+        this.setName(this.getName() == null || this.getName().isEmpty() ? other
+                .getName() : this.getName());
+        this.setDescription(this.getDescription() == null
+                || this.getDescription().isEmpty() ? other.getDescription()
+                : this.getDescription());
+        this.setCreated(this.getCreated() < other.getCreated() ? this
+                .getCreated() : other.getCreated());
         this.setPath(this.getPath() == null ? other.getPath() : this.getPath());
         //        this.setOwner(
         //                this.getOwner() == null ? other.getOwner() : this.getOwner());
@@ -142,26 +148,29 @@
         //        this.setShared(!this.isShared() ? other.isShared() : this.isShared());
     }
 
+
     /**
-     * Checks this instance for null parameter and replaces them with default values.
-     * Every implementation of KorAPResource should override this method!
-     *
+     * Checks this instance for null parameter and replaces them with
+     * default values.
+     * Every implementation of KorAPResource should override this
+     * method!
+     * 
      * @return
      */
-    public void checkNull() {
-        setCreated(this.getCreated() == 0L ?
-                TimeUtils.getNow().getMillis() :
-                this.getCreated());
+    public void checkNull () {
+        setCreated(this.getCreated() == 0L ? TimeUtils.getNow().getMillis()
+                : this.getCreated());
         setName(this.getName() == null ? "" : this.getName());
     }
 
+
     /**
      * this method is used to return field information about the class
      * All subclasses should override this method
-     *
+     * 
      * @return
      */
-    public Map toMap() {
+    public Map toMap () {
         Map m = new HashMap();
         m.put("id", persistentID);
         m.put("name", name);
@@ -176,15 +185,12 @@
         return m;
     }
 
+
     @Override
-    public String toString() {
-        return "Resource{" +
-                "id='" + id + '\'' +
-                "persistentID='" + persistentID + '\'' +
-                ", name='" + name + '\'' +
-                ", created=" + created +
-                ", path=" + path +
-                '}';
+    public String toString () {
+        return "Resource{" + "id='" + id + '\'' + "persistentID='"
+                + persistentID + '\'' + ", name='" + name + '\'' + ", created="
+                + created + ", path=" + path + '}';
     }
 
     //fixme: make private in respective areas
@@ -194,26 +200,30 @@
         private final String persistentID;
         private final boolean set;
 
-        public Container(String persistentID, Class type) {
+
+        public Container (String persistentID, Class type) {
             this.type = type;
             this.set = true;
             this.persistentID = persistentID;
         }
 
-        public Container(Class type) {
+
+        public Container (Class type) {
             this.type = type;
             this.set = true;
             this.persistentID = null;
         }
 
-        public Container() {
+
+        public Container () {
             this.set = false;
             this.type = null;
             this.persistentID = null;
         }
 
+
         @Override
-        public String toString() {
+        public String toString () {
             return persistentID + "@" + type.getSimpleName();
         }
     }
diff --git a/src/main/java/de/ids_mannheim/korap/resources/Layer.java b/src/main/java/de/ids_mannheim/korap/resources/Layer.java
index 2dc411c..d8a2e09 100644
--- a/src/main/java/de/ids_mannheim/korap/resources/Layer.java
+++ b/src/main/java/de/ids_mannheim/korap/resources/Layer.java
@@ -6,27 +6,31 @@
  */
 public class Layer extends KustvaktResource {
 
-    public Layer() {
+    public Layer () {
         super();
     }
 
-    public Layer(Integer id, int creator) {
+
+    public Layer (Integer id, int creator) {
         super(id);
     }
 
+
     // layer name must not be unique!
-    public Layer(Integer id, String name) {
+    public Layer (Integer id, String name) {
         super(id);
         this.setName(name);
     }
 
-    public Layer(String persistentID, String name) {
+
+    public Layer (String persistentID, String name) {
         super(persistentID);
         this.setPersistentID(persistentID);
         this.setName(name);
     }
 
-    public Layer(String persistentID) {
+
+    public Layer (String persistentID) {
         super(persistentID);
     }
 
diff --git a/src/main/java/de/ids_mannheim/korap/resources/Permissions.java b/src/main/java/de/ids_mannheim/korap/resources/Permissions.java
index 0cdb37e..6f2c446 100644
--- a/src/main/java/de/ids_mannheim/korap/resources/Permissions.java
+++ b/src/main/java/de/ids_mannheim/korap/resources/Permissions.java
@@ -9,23 +9,23 @@
     public enum Permission {
 
         //fixme: add read_policy permission to allow read policy permissions
-        READ(Permissions.READ),
-        WRITE(Permissions.WRITE),
-        DELETE(Permissions.DELETE),
+        READ(Permissions.READ), WRITE(Permissions.WRITE), DELETE(
+                Permissions.DELETE),
 
-        READ_POLICY(Permissions.READ_POLICY),
-        CREATE_POLICY(Permissions.CREATE_POLICY),
-        MODIFY_POLICY(Permissions.MODIFY_POLICY),
-        DELETE_POLICY(Permissions.DELETE_POLICY),
-        ALL(Permissions.ALL);
+        READ_POLICY(Permissions.READ_POLICY), CREATE_POLICY(
+                Permissions.CREATE_POLICY), MODIFY_POLICY(
+                Permissions.MODIFY_POLICY), DELETE_POLICY(
+                Permissions.DELETE_POLICY), ALL(Permissions.ALL);
 
         private final byte b;
 
-        Permission(byte b) {
+
+        Permission (byte b) {
             this.b = b;
         }
 
-        public byte toByte() {
+
+        public byte toByte () {
             return this.b;
         }
     }
diff --git a/src/main/java/de/ids_mannheim/korap/resources/ResourceFactory.java b/src/main/java/de/ids_mannheim/korap/resources/ResourceFactory.java
index 48e4747..9458ffc 100644
--- a/src/main/java/de/ids_mannheim/korap/resources/ResourceFactory.java
+++ b/src/main/java/de/ids_mannheim/korap/resources/ResourceFactory.java
@@ -23,17 +23,20 @@
         //        subTypes.add(USERQUERY, UserQuery.class);
     }
 
-    public static KustvaktResource getResource(
+
+    public static KustvaktResource getResource (
             Class<? extends KustvaktResource> clazz) {
         try {
             return (KustvaktResource) clazz.newInstance();
-        }catch (InstantiationException | IllegalAccessException e) {
+        }
+        catch (InstantiationException | IllegalAccessException e) {
             // do nothing
         }
         return null;
     }
 
-    public static int getResourceMapping(Class<? extends KustvaktResource> r) {
+
+    public static int getResourceMapping (Class<? extends KustvaktResource> r) {
         int value = -1;
         if (r != null) {
             for (int i = 0; i < subTypes.size(); i++) {
@@ -44,11 +47,13 @@
         return value;
     }
 
-    public static KustvaktResource getResource(String type) {
+
+    public static KustvaktResource getResource (String type) {
         return getResource(getResourceClass(type));
     }
 
-    public static KustvaktResource getResource(int j) {
+
+    public static KustvaktResource getResource (int j) {
         Class s = subTypes.get(j);
         if (s != null) {
             return getResource(s);
@@ -56,37 +61,42 @@
         return null;
     }
 
-    public static <T extends KustvaktResource> T createID(T resource) {
+
+    public static <T extends KustvaktResource> T createID (T resource) {
         if (resource.getData() != null && !resource.getData().isEmpty())
             resource.setPersistentID(DigestUtils.sha1Hex(resource.getData()));
         return resource;
     }
 
-    public static <T extends KustvaktResource> Class<T> getResourceClass(
+
+    public static <T extends KustvaktResource> Class<T> getResourceClass (
             String type) {
         for (Class value : subTypes) {
-            if (value == VirtualCollection.class && type
-                    .equalsIgnoreCase("collection"))
+            if (value == VirtualCollection.class
+                    && type.equalsIgnoreCase("collection"))
                 return (Class<T>) VirtualCollection.class;
-                //todo
-                //            else if (value == UserQuery.class && type.equalsIgnoreCase("query"))
-                //                return (Class<T>) UserQuery.class;
+            //todo
+            //            else if (value == UserQuery.class && type.equalsIgnoreCase("query"))
+            //                return (Class<T>) UserQuery.class;
             else if (value.getSimpleName().equalsIgnoreCase(type.trim())) {
                 return value;
             }
         }
         return null;
     }
+
+
     // all deprecated!
 
-    public static VirtualCollection getCachedCollection(String query) {
+    public static VirtualCollection getCachedCollection (String query) {
         VirtualCollection v = new VirtualCollection(query);
         v.setName("");
         v.setDescription("");
         return v;
     }
 
-    public static VirtualCollection getPermanentCollection(
+
+    public static VirtualCollection getPermanentCollection (
             VirtualCollection mergable, String corpusName, String description) {
         VirtualCollection v = new VirtualCollection();
         v.merge(mergable);
@@ -95,6 +105,7 @@
         return createID(v);
     }
 
+
     //    public static VirtualCollection createCollection(String name, String query,
     //            Integer owner) {
     //        VirtualCollection v = new VirtualCollection(query);
@@ -130,7 +141,7 @@
     //        return v;
     //    }
 
-    public static VirtualCollection getIDContainer(Integer id) {
+    public static VirtualCollection getIDContainer (Integer id) {
         return new VirtualCollection(id);
     }
 }
diff --git a/src/main/java/de/ids_mannheim/korap/resources/VirtualCollection.java b/src/main/java/de/ids_mannheim/korap/resources/VirtualCollection.java
index 74ff1c8..cf87bff 100644
--- a/src/main/java/de/ids_mannheim/korap/resources/VirtualCollection.java
+++ b/src/main/java/de/ids_mannheim/korap/resources/VirtualCollection.java
@@ -16,47 +16,49 @@
     @Deprecated
     private Map stats;
 
-    public VirtualCollection() {
+
+    public VirtualCollection () {
         super();
     }
 
-    public VirtualCollection(Integer id) {
+
+    public VirtualCollection (Integer id) {
         super(id);
     }
 
-    public VirtualCollection(String persistentID) {
+
+    public VirtualCollection (String persistentID) {
         super(persistentID);
     }
 
+
     @Override
-    public void merge(KustvaktResource resource) {
+    public void merge (KustvaktResource resource) {
         super.merge(resource);
         if (resource == null | !(resource instanceof VirtualCollection))
             return;
         VirtualCollection other = (VirtualCollection) resource;
-        this.setFields(this.getFields() == null ?
-                other.getFields() :
-                this.getFields());
+        this.setFields(this.getFields() == null ? other.getFields() : this
+                .getFields());
     }
 
+
     @Override
     @SuppressWarnings("unchecked")
-    public void checkNull() {
-        this.setDescription(
-                this.getDescription() == null ? "" : this.getDescription());
+    public void checkNull () {
+        this.setDescription(this.getDescription() == null ? "" : this
+                .getDescription());
         super.checkNull();
     }
 
+
     @Override
-    public String toString() {
-        return "VirtualCollection{" +
-                "id='" + this.getId() + '\'' +
-                ", persistentID='" + this.getPersistentID() + '\'' +
-                ", created=" + created +
-                ", path=" + this.getPath() +
-                ", name='" + this.getName() + '\'' +
-                ", data='" + this.getData() + '\'' +
-                '}';
+    public String toString () {
+        return "VirtualCollection{" + "id='" + this.getId() + '\''
+                + ", persistentID='" + this.getPersistentID() + '\''
+                + ", created=" + created + ", path=" + this.getPath()
+                + ", name='" + this.getName() + '\'' + ", data='"
+                + this.getData() + '\'' + '}';
     }
 
     //    @Override
diff --git a/src/main/java/de/ids_mannheim/korap/security/Parameter.java b/src/main/java/de/ids_mannheim/korap/security/Parameter.java
index 5f775ad..c27f0cf 100644
--- a/src/main/java/de/ids_mannheim/korap/security/Parameter.java
+++ b/src/main/java/de/ids_mannheim/korap/security/Parameter.java
@@ -16,29 +16,31 @@
     // todo: what is this supposed to do?
     private boolean equal;
 
-    public Parameter(String identifier, String value, boolean equal,
-            User user) {
+
+    public Parameter (String identifier, String value, boolean equal, User user) {
         super();
         super.setName(identifier.toLowerCase());
         this.value = value;
         this.equal = equal;
     }
 
-    @Override
-    public void merge(KustvaktResource resource) {
-    }
 
     @Override
-    public void checkNull() {
-    }
+    public void merge (KustvaktResource resource) {}
 
-    public String getValue() {
+
+    @Override
+    public void checkNull () {}
+
+
+    public String getValue () {
         if (policy == null)
             return null;
         return value;
     }
 
-    public void setPolicy(SecurityPolicy policy) {
+
+    public void setPolicy (SecurityPolicy policy) {
         this.policy = policy;
     }
 
diff --git a/src/main/java/de/ids_mannheim/korap/security/PermissionsBuffer.java b/src/main/java/de/ids_mannheim/korap/security/PermissionsBuffer.java
index 9c63a15..dc98264 100644
--- a/src/main/java/de/ids_mannheim/korap/security/PermissionsBuffer.java
+++ b/src/main/java/de/ids_mannheim/korap/security/PermissionsBuffer.java
@@ -15,33 +15,40 @@
 
     private byte[] bytes;
 
-    public PermissionsBuffer() {
+
+    public PermissionsBuffer () {
         this((short) 0);
     }
 
-    public PermissionsBuffer(short perm) {
+
+    public PermissionsBuffer (short perm) {
         setByte(perm);
     }
 
-    private void setByte(short perm) {
+
+    private void setByte (short perm) {
         ByteBuffer b = ByteBuffer.allocate(2);
         b.putShort(perm);
         bytes = b.array();
     }
 
-    public PermissionsBuffer(byte... bytes) {
+
+    public PermissionsBuffer (byte ... bytes) {
         this.bytes = bytes;
     }
 
-    public boolean containsPermission(Permissions.Permission p) {
+
+    public boolean containsPermission (Permissions.Permission p) {
         return containsPByte(p.toByte());
     }
 
-    public boolean containsPByte(byte perm) {
+
+    public boolean containsPByte (byte perm) {
         return (bytes[1] & perm) == perm;
     }
 
-    public int addPermission(int b) {
+
+    public int addPermission (int b) {
         short r = (short) (bytes[1] & b);
         if ((bytes[1] & b) != b)
             bytes[1] += b;
@@ -50,25 +57,29 @@
         return 0;
     }
 
-    public void retain(int compare) {
+
+    public void retain (int compare) {
         short f = (short) (bytes[1] & compare);
         ByteBuffer b = ByteBuffer.allocate(2);
         b.putShort(f);
         bytes = b.array();
     }
 
-    public void addPermissions(Permissions.Permission... perm) {
+
+    public void addPermissions (Permissions.Permission ... perm) {
         if (perm.length > 0) {
             for (Permissions.Permission p : perm)
                 addPermission(p.toByte());
         }
     }
 
-    public void removePermission(Permissions.Permission perm) {
+
+    public void removePermission (Permissions.Permission perm) {
         this.removePermission(perm.toByte());
     }
 
-    public int removePermission(int b) {
+
+    public int removePermission (int b) {
         if ((bytes[1] & b) != 0)
             bytes[1] -= b;
         else
@@ -76,8 +87,9 @@
         return 0;
     }
 
+
     @Deprecated
-    public int addOverride(int b) {
+    public int addOverride (int b) {
         if ((bytes[0] & b) == 0)
             bytes[0] += b;
         else
@@ -85,7 +97,8 @@
         return 0;
     }
 
-    public int removeOverride(int b) {
+
+    public int removeOverride (int b) {
         if ((bytes[0] & b) != 0)
             bytes[0] -= b;
         else
@@ -93,20 +106,23 @@
         return 0;
     }
 
+
     @Deprecated
-    public boolean isOverridable(int b) {
+    public boolean isOverridable (int b) {
         return (bytes[0] & b) != 0;
     }
 
-    public boolean leftShift(byte perm) {
+
+    public boolean leftShift (byte perm) {
         //        return pbyte & (perm << 1);
         System.out.println("pbyte is: " + bytes[1]);
         System.out.println("bitswise operation, left shift " + (perm << 1));
         return false;
     }
 
+
     @Override
-    public boolean equals(Object perm) {
+    public boolean equals (Object perm) {
         if (perm instanceof Byte)
             return (bytes[1] & (byte) perm) == bytes[1];
         else if (perm instanceof PermissionsBuffer) {
@@ -116,20 +132,24 @@
         return false;
     }
 
-    public short getBytes() {
+
+    public short getBytes () {
         ByteBuffer b = ByteBuffer.wrap(bytes);
         return b.getShort();
     }
 
-    public byte[] getByteArray() {
+
+    public byte[] getByteArray () {
         return bytes;
     }
 
-    public Byte getPbyte() {
+
+    public Byte getPbyte () {
         return this.bytes[1];
     }
 
-    public Set<Permissions.Permission> getPermissions() {
+
+    public Set<Permissions.Permission> getPermissions () {
         Set<Permissions.Permission> pe = new HashSet<>();
         for (Permissions.Permission p : Permissions.Permission.values()) {
             if (containsPByte(p.toByte()))
@@ -138,16 +158,17 @@
         return pe;
     }
 
-    public byte getOverride() {
+
+    public byte getOverride () {
         return this.bytes[0];
     }
 
-    public String toBinary() {
+
+    public String toBinary () {
         StringBuilder sb = new StringBuilder(bytes.length * Byte.SIZE);
         for (int i = 0; i < Byte.SIZE * bytes.length; i++) {
-            sb.append((bytes[i / Byte.SIZE] << i % Byte.SIZE & 0x80) == 0 ?
-                    '0' :
-                    '1');
+            sb.append((bytes[i / Byte.SIZE] << i % Byte.SIZE & 0x80) == 0 ? '0'
+                    : '1');
         }
         return sb.toString();
     }
diff --git a/src/main/java/de/ids_mannheim/korap/security/PolicyCondition.java b/src/main/java/de/ids_mannheim/korap/security/PolicyCondition.java
index 324ee8b..6ec5450 100644
--- a/src/main/java/de/ids_mannheim/korap/security/PolicyCondition.java
+++ b/src/main/java/de/ids_mannheim/korap/security/PolicyCondition.java
@@ -37,54 +37,64 @@
     private static final String EX_PRE = "ex:";
     private Map<String, Object> flags;
 
-    public PolicyCondition(String target) {
+
+    public PolicyCondition (String target) {
         // pattern to map extensionally created groups
         this.specifier = target;
         this.flags = new HashMap<>(stats);
     }
 
-    public PolicyCondition() {
+
+    public PolicyCondition () {
         this(EX_PRE + createGroupName());
     }
 
+
     @Deprecated
     //todo: do this in crypto bean!
-    private static String createGroupName() {
+    private static String createGroupName () {
         //        return Base64.encodeBase64String(SecureRGenerator
         //                .getNextSecureRandom(64));
         return "<new group name>";
     }
 
-    public void setDescription(String description) {
+
+    public void setDescription (String description) {
         this.description = description;
     }
 
-    public void setFlag(String key, Object value) {
+
+    public void setFlag (String key, Object value) {
         Object f = this.flags.get(key);
         if (f != null && f.getClass().equals(value.getClass()))
             this.flags.put(key, value);
     }
 
-    public String getSpecifier() {
+
+    public String getSpecifier () {
         return this.specifier;
     }
 
-    public boolean isExtensional() {
+
+    public boolean isExtensional () {
         return getSpecifier().startsWith(EX_PRE);
     }
 
+
     @Override
-    public String toString() {
+    public String toString () {
         return "(" + this.specifier + ")";
     }
 
+
     @Override
-    public int compareTo(PolicyCondition o) {
+    public int compareTo (PolicyCondition o) {
         return this.getSpecifier().compareTo(o.getSpecifier());
     }
 
+
     @Override
-    public boolean equals(Object o) {
+    public boolean equals (Object o) {
         if (this == o)
             return true;
         if (o == null || getClass() != o.getClass())
@@ -94,8 +104,9 @@
         return specifier.equals(that.specifier);
     }
 
+
     @Override
-    public int hashCode() {
+    public int hashCode () {
         return specifier.hashCode();
     }
 
diff --git a/src/main/java/de/ids_mannheim/korap/security/PolicyContext.java b/src/main/java/de/ids_mannheim/korap/security/PolicyContext.java
index c4f41ca..00e3067 100644
--- a/src/main/java/de/ids_mannheim/korap/security/PolicyContext.java
+++ b/src/main/java/de/ids_mannheim/korap/security/PolicyContext.java
@@ -25,26 +25,30 @@
     private long end = 0L;
 
 
-    public PolicyContext() {
+    public PolicyContext () {
         start = TimeUtils.getNow().getMillis();
     }
 
-    public PolicyContext setIPMask(String ip) {
+
+    public PolicyContext setIPMask (String ip) {
         this.ipmask = ip;
         return this;
     }
 
-    public PolicyContext setExpirationTime(long limit) {
+
+    public PolicyContext setExpirationTime (long limit) {
         this.end = limit;
         return this;
     }
 
-    public PolicyContext setEnableTime(long start) {
+
+    public PolicyContext setEnableTime (long start) {
         this.start = start;
         return this;
     }
 
-    protected boolean isActive(String ipaddress) {
+
+    protected boolean isActive (String ipaddress) {
         if (ipaddress == null)
             return false;
         if (noMask())
@@ -54,22 +58,22 @@
             mask = IPNetMask.getIPMask(this.ipmask);
             boolean f = mask.matches(ipaddress);
             return f;
-        } catch (UnknownHostException e) {
+        }
+        catch (UnknownHostException e) {
             e.printStackTrace();
             return false;
         }
     }
 
-    protected boolean noMask() {
+
+    protected boolean noMask () {
         return ipmask == null || ipmask.isEmpty();
     }
 
+
     @Override
-    public String toString() {
-        return "PolicyContext{" +
-                ", ipmask='" + ipmask + '\'' +
-                ", start=" + start +
-                ", end=" + end +
-                '}';
+    public String toString () {
+        return "PolicyContext{" + ", ipmask='" + ipmask + '\'' + ", start="
+                + start + ", end=" + end + '}';
     }
 }
diff --git a/src/main/java/de/ids_mannheim/korap/security/SecurityPolicy.java b/src/main/java/de/ids_mannheim/korap/security/SecurityPolicy.java
index 9539cb8..51d73d8 100644
--- a/src/main/java/de/ids_mannheim/korap/security/SecurityPolicy.java
+++ b/src/main/java/de/ids_mannheim/korap/security/SecurityPolicy.java
@@ -30,7 +30,8 @@
     private PolicyContext ctx;
     private Integer creator;
 
-    public SecurityPolicy() {
+
+    public SecurityPolicy () {
         this.setID(-1);
         this.ctx = new PolicyContext();
         this.conditions = new ArrayList<>();
@@ -39,71 +40,85 @@
         this.permissions = new PermissionsBuffer();
     }
 
-    public SecurityPolicy(Integer id) {
+
+    public SecurityPolicy (Integer id) {
         this();
         this.setID(id);
     }
 
-    public SecurityPolicy setID(Integer id) {
+
+    public SecurityPolicy setID (Integer id) {
         this.id = id;
         return this;
     }
 
-    public Integer getID() {
+
+    public Integer getID () {
         return this.id;
     }
 
-    public Integer getCreator() {
+
+    public Integer getCreator () {
         return this.creator;
     }
 
-    public PolicyContext getContext() {
+
+    public PolicyContext getContext () {
         return this.ctx;
     }
 
-    public SecurityPolicy setTarget(KustvaktResource resource) {
+
+    public SecurityPolicy setTarget (KustvaktResource resource) {
         this.target = resource.getPersistentID();
         return this;
     }
 
-    public SecurityPolicy setTarget(String target) {
+
+    public SecurityPolicy setTarget (String target) {
         this.target = target;
         return this;
     }
 
-    public String getTarget() {
+
+    public String getTarget () {
         return this.target;
     }
 
-    public SecurityPolicy setPOSIX(String posix) {
+
+    public SecurityPolicy setPOSIX (String posix) {
         this.permissions = new PermissionsBuffer(Short.valueOf(posix));
         return this;
     }
 
-    public SecurityPolicy setCreator(Integer creator) {
+
+    public SecurityPolicy setCreator (Integer creator) {
         this.creator = creator;
         return this;
     }
 
+
     // todo ???????
     @Deprecated
-    private SecurityPolicy setOverride(Permissions.Permission... perms) {
+    private SecurityPolicy setOverride (Permissions.Permission ... perms) {
         for (Permissions.Permission p : perms)
             this.permissions.addOverride(p.toByte());
         return this;
     }
 
-    public SecurityPolicy setContext(PolicyContext ctx) {
+
+    public SecurityPolicy setContext (PolicyContext ctx) {
         this.ctx = ctx;
         return this;
     }
 
-    private boolean hasContext() {
+
+    private boolean hasContext () {
         return !ctx.noMask();
     }
 
+
     //todo:
-    public boolean isActive(User user) {
+    public boolean isActive (User user) {
         System.out.println("THE POLICY " + this.toString());
         System.out.println("DOES THIS HAVE CONTEXT? " + this.hasContext());
         //        String host = (String) user.getField(Attributes.HOST);
@@ -114,7 +129,8 @@
         return !this.hasContext();
     }
 
-    public List<String> getConditionList() {
+
+    public List<String> getConditionList () {
         List<String> c = new LinkedList<>();
         Collections.sort(conditions);
         for (PolicyCondition p : conditions)
@@ -122,7 +138,8 @@
         return c;
     }
 
-    public String getConditionString() {
+
+    public String getConditionString () {
         if (conditions.isEmpty())
             return "";
 
@@ -136,11 +153,13 @@
         return b.toString();
     }
 
-    public List<PolicyCondition> getConditions() {
+
+    public List<PolicyCondition> getConditions () {
         return this.conditions;
     }
 
-    public SecurityPolicy setConditions(PolicyCondition... constraints) {
+
+    public SecurityPolicy setConditions (PolicyCondition ... constraints) {
         this.conditions.clear();
         this.removedidx.clear();
         this.addedidx.clear();
@@ -151,7 +170,8 @@
         return this;
     }
 
-    public SecurityPolicy removeCondition(PolicyCondition constraint) {
+
+    public SecurityPolicy removeCondition (PolicyCondition constraint) {
         int idx = this.conditions.indexOf(constraint);
         if (this.addedidx.contains(idx))
             this.addedidx.remove(idx);
@@ -160,30 +180,36 @@
         return this;
     }
 
-    public SecurityPolicy addCondition(PolicyCondition constraint) {
+
+    public SecurityPolicy addCondition (PolicyCondition constraint) {
         this.conditions.add(constraint);
         return this;
     }
 
-    public SecurityPolicy addNewCondition(PolicyCondition constraint) {
+
+    public SecurityPolicy addNewCondition (PolicyCondition constraint) {
         if (this.conditions.add(constraint))
             this.addedidx.add(this.conditions.indexOf(constraint));
         return this;
     }
 
-    public boolean contains(PolicyCondition constraint) {
+
+    public boolean contains (PolicyCondition constraint) {
         return conditions.contains(constraint);
     }
 
-    public Collection<Integer> getRemoved() {
+
+    public Collection<Integer> getRemoved () {
         return this.removedidx;
     }
 
-    public Collection<Integer> getAdded() {
+
+    public Collection<Integer> getAdded () {
         return this.addedidx;
     }
 
-    public void clear() {
+
+    public void clear () {
         // clear remove, add, conditions list!
         for (Integer remove : this.removedidx)
             this.conditions.remove(remove);
@@ -191,39 +217,45 @@
         this.addedidx.clear();
     }
 
-    public boolean hasPermission(Permissions.Permission perm) {
+
+    public boolean hasPermission (Permissions.Permission perm) {
         return permissions != null && permissions.containsPermission(perm);
     }
 
+
     /**
      * function to add a permission byte to the collection.
-     *
+     * 
      * @param perms
      * @return
      */
-    public SecurityPolicy addPermission(Permissions.Permission... perms) {
+    public SecurityPolicy addPermission (Permissions.Permission ... perms) {
         permissions.addPermissions(perms);
         return this;
     }
 
-    public boolean equalsPermission(Permissions.Permission... perms) {
+
+    public boolean equalsPermission (Permissions.Permission ... perms) {
         PermissionsBuffer b = new PermissionsBuffer();
         b.addPermissions(perms);
-        return permissions != null && permissions.getPbyte()
-                .equals(b.getPbyte());
+        return permissions != null
+                && permissions.getPbyte().equals(b.getPbyte());
     }
 
-    public void removePermission(Permissions.Permission perm) {
+
+    public void removePermission (Permissions.Permission perm) {
         if (permissions != null)
             permissions.removePermission(perm);
     }
 
-    public Byte getPermissionByte() {
+
+    public Byte getPermissionByte () {
         return permissions.getPbyte();
     }
 
+
     @Override
-    public String toString() {
+    public String toString () {
         final StringBuffer sb = new StringBuffer("SecurityPolicy{");
         sb.append("id=").append(id);
         sb.append(", target='").append(target).append('\'');
@@ -233,12 +265,14 @@
         return sb.toString();
     }
 
-    public Set<Permissions.Permission> getPermissions() {
+
+    public Set<Permissions.Permission> getPermissions () {
         return permissions.getPermissions();
     }
 
+
     @Override
-    public boolean equals(Object o) {
+    public boolean equals (Object o) {
         if (this == o)
             return true;
         if (o == null || getClass() != o.getClass())
@@ -254,8 +288,9 @@
         return true;
     }
 
+
     @Override
-    public int hashCode() {
+    public int hashCode () {
         int result = id;
         result = 31 * result + target.hashCode();
         return result;
@@ -265,13 +300,15 @@
     public static class OwnerPolicy extends SecurityPolicy {
         private final Integer owner;
 
-        public OwnerPolicy(String target, Integer owner) {
+
+        public OwnerPolicy (String target, Integer owner) {
             this.owner = owner;
             super.setTarget(target);
         }
 
+
         @Override
-        public String toString() {
+        public String toString () {
             return "OwnerPolicy(" + super.getTarget() + "," + owner + ")";
         }
 
diff --git a/src/main/java/de/ids_mannheim/korap/security/ac/ConditionManagement.java b/src/main/java/de/ids_mannheim/korap/security/ac/ConditionManagement.java
index eab7b7f..d0db4fa 100644
--- a/src/main/java/de/ids_mannheim/korap/security/ac/ConditionManagement.java
+++ b/src/main/java/de/ids_mannheim/korap/security/ac/ConditionManagement.java
@@ -25,15 +25,17 @@
     private User user;
     private PolicyHandlerIface policydao;
 
-    public ConditionManagement(User user) {
+
+    public ConditionManagement (User user) {
         this.user = user;
         this.policydao = BeanConfiguration.getBeans().getPolicyDbProvider();
 
     }
 
+
     /**
      * adds a user to an existing group
-     *
+     * 
      * @param usernames
      * @param condition
      * @param admin
@@ -41,58 +43,59 @@
     // todo: conflict resolution
     // fixme: not applicable to korap system roles
     // only works if there is a policy with that condition and permission set, if not, create one!
-    public void addUser(List<String> usernames, PolicyCondition condition,
+    public void addUser (List<String> usernames, PolicyCondition condition,
             boolean admin) throws NotAuthorizedException, KustvaktException {
-        if (policydao.matchCondition(this.user, condition.getSpecifier(), true)
-                == 1) {
+        if (policydao.matchCondition(this.user, condition.getSpecifier(), true) == 1) {
             policydao.addToCondition(usernames, condition, admin);
-        }else
+        }
+        else
             jlog.error("Users '{}' could not be added to condition '{}'",
                     usernames, condition.getSpecifier());
     }
 
-    public void addUser(String username, PolicyCondition condition,
+
+    public void addUser (String username, PolicyCondition condition,
             boolean admin) throws NotAuthorizedException, KustvaktException {
         addUser(Arrays.asList(username), condition, admin);
     }
 
-    public void removeUser(List<String> users, PolicyCondition condition)
+
+    public void removeUser (List<String> users, PolicyCondition condition)
             throws KustvaktException {
-        if (policydao.matchCondition(this.user, condition.getSpecifier(), true)
-                == 1) {
+        if (policydao.matchCondition(this.user, condition.getSpecifier(), true) == 1) {
             policydao.removeFromCondition(users, condition);
         }
     }
 
-    public Set<String> getMembers(PolicyCondition condition) {
+
+    public Set<String> getMembers (PolicyCondition condition) {
         try {
-            if (policydao
-                    .matchCondition(this.user, condition.getSpecifier(), true)
-                    == 1) {
-                return new HashSet<>(
-                        policydao.getUsersFromCondition(condition));
+            if (policydao.matchCondition(this.user, condition.getSpecifier(),
+                    true) == 1) {
+                return new HashSet<>(policydao.getUsersFromCondition(condition));
             }
-        }catch (KustvaktException e) {
+        }
+        catch (KustvaktException e) {
             return Collections.emptySet();
         }
         return Collections.emptySet();
     }
 
+
     @Deprecated
-    public void addUser(KustvaktResource resource, String user,
-            Permissions.Permission... pps)
-            throws NotAuthorizedException, KustvaktException,
-            EmptyResultException {
+    public void addUser (KustvaktResource resource, String user,
+            Permissions.Permission ... pps) throws NotAuthorizedException,
+            KustvaktException, EmptyResultException {
         addUser(resource, Arrays.asList(user), pps);
     }
 
+
     @Deprecated
-    public void addUser(KustvaktResource resource, List<String> users,
-            Permissions.Permission... pps)
-            throws NotAuthorizedException, KustvaktException,
-            EmptyResultException {
-        SecurityManager policies = SecurityManager
-                .findbyId(resource.getId(), this.user);
+    public void addUser (KustvaktResource resource, List<String> users,
+            Permissions.Permission ... pps) throws NotAuthorizedException,
+            KustvaktException, EmptyResultException {
+        SecurityManager policies = SecurityManager.findbyId(resource.getId(),
+                this.user);
         PolicyCondition c = policies.getExtensional(pps);
         if (c != null)
             this.addUser(users, c, false);
diff --git a/src/main/java/de/ids_mannheim/korap/security/ac/PolicyBuilder.java b/src/main/java/de/ids_mannheim/korap/security/ac/PolicyBuilder.java
index 8fff53c..fac7636 100644
--- a/src/main/java/de/ids_mannheim/korap/security/ac/PolicyBuilder.java
+++ b/src/main/java/de/ids_mannheim/korap/security/ac/PolicyBuilder.java
@@ -29,7 +29,8 @@
     private Relation rel = null;
     private PolicyContext context;
 
-    public PolicyBuilder(User user) {
+
+    public PolicyBuilder (User user) {
         this.user = user;
         this.notifications = new Notifications();
         // fixme: other exception!?
@@ -37,32 +38,39 @@
             throw new RuntimeException("user id must be a valid interger id");
     }
 
-    public PolicyBuilder setResources(KustvaktResource... targets) {
+
+    public PolicyBuilder setResources (KustvaktResource ... targets) {
         this.resources = targets;
         this.parents = new KustvaktResource[targets.length];
         return this;
     }
 
+
     /**
-     * set the parents for the resources. Order is relevant, since the relation parent - resource is handled
-     * via the index within the array. Parent relation is limited to depth 1!
-     * In case of a skipped parent resource relation within the array, set 'null'
-     *
+     * set the parents for the resources. Order is relevant, since the
+     * relation parent - resource is handled
+     * via the index within the array. Parent relation is limited to
+     * depth 1!
+     * In case of a skipped parent resource relation within the array,
+     * set 'null'
+     * 
      * @param parents
      * @return
      */
-    public PolicyBuilder setParents(KustvaktResource... parents) {
+    public PolicyBuilder setParents (KustvaktResource ... parents) {
         for (int idx = 0; idx < parents.length; idx++)
             this.parents[idx] = parents[idx];
         return this;
     }
 
-    public PolicyBuilder setContext(PolicyContext context) {
+
+    public PolicyBuilder setContext (PolicyContext context) {
         this.context = context;
         return this;
     }
 
-    public PolicyBuilder setContext(long start, long end) {
+
+    public PolicyBuilder setContext (long start, long end) {
         if (this.context == null)
             this.context = new PolicyContext();
         this.context.setEnableTime(start);
@@ -70,50 +78,57 @@
         return this;
     }
 
-    public PolicyBuilder setLocation(String iprange) {
+
+    public PolicyBuilder setLocation (String iprange) {
         if (this.context == null)
             this.context = new PolicyContext();
         this.context.setIPMask(iprange);
         return this;
     }
 
-    public PolicyBuilder setPermissions(
-            Permissions.Permission... permissions) {
+
+    public PolicyBuilder setPermissions (Permissions.Permission ... permissions) {
         this.permissions = permissions;
         return this;
     }
 
-    public PolicyBuilder setConditions(String... conditions) {
+
+    public PolicyBuilder setConditions (String ... conditions) {
         this.conditions = new PolicyCondition[conditions.length];
         for (int idx = 0; idx < conditions.length; idx++)
             this.conditions[idx] = new PolicyCondition(conditions[idx]);
         return this;
     }
 
-    public PolicyBuilder setConditions(PolicyCondition... conditions) {
+
+    public PolicyBuilder setConditions (PolicyCondition ... conditions) {
         this.conditions = new PolicyCondition[conditions.length];
         for (int idx = 0; idx < conditions.length; idx++)
             this.conditions[idx] = conditions[idx];
         return this;
     }
 
-    public PolicyBuilder setRelation(Relation rel) {
+
+    public PolicyBuilder setRelation (Relation rel) {
         this.rel = rel;
         return this;
     }
 
-    public PolicyBuilder addCondition(String condition) {
+
+    public PolicyBuilder addCondition (String condition) {
         if (this.rel == null)
             setRelation(Relation.AND);
         return setConditions(condition);
     }
 
-    public String create() throws KustvaktException {
+
+    public String create () throws KustvaktException {
         return this.doIt();
     }
 
+
     // for and relations there is no way of setting parameters conjoined with the policy
-    private String doIt() throws KustvaktException {
+    private String doIt () throws KustvaktException {
         if (this.resources == null)
             throw new KustvaktException(user.getId(),
                     StatusCodes.ILLEGAL_ARGUMENT, "resource must be set",
@@ -133,8 +148,8 @@
             try {
                 if (parents[idx] != null)
                     resources[idx].setParentID(parents[idx].getPersistentID());
-                SecurityManager manager = SecurityManager
-                        .register(resources[idx], user);
+                SecurityManager manager = SecurityManager.register(
+                        resources[idx], user);
 
                 if (rel.equals(Relation.AND)) {
                     SecurityPolicy policy = new SecurityPolicy()
@@ -148,7 +163,8 @@
 
                     manager.addPolicy(policy);
 
-                }else if (rel.equals(Relation.OR)) {
+                }
+                else if (rel.equals(Relation.OR)) {
                     for (PolicyCondition c : this.conditions) {
                         SecurityPolicy policy = new SecurityPolicy()
                                 .addNewCondition(c).setTarget(resources[idx])
@@ -172,7 +188,8 @@
                         manager.addPolicy(policy);
                     }
                 }
-            }catch (KustvaktException e) {
+            }
+            catch (KustvaktException e) {
                 this.notifications.addError(e.getStatusCode(), e.getMessage(),
                         resources[idx].getPersistentID());
             }
diff --git a/src/main/java/de/ids_mannheim/korap/security/ac/PolicyDao.java b/src/main/java/de/ids_mannheim/korap/security/ac/PolicyDao.java
index 57d4658..e0e33ce 100644
--- a/src/main/java/de/ids_mannheim/korap/security/ac/PolicyDao.java
+++ b/src/main/java/de/ids_mannheim/korap/security/ac/PolicyDao.java
@@ -44,10 +44,12 @@
 
     private NamedParameterJdbcTemplate jdbcTemplate;
 
-    public PolicyDao(PersistenceClient client) {
+
+    public PolicyDao (PersistenceClient client) {
         this.jdbcTemplate = (NamedParameterJdbcTemplate) client.getSource();
     }
 
+
     /**
      * @param policy
      * @param user
@@ -57,11 +59,10 @@
     // fixme: better way of dealing with this?
     // fixme: enable needs to be set specifically for mysql db
     @Override
-    public int createPolicy(SecurityPolicy policy, User user)
+    public int createPolicy (SecurityPolicy policy, User user)
             throws KustvaktException {
-        String sql =
-                "INSERT INTO policy_store (target_id, creator, created, posix, enable, expire, iprange)"
-                        + " SELECT id, :creator, :cr, :posix, :en, :exp, :ip FROM resource_store WHERE persistent_id=:target;";
+        String sql = "INSERT INTO policy_store (target_id, creator, created, posix, enable, expire, iprange)"
+                + " SELECT id, :creator, :cr, :posix, :en, :exp, :ip FROM resource_store WHERE persistent_id=:target;";
 
         if (policy.getTarget() == null)
             throw new dbException(user.getId(), "policy_store",
@@ -94,25 +95,29 @@
             policy.setID(keyHolder.getKey().intValue());
             this.mapConstraints(policy);
             return policy.getID();
-        }catch (DataAccessException e) {
+        }
+        catch (DataAccessException e) {
             e.printStackTrace();
-            jlog.error("Operation (INSERT) not possible for '{}' for user '{}'",
+            jlog.error(
+                    "Operation (INSERT) not possible for '{}' for user '{}'",
                     policy.toString(), user.getId());
             throw new dbException(user.getId(), "policy_store",
                     StatusCodes.DB_INSERT_FAILED, policy.toString());
         }
     }
 
+
     /**
-     * should also include a remove operation, so removed policy constraints
-     *
+     * should also include a remove operation, so removed policy
+     * constraints
+     * 
      * @param policy
      * @return
      * @throws KustvaktException
      */
     // benchmark this!
     @Override
-    public void mapConstraints(SecurityPolicy policy) throws KustvaktException {
+    public void mapConstraints (SecurityPolicy policy) throws KustvaktException {
         final String cond = "INSERT INTO group_ref (group_id, policy_id) VALUES (:group, :policyID);";
         final String remove = "DELETE FROM group_ref WHERE group_id=:group and policy_id=:policyID;";
         try {
@@ -123,8 +128,8 @@
                         .getRemoved().size()];
                 for (Integer toremove : policy.getRemoved()) {
                     MapSqlParameterSource source = new MapSqlParameterSource();
-                    source.addValue("group",
-                            conditions.get(toremove).getSpecifier());
+                    source.addValue("group", conditions.get(toremove)
+                            .getSpecifier());
                     source.addValue("policyID", policy.getID());
                     sources_removed[idx++] = source;
                 }
@@ -138,15 +143,15 @@
                         .getAdded().size()];
                 for (Integer add : policy.getAdded()) {
                     MapSqlParameterSource source = new MapSqlParameterSource();
-                    source.addValue("group",
-                            conditions.get(add).getSpecifier());
+                    source.addValue("group", conditions.get(add).getSpecifier());
                     source.addValue("policyID", policy.getID());
                     sources[idx++] = source;
                 }
                 this.jdbcTemplate.batchUpdate(cond, sources);
             }
             policy.clear();
-        }catch (DataAccessException e) {
+        }
+        catch (DataAccessException e) {
             e.printStackTrace();
             jlog.error(
                     "Operation (MAPPING POLICY CONDITIONS) not possible for '{}' for user '{}'",
@@ -157,8 +162,9 @@
         }
     }
 
+
     // todo: check transactional behaviour! --> rollback
-    private void mapConditionsToUsers(SecurityPolicy policy, User user)
+    private void mapConditionsToUsers (SecurityPolicy policy, User user)
             throws KustvaktException {
         for (PolicyCondition cond : policy.getConditions()) {
             MapSqlParameterSource param = new MapSqlParameterSource();
@@ -169,10 +175,10 @@
                 final Integer[] results = new Integer[2];
                 jdbcTemplate
                         .query("SELECT COUNT(*) as total, (select count(*) from group_users where user_id=:userid and "
-                                        + "group_id=:name) as users FROM group_store WHERE name=:name",
+                                + "group_id=:name) as users FROM group_store WHERE name=:name",
                                 param, new RowCallbackHandler() {
                                     @Override
-                                    public void processRow(ResultSet rs)
+                                    public void processRow (ResultSet rs)
                                             throws SQLException {
                                         results[0] = rs.getInt("total");
                                         results[1] = rs.getInt("users");
@@ -185,9 +191,10 @@
                     this.createCondition(cond, user);
                 }
                 if (results[1] == 0)
-                    this.addToCondition(Arrays.asList(user.getUsername()), cond,
-                            admin);
-            }catch (DataAccessException e) {
+                    this.addToCondition(Arrays.asList(user.getUsername()),
+                            cond, admin);
+            }
+            catch (DataAccessException e) {
                 jlog.error(
                         "Operation (SELECT) not possible for '{}' for user '{}'",
                         policy.getTarget(), user.getId());
@@ -197,9 +204,10 @@
         }
     }
 
+
     // fixme: does not compare permissions. parent can still disregard policy because of missing permisssions
     @Override
-    public List<SecurityPolicy>[] getPolicies(Integer target, final User user,
+    public List<SecurityPolicy>[] getPolicies (Integer target, final User user,
             Byte perm) {
         MapSqlParameterSource param = new MapSqlParameterSource();
         param.addValue("target", target);
@@ -207,34 +215,27 @@
         param.addValue("perm", perm);
         param.addValue("en", new Timestamp(TimeUtils.getNow().getMillis()));
 
-        String sql_new =
-                "select pv.*, pv.perm & :perm as allowed, rh.depth, (select max(depth) from resource_tree \n"
-                        +
-                        "where child_id=rh.child_id) as max_depth from policy_view as pv "
-                        +
-                        "inner join resource_tree as rh on rh.parent_id=pv.id "
-                        +
-                        "where rh.child_id=:target and pv.enable <= :en and (pv.expire > :en or pv.expire is NULL) and "
-                        +
-                        "(pv.group_id='self' or pv.group_id in (select g.group_id from group_users as g where g.user_id=:userid)) and "
-                        +
-                        "(select sum(distinct depth) from resource_tree where child_id=rh.child_id) = "
-                        +
-                        "(select sum(distinct res.depth) from policy_view as pos inner join resource_tree as res on res.parent_id=pos.id where (pos.group_id in (select g.group_id from group_users as g "
-                        +
-                        "where g.user_id=:userid) or pos.group_id='self') and res.child_id=rh.child_id group by child_id);";
+        String sql_new = "select pv.*, pv.perm & :perm as allowed, rh.depth, (select max(depth) from resource_tree \n"
+                + "where child_id=rh.child_id) as max_depth from policy_view as pv "
+                + "inner join resource_tree as rh on rh.parent_id=pv.id "
+                + "where rh.child_id=:target and pv.enable <= :en and (pv.expire > :en or pv.expire is NULL) and "
+                + "(pv.group_id='self' or pv.group_id in (select g.group_id from group_users as g where g.user_id=:userid)) and "
+                + "(select sum(distinct depth) from resource_tree where child_id=rh.child_id) = "
+                + "(select sum(distinct res.depth) from policy_view as pos inner join resource_tree as res on res.parent_id=pos.id where (pos.group_id in (select g.group_id from group_users as g "
+                + "where g.user_id=:userid) or pos.group_id='self') and res.child_id=rh.child_id group by child_id);";
 
         try {
             return this.jdbcTemplate.query(sql_new, param,
                     new ResultSetExtractor<List<SecurityPolicy>[]>() {
 
                         @Override
-                        public List<SecurityPolicy>[] extractData(ResultSet rs)
+                        public List<SecurityPolicy>[] extractData (ResultSet rs)
                                 throws SQLException, DataAccessException {
                             return SecurityRowMappers.mapResourcePolicies(rs);
                         }
                     });
-        }catch (DataAccessException e) {
+        }
+        catch (DataAccessException e) {
             jlog.error(
                     "Permission Denied for policy retrieval for '{}' for user '{}'",
                     target, user.getId());
@@ -242,49 +243,48 @@
         }
     }
 
+
     // without root policies, since these are policies from different resources!
     @Override
-    public List<SecurityPolicy> getPolicies(PolicyCondition condition,
+    public List<SecurityPolicy> getPolicies (PolicyCondition condition,
             Class<? extends KustvaktResource> clazz, Byte perm) {
         MapSqlParameterSource param = new MapSqlParameterSource();
         param.addValue("cond", condition.getSpecifier());
         param.addValue("perm", perm);
         param.addValue("type", ResourceFactory.getResourceMapping(clazz));
         param.addValue("en", new Timestamp(TimeUtils.getNow().getMillis()));
-        String sql_new = "select pv.*, pv.perm & :perm as allowed, " +
-                "rh.depth, (select max(depth) from resource_tree " +
-                "where child_id=rh.child_id) as max_depth from policy_view as pv "
-                +
-                "inner join resource_tree as rh on rh.parent_id=pv.id " +
-                "where " +
-                "pv.enable <= :en and (pv.expire > :en or pv.expire is NULL) and "
-                +
-                "pv.group_id=:cond and pv.type=:type and " +
-                "(select sum(distinct depth) from resource_tree where child_id=rh.child_id) = "
-                +
-                "(select sum(distinct res.depth) from policy_view as pos inner join resource_tree as res on res.parent_id=pos.id where (pos.group_id=:cond)"
-                +
-                " and res.child_id=rh.child_id group by child_id)";
+        String sql_new = "select pv.*, pv.perm & :perm as allowed, "
+                + "rh.depth, (select max(depth) from resource_tree "
+                + "where child_id=rh.child_id) as max_depth from policy_view as pv "
+                + "inner join resource_tree as rh on rh.parent_id=pv.id "
+                + "where "
+                + "pv.enable <= :en and (pv.expire > :en or pv.expire is NULL) and "
+                + "pv.group_id=:cond and pv.type=:type and "
+                + "(select sum(distinct depth) from resource_tree where child_id=rh.child_id) = "
+                + "(select sum(distinct res.depth) from policy_view as pos inner join resource_tree as res on res.parent_id=pos.id where (pos.group_id=:cond)"
+                + " and res.child_id=rh.child_id group by child_id)";
 
         try {
             return this.jdbcTemplate.query(sql_new, param,
                     new ResultSetExtractor<List<SecurityPolicy>>() {
 
                         @Override
-                        public List<SecurityPolicy> extractData(ResultSet rs)
+                        public List<SecurityPolicy> extractData (ResultSet rs)
                                 throws SQLException, DataAccessException {
                             return SecurityRowMappers.mapConditionPolicies(rs);
                         }
                     });
-        }catch (DataAccessException e) {
+        }
+        catch (DataAccessException e) {
             jlog.error("Permission Denied: policy retrieval for '{}'",
                     condition.getSpecifier());
             return Collections.emptyList();
         }
     }
 
+
     @Override
-    public List<SecurityPolicy>[] getPolicies(String target, final User user,
+    public List<SecurityPolicy>[] getPolicies (String target, final User user,
             Byte perm) {
         MapSqlParameterSource param = new MapSqlParameterSource();
         param.addValue("target", target);
@@ -292,35 +292,30 @@
         param.addValue("perm", perm);
         param.addValue("en", new Timestamp(TimeUtils.getNow().getMillis()));
 
-        String sql_new = "select pv.*, pv.perm & :perm as allowed, " +
-                "rh.depth, (select max(depth) from resource_tree " +
-                "where child_id=rh.child_id) as max_depth from policy_view as pv "
-                +
-                "inner join resource_tree as rh on rh.parent_id=pv.id " +
-                "where rh.child_id=(select id from resource_store where persistent_id=:target) and "
-                +
-                "pv.enable <= :en and (pv.expire > :en or pv.expire is NULL) and "
-                +
-                "(pv.group_id='self' or pv.group_id in (select g.group_id from group_users as g where g.user_id=:userid)) and "
-                +
-                "(select sum(distinct depth) from resource_tree where child_id=rh.child_id) = "
-                +
-                "(select sum(distinct res.depth) from policy_view as pos inner join resource_tree as res on res.parent_id=pos.id where (pos.group_id in (select g.group_id from group_users "
-                +
-                "as g where g.user_id=:userid) or pos.group_id='self') and res.child_id=rh.child_id group by child_id)";
+        String sql_new = "select pv.*, pv.perm & :perm as allowed, "
+                + "rh.depth, (select max(depth) from resource_tree "
+                + "where child_id=rh.child_id) as max_depth from policy_view as pv "
+                + "inner join resource_tree as rh on rh.parent_id=pv.id "
+                + "where rh.child_id=(select id from resource_store where persistent_id=:target) and "
+                + "pv.enable <= :en and (pv.expire > :en or pv.expire is NULL) and "
+                + "(pv.group_id='self' or pv.group_id in (select g.group_id from group_users as g where g.user_id=:userid)) and "
+                + "(select sum(distinct depth) from resource_tree where child_id=rh.child_id) = "
+                + "(select sum(distinct res.depth) from policy_view as pos inner join resource_tree as res on res.parent_id=pos.id where (pos.group_id in (select g.group_id from group_users "
+                + "as g where g.user_id=:userid) or pos.group_id='self') and res.child_id=rh.child_id group by child_id)";
         try {
             return this.jdbcTemplate.query(sql_new, param,
                     new ResultSetExtractor<List<SecurityPolicy>[]>() {
 
                         @Override
-                        public List<SecurityPolicy>[] extractData(ResultSet rs)
+                        public List<SecurityPolicy>[] extractData (ResultSet rs)
                                 throws SQLException, DataAccessException {
                             List<SecurityPolicy>[] pol = SecurityRowMappers
                                     .mapResourcePolicies(rs);
                             return pol;
                         }
                     });
-        }catch (DataAccessException e) {
+        }
+        catch (DataAccessException e) {
             jlog.error(
                     "Permission Denied: policy retrieval for '{}' for user '{}'",
                     target, user.getId());
@@ -328,8 +323,9 @@
         }
     }
 
+
     @Override
-    public List<SecurityPolicy>[] findPolicies(String path, final User user,
+    public List<SecurityPolicy>[] findPolicies (String path, final User user,
             Byte perm) {
         MapSqlParameterSource param = new MapSqlParameterSource();
         param.addValue("path", StringUtils.buildSQLRegex(path));
@@ -337,33 +333,29 @@
         param.addValue("perm", perm);
         param.addValue("en", new Timestamp(TimeUtils.getNow().getMillis()));
 
-        String sql_new = "select pv.*, pv.perm & :perm as allowed, " +
-                "rh.depth, (select max(depth) from resource_tree " +
-                "where child_id=rh.child_id) as max_depth from policy_view as pv "
-                +
-                "inner join resource_tree as rh on rh.parent_id=pv.id " +
-                "where rt.name_path regexp :path and " +
-                "pv.enable <= :en and (pv.expire > :en or pv.expire is NULL) and "
-                +
-                "(pv.group_id='self' or pv.group_id in (select g.group_id from group_users as g where g.user_id=:userid)) and "
-                +
-                "(select sum(distinct depth) from resource_tree where child_id=rh.child_id) = "
-                +
-                "(select sum(distinct res.depth) from policy_view as pos inner join resource_tree as res on res.parent_id=pos.id where (pos.group_id in (select g.group_id from group_users "
-                +
-                "as g where g.user_id=:userid) or pos.group_id='self') and res.child_id=rh.child_id group by child_id)";
+        String sql_new = "select pv.*, pv.perm & :perm as allowed, "
+                + "rh.depth, (select max(depth) from resource_tree "
+                + "where child_id=rh.child_id) as max_depth from policy_view as pv "
+                + "inner join resource_tree as rh on rh.parent_id=pv.id "
+                + "where rt.name_path regexp :path and "
+                + "pv.enable <= :en and (pv.expire > :en or pv.expire is NULL) and "
+                + "(pv.group_id='self' or pv.group_id in (select g.group_id from group_users as g where g.user_id=:userid)) and "
+                + "(select sum(distinct depth) from resource_tree where child_id=rh.child_id) = "
+                + "(select sum(distinct res.depth) from policy_view as pos inner join resource_tree as res on res.parent_id=pos.id where (pos.group_id in (select g.group_id from group_users "
+                + "as g where g.user_id=:userid) or pos.group_id='self') and res.child_id=rh.child_id group by child_id)";
 
         try {
             return this.jdbcTemplate.query(sql_new, param,
                     new ResultSetExtractor<List<SecurityPolicy>[]>() {
 
                         @Override
-                        public List<SecurityPolicy>[] extractData(ResultSet rs)
+                        public List<SecurityPolicy>[] extractData (ResultSet rs)
                                 throws SQLException, DataAccessException {
                             return SecurityRowMappers.mapResourcePolicies(rs);
                         }
                     });
-        }catch (DataAccessException e) {
+        }
+        catch (DataAccessException e) {
             jlog.error(
                     "Permission Denied for retrieval for resource id '{}' for user '{}'",
                     path, user.getId());
@@ -371,8 +363,11 @@
         }
     }
 
+
     /**
-     * @param path  if set searches in path where the child element equals name. Also applicable for root resources!
+     * @param path
+     *            if set searches in path where the child element
+     *            equals name. Also applicable for root resources!
      * @param user
      * @param clazz
      * @return
@@ -380,7 +375,7 @@
     //todo: not working yet!
     // todo: does not concern itsself with location matching, ever!
     @Override
-    public List<KustvaktResource.Container> getDescending(String path,
+    public List<KustvaktResource.Container> getDescending (String path,
             final User user, Byte b,
             final Class<? extends KustvaktResource> clazz)
             throws KustvaktException {
@@ -393,57 +388,39 @@
         String sql;
         if (path != null && !path.isEmpty()) {
             sql = "select pv.*, pv.perm & :perm as allowed, rh.depth, rh.name_path, (select max(depth) from resource_tree \n"
-                    +
-                    "where child_id=rh.child_id) as max_depth from policy_view as pv "
-                    +
-                    "inner join resource_tree as rh on rh.child_id=pv.id " +
-                    "where pv.type=:type and (rh.name_path like :part) and ((pv.creator=:userid and pv.group_id='self') or "
-                    +
-                    "(pv.group_id in (select g.group_id from group_users as g where g.user_id=:userid) and "
-                    +
-                    "(select sum(distinct depth) from resource_tree where child_id=rh.child_id) = "
-                    +
-                    "(select sum(distinct depth) from policy_view as pos inner join resource_tree as res on res.parent_id=pos.id "
-                    +
-                    "where pos.group_id in (select g.group_id from group_users as g where g.user_id=:userid) "
-                    +
-                    "and res.child_id=rh.child_id group by child_id))) " +
-                    "group by pv.pid, pv.id having count(distinct pv.group_id) = "
-                    +
-                    "((select count(co.group_id) from group_ref as co where co.policy_id=pv.pid) or "
-                    +
-                    "(select 1 from policy_view as cp2 where cp2.group_id='self' and cp2.id=pv.id)) "
-                    +
-                    "order by rh.depth asc, pv.id desc;";
-        }else {
+                    + "where child_id=rh.child_id) as max_depth from policy_view as pv "
+                    + "inner join resource_tree as rh on rh.child_id=pv.id "
+                    + "where pv.type=:type and (rh.name_path like :part) and ((pv.creator=:userid and pv.group_id='self') or "
+                    + "(pv.group_id in (select g.group_id from group_users as g where g.user_id=:userid) and "
+                    + "(select sum(distinct depth) from resource_tree where child_id=rh.child_id) = "
+                    + "(select sum(distinct depth) from policy_view as pos inner join resource_tree as res on res.parent_id=pos.id "
+                    + "where pos.group_id in (select g.group_id from group_users as g where g.user_id=:userid) "
+                    + "and res.child_id=rh.child_id group by child_id))) "
+                    + "group by pv.pid, pv.id having count(distinct pv.group_id) = "
+                    + "((select count(co.group_id) from group_ref as co where co.policy_id=pv.pid) or "
+                    + "(select 1 from policy_view as cp2 where cp2.group_id='self' and cp2.id=pv.id)) "
+                    + "order by rh.depth asc, pv.id desc;";
+        }
+        else {
             sql = "select pv.*, pv.perm & :perm as allowed, rh.depth, rh.name_path, (select max(depth) from resource_tree \n"
-                    +
-                    "where child_id=rh.child_id) as max_depth from policy_view as pv "
-                    +
-                    "inner join resource_tree as rh on rh.child_id=pv.id " +
-                    "where pv.type=:type and ((pv.creator=:userid and pv.group_id='self') or "
-                    +
-                    "(pv.group_id in (select g.group_id from group_users as g where g.user_id=:userid) and "
-                    +
-                    "(select sum(distinct depth) from resource_tree where child_id=rh.child_id) = "
-                    +
-                    "(select sum(distinct depth) from policy_view as pos inner join resource_tree as res on res.parent_id=pos.id "
-                    +
-                    "where pos.group_id in (select g.group_id from group_users as g where g.user_id=:userid) "
-                    +
-                    "and res.child_id=rh.child_id group by child_id))) " +
-                    "group by pv.pid, pv.id having count(distinct pv.group_id) = "
-                    +
-                    "((select count(co.group_id) from group_ref as co where co.policy_id=pv.pid) or "
-                    +
-                    "(select 1 from policy_view as cp2 where cp2.group_id='self' and cp2.id=pv.id)) "
-                    +
-                    "order by rh.depth asc, pv.id desc;";
+                    + "where child_id=rh.child_id) as max_depth from policy_view as pv "
+                    + "inner join resource_tree as rh on rh.child_id=pv.id "
+                    + "where pv.type=:type and ((pv.creator=:userid and pv.group_id='self') or "
+                    + "(pv.group_id in (select g.group_id from group_users as g where g.user_id=:userid) and "
+                    + "(select sum(distinct depth) from resource_tree where child_id=rh.child_id) = "
+                    + "(select sum(distinct depth) from policy_view as pos inner join resource_tree as res on res.parent_id=pos.id "
+                    + "where pos.group_id in (select g.group_id from group_users as g where g.user_id=:userid) "
+                    + "and res.child_id=rh.child_id group by child_id))) "
+                    + "group by pv.pid, pv.id having count(distinct pv.group_id) = "
+                    + "((select count(co.group_id) from group_ref as co where co.policy_id=pv.pid) or "
+                    + "(select 1 from policy_view as cp2 where cp2.group_id='self' and cp2.id=pv.id)) "
+                    + "order by rh.depth asc, pv.id desc;";
         }
         try {
             return this.jdbcTemplate.query(sql, param,
                     new SecurityRowMappers.HierarchicalResultExtractor());
-        }catch (DataAccessException e) {
+        }
+        catch (DataAccessException e) {
             jlog.error(
                     "Permission Denied for retrieval for path '{}' for user '{}'",
                     path, user.getId());
@@ -452,9 +429,10 @@
         }
     }
 
+
     @Override
-    public List<KustvaktResource.Container> getAscending(String name, User user,
-            Byte b, Class<? extends KustvaktResource> clazz)
+    public List<KustvaktResource.Container> getAscending (String name,
+            User user, Byte b, Class<? extends KustvaktResource> clazz)
             throws KustvaktException {
         final MapSqlParameterSource param = new MapSqlParameterSource();
         param.addValue("userid", user.getId());
@@ -465,59 +443,41 @@
         String sql;
         if (name != null && !name.isEmpty()) {
             sql = "select pv.*, pv.perm & :perm as allowed, rh.depth, rh.name_path,\n"
-                    +
-                    "(select max(depth) from resource_tree \n" +
-                    "where child_id=rh.child_id) as max_depth from policy_view as pv\n"
-                    +
-                    "inner join resource_tree as rh on rh.child_id=pv.id\n" +
-                    "where pv.id in (select rt.parent_id from resource_tree as rt inner join resource_store rs on rs.id=rt.child_id\n"
-                    +
-                    "where rs.type=:type and rt.name_path like :part) and ((pv.creator=:userid and pv.group_id='self') or\n"
-                    +
-                    "(pv.group_id in (select g.group_id from group_users as g where g.user_id=:userid) and\n"
-                    +
-                    "(select sum(distinct depth) from resource_tree where child_id=rh.child_id) =\n"
-                    +
-                    "(select sum(distinct depth) from policy_view as pos inner join resource_tree as res on res.parent_id=pos.id\n"
-                    +
-                    "where pos.group_id in (select g.group_id from group_users as g where g.user_id=:userid)\n"
-                    +
-                    "and res.child_id=rh.child_id group by child_id)))\n" +
-                    "group by pv.pid, pv.id having count(distinct pv.group_id) = \n"
-                    +
-                    "case when pv.creator=:userid then 1 else (select count(distinct co.group_id) "
-                    +
-                    "from group_ref as co where co.policy_id=pv.pid) end order by rh.depth desc, pv.id desc;";
-        }else {
+                    + "(select max(depth) from resource_tree \n"
+                    + "where child_id=rh.child_id) as max_depth from policy_view as pv\n"
+                    + "inner join resource_tree as rh on rh.child_id=pv.id\n"
+                    + "where pv.id in (select rt.parent_id from resource_tree as rt inner join resource_store rs on rs.id=rt.child_id\n"
+                    + "where rs.type=:type and rt.name_path like :part) and ((pv.creator=:userid and pv.group_id='self') or\n"
+                    + "(pv.group_id in (select g.group_id from group_users as g where g.user_id=:userid) and\n"
+                    + "(select sum(distinct depth) from resource_tree where child_id=rh.child_id) =\n"
+                    + "(select sum(distinct depth) from policy_view as pos inner join resource_tree as res on res.parent_id=pos.id\n"
+                    + "where pos.group_id in (select g.group_id from group_users as g where g.user_id=:userid)\n"
+                    + "and res.child_id=rh.child_id group by child_id)))\n"
+                    + "group by pv.pid, pv.id having count(distinct pv.group_id) = \n"
+                    + "case when pv.creator=:userid then 1 else (select count(distinct co.group_id) "
+                    + "from group_ref as co where co.policy_id=pv.pid) end order by rh.depth desc, pv.id desc;";
+        }
+        else {
             sql = "select pv.*, pv.perm & :perm as allowed, rh.depth, rh.name_path,\n"
-                    +
-                    "(select max(depth) from resource_tree \n" +
-                    "where child_id=rh.child_id) as max_depth from policy_view as pv\n"
-                    +
-                    "inner join resource_tree as rh on rh.child_id=pv.id\n" +
-                    "where pv.id in (select rt.parent_id from resource_tree as rt inner join resource_store rs on rs.id=rt.child_id\n"
-                    +
-                    "where rs.type=:type) and ((pv.creator=:userid and pv.group_id='self') or\n"
-                    +
-                    "(pv.group_id in (select g.group_id from group_users as g where g.user_id=:userid) and\n"
-                    +
-                    "(select sum(distinct depth) from resource_tree where child_id=rh.child_id) =\n"
-                    +
-                    "(select sum(distinct depth) from policy_view as pos inner join resource_tree as res on res.parent_id=pos.target_id\n"
-                    +
-                    "where pos.group_id in (select g.group_id from group_users as g where g.user_id=:userid)\n"
-                    +
-                    "and res.child_id=rh.child_id group by child_id)))\n" +
-                    "group by pv.pid, pv.id having count(distinct pv.group_id) = \n"
-                    +
-                    "case when pv.creator=:userid then 1 else (select count(distinct co.group_id) "
-                    +
-                    "from group_ref as co where co.policy_id=pv.pid) end order by rh.depth desc, pv.id desc;";
+                    + "(select max(depth) from resource_tree \n"
+                    + "where child_id=rh.child_id) as max_depth from policy_view as pv\n"
+                    + "inner join resource_tree as rh on rh.child_id=pv.id\n"
+                    + "where pv.id in (select rt.parent_id from resource_tree as rt inner join resource_store rs on rs.id=rt.child_id\n"
+                    + "where rs.type=:type) and ((pv.creator=:userid and pv.group_id='self') or\n"
+                    + "(pv.group_id in (select g.group_id from group_users as g where g.user_id=:userid) and\n"
+                    + "(select sum(distinct depth) from resource_tree where child_id=rh.child_id) =\n"
+                    + "(select sum(distinct depth) from policy_view as pos inner join resource_tree as res on res.parent_id=pos.target_id\n"
+                    + "where pos.group_id in (select g.group_id from group_users as g where g.user_id=:userid)\n"
+                    + "and res.child_id=rh.child_id group by child_id)))\n"
+                    + "group by pv.pid, pv.id having count(distinct pv.group_id) = \n"
+                    + "case when pv.creator=:userid then 1 else (select count(distinct co.group_id) "
+                    + "from group_ref as co where co.policy_id=pv.pid) end order by rh.depth desc, pv.id desc;";
         }
         try {
             return this.jdbcTemplate.query(sql, param,
                     new SecurityRowMappers.HierarchicalResultExtractor());
-        }catch (DataAccessException e) {
+        }
+        catch (DataAccessException e) {
             jlog.error(
                     "Permission Denied for retrieval for path '{}' for user '{}'",
                     name, user.getId());
@@ -526,48 +486,55 @@
         }
     }
 
+
     // todo: return all resources or only leave nodes? --> currently only leaves are returned
     // todo: access to leave node also means that the path to the root for that permission is allowed,
     // todo: thus all upper resource access is as well allowed
 
     //todo: remove not used context?! --> who is allowed to do so?
     @Override
-    public int deletePolicy(SecurityPolicy policy, User user)
+    public int deletePolicy (SecurityPolicy policy, User user)
             throws KustvaktException {
         MapSqlParameterSource param = new MapSqlParameterSource();
         param.addValue("id", policy.getID());
 
         try {
-            this.jdbcTemplate
-                    .update("DELETE FROM group_ref WHERE policy_id=:id", param);
-            return this.jdbcTemplate
-                    .update("DELETE FROM policy_store WHERE id=:id", param);
-        }catch (DataAccessException e) {
-            jlog.error("Operation (DELETE) not possible for '{}' for user '{}'",
+            this.jdbcTemplate.update(
+                    "DELETE FROM group_ref WHERE policy_id=:id", param);
+            return this.jdbcTemplate.update(
+                    "DELETE FROM policy_store WHERE id=:id", param);
+        }
+        catch (DataAccessException e) {
+            jlog.error(
+                    "Operation (DELETE) not possible for '{}' for user '{}'",
                     policy.toString(), user.getId());
             throw new dbException(user.getId(), "policy_store, group_ref",
                     StatusCodes.DB_DELETE_FAILED, policy.toString());
         }
     }
 
+
     @Override
-    public int deleteResourcePolicies(String id, User user)
+    public int deleteResourcePolicies (String id, User user)
             throws KustvaktException {
         MapSqlParameterSource param = new MapSqlParameterSource();
         param.addValue("id", id);
         String sql = "DELETE FROM policy_store WHERE target_id in (SELECT id FROM resource_store WHERE persistent_id=:id);";
         try {
             return this.jdbcTemplate.update(sql, param);
-        }catch (DataAccessException e) {
-            jlog.error("Operation (DELETE) not possible for '{}' for user '{}'",
+        }
+        catch (DataAccessException e) {
+            jlog.error(
+                    "Operation (DELETE) not possible for '{}' for user '{}'",
                     id, user.getId());
             throw new dbException(user.getId(), "policy_store",
                     StatusCodes.DB_DELETE_FAILED, id);
         }
     }
 
+
     @Override
-    public int updatePolicy(SecurityPolicy policy, User user)
+    public int updatePolicy (SecurityPolicy policy, User user)
             throws KustvaktException {
         MapSqlParameterSource np = new MapSqlParameterSource();
         np.addValue("posix", policy.getPermissionByte());
@@ -576,21 +543,23 @@
         np.addValue("id", policy.getID());
 
         try {
-            int result = this.jdbcTemplate
-                    .update("UPDATE policy_store SET posix=:posix WHERE id=:id",
-                            np);
+            int result = this.jdbcTemplate.update(
+                    "UPDATE policy_store SET posix=:posix WHERE id=:id", np);
             this.mapConstraints(policy);
             return result;
-        }catch (DataAccessException e) {
-            jlog.error("Operation (UPDATE) not possible for '{}' for user '{}'",
+        }
+        catch (DataAccessException e) {
+            jlog.error(
+                    "Operation (UPDATE) not possible for '{}' for user '{}'",
                     policy.toString(), user.getId());
             throw new dbException(user.getId(), "policy_store",
                     StatusCodes.DB_UPDATE_FAILED, policy.toString());
         }
     }
 
+
     @Override
-    public int checkPolicy(SecurityPolicy policy, User user)
+    public int checkPolicy (SecurityPolicy policy, User user)
             throws KustvaktException {
         if (policy.getID() == -1)
             return 0;
@@ -601,17 +570,21 @@
 
         try {
             return this.jdbcTemplate.queryForObject(sql1, param, Integer.class);
-        }catch (DataAccessException e) {
-            jlog.error("Operation (SELECT) not possible for '{}' for user '{}'",
+        }
+        catch (DataAccessException e) {
+            jlog.error(
+                    "Operation (SELECT) not possible for '{}' for user '{}'",
                     policy.getTarget(), user.getId());
             throw new dbException(user.getId(), "policy_store",
                     StatusCodes.DB_GET_FAILED, policy.toString());
         }
     }
 
+
     /**
-     * checks if the user is a member of the specified group. Additional ownership can be tested via boolean flag
-     *
+     * checks if the user is a member of the specified group.
+     * Additional ownership can be tested via boolean flag
+     * 
      * @param user
      * @param group
      * @param owner
@@ -619,7 +592,7 @@
      * @throws KustvaktException
      */
     @Override
-    public int matchCondition(User user, String group, boolean owner)
+    public int matchCondition (User user, String group, boolean owner)
             throws KustvaktException {
         MapSqlParameterSource param = new MapSqlParameterSource();
         param.addValue("userid", user.getId());
@@ -628,27 +601,29 @@
         String sql;
         if (owner) {
             sql = "SELECT COUNT(*) FROM group_users AS gu INNER JOIN group_store AS gs "
-                    +
-                    "ON gs.name=gu.group_id WHERE gu.user_id=:userid " +
-                    "AND gs.name=:group AND gu.admin=:isadmin;";
-        }else {
+                    + "ON gs.name=gu.group_id WHERE gu.user_id=:userid "
+                    + "AND gs.name=:group AND gu.admin=:isadmin;";
+        }
+        else {
             sql = "SELECT COUNT(*) FROM group_users AS gu INNER JOIN group_store AS gs "
-                    +
-                    "ON gs.name=gu.group_id WHERE gu.user_id=:userid " +
-                    "AND gs.name=:group;";
+                    + "ON gs.name=gu.group_id WHERE gu.user_id=:userid "
+                    + "AND gs.name=:group;";
         }
 
         try {
             return this.jdbcTemplate.queryForObject(sql, param, Integer.class);
-        }catch (DataAccessException e) {
-            jlog.error("Operation (SELECT) not possible for '{}' for user '{}'",
+        }
+        catch (DataAccessException e) {
+            jlog.error(
+                    "Operation (SELECT) not possible for '{}' for user '{}'",
                     group, user.getId());
             throw new dbException(user.getId(), "policy_store",
                     StatusCodes.DB_GET_FAILED, group);
         }
     }
 
-    private void createCondition(PolicyCondition condition, User user)
+
+    private void createCondition (PolicyCondition condition, User user)
             throws KustvaktException {
         MapSqlParameterSource param = new MapSqlParameterSource();
         param.addValue("name", condition.getSpecifier());
@@ -658,10 +633,11 @@
         param.addValue("sy", condition.getFlags().get(Attributes.SYM_USE));
         param.addValue("ex", condition.getFlags().get(Attributes.LICENCE));
         try {
-            this.jdbcTemplate
-                    .update("INSERT INTO group_store (name, sym_use, export, commercial) "
+            this.jdbcTemplate.update(
+                    "INSERT INTO group_store (name, sym_use, export, commercial) "
                             + "VALUES (:name, :sy, :ex, :com);", param);
-        }catch (DataAccessException e) {
+        }
+        catch (DataAccessException e) {
             jlog.error("Operation (INSERT) not possible for '{}'",
                     condition.toString());
             throw new dbException(user.getId(), "group_store",
@@ -669,24 +645,24 @@
         }
     }
 
+
     //todo: check for unique constraint exception and exclude from throw!
     @Override
-    public int addToCondition(String username, PolicyCondition condition,
+    public int addToCondition (String username, PolicyCondition condition,
             boolean admin) throws KustvaktException {
-        final String insert =
-                "INSERT INTO group_users (user_id, group_id, admin) " +
-                        "VALUES ((SELECT id FROM korap_users " +
-                        "WHERE username=:username), :group, :status);";
+        final String insert = "INSERT INTO group_users (user_id, group_id, admin) "
+                + "VALUES ((SELECT id FROM korap_users "
+                + "WHERE username=:username), :group, :status);";
         try {
             MapSqlParameterSource param = new MapSqlParameterSource();
             param.addValue("group", condition.getSpecifier());
             param.addValue("username", username);
             param.addValue("status", BooleanUtils.getBoolean(admin));
             return this.jdbcTemplate.update(insert, param);
-        }catch (DataAccessException e) {
+        }
+        catch (DataAccessException e) {
             //todo: test with mysql
-            if (!e.getMessage().toLowerCase()
-                    .contains("UNIQUE".toLowerCase())) {
+            if (!e.getMessage().toLowerCase().contains("UNIQUE".toLowerCase())) {
                 jlog.error(
                         "Operation (INSERT) not possible for '{}' for user '{}'",
                         condition.toString(), username);
@@ -697,18 +673,22 @@
         }
     }
 
+
     /**
      * @param usernames
      * @param condition
      * @param admin
      * @return
-     * @throws KustvaktException userID and group_id have a unique constraint,
-     *                           thus: if any of the supplied users is already a member of the group, the entire chain will be broken!
+     * @throws KustvaktException
+     *             userID and group_id have a unique constraint,
+     *             thus: if any of the supplied users is already a
+     *             member of the group, the entire chain will be
+     *             broken!
      */
     //todo definitely needs rework
     //todo: test the unique index constraints!
     @Override
-    public int[] addToCondition(List<String> usernames,
+    public int[] addToCondition (List<String> usernames,
             PolicyCondition condition, boolean admin) throws KustvaktException {
         MapSqlParameterSource[] sources = new MapSqlParameterSource[usernames
                 .size()];
@@ -719,10 +699,9 @@
         //                "AND group_id=:group;";
 
         //todo: use index to create uniqueness. how to batch?
-        final String insert =
-                "INSERT INTO group_users (user_id, group_id, admin) " +
-                        "VALUES ((SELECT id FROM korap_users " +
-                        "WHERE username=:username), :group, :status);";
+        final String insert = "INSERT INTO group_users (user_id, group_id, admin) "
+                + "VALUES ((SELECT id FROM korap_users "
+                + "WHERE username=:username), :group, :status);";
         try {
             for (int idx = 0; idx < usernames.size(); idx++) {
                 //todo: dont do that here
@@ -743,22 +722,25 @@
             // todo: only insert if user is not already a member of this group
             //fixme: problem - unique constraints throws exception. skip that user entry?!
             return this.jdbcTemplate.batchUpdate(insert, sources);
-        }catch (DataAccessException e) {
+        }
+        catch (DataAccessException e) {
             if (!e.getCause().toString().contains("UNIQUE")) {
                 jlog.error(
                         "Operation (INSERT) not possible for '{}' for user '{}'",
                         condition.toString(), usernames, e);
                 throw new KustvaktException(
-                        "Operation (INSERT) not possible for '" + condition
-                                .toString() + "' for user '" + usernames + "'",
-                        e, StatusCodes.CONNECTION_ERROR);
+                        "Operation (INSERT) not possible for '"
+                                + condition.toString() + "' for user '"
+                                + usernames + "'", e,
+                        StatusCodes.CONNECTION_ERROR);
             }
             return null;
         }
     }
 
+
     @Override
-    public void removeFromCondition(List<String> usernames,
+    public void removeFromCondition (List<String> usernames,
             PolicyCondition condition) throws KustvaktException {
         MapSqlParameterSource[] sources = new MapSqlParameterSource[usernames
                 .size()];
@@ -770,21 +752,23 @@
             sources[idx++] = param;
         }
 
-        final String del =
-                "DELETE FROM group_users WHERE group_id=:group AND user_id=(SELECT id FROM "
-                        + "korap_users WHERE username=:username);";
+        final String del = "DELETE FROM group_users WHERE group_id=:group AND user_id=(SELECT id FROM "
+                + "korap_users WHERE username=:username);";
 
         try {
             this.jdbcTemplate.batchUpdate(del, sources);
-        }catch (DataAccessException e) {
-            jlog.error("Operation (DELETE) not possible for '{}' for user '{}'",
+        }
+        catch (DataAccessException e) {
+            jlog.error(
+                    "Operation (DELETE) not possible for '{}' for user '{}'",
                     condition.toString(), usernames);
             throw new KustvaktException(e, StatusCodes.CONNECTION_ERROR);
         }
     }
 
+
     @Override
-    public int createParamBinding(Parameter param) throws KustvaktException {
+    public int createParamBinding (Parameter param) throws KustvaktException {
         MapSqlParameterSource source = new MapSqlParameterSource();
         source.addValue("key", param.getName());
         source.addValue("policy", param.getPolicy().getID());
@@ -794,44 +778,46 @@
         //todo:
         //        if (!parameterExists(param.getName()))
         //            createParameter(param.getName(), "", param.getOwner());
-        final String insert =
-                "INSERT INTO param_map (param_id, policy_id, value, flag) VALUES ((SELECT id FROM param_store "
-                        + "WHERE p_key=:key), (SELECT id FROM policy_store WHERE id=:policy), :value, :flag);";
+        final String insert = "INSERT INTO param_map (param_id, policy_id, value, flag) VALUES ((SELECT id FROM param_store "
+                + "WHERE p_key=:key), (SELECT id FROM policy_store WHERE id=:policy), :value, :flag);";
         try {
             return this.jdbcTemplate.update(insert, source);
-        }catch (DataAccessException e) {
+        }
+        catch (DataAccessException e) {
             jlog.error("Operation (INSERT) not possible for '{}",
                     param.toString());
             throw new KustvaktException(e, StatusCodes.CONNECTION_ERROR);
         }
     }
 
+
     @Override
-    public List<String> getUsersFromCondition(PolicyCondition condition)
+    public List<String> getUsersFromCondition (PolicyCondition condition)
             throws KustvaktException {
         MapSqlParameterSource source = new MapSqlParameterSource();
         source.addValue("specifier", condition.getSpecifier());
-        final String sql1 =
-                "SELECT username FROM korap_users WHERE id IN (SELECT user_id FROM "
-                        + "group_users WHERE group_id=:specifier);";
+        final String sql1 = "SELECT username FROM korap_users WHERE id IN (SELECT user_id FROM "
+                + "group_users WHERE group_id=:specifier);";
         try {
             return this.jdbcTemplate.queryForList(sql1, source, String.class);
-        }catch (DataAccessException e) {
+        }
+        catch (DataAccessException e) {
             jlog.error("Operation (SELECT) not possible for '{}'",
                     condition.toString());
             throw new KustvaktException(StatusCodes.CONNECTION_ERROR);
         }
     }
 
-    private boolean parameterExists(String key) {
+
+    private boolean parameterExists (String key) {
         MapSqlParameterSource source = new MapSqlParameterSource();
         source.addValue("key", key);
         final String select = "SELECT COUNT(*) FROM param_store WHERE p_key=:key;";
-        return this.jdbcTemplate.queryForObject(select, source, Integer.class)
-                == 1;
+        return this.jdbcTemplate.queryForObject(select, source, Integer.class) == 1;
     }
 
-    private void createParameter(String parameter, String value, Integer owner)
+
+    private void createParameter (String parameter, String value, Integer owner)
             throws KustvaktException {
         MapSqlParameterSource source = new MapSqlParameterSource();
         source.addValue("name", parameter);
@@ -840,32 +826,36 @@
         final String sql = "INSERT INTO param_store (p_key, p_value) VALUES (:name, :value);";
         try {
             this.jdbcTemplate.update(sql, source);
-        }catch (DataAccessException e) {
+        }
+        catch (DataAccessException e) {
             throw new KustvaktException(e, StatusCodes.CONNECTION_ERROR);
         }
     }
 
+
     @Override
-    public int removeParamBinding(SecurityPolicy policy)
+    public int removeParamBinding (SecurityPolicy policy)
             throws KustvaktException {
         MapSqlParameterSource source = new MapSqlParameterSource();
         source.addValue("id", policy.getID());
         final String sql = "DELETE FROM param_map WHERE policy_id=:id";
         try {
             return this.jdbcTemplate.update(sql, source);
-        }catch (DataAccessException e) {
+        }
+        catch (DataAccessException e) {
             throw new KustvaktException(e, StatusCodes.CONNECTION_ERROR);
         }
     }
 
+
     @Override
-    public int size() {
+    public int size () {
         String sql = "SELECT COUNT(*) FROM policy_view;";
         try {
-            return this.jdbcTemplate
-                    .queryForObject(sql, new HashMap<String, Object>(),
-                            Integer.class);
-        }catch (DataAccessException e) {
+            return this.jdbcTemplate.queryForObject(sql,
+                    new HashMap<String, Object>(), Integer.class);
+        }
+        catch (DataAccessException e) {
             return 0;
         }
     }
diff --git a/src/main/java/de/ids_mannheim/korap/security/ac/PolicyEvaluator.java b/src/main/java/de/ids_mannheim/korap/security/ac/PolicyEvaluator.java
index ed1d0af..9a70f81 100644
--- a/src/main/java/de/ids_mannheim/korap/security/ac/PolicyEvaluator.java
+++ b/src/main/java/de/ids_mannheim/korap/security/ac/PolicyEvaluator.java
@@ -33,14 +33,16 @@
     @Deprecated
     private Map<String, Object> flags;
 
-    public PolicyEvaluator(User user, List<SecurityPolicy>[] policies) {
+
+    public PolicyEvaluator (User user, List<SecurityPolicy>[] policies) {
         this.user = user;
         this.policies = policies;
         this.permissions = new PermissionsBuffer();
         this.flags = new HashMap<>();
     }
 
-    private PolicyEvaluator(User user, KustvaktResource resource) {
+
+    private PolicyEvaluator (User user, KustvaktResource resource) {
         this.user = user;
         this.resourceID = resource.getPersistentID();
         this.permissions = new PermissionsBuffer();
@@ -48,15 +50,17 @@
         this.policies = null;
     }
 
-    public String getResourceID() {
+
+    public String getResourceID () {
         if (this.resourceID == null && policies[0] != null
                 && policies[0].get(0) != null)
             this.resourceID = policies[0].get(0).getTarget();
         return this.resourceID;
     }
 
+
     // todo: test benchmarks
-    private List<SecurityPolicy> evaluate(List<SecurityPolicy>[] policies,
+    private List<SecurityPolicy> evaluate (List<SecurityPolicy>[] policies,
             Permissions.Permission perm) throws NotAuthorizedException {
         //fixme: what happens in case a parent relation does not allow changing a resource, but the owner of child per default
         //todo: receives all rights? --> test casing
@@ -70,16 +74,16 @@
                 int idx = 0;
                 if (policies[i] != null) {
                     int ow = getOwner(policies[i]);
-                    for (int internal = 0;
-                         internal < policies[i].size(); internal++) {
+                    for (int internal = 0; internal < policies[i].size(); internal++) {
                         SecurityPolicy s = policies[i].get(internal);
                         if (i == policies.length - 1) {
                             if (ow == user.getId())
                                 this.permissions.addPermission(127);
                             else if (!(s instanceof SecurityPolicy.OwnerPolicy))
-                                this.permissions
-                                        .addPermission(s.getPermissionByte());
-                        }else {
+                                this.permissions.addPermission(s
+                                        .getPermissionByte());
+                        }
+                        else {
                             if (ow == user.getId())
                                 this.permissions.retain(127);
                             else if (!(s instanceof SecurityPolicy.OwnerPolicy))
@@ -92,16 +96,16 @@
                 if (idx == 0) {
                     relationError = i;
                     throw new NotAuthorizedException(
-                            StatusCodes.PERMISSION_DENIED,
-                            this.getResourceID());
+                            StatusCodes.PERMISSION_DENIED, this.getResourceID());
                 }
             }
             this.processed = true;
             System.out.println("FINAL BYTE :" + this.permissions.getPbyte());
             if (this.permissions.containsPermission(perm))
                 return policies[0];
-        }else if (processed && relationError == -1 && this.permissions
-                .containsPermission(perm)) {
+        }
+        else if (processed && relationError == -1
+                && this.permissions.containsPermission(perm)) {
             jlog.debug("Done processing resource policies");
             jlog.debug("Will return policies to security manager: "
                     + this.policies[0]);
@@ -111,60 +115,69 @@
         return Collections.emptyList();
     }
 
+
     /**
      * checks read permission
-     *
+     * 
      * @return
      */
-    public boolean isAllowed() {
+    public boolean isAllowed () {
         return isAllowed(Permissions.Permission.READ);
     }
 
-    public boolean isAllowed(Permissions.Permission perm) {
+
+    public boolean isAllowed (Permissions.Permission perm) {
         try {
             List s = evaluate(this.policies, perm);
             return s != null && !s.isEmpty();
-        }catch (NotAuthorizedException e) {
+        }
+        catch (NotAuthorizedException e) {
             return false;
         }
     }
 
-    public boolean isOwner() {
+
+    public boolean isOwner () {
         return policies != null && this.user.getId() != null
                 && getOwner(this.policies[0]) == this.user.getId();
     }
 
-    private int getOwner(List<SecurityPolicy> policies) {
-        if (policies != null && policies.get(0) != null && policies
-                .get(0) instanceof SecurityPolicy.OwnerPolicy) {
+
+    private int getOwner (List<SecurityPolicy> policies) {
+        if (policies != null && policies.get(0) != null
+                && policies.get(0) instanceof SecurityPolicy.OwnerPolicy) {
             return ((SecurityPolicy.OwnerPolicy) policies.get(0)).getOwner();
         }
         return -1;
     }
 
+
     // todo: what is this supposed to do?
     @Deprecated
-    public static PolicyEvaluator setFlags(User user,
-            KustvaktResource resource) {
+    public static PolicyEvaluator setFlags (User user, KustvaktResource resource) {
         PolicyEvaluator e = new PolicyEvaluator(user, resource);
-//        e.setFlag("managed", resource.getOwner() == KorAPUser.ADMINISTRATOR_ID);
-//        e.setFlag("shared", false);
+        //        e.setFlag("managed", resource.getOwner() == KorAPUser.ADMINISTRATOR_ID);
+        //        e.setFlag("shared", false);
         return e;
     }
 
-    public <V> V getFlag(String key, V value) {
+
+    public <V> V getFlag (String key, V value) {
         return (V) this.flags.get(key);
     }
 
-    private <V> void setFlag(String key, V value) {
+
+    private <V> void setFlag (String key, V value) {
         this.flags.put(key, value);
     }
 
-    public boolean isManaged() {
+
+    public boolean isManaged () {
         return getOwner(this.policies[0]) == KorAPUser.ADMINISTRATOR_ID;
     }
 
-    public boolean isShared() {
+
+    public boolean isShared () {
         return !isManaged() && !isOwner();
     }
 
diff --git a/src/main/java/de/ids_mannheim/korap/security/ac/ResourceFinder.java b/src/main/java/de/ids_mannheim/korap/security/ac/ResourceFinder.java
index 232c5eb..4dffda5 100644
--- a/src/main/java/de/ids_mannheim/korap/security/ac/ResourceFinder.java
+++ b/src/main/java/de/ids_mannheim/korap/security/ac/ResourceFinder.java
@@ -33,17 +33,20 @@
     private List<KustvaktResource.Container> containers;
     private User user;
 
-    private ResourceFinder(User user) {
+
+    private ResourceFinder (User user) {
         this();
         this.user = user;
     }
 
-    private ResourceFinder() {
+
+    private ResourceFinder () {
         this.containers = new ArrayList<>();
         overrideProviders(null);
     }
 
-    public static void overrideProviders(ContextHolder beans) {
+
+    public static void overrideProviders (ContextHolder beans) {
         if (beans == null)
             beans = BeansFactory.getKustvaktContext();
         if (policydao == null | resourcedaos == null) {
@@ -55,16 +58,18 @@
             throw new RuntimeException("provider not set!");
     }
 
-    public static <T extends KustvaktResource> Set<T> search(String path,
+
+    public static <T extends KustvaktResource> Set<T> search (String path,
             boolean asParent, User user, Class<T> clazz,
-            Permissions.Permission... perms) throws KustvaktException {
+            Permissions.Permission ... perms) throws KustvaktException {
         ResourceFinder cat = init(path, asParent, user, clazz, perms);
         return cat.getResources();
     }
 
-    private static <T extends KustvaktResource> ResourceFinder init(String path,
-            boolean asParent, User user, Class<T> clazz,
-            Permissions.Permission... perms) throws KustvaktException {
+
+    private static <T extends KustvaktResource> ResourceFinder init (
+            String path, boolean asParent, User user, Class<T> clazz,
+            Permissions.Permission ... perms) throws KustvaktException {
         ResourceFinder cat = new ResourceFinder(user);
         PermissionsBuffer buffer = new PermissionsBuffer();
         if (perms.length == 0)
@@ -74,50 +79,55 @@
         return cat;
     }
 
+
     //todo: needs to be much faster!
-    public static <T extends KustvaktResource> ResourceFinder init(
+    public static <T extends KustvaktResource> ResourceFinder init (
             @NonNull User user, Class<T> clazz) throws KustvaktException {
         return init(null, true, user, clazz, Permissions.Permission.READ);
     }
 
-    public static <T extends KustvaktResource> Set<T> search(String name,
+
+    public static <T extends KustvaktResource> Set<T> search (String name,
             boolean asParent, User user, String type) throws KustvaktException {
         return (Set<T>) search(name, asParent, user,
                 ResourceFactory.getResourceClass(type),
                 Permissions.Permission.READ);
     }
 
-    public static <T extends KustvaktResource> Set<T> searchPublic(
+
+    public static <T extends KustvaktResource> Set<T> searchPublic (
             Class<T> clazz) throws KustvaktException {
         return searchPublicFiltered(clazz);
     }
 
-    public static <T extends KustvaktResource> Set<T> searchPublicFiltered(
-            Class<T> clazz, String ...ids) throws KustvaktException {
+
+    public static <T extends KustvaktResource> Set<T> searchPublicFiltered (
+            Class<T> clazz, String ... ids) throws KustvaktException {
         overrideProviders(null);
         Set<T> sets = new HashSet<>();
-        List<SecurityPolicy> policies = policydao
-                .getPolicies(new PolicyCondition(Attributes.PUBLIC_GROUP),
-                        clazz, Permissions.Permission.READ.toByte());
+        List<SecurityPolicy> policies = policydao.getPolicies(
+                new PolicyCondition(Attributes.PUBLIC_GROUP), clazz,
+                Permissions.Permission.READ.toByte());
 
         List<String> id_set = Arrays.asList(ids);
         for (SecurityPolicy policy : policies) {
-            T r = (T) resourcedaos.get(KustvaktResource.class)
-                    .findbyId(policy.getTarget(),
-                            User.UserFactory.getDemoUser());
+            T r = (T) resourcedaos.get(KustvaktResource.class).findbyId(
+                    policy.getTarget(), User.UserFactory.getDemoUser());
             if (id_set.isEmpty() || id_set.contains(r.getPersistentID()))
                 sets.add(r);
         }
         return sets;
     }
 
+
     // todo: should this be working?
-    public static <T extends KustvaktResource> Set<T> search(User user,
+    public static <T extends KustvaktResource> Set<T> search (User user,
             Class<T> clazz) throws KustvaktException {
         return search(null, true, user, clazz, Permissions.Permission.READ);
     }
 
-    private void retrievePolicies(String path, Byte b, Class type,
+
+    private void retrievePolicies (String path, Byte b, Class type,
             boolean parent) throws KustvaktException {
         //fixme: throw exception to avoid susequent exceptions due to unknown origin
         if (user == null | type == null)
@@ -128,12 +138,14 @@
             this.containers = policydao.getAscending(path, user, b, type);
     }
 
-    public <T extends KustvaktResource> Set<T> getResources() {
+
+    public <T extends KustvaktResource> Set<T> getResources () {
         return evaluateResources();
     }
 
+
     // todo: redo with less memory usage/faster
-    private <T extends KustvaktResource> Set<T> evaluateResources() {
+    private <T extends KustvaktResource> Set<T> evaluateResources () {
         Set<T> resources = new HashSet<>();
         if (this.containers != null) {
             for (KustvaktResource.Container c : this.containers) {
@@ -141,12 +153,13 @@
                     T resource = (T) resourcedaos.get(KustvaktResource.class)
                             .findbyId(c.getPersistentID(), this.user);
                     if (resource != null) {
-                        PolicyEvaluator e = PolicyEvaluator
-                                .setFlags(user, resource);
+                        PolicyEvaluator e = PolicyEvaluator.setFlags(user,
+                                resource);
                         //                        resource.setManaged(e.getFlag("managed", false));
                         resources.add(resource);
                     }
-                }catch (KustvaktException e) {
+                }
+                catch (KustvaktException e) {
                     // don't handle connection error or no handler registered!
                     jlog.error("Error while retrieving containers '{}' ",
                             this.containers);
@@ -157,7 +170,8 @@
         return resources;
     }
 
-    public Set<String> getIds() {
+
+    public Set<String> getIds () {
         Set<String> resources = new HashSet<>();
         for (KustvaktResource.Container c : this.containers)
             resources.add(c.getPersistentID());
diff --git a/src/main/java/de/ids_mannheim/korap/security/ac/ResourceHandler.java b/src/main/java/de/ids_mannheim/korap/security/ac/ResourceHandler.java
index 840461b..7d34efa 100644
--- a/src/main/java/de/ids_mannheim/korap/security/ac/ResourceHandler.java
+++ b/src/main/java/de/ids_mannheim/korap/security/ac/ResourceHandler.java
@@ -27,132 +27,154 @@
 
     private static Logger jlog = LoggerFactory.getLogger(ResourceHandler.class);
 
-    public ResourceHandler() {
-    }
 
-    public <T extends KustvaktResource> T getCache(Object id, Class<T> clazz) {
-        Element e = CacheManager.getInstance().getCache("resources")
-                .get(id);
+    public ResourceHandler () {}
+
+
+    public <T extends KustvaktResource> T getCache (Object id, Class<T> clazz) {
+        Element e = CacheManager.getInstance().getCache("resources").get(id);
         if (e != null)
             return (T) e.getObjectValue();
         else
             return null;
     }
 
-    public <R extends KustvaktResource> void cache(R resource) {
+
+    public <R extends KustvaktResource> void cache (R resource) {
         CacheManager.getInstance().getCache("resources")
                 .put(new Element(resource.getPersistentID(), resource));
     }
 
+
     /**
      * @param id
      * @param user
      * @return
-     * @throws KustvaktException         if there is no handler registered, resource might still be valid,
-     *                                only Notauthorized exception will cause a parsing error here
+     * @throws KustvaktException
+     *             if there is no handler registered, resource might
+     *             still be valid,
+     *             only Notauthorized exception will cause a parsing
+     *             error here
      * @throws NotAuthorizedException
      */
-    public <T extends KustvaktResource> T findbyIntId(Integer id, User user)
+    public <T extends KustvaktResource> T findbyIntId (Integer id, User user)
             throws KustvaktException, NotAuthorizedException {
         SecurityManager<T> p;
         try {
             p = SecurityManager.findbyId(id, user);
-        } catch (EmptyResultException e) {
-            throw new NotAuthorizedException(StatusCodes.EMPTY_RESULTS, String.valueOf(id));
+        }
+        catch (EmptyResultException e) {
+            throw new NotAuthorizedException(StatusCodes.EMPTY_RESULTS,
+                    String.valueOf(id));
         }
         return p.getResource();
     }
 
-    public <T extends KustvaktResource> T findbyStrId(String persistent_id,
-            User user, String type)
-            throws KustvaktException, NotAuthorizedException {
+
+    public <T extends KustvaktResource> T findbyStrId (String persistent_id,
+            User user, String type) throws KustvaktException,
+            NotAuthorizedException {
         return (T) findbyStrId(persistent_id, user,
                 ResourceFactory.getResourceClass(type));
     }
 
-    public <T extends KustvaktResource> T findbyStrId(String persistent_id,
-            User user, Class<T> type)
-            throws KustvaktException, NotAuthorizedException {
+
+    public <T extends KustvaktResource> T findbyStrId (String persistent_id,
+            User user, Class<T> type) throws KustvaktException,
+            NotAuthorizedException {
         //T cache = (T) getCache(persistent_id, type);
         //if (cache != null)
         //    return cache;
         //else {
-            SecurityManager<T> p;
-            try {
-                p = SecurityManager.findbyId(persistent_id, user, type);
-            } catch (EmptyResultException e) {
-                throw new NotAuthorizedException(StatusCodes.EMPTY_RESULTS, persistent_id);
-            }
-            return p.getResource();
+        SecurityManager<T> p;
+        try {
+            p = SecurityManager.findbyId(persistent_id, user, type);
+        }
+        catch (EmptyResultException e) {
+            throw new NotAuthorizedException(StatusCodes.EMPTY_RESULTS,
+                    persistent_id);
+        }
+        return p.getResource();
         //}
     }
 
-    public <T extends KustvaktResource> Collection<T> findbyPath(String path, Class type, User user)
-            throws KustvaktException, NotAuthorizedException {
+
+    public <T extends KustvaktResource> Collection<T> findbyPath (String path,
+            Class type, User user) throws KustvaktException,
+            NotAuthorizedException {
         return ResourceFinder.search(path, false, user, type);
     }
 
 
-    public <T extends KustvaktResource> void updateResources(User user, T... resources)
-            throws KustvaktException, NotAuthorizedException {
+    public <T extends KustvaktResource> void updateResources (User user,
+            T ... resources) throws KustvaktException, NotAuthorizedException {
         // fixme: what if update fails? then i have a root policy lingering for a resource that is not available?!
         // fixme: transaction management
 
         for (T resource : resources) {
             SecurityManager policies;
             try {
-                policies = SecurityManager.init(resource.getPersistentID(), user, Permissions.Permission.WRITE);
-            } catch (EmptyResultException e) {
+                policies = SecurityManager.init(resource.getPersistentID(),
+                        user, Permissions.Permission.WRITE);
+            }
+            catch (EmptyResultException e) {
                 return;
             }
             policies.updateResource(resource);
         }
     }
 
-    public <T extends KustvaktResource> void storeResources(User user, T... resources)
-            throws KustvaktException, NotAuthorizedException {
+
+    public <T extends KustvaktResource> void storeResources (User user,
+            T ... resources) throws KustvaktException, NotAuthorizedException {
         for (T resource : resources)
             SecurityManager.register(resource, user);
     }
 
+
     @Deprecated
-    public <T extends KustvaktResource> void deleteResources(User user, String... ids)
-            throws KustvaktException, NotAuthorizedException {
+    public <T extends KustvaktResource> void deleteResources (User user,
+            String ... ids) throws KustvaktException, NotAuthorizedException {
         for (String id : ids) {
             SecurityManager policies;
             try {
                 policies = SecurityManager.init(id, user,
                         Permissions.Permission.DELETE);
-            } catch (EmptyResultException e) {
+            }
+            catch (EmptyResultException e) {
                 return;
             }
             policies.deleteResource();
         }
     }
 
-    public <T extends KustvaktResource> void deleteResources(User user, T... resources)
-            throws KustvaktException, NotAuthorizedException {
+
+    public <T extends KustvaktResource> void deleteResources (User user,
+            T ... resources) throws KustvaktException, NotAuthorizedException {
         for (T r : resources) {
             SecurityManager manager;
             try {
-                manager = SecurityManager.findbyId(r.getPersistentID(), user, r.getClass(),
-                        Permissions.Permission.DELETE);
-            } catch (EmptyResultException e) {
+                manager = SecurityManager.findbyId(r.getPersistentID(), user,
+                        r.getClass(), Permissions.Permission.DELETE);
+            }
+            catch (EmptyResultException e) {
                 return;
             }
             manager.deleteResource();
         }
     }
 
+
     @Deprecated
-    public <T extends KustvaktResource> void deleteResources(User user, Integer... ids)
-            throws KustvaktException, NotAuthorizedException {
+    public <T extends KustvaktResource> void deleteResources (User user,
+            Integer ... ids) throws KustvaktException, NotAuthorizedException {
         for (Integer id : ids) {
             SecurityManager policies;
             try {
                 policies = SecurityManager.findbyId(id, user,
                         Permissions.Permission.DELETE);
-            } catch (EmptyResultException e) {
+            }
+            catch (EmptyResultException e) {
                 return;
             }
             policies.deleteResource();
diff --git a/src/main/java/de/ids_mannheim/korap/security/ac/SecurityManager.java b/src/main/java/de/ids_mannheim/korap/security/ac/SecurityManager.java
index b66fe62..0bf367c 100644
--- a/src/main/java/de/ids_mannheim/korap/security/ac/SecurityManager.java
+++ b/src/main/java/de/ids_mannheim/korap/security/ac/SecurityManager.java
@@ -23,9 +23,11 @@
 import java.util.*;
 
 /**
- * should only be used if a resource is uniquely identifiable by either three methods: id, name or path!
- * In any other case, use categorypolicies to retrieve policies of a certain type
- *
+ * should only be used if a resource is uniquely identifiable by
+ * either three methods: id, name or path!
+ * In any other case, use categorypolicies to retrieve policies of a
+ * certain type
+ * 
  * @author hanl
  * @date 15/01/2014
  */
@@ -49,8 +51,9 @@
     private PolicyEvaluator evaluator;
     private T resource;
 
+
     //todo: use simple user id if possible! --> or if not check that user has valid integer id (or use username as fallback instead)
-    private SecurityManager(User user) {
+    private SecurityManager (User user) {
         this.policies = new List[1];
         this.policies[0] = new ArrayList<>();
         this.silent = true;
@@ -58,7 +61,8 @@
         overrideProviders(null);
     }
 
-    public static void overrideProviders(ContextHolder beans) {
+
+    public static void overrideProviders (ContextHolder beans) {
         if (beans == null)
             beans = BeansFactory.getKustvaktContext();
         if (policydao == null | crypto == null) {
@@ -74,8 +78,9 @@
             throw new RuntimeException("providers not set!");
     }
 
+
     @Deprecated
-    public static final void setProviders(PolicyHandlerIface policyHandler,
+    public static final void setProviders (PolicyHandlerIface policyHandler,
             EncryptionIface crypto, Collection<ResourceOperationIface> ifaces) {
         SecurityManager.policydao = policyHandler;
         SecurityManager.crypto = crypto;
@@ -85,10 +90,13 @@
         //            handlers.put(iface.getType(), iface);
     }
 
+
     /**
-     * only allowed if the resource is uniquely identifiable by the name, if not, use path or id!
-     * Shortcut so resource values do not need to be retrieved afterwards!
-     *
+     * only allowed if the resource is uniquely identifiable by the
+     * name, if not, use path or id!
+     * Shortcut so resource values do not need to be retrieved
+     * afterwards!
+     * 
      * @param name
      * @param user
      * @param type
@@ -97,74 +105,83 @@
      * @throws KustvaktException
      */
     //todo: implement a fall back that throws an exception when the user NULL, but the resource has restrictions!
-    public static SecurityManager findbyId(String id, User user, Class type,
-            Permissions.Permission... perms) throws KustvaktException {
+    public static SecurityManager findbyId (String id, User user, Class type,
+            Permissions.Permission ... perms) throws KustvaktException {
         SecurityManager p = new SecurityManager(user);
         p.findPolicies(id, false, perms);
         p.resource = p.findResource(type);
         return p;
     }
 
-    public static SecurityManager findbyId(String id, User user,
-            Permissions.Permission... perms) throws KustvaktException {
+
+    public static SecurityManager findbyId (String id, User user,
+            Permissions.Permission ... perms) throws KustvaktException {
         SecurityManager p = new SecurityManager(user);
         p.findPolicies(id, false, perms);
         p.resource = p.findResource(null);
         return p;
     }
 
-    public static SecurityManager findbyId(Integer id, User user,
-            Permissions.Permission... perms) throws KustvaktException {
+
+    public static SecurityManager findbyId (Integer id, User user,
+            Permissions.Permission ... perms) throws KustvaktException {
         SecurityManager p = new SecurityManager(user);
         p.findPolicies(id, false, perms);
         p.resource = p.findResource(null);
         return p;
     }
 
-    public static SecurityManager findbyPath(String path, User user,
-            Permissions.Permission... perms)
-            throws NotAuthorizedException, EmptyResultException {
+
+    public static SecurityManager findbyPath (String path, User user,
+            Permissions.Permission ... perms) throws NotAuthorizedException,
+            EmptyResultException {
         SecurityManager manager = new SecurityManager(user);
         manager.findPolicies(path, true, perms);
         //fixme: need a match count. if match not unique, exception. also, does parent -child relation match hold up here?
         return manager;
     }
 
-    public static SecurityManager init(String id, User user,
-            Permissions.Permission... perms)
-            throws NotAuthorizedException, EmptyResultException {
+
+    public static SecurityManager init (String id, User user,
+            Permissions.Permission ... perms) throws NotAuthorizedException,
+            EmptyResultException {
         SecurityManager p = new SecurityManager(user);
         p.findPolicies(id, false, perms);
         return p;
     }
 
+
     /**
      * enables retrieval for read access only!
-     *
+     * 
      * @return
      * @throws NotAuthorizedException
      */
-    public final T getResource() throws NotAuthorizedException {
+    public final T getResource () throws NotAuthorizedException {
         if (evaluator.isAllowed(Permissions.Permission.READ)) {
             return this.resource;
-        }else {
-            jlog.error("Reading the resource '{}' is not allowed for user '{}'",
+        }
+        else {
+            jlog.error(
+                    "Reading the resource '{}' is not allowed for user '{}'",
                     this.resource.getPersistentID(), this.user.getUsername());
             throw new NotAuthorizedException(StatusCodes.PERMISSION_DENIED,
                     evaluator.getResourceID());
         }
     }
 
-    public void updateResource(T resource)
-            throws NotAuthorizedException, KustvaktException {
+
+    public void updateResource (T resource) throws NotAuthorizedException,
+            KustvaktException {
         if (evaluator.isAllowed(Permissions.Permission.WRITE)) {
             ResourceOperationIface iface = handlers.get(resource.getClass());
             if (iface != null)
                 iface.updateResource(resource, this.user);
             else
-                handlers.get(KustvaktResource.class)
-                        .updateResource(resource, this.user);
-        }else {
+                handlers.get(KustvaktResource.class).updateResource(resource,
+                        this.user);
+        }
+        else {
             jlog.error(
                     "Updating the resource '{}' is not allowed for user '{}'",
                     this.resource.getPersistentID(), this.user.getUsername());
@@ -174,47 +191,48 @@
 
     }
 
+
     /**
      * @throws NotAuthorizedException
      * @throws KustvaktException
      */
     // todo: delete only works with find, not with init constructor!
-    public void deleteResource()
-            throws NotAuthorizedException, KustvaktException {
+    public void deleteResource () throws NotAuthorizedException,
+            KustvaktException {
         if (evaluator.isAllowed(Permissions.Permission.DELETE)) {
-            ResourceOperationIface iface = handlers
-                    .get(this.resource.getClass());
+            ResourceOperationIface iface = handlers.get(this.resource
+                    .getClass());
             if (iface != null)
                 iface.deleteResource(this.evaluator.getResourceID(), this.user);
             else
-                handlers.get(KustvaktResource.class)
-                        .deleteResource(this.evaluator.getResourceID(),
-                                this.user);
-            this.policydao
-                    .deleteResourcePolicies(this.evaluator.getResourceID(),
-                            this.user);
-        }else
+                handlers.get(KustvaktResource.class).deleteResource(
+                        this.evaluator.getResourceID(), this.user);
+            this.policydao.deleteResourcePolicies(
+                    this.evaluator.getResourceID(), this.user);
+        }
+        else
             throw new NotAuthorizedException(StatusCodes.PERMISSION_DENIED,
                     this.evaluator.getResourceID());
     }
 
+
     // todo: type should be deprecated and return type of policies should be containers!
-    private boolean findPolicies(Object id, boolean path,
-            Permissions.Permission... perms) throws EmptyResultException {
+    private boolean findPolicies (Object id, boolean path,
+            Permissions.Permission ... perms) throws EmptyResultException {
         PermissionsBuffer b = new PermissionsBuffer();
         if (perms.length == 0)
             b.addPermission(Permissions.Permission.READ.toByte());
         else
             b.addPermissions(perms);
         if (id instanceof String && !path)
-            this.policies = policydao
-                    .getPolicies((String) id, this.user, b.getPbyte());
+            this.policies = policydao.getPolicies((String) id, this.user,
+                    b.getPbyte());
         if (id instanceof String && path)
-            this.policies = policydao
-                    .findPolicies((String) id, this.user, b.getPbyte());
+            this.policies = policydao.findPolicies((String) id, this.user,
+                    b.getPbyte());
         if (id instanceof Integer)
-            this.policies = policydao
-                    .getPolicies((Integer) id, this.user, b.getPbyte());
+            this.policies = policydao.getPolicies((Integer) id, this.user,
+                    b.getPbyte());
         this.evaluator = new PolicyEvaluator(this.user, this.policies);
 
         if (this.policies == null) {
@@ -225,9 +243,10 @@
         return true;
     }
 
+
     // todo:  security log shows id 'null' --> better way?
-    private T findResource(Class type)
-            throws NotAuthorizedException, KustvaktException {
+    private T findResource (Class type) throws NotAuthorizedException,
+            KustvaktException {
         if (!evaluator.isAllowed()) {
             jlog.error("Permission denied for resource id '{}' for user '{}'",
                     this.evaluator.getResourceID(), user.getId());
@@ -238,8 +257,8 @@
         ResourceOperationIface iface = handlers.get(type);
         if (iface == null)
             iface = handlers.get(KustvaktResource.class);
-        T resource = (T) iface
-                .findbyId(this.evaluator.getResourceID(), this.user);
+        T resource = (T) iface.findbyId(this.evaluator.getResourceID(),
+                this.user);
         // fixme: this
         // fixme: deprecated!
         resource.setManaged(this.evaluator.isManaged());
@@ -247,13 +266,15 @@
         return resource;
     }
 
-    private boolean checkResource(String persistentID, User user)
+
+    private boolean checkResource (String persistentID, User user)
             throws KustvaktException {
         ResourceOperationIface iface = handlers.get(KustvaktResource.class);
         return iface.findbyId(persistentID, user) != null;
     }
 
-    public static SecurityManager register(KustvaktResource resource, User user)
+
+    public static SecurityManager register (KustvaktResource resource, User user)
             throws KustvaktException, NotAuthorizedException {
         SecurityManager p = new SecurityManager(user);
         if (!User.UserFactory.isDemo(user.getUsername())) {
@@ -264,7 +285,8 @@
                     // --> in order not to have a resource owner that is denied access due to missing parent relation dependency
                     SecurityManager.findbyId(resource.getParentID(), user,
                             Permissions.Permission.ALL);
-                }catch (EmptyResultException e) {
+                }
+                catch (EmptyResultException e) {
                     jlog.error(
                             "No policies found for parent '{}' for user '{}'",
                             resource.getParentID(), user.getId());
@@ -273,8 +295,8 @@
             }
             boolean newid = false;
             // create persistent identifier for the resource
-            if (resource.getPersistentID() == null || resource.getPersistentID()
-                    .isEmpty()) {
+            if (resource.getPersistentID() == null
+                    || resource.getPersistentID().isEmpty()) {
                 ResourceFactory.createID(resource);
                 newid = true;
             }
@@ -286,8 +308,8 @@
                         + resource.getPersistentID() + "@" + resource.getId()
                         + "', name: " + resource.getName());
                 // storing resource is called twice. first when this is register and later in idsbootstrap to create cstorage entry. how to unify this?
-                ResourceOperationIface iface = p.handlers
-                        .get(resource.getClass());
+                ResourceOperationIface iface = p.handlers.get(resource
+                        .getClass());
                 if (iface != null)
                     resource.setId(iface.storeResource(resource, user));
                 else
@@ -302,36 +324,39 @@
                         Permissions.Permission.CREATE_POLICY,
                         Permissions.Permission.READ_POLICY,
                         Permissions.Permission.MODIFY_POLICY);
-            }catch (EmptyResultException e) {
+            }
+            catch (EmptyResultException e) {
                 jlog.error(
                         "No policies found for '{}' for user '{}'. Resource could not be registered!",
                         resource.getPersistentID(), user.getId());
                 throw new KustvaktException(user.getId(),
                         StatusCodes.POLICY_CREATE_ERROR,
-                        "Resource could not be registered",
-                        resource.toString());
+                        "Resource could not be registered", resource.toString());
             }
         }
         return p;
     }
 
+
     @Deprecated
-    public List<SecurityPolicy> getPoliciesList(int i) {
+    public List<SecurityPolicy> getPoliciesList (int i) {
         if (i < this.policies.length)
             return this.policies[i];
         return Collections.emptyList();
     }
 
+
     // fixme: make protected
-    public SecurityPolicy getPolicy(Integer id) {
+    public SecurityPolicy getPolicy (Integer id) {
         for (SecurityPolicy p : this.policies[0])
             if (p.getID() == id)
                 return p;
         return null;
     }
 
+
     // fixme: make protected
-    public PolicyCondition getExtensional(Permissions.Permission... pps) {
+    public PolicyCondition getExtensional (Permissions.Permission ... pps) {
         for (SecurityPolicy p : this.policies[0]) {
             if (p.equalsPermission(pps)) {
                 for (PolicyCondition c : p.getConditions()) {
@@ -343,12 +368,14 @@
         return null;
     }
 
-    private boolean matchTarget(String target) {
-        return this.resource.getPersistentID() != null && (
-                this.resource.getPersistentID() == target);
+
+    private boolean matchTarget (String target) {
+        return this.resource.getPersistentID() != null
+                && (this.resource.getPersistentID() == target);
     }
 
-    public void addPolicy(SecurityPolicy policy, Parameter... params)
+
+    public void addPolicy (SecurityPolicy policy, Parameter ... params)
             throws KustvaktException, NotAuthorizedException {
         if (policy.getConditions().isEmpty()) {
             jlog.error("No conditions set for '{}' for user '{}'",
@@ -371,7 +398,8 @@
 
         if (evaluator.isAllowed(Permissions.Permission.CREATE_POLICY)) {
             policydao.createPolicy(policy, this.user);
-        }else if (silent) {
+        }
+        else if (silent) {
             jlog.error(
                     "Permission Denied (CREATE_POLICY) on '{}' for user '{}'",
                     this.evaluator.getResourceID(), this.user.getId());
@@ -388,18 +416,21 @@
         this.policies[0].add(policy);
         try {
             Thread.sleep(5);
-        }catch (InterruptedException e) {
+        }
+        catch (InterruptedException e) {
             e.printStackTrace();
         }
     }
 
-    public void deletePolicies()
-            throws NotAuthorizedException, KustvaktException {
+
+    public void deletePolicies () throws NotAuthorizedException,
+            KustvaktException {
         for (SecurityPolicy p : new ArrayList<>(this.policies[0]))
             deletePolicy(p);
     }
 
-    public void retainPolicies(List<SecurityPolicy> policies)
+
+    public void retainPolicies (List<SecurityPolicy> policies)
             throws NotAuthorizedException, KustvaktException {
         for (SecurityPolicy p : new ArrayList<>(this.policies[0])) {
             if (!policies.contains(p))
@@ -407,9 +438,10 @@
         }
     }
 
+
     // todo:
-    public void deletePolicy(SecurityPolicy policy)
-            throws KustvaktException, NotAuthorizedException {
+    public void deletePolicy (SecurityPolicy policy) throws KustvaktException,
+            NotAuthorizedException {
         // todo: get rid of this: use sql to match policy id and target according to evaluator!
         if (!matchTarget(policy.getTarget()))
             // adjust message
@@ -423,10 +455,11 @@
                     "no policy desicion possible",
                     this.evaluator.getResourceID());
         }
-        if (contains(policy) && (evaluator
-                .isAllowed(Permissions.Permission.DELETE_POLICY))) {
+        if (contains(policy)
+                && (evaluator.isAllowed(Permissions.Permission.DELETE_POLICY))) {
             policydao.deletePolicy(policy, this.user);
-        }else if (silent) {
+        }
+        else if (silent) {
             jlog.error("Permission Denied (DELETE_POLICY) on '{}' for '{}'",
                     this.evaluator.getResourceID(), this.user.getId());
             throw new NotAuthorizedException(StatusCodes.PERMISSION_DENIED,
@@ -438,8 +471,9 @@
         this.policies[0].remove(policy);
     }
 
-    public void modifyPolicy(SecurityPolicy policy)
-            throws KustvaktException, NotAuthorizedException {
+
+    public void modifyPolicy (SecurityPolicy policy) throws KustvaktException,
+            NotAuthorizedException {
         if (!matchTarget(policy.getTarget()))
             throw new NotAuthorizedException(StatusCodes.ILLEGAL_ARGUMENT);
 
@@ -452,43 +486,48 @@
                     this.evaluator.getResourceID());
         }
 
-        if (contains(policy) && (evaluator
-                .isAllowed(Permissions.Permission.MODIFY_POLICY))) {
+        if (contains(policy)
+                && (evaluator.isAllowed(Permissions.Permission.MODIFY_POLICY))) {
             policydao.updatePolicy(policy, this.user);
-        }else if (silent) {
+        }
+        else if (silent) {
             jlog.error("Permission Denied (DELETE_POLICY) on '{}' for '{}'",
                     this.evaluator.getResourceID(), this.user.getId());
             throw new NotAuthorizedException(StatusCodes.PERMISSION_DENIED,
                     this.evaluator.getResourceID());
         }
-        this.policies = policydao
-                .getPolicies((int) this.resource.getId(), this.user, null);
+        this.policies = policydao.getPolicies((int) this.resource.getId(),
+                this.user, null);
     }
 
+
     /**
      * standard function for READ access on the resource
-     *
+     * 
      * @return boolean is action allowed for resource
      */
-    public boolean isAllowed() {
+    public boolean isAllowed () {
         return evaluator.isAllowed();
     }
 
-    public boolean isAllowed(Permissions.Permission... perm) {
+
+    public boolean isAllowed (Permissions.Permission ... perm) {
         return evaluator.isAllowed();
     }
 
+
     /**
      * checks if that exact object already exists (compares name,
      * conditional parameter)
-     *
+     * 
      * @param policy
      * @return
      */
-    public boolean contains(SecurityPolicy policy) {
+    public boolean contains (SecurityPolicy policy) {
         try {
             return policydao.checkPolicy(policy, this.user) == 1;
-        }catch (KustvaktException e) {
+        }
+        catch (KustvaktException e) {
             return false;
         }
     }
diff --git a/src/main/java/de/ids_mannheim/korap/security/ac/SecurityRowMappers.java b/src/main/java/de/ids_mannheim/korap/security/ac/SecurityRowMappers.java
index 0ab9cbd..5c36e5c 100644
--- a/src/main/java/de/ids_mannheim/korap/security/ac/SecurityRowMappers.java
+++ b/src/main/java/de/ids_mannheim/korap/security/ac/SecurityRowMappers.java
@@ -24,7 +24,7 @@
     public static class PolicyRowMapper implements RowMapper<SecurityPolicy> {
 
         @Override
-        public SecurityPolicy mapRow(ResultSet rs, int rowNum)
+        public SecurityPolicy mapRow (ResultSet rs, int rowNum)
                 throws SQLException {
             String perms = rs.getString("perm");
             SecurityPolicy p = new SecurityPolicy();
@@ -51,33 +51,37 @@
 
         private Map<String, Object> flags;
 
-        public FlagContext() {
+
+        public FlagContext () {
             this.flags = new HashMap<>();
         }
 
-        public FlagContext addFlag(String key, Object value) {
+
+        public FlagContext addFlag (String key, Object value) {
             this.flags.put(key, value);
             return this;
         }
 
-        public FlagContext removeFlag(String key) {
+
+        public FlagContext removeFlag (String key) {
             this.flags.remove(key);
             return this;
         }
 
-        public FlagContext clearFlags() {
+
+        public FlagContext clearFlags () {
             this.flags.clear();
             return this;
         }
     }
 
+
     @SuppressWarnings(value = "all")
-    public static List<SecurityPolicy>[] mapResourcePolicies(ResultSet rs)
+    public static List<SecurityPolicy>[] mapResourcePolicies (ResultSet rs)
             throws SQLException {
         List<SecurityPolicy>[] policyArray = null;
         List<Integer>[] idx = null;
-        loop:
-        while (rs.next()) {
+        loop: while (rs.next()) {
             // user has no permission here, thus skip
             if (rs.getInt("allowed") == 0)
                 continue loop;
@@ -102,13 +106,13 @@
             if (index == -1) {
                 if (pid == -1 && grouping.equalsIgnoreCase("self")) {
                     policy = new SecurityPolicy.OwnerPolicy(
-                            rs.getString("persistent_id"),
-                            rs.getInt("creator"));
+                            rs.getString("persistent_id"), rs.getInt("creator"));
                     policyArray[depth].add(0, policy);
                     idx[depth].add(0, pid);
-                }else {
-                    policy = new SecurityRowMappers.PolicyRowMapper()
-                            .mapRow(rs, 0);
+                }
+                else {
+                    policy = new SecurityRowMappers.PolicyRowMapper().mapRow(
+                            rs, 0);
                     policyArray[depth].add(policy);
                     idx[depth].add(pid);
 
@@ -118,7 +122,8 @@
                     //                        idx[depth].add(pid);
                     //                    }
                 }
-            }else
+            }
+            else
                 policy = policyArray[depth].get(index);
 
             PolicyCondition c = new PolicyCondition(rs.getString("group_id"));
@@ -128,7 +133,8 @@
         return policyArray;
     }
 
-    public static List<SecurityPolicy> mapConditionPolicies(ResultSet rs)
+
+    public static List<SecurityPolicy> mapConditionPolicies (ResultSet rs)
             throws SQLException {
         Map<Integer, SecurityPolicy> policyMap = new HashMap<>();
         while (rs.next()) {
@@ -149,8 +155,9 @@
         return new ArrayList<>(policyMap.values());
     }
 
+
     @Deprecated
-    public static List<SecurityPolicy>[] map(ResultSet rs) throws SQLException {
+    public static List<SecurityPolicy>[] map (ResultSet rs) throws SQLException {
         Map<Integer, SecurityPolicy>[] policyArray = null;
         while (rs.next()) {
             // user has no permission here!
@@ -181,7 +188,8 @@
         if (policyArray == null) {
             results = new List[1];
             results[0] = new ArrayList<>();
-        }else {
+        }
+        else {
             results = new List[policyArray.length];
             for (int idx = 0; idx < policyArray.length; idx++) {
                 if (policyArray[idx] != null)
@@ -193,17 +201,18 @@
         return results;
     }
 
-    public static class HierarchicalResultExtractor
-            implements ResultSetExtractor<List<KustvaktResource.Container>> {
+    public static class HierarchicalResultExtractor implements
+            ResultSetExtractor<List<KustvaktResource.Container>> {
 
         private boolean _withpid;
 
+
         //        public HierarchicalResultExtractor(boolean wpid) {
         //            this._withpid = wpid;
         //        }
 
         // todo: in order for this to work, all parent flags need to be matched in sql!
-        public List<KustvaktResource.Container> extractData(ResultSet rs)
+        public List<KustvaktResource.Container> extractData (ResultSet rs)
                 throws SQLException, DataAccessException {
             // contains the container with the highest available name_path to retrieve partial matches!
             PrefixTreeMap<KustvaktResource.Container[]> containerMap = new PrefixTreeMap<>();
@@ -219,30 +228,28 @@
                     String persistentId = rs.getString("persistent_id");
                     int depth = rs.getInt("depth");
                     String namePath = rs.getString("name_path");
-                    policy = new SecurityRowMappers.PolicyRowMapper()
-                            .mapRow(rs, 0);
+                    policy = new SecurityRowMappers.PolicyRowMapper().mapRow(
+                            rs, 0);
 
                     //todo: put active status here!
                     trace.put(pid, policy);
 
                     //fixme: since leaves are mentioned first, maybe retrieve
                     SortedMap<String, KustvaktResource.Container[]> submatch;
-                    if ((submatch = containerMap.getPrefixSubMap(namePath))
-                            == null) {
+                    if ((submatch = containerMap.getPrefixSubMap(namePath)) == null) {
                         //create container for last child node
                         cursor = new KustvaktResource.Container[depth + 1];
                         cursor[depth] = new KustvaktResource.Container(
-                                persistentId,
-                                ResourceFactory.getResource(rs.getInt("type"))
-                                        .getClass());
+                                persistentId, ResourceFactory.getResource(
+                                        rs.getInt("type")).getClass());
                         containerMap.put(namePath, cursor);
-                    }else {
+                    }
+                    else {
                         KustvaktResource.Container[] values = submatch
                                 .get(submatch.firstKey());
                         values[depth] = new KustvaktResource.Container(
-                                persistentId,
-                                ResourceFactory.getResource(rs.getInt("type"))
-                                        .getClass());
+                                persistentId, ResourceFactory.getResource(
+                                        rs.getInt("type")).getClass());
                     }
                 }
             }
diff --git a/src/main/java/de/ids_mannheim/korap/security/auth/APIAuthentication.java b/src/main/java/de/ids_mannheim/korap/security/auth/APIAuthentication.java
index 297a36e..97b0e1b 100644
--- a/src/main/java/de/ids_mannheim/korap/security/auth/APIAuthentication.java
+++ b/src/main/java/de/ids_mannheim/korap/security/auth/APIAuthentication.java
@@ -10,6 +10,7 @@
 import de.ids_mannheim.korap.user.Attributes;
 import de.ids_mannheim.korap.user.TokenContext;
 import de.ids_mannheim.korap.user.User;
+import de.ids_mannheim.korap.utils.NamingUtils;
 import de.ids_mannheim.korap.utils.StringUtils;
 import net.sf.ehcache.Cache;
 import net.sf.ehcache.CacheManager;
@@ -24,48 +25,55 @@
 public class APIAuthentication implements AuthenticationIface {
 
     private JWTSigner signedToken;
-    private Cache invalided = CacheManager.getInstance()
-            .getCache("id_tokens_inv");
+    private Cache invalided = CacheManager.getInstance().getCache(
+            "id_tokens_inv");
     private Cache id_tokens = CacheManager.getInstance().getCache("id_tokens");
 
-    public APIAuthentication(KustvaktConfiguration bconfig) {
+
+    public APIAuthentication (KustvaktConfiguration bconfig) {
         KustvaktConfiguration config = bconfig;
         this.signedToken = new JWTSigner(config.getSharedSecret(),
                 config.getIssuer(), config.getTokenTTL());
     }
 
+
     //    @Cacheable(value = "id_tokens", key = "#authToken")
     // todo: test
     @Override
-    public TokenContext getUserStatus(String authToken)
+    public TokenContext getUserStatus (String authToken)
             throws KustvaktException {
         TokenContext context;
         Element e = id_tokens.get(authToken);
         Element ein = invalided.get(authToken);
         if (e == null && ein == null) {
             try {
-                authToken = StringUtils.stripTokenType(authToken);
+                authToken = NamingUtils.stripTokenType(authToken);
                 context = signedToken.getTokenContext(authToken);
                 context.setTokenType(Attributes.API_AUTHENTICATION);
-            }catch (JOSEException | ParseException ex) {
+            }
+            catch (JOSEException | ParseException ex) {
                 throw new KustvaktException(StatusCodes.ILLEGAL_ARGUMENT);
             }
-        }else if (ein == null) {
+        }
+        else if (ein == null) {
             context = (TokenContext) e.getObjectValue();
-        }else
+        }
+        else
             throw new KustvaktException(StatusCodes.EXPIRED);
         return context;
     }
 
+
     @Override
-    public TokenContext createUserSession(User user, Map<String, Object> attr)
+    public TokenContext createUserSession (User user, Map<String, Object> attr)
             throws KustvaktException {
         TokenContext c = new TokenContext();
         c.setUsername(user.getUsername());
         SignedJWT jwt = signedToken.createJWT(user, attr);
         try {
             c.setExpirationTime(jwt.getJWTClaimsSet().getExpirationTimeClaim());
-        }catch (ParseException e) {
+        }
+        catch (ParseException e) {
             throw new KustvaktException(StatusCodes.ILLEGAL_ARGUMENT);
         }
         c.setTokenType(Attributes.API_AUTHENTICATION);
@@ -75,22 +83,25 @@
         return c;
     }
 
+
     // todo: cache and set expiration to token expiration. if token in that cache, it is not to be used anymore!
     // fixme: dont use annotations but function calls
     //    @CacheEvict(value = "id_tokens", key = "#token")
     @Override
-    public void removeUserSession(String token) throws KustvaktException {
+    public void removeUserSession (String token) throws KustvaktException {
         // invalidate token!
         invalided.put(new Element(token, null));
     }
 
+
     @Override
-    public TokenContext refresh(TokenContext context) throws KustvaktException {
+    public TokenContext refresh (TokenContext context) throws KustvaktException {
         return null;
     }
 
+
     @Override
-    public String getIdentifier() {
+    public String getIdentifier () {
         return Attributes.API_AUTHENTICATION;
     }
 
diff --git a/src/main/java/de/ids_mannheim/korap/security/auth/BasicHttpAuth.java b/src/main/java/de/ids_mannheim/korap/security/auth/BasicHttpAuth.java
index c93d6ec..16e0298 100644
--- a/src/main/java/de/ids_mannheim/korap/security/auth/BasicHttpAuth.java
+++ b/src/main/java/de/ids_mannheim/korap/security/auth/BasicHttpAuth.java
@@ -11,6 +11,7 @@
 import de.ids_mannheim.korap.user.KorAPUser;
 import de.ids_mannheim.korap.user.TokenContext;
 import de.ids_mannheim.korap.user.User;
+import de.ids_mannheim.korap.utils.NamingUtils;
 import de.ids_mannheim.korap.utils.StringUtils;
 import org.apache.commons.codec.binary.Base64;
 import org.apache.oltu.oauth2.common.utils.OAuthUtils;
@@ -23,7 +24,7 @@
  */
 public class BasicHttpAuth implements AuthenticationIface {
 
-    public static String[] decode(String token) {
+    public static String[] decode (String token) {
         return OAuthUtils.decodeClientAuthenticationHeader(token);
 
         //        String t = StringUtils.getTokenType(token);
@@ -38,16 +39,19 @@
         //        return null;
     }
 
-    public static String encode(String user, String pass) {
+
+    public static String encode (String user, String pass) {
         String s = user + ":" + pass;
-        return Attributes.BASIC_AUTHENTICATION + " " + new String(
-                Base64.encodeBase64(s.getBytes()));
+        return Attributes.BASIC_AUTHENTICATION + " "
+                + new String(Base64.encodeBase64(s.getBytes()));
     }
 
+
     @Override
-    public TokenContext getUserStatus(String authToken)
+    public TokenContext getUserStatus (String authToken)
             throws KustvaktException {
-        EncryptionIface crypto = BeansFactory.getKustvaktContext().getEncryption();
+        EncryptionIface crypto = BeansFactory.getKustvaktContext()
+                .getEncryption();
         EntityHandlerIface dao = BeansFactory.getKustvaktContext()
                 .getUserDBHandler();
         String[] values = decode(authToken);
@@ -55,8 +59,8 @@
             TokenContext c = new TokenContext();
             User user = dao.getAccount(values[0]);
             if (user instanceof KorAPUser) {
-                boolean check = crypto
-                        .checkHash(values[1], ((KorAPUser) user).getPassword());
+                boolean check = crypto.checkHash(values[1],
+                        ((KorAPUser) user).getPassword());
 
                 if (!check)
                     return null;
@@ -65,7 +69,7 @@
             c.setTokenType(Attributes.BASIC_AUTHENTICATION);
             // todo: for production mode, set true
             c.setSecureRequired(false);
-            c.setToken(StringUtils.stripTokenType(authToken));
+            c.setToken(NamingUtils.stripTokenType(authToken));
             //            fixme: you can make queries, but user sensitive data is off limits?!
             c.addContextParameter(Attributes.SCOPES,
                     Scopes.Scope.search.toString());
@@ -74,25 +78,29 @@
         return null;
     }
 
+
     // not supported!
     @Override
-    public TokenContext createUserSession(User user, Map<String, Object> attr)
+    public TokenContext createUserSession (User user, Map<String, Object> attr)
             throws KustvaktException {
         return null;
     }
 
+
     @Override
-    public void removeUserSession(String token) throws KustvaktException {
+    public void removeUserSession (String token) throws KustvaktException {
         throw new KustvaktException(StatusCodes.NOT_SUPPORTED);
     }
 
+
     @Override
-    public TokenContext refresh(TokenContext context) throws KustvaktException {
+    public TokenContext refresh (TokenContext context) throws KustvaktException {
         return null;
     }
 
+
     @Override
-    public String getIdentifier() {
+    public String getIdentifier () {
         return Attributes.BASIC_AUTHENTICATION;
     }
 }
diff --git a/src/main/java/de/ids_mannheim/korap/security/auth/KustvaktAuthenticationManager.java b/src/main/java/de/ids_mannheim/korap/security/auth/KustvaktAuthenticationManager.java
index fe33683..28cb802 100644
--- a/src/main/java/de/ids_mannheim/korap/security/auth/KustvaktAuthenticationManager.java
+++ b/src/main/java/de/ids_mannheim/korap/security/auth/KustvaktAuthenticationManager.java
@@ -12,6 +12,7 @@
 import de.ids_mannheim.korap.interfaces.db.EntityHandlerIface;
 import de.ids_mannheim.korap.interfaces.db.UserDataDbIface;
 import de.ids_mannheim.korap.user.*;
+import de.ids_mannheim.korap.utils.NamingUtils;
 import de.ids_mannheim.korap.utils.StringUtils;
 import de.ids_mannheim.korap.utils.TimeUtils;
 import net.sf.ehcache.Cache;
@@ -28,9 +29,11 @@
 import java.util.Map;
 
 /**
- * contains the logic to authentication and registration processes. Uses
- * interface implementations (AuthenticationIface) for different databases and handlers
- *
+ * contains the logic to authentication and registration processes.
+ * Uses
+ * interface implementations (AuthenticationIface) for different
+ * databases and handlers
+ * 
  * @author hanl
  */
 public class KustvaktAuthenticationManager extends AuthenticationManagerIface {
@@ -46,9 +49,12 @@
     private LoginCounter counter;
     private Cache user_cache;
 
-    public KustvaktAuthenticationManager(EntityHandlerIface userdb,
-            EncryptionIface crypto, KustvaktConfiguration config,
-            AuditingIface auditer, Collection<UserDataDbIface> userdatadaos) {
+
+    public KustvaktAuthenticationManager (EntityHandlerIface userdb,
+                                          EncryptionIface crypto,
+                                          KustvaktConfiguration config,
+                                          AuditingIface auditer,
+                                          Collection<UserDataDbIface> userdatadaos) {
         this.user_cache = CacheManager.getInstance().getCache("users");
         this.entHandler = userdb;
         this.config = config;
@@ -58,21 +64,22 @@
         this.userdatadaos = userdatadaos;
     }
 
+
     /**
      * get session object if token was a session token
-     *
+     * 
      * @param token
      * @param host
      * @param useragent
      * @return
      * @throws KustvaktException
      */
-    public TokenContext getTokenStatus(String token, String host,
+    public TokenContext getTokenStatus (String token, String host,
             String useragent) throws KustvaktException {
         jlog.info("getting session status of token type '{}'",
                 token.split(" ")[0]);
         AuthenticationIface provider = getProvider(
-                StringUtils.getTokenType(token), null);
+                NamingUtils.getTokenType(token), null);
 
         if (provider == null)
             // throw exception for missing type paramter
@@ -85,7 +92,8 @@
         return context;
     }
 
-    public User getUser(String username) throws KustvaktException {
+
+    public User getUser (String username) throws KustvaktException {
         User user;
         String key = cache_key(username);
         Element e = user_cache.get(key);
@@ -96,7 +104,8 @@
         if (e != null) {
             Map map = (Map) e.getObjectValue();
             user = User.UserFactory.toUser(map);
-        }else {
+        }
+        else {
             user = entHandler.getAccount(username);
             user_cache.put(new Element(key, user.toCache()));
             // todo: not valid. for the duration of the session, the host should not change!
@@ -107,9 +116,9 @@
         return user;
     }
 
-    public TokenContext refresh(TokenContext context) throws KustvaktException {
-        AuthenticationIface provider = getProvider(context.getTokenType(),
-                null);
+
+    public TokenContext refresh (TokenContext context) throws KustvaktException {
+        AuthenticationIface provider = getProvider(context.getTokenType(), null);
         if (provider == null) {
             //todo:
         }
@@ -118,20 +127,25 @@
             provider.removeUserSession(context.getToken());
             User user = getUser(context.getUsername());
             return provider.createUserSession(user, context.params());
-        }catch (KustvaktException e) {
+        }
+        catch (KustvaktException e) {
             throw new WrappedException(e, StatusCodes.LOGIN_FAILED);
         }
     }
 
+
     /**
      * @param type
-     * @param attributes contains username and password to authenticate the user.
-     *                   Depending of the authentication schema, may contain other values as well
+     * @param attributes
+     *            contains username and password to authenticate the
+     *            user.
+     *            Depending of the authentication schema, may contain
+     *            other values as well
      * @return User
      * @throws KustvaktException
      */
     @Override
-    public User authenticate(int type, String username, String password,
+    public User authenticate (int type, String username, String password,
             Map<String, Object> attributes) throws KustvaktException {
         User user;
         switch (type) {
@@ -143,17 +157,18 @@
                 user = authenticate(username, password, attributes);
                 break;
         }
-        auditing.audit(AuditRecord
-                .serviceRecord(user.getId(), StatusCodes.LOGIN_SUCCESSFUL,
-                        user.toString()));
+        auditing.audit(AuditRecord.serviceRecord(user.getId(),
+                StatusCodes.LOGIN_SUCCESSFUL, user.toString()));
         return user;
     }
 
+
     // todo: dont use annotations for caching
     @Override
     @CachePut(value = "users", key = "#user.getUsername()")
-    public TokenContext createTokenContext(User user, Map<String, Object> attr,
-            String provider_key) throws KustvaktException {
+    public TokenContext createTokenContext (User user,
+            Map<String, Object> attr, String provider_key)
+            throws KustvaktException {
         AuthenticationIface provider = getProvider(provider_key,
                 Attributes.API_AUTHENTICATION);
 
@@ -168,9 +183,10 @@
         return context;
     }
 
+
     //todo: test
     @Deprecated
-    private boolean matchStatus(String host, String useragent,
+    private boolean matchStatus (String host, String useragent,
             TokenContext context) {
         if (host.equals(context.getHostAddress())) {
             if (useragent.equals(context.getUserAgent()))
@@ -179,7 +195,8 @@
         return false;
     }
 
-    private User authenticateShib(Map<String, Object> attributes)
+
+    private User authenticateShib (Map<String, Object> attributes)
             throws KustvaktException {
         // todo use persistent id, since eppn is not unique
         String eppn = (String) attributes.get(Attributes.EPPN);
@@ -198,8 +215,9 @@
         return user;
     }
 
+
     //todo: what if attributes null?
-    private User authenticate(String username, String password,
+    private User authenticate (String username, String password,
             Map<String, Object> attr) throws KustvaktException {
         Map<String, Object> attributes = crypto.validateMap(attr);
         String safeUS;
@@ -208,7 +226,8 @@
 
         try {
             safeUS = crypto.validateEntry(username, Attributes.USERNAME);
-        }catch (KustvaktException e) {
+        }
+        catch (KustvaktException e) {
             throw new WrappedException(e, StatusCodes.LOGIN_FAILED, username);
         }
 
@@ -218,12 +237,14 @@
         else {
             try {
                 unknown = entHandler.getAccount(safeUS);
-            }catch (EmptyResultException e) {
+            }
+            catch (EmptyResultException e) {
                 // mask exception to disable user guessing in possible attacks
                 throw new WrappedException(new KustvaktException(username,
                         StatusCodes.BAD_CREDENTIALS), StatusCodes.LOGIN_FAILED,
                         username);
-            }catch (KustvaktException e) {
+            }
+            catch (KustvaktException e) {
                 throw new WrappedException(e, StatusCodes.LOGIN_FAILED,
                         attributes.toString());
             }
@@ -231,9 +252,8 @@
         jlog.trace("Authentication: found username " + unknown.getUsername());
         if (unknown instanceof KorAPUser) {
             if (password == null || password.isEmpty())
-                throw new WrappedException(
-                        new KustvaktException(unknown.getId(),
-                                StatusCodes.BAD_CREDENTIALS),
+                throw new WrappedException(new KustvaktException(
+                        unknown.getId(), StatusCodes.BAD_CREDENTIALS),
                         StatusCodes.LOGIN_FAILED, username);
 
             KorAPUser user = (KorAPUser) unknown;
@@ -261,34 +281,33 @@
                                 "URI token is expired. Deleting account for user {}",
                                 user.getUsername());
                         deleteAccount(user);
-                        throw new WrappedException(
-                                new KustvaktException(unknown.getId(),
-                                        StatusCodes.EXPIRED,
-                                        "account confirmation uri has expired",
-                                        param.getUriFragment()),
+                        throw new WrappedException(new KustvaktException(
+                                unknown.getId(), StatusCodes.EXPIRED,
+                                "account confirmation uri has expired",
+                                param.getUriFragment()),
                                 StatusCodes.LOGIN_FAILED, username);
                     }
-                    throw new WrappedException(
-                            new KustvaktException(unknown.getId(),
-                                    StatusCodes.UNCONFIRMED_ACCOUNT),
+                    throw new WrappedException(new KustvaktException(
+                            unknown.getId(), StatusCodes.UNCONFIRMED_ACCOUNT),
                             StatusCodes.LOGIN_FAILED, username);
                 }
                 jlog.error("ACCESS DENIED: account not active for '{}'",
                         unknown.getUsername());
-                throw new WrappedException(
-                        new KustvaktException(unknown.getId(),
-                                StatusCodes.ACCOUNT_DEACTIVATED),
+                throw new WrappedException(new KustvaktException(
+                        unknown.getId(), StatusCodes.ACCOUNT_DEACTIVATED),
                         StatusCodes.LOGIN_FAILED, username);
             }
 
-        }else if (unknown instanceof ShibUser) {
+        }
+        else if (unknown instanceof ShibUser) {
             //todo
         }
         jlog.debug("Authentication done: " + safeUS);
         return unknown;
     }
 
-    public User isRegistered(String username) throws KustvaktException {
+
+    public User isRegistered (String username) throws KustvaktException {
         User user;
         if (username == null || username.isEmpty())
             throw new KustvaktException(username, StatusCodes.ILLEGAL_ARGUMENT,
@@ -296,11 +315,13 @@
 
         try {
             user = entHandler.getAccount(username);
-        }catch (EmptyResultException e) {
+        }
+        catch (EmptyResultException e) {
             jlog.debug("user does not exist ({})", username);
             return null;
 
-        }catch (KustvaktException e) {
+        }
+        catch (KustvaktException e) {
             jlog.error("KorAPException", e);
             throw new KustvaktException(username, StatusCodes.ILLEGAL_ARGUMENT,
                     "username invalid", username);
@@ -308,7 +329,8 @@
         return user;
     }
 
-    public void logout(TokenContext context) throws KustvaktException {
+
+    public void logout (TokenContext context) throws KustvaktException {
         String key = cache_key(context.getUsername());
         try {
             AuthenticationIface provider = getProvider(context.getTokenType(),
@@ -319,7 +341,8 @@
                 return;
             }
             provider.removeUserSession(context.getToken());
-        }catch (KustvaktException e) {
+        }
+        catch (KustvaktException e) {
             throw new WrappedException(e, StatusCodes.LOGOUT_FAILED,
                     context.toString());
         }
@@ -328,22 +351,24 @@
         user_cache.remove(key);
     }
 
-    private void processLoginFail(User user) throws KustvaktException {
+
+    private void processLoginFail (User user) throws KustvaktException {
         counter.registerFail(user.getUsername());
         if (!counter.validate(user.getUsername())) {
             try {
                 this.lockAccount(user);
-            }catch (KustvaktException e) {
+            }
+            catch (KustvaktException e) {
                 jlog.error("user account could not be locked!", e);
-                throw new WrappedException(e,
-                        StatusCodes.UPDATE_ACCOUNT_FAILED);
+                throw new WrappedException(e, StatusCodes.UPDATE_ACCOUNT_FAILED);
             }
             throw new WrappedException(new KustvaktException(user.getId(),
                     StatusCodes.ACCOUNT_DEACTIVATED), StatusCodes.LOGIN_FAILED);
         }
     }
 
-    public void lockAccount(User user) throws KustvaktException {
+
+    public void lockAccount (User user) throws KustvaktException {
         if (!(user instanceof KorAPUser))
             throw new KustvaktException(StatusCodes.REQUEST_INVALID);
 
@@ -353,8 +378,9 @@
         entHandler.updateAccount(u);
     }
 
-    public KorAPUser checkPasswordAllowance(KorAPUser user, String oldPassword,
-            String newPassword) throws KustvaktException {
+
+    public KorAPUser checkPasswordAllowance (KorAPUser user,
+            String oldPassword, String newPassword) throws KustvaktException {
         String dbPassword = user.getPassword();
 
         if (oldPassword.trim().equals(newPassword.trim())) {
@@ -373,7 +399,8 @@
 
         try {
             user.setPassword(crypto.produceSecureHash(newPassword));
-        }catch (NoSuchAlgorithmException | UnsupportedEncodingException e) {
+        }
+        catch (NoSuchAlgorithmException | UnsupportedEncodingException e) {
             //            throw new KorAPException(StatusCodes.ILLEGAL_ARGUMENT,
             //                    "Creating password hash failed!", "password");
             throw new WrappedException(new KustvaktException(user.getId(),
@@ -384,50 +411,54 @@
         return user;
     }
 
+
     //fixme: use clientinfo for logging/auditing?! = from where did he access the reset function?
     @Override
-    public void resetPassword(String uriFragment, String username,
+    public void resetPassword (String uriFragment, String username,
             String newPassphrase) throws KustvaktException {
         String safeUser, safePass;
 
         try {
             safeUser = crypto.validateEntry(username, Attributes.USERNAME);
             safePass = crypto.validateEntry(newPassphrase, Attributes.PASSWORD);
-        }catch (KustvaktException e) {
+        }
+        catch (KustvaktException e) {
             jlog.error("Error", e);
             throw new WrappedException(new KustvaktException(username,
                     StatusCodes.ILLEGAL_ARGUMENT, "password invalid",
-                    newPassphrase), StatusCodes.PASSWORD_RESET_FAILED, username,
-                    newPassphrase);
+                    newPassphrase), StatusCodes.PASSWORD_RESET_FAILED,
+                    username, newPassphrase);
         }
 
         try {
             safePass = crypto.produceSecureHash(safePass);
-        }catch (NoSuchAlgorithmException | UnsupportedEncodingException e) {
+        }
+        catch (NoSuchAlgorithmException | UnsupportedEncodingException e) {
             jlog.error("Encoding/Algorithm Error", e);
             throw new WrappedException(new KustvaktException(username,
                     StatusCodes.ILLEGAL_ARGUMENT, "password invalid",
-                    newPassphrase), StatusCodes.PASSWORD_RESET_FAILED, username,
-                    uriFragment, newPassphrase);
+                    newPassphrase), StatusCodes.PASSWORD_RESET_FAILED,
+                    username, uriFragment, newPassphrase);
         }
         int result = entHandler
                 .resetPassphrase(safeUser, uriFragment, safePass);
 
         if (result == 0)
-            throw new WrappedException(
-                    new KustvaktException(username, StatusCodes.EXPIRED,
-                            "URI fragment expired", uriFragment),
+            throw new WrappedException(new KustvaktException(username,
+                    StatusCodes.EXPIRED, "URI fragment expired", uriFragment),
                     StatusCodes.PASSWORD_RESET_FAILED, username, uriFragment);
         else if (result == 1)
             jlog.info("successfully reset password for user {}", safeUser);
     }
 
-    public void confirmRegistration(String uriFragment, String username)
+
+    public void confirmRegistration (String uriFragment, String username)
             throws KustvaktException {
         String safeUser;
         try {
             safeUser = crypto.validateEntry(username, Attributes.USERNAME);
-        }catch (KustvaktException e) {
+        }
+        catch (KustvaktException e) {
             jlog.error("error", e);
             throw new WrappedException(e,
                     StatusCodes.ACCOUNT_CONFIRMATION_FAILED, username,
@@ -438,52 +469,54 @@
             User user;
             try {
                 user = entHandler.getAccount(username);
-            }catch (EmptyResultException e) {
+            }
+            catch (EmptyResultException e) {
                 throw new WrappedException(new KustvaktException(username,
                         StatusCodes.BAD_CREDENTIALS),
                         StatusCodes.ACCOUNT_CONFIRMATION_FAILED, username,
                         uriFragment);
             }
             entHandler.deleteAccount(user.getId());
-            throw new WrappedException(
-                    new KustvaktException(user.getId(), StatusCodes.EXPIRED),
+            throw new WrappedException(new KustvaktException(user.getId(),
+                    StatusCodes.EXPIRED),
                     StatusCodes.ACCOUNT_CONFIRMATION_FAILED, username,
                     uriFragment);
-        }else if (r == 1)
+        }
+        else if (r == 1)
             jlog.info("successfully confirmed user registration for user {}",
                     safeUser);
         // register successful audit!
     }
 
+
     /**
      * @param attributes
      * @return
      * @throws KustvaktException
      */
     //fixme: remove clientinfo object (not needed), use json representation to get stuff
-    public User createUserAccount(Map<String, Object> attributes,
+    public User createUserAccount (Map<String, Object> attributes,
             boolean confirmation_required) throws KustvaktException {
         Map<String, Object> safeMap = crypto.validateMap(attributes);
-        if (safeMap.get(Attributes.USERNAME) == null || ((String) safeMap
-                .get(Attributes.USERNAME)).isEmpty())
+        if (safeMap.get(Attributes.USERNAME) == null
+                || ((String) safeMap.get(Attributes.USERNAME)).isEmpty())
             throw new KustvaktException(StatusCodes.ILLEGAL_ARGUMENT,
                     "username must be set", "username");
-        if (safeMap.get(Attributes.PASSWORD) == null || ((String) safeMap
-                .get(Attributes.PASSWORD)).isEmpty())
+        if (safeMap.get(Attributes.PASSWORD) == null
+                || ((String) safeMap.get(Attributes.PASSWORD)).isEmpty())
             throw new KustvaktException(safeMap.get(Attributes.USERNAME),
                     StatusCodes.ILLEGAL_ARGUMENT, "password must be set",
                     "password");
 
-        String username = crypto
-                .validateEntry((String) safeMap.get(Attributes.USERNAME),
-                        Attributes.USERNAME);
-        String safePass = crypto
-                .validateEntry((String) safeMap.get(Attributes.PASSWORD),
-                        Attributes.PASSWORD);
+        String username = crypto.validateEntry(
+                (String) safeMap.get(Attributes.USERNAME), Attributes.USERNAME);
+        String safePass = crypto.validateEntry(
+                (String) safeMap.get(Attributes.PASSWORD), Attributes.PASSWORD);
         String hash;
         try {
             hash = crypto.produceSecureHash(safePass);
-        }catch (UnsupportedEncodingException | NoSuchAlgorithmException e) {
+        }
+        catch (UnsupportedEncodingException | NoSuchAlgorithmException e) {
             jlog.error("Encryption error", e);
             throw new KustvaktException(StatusCodes.ILLEGAL_ARGUMENT);
         }
@@ -495,8 +528,8 @@
 
         user.setAccountLocked(confirmation_required);
         if (confirmation_required) {
-            URIParam param = new URIParam(crypto.createToken(),
-                    TimeUtils.plusSeconds(config.getExpiration()).getMillis());
+            URIParam param = new URIParam(crypto.createToken(), TimeUtils
+                    .plusSeconds(config.getExpiration()).getMillis());
             user.addField(param);
         }
         user.setPassword(hash);
@@ -512,15 +545,16 @@
             settings.readDefaults(safeMap);
             settings.checkRequired();
 
-            UserDataDbIface dao = BeansFactory.getTypeFactory()
-                    .getTypedBean(userdatadaos, UserDetails.class);
+            UserDataDbIface dao = BeansFactory.getTypeFactory().getTypedBean(
+                    userdatadaos, UserDetails.class);
             assert dao != null;
             dao.store(details);
-            dao = BeansFactory.getTypeFactory()
-                    .getTypedBean(userdatadaos, UserSettings.class);
+            dao = BeansFactory.getTypeFactory().getTypedBean(userdatadaos,
+                    UserSettings.class);
             assert dao != null;
             dao.store(settings);
-        }catch (KustvaktException e) {
+        }
+        catch (KustvaktException e) {
             throw new WrappedException(e, StatusCodes.CREATE_ACCOUNT_FAILED,
                     user.toString());
         }
@@ -530,18 +564,19 @@
         return user;
     }
 
+
     //todo:
-    private ShibUser createShibbUserAccount(Map<String, Object> attributes)
+    private ShibUser createShibbUserAccount (Map<String, Object> attributes)
             throws KustvaktException {
         jlog.debug("creating shibboleth user account for user attr: {}",
                 attributes);
         Map<String, Object> safeMap = crypto.validateMap(attributes);
 
         //todo eppn non-unique.join with idp or use persistent_id as username identifier
-        ShibUser user = User.UserFactory
-                .getShibInstance((String) safeMap.get(Attributes.EPPN),
-                        (String) safeMap.get(Attributes.MAIL),
-                        (String) safeMap.get(Attributes.CN));
+        ShibUser user = User.UserFactory.getShibInstance(
+                (String) safeMap.get(Attributes.EPPN),
+                (String) safeMap.get(Attributes.MAIL),
+                (String) safeMap.get(Attributes.CN));
         user.setAffiliation((String) safeMap.get(Attributes.EDU_AFFIL));
         user.setAccountCreation(TimeUtils.getNow().getMillis());
         entHandler.createAccount(user);
@@ -550,8 +585,8 @@
         d.readDefaults(attributes);
         d.checkRequired();
 
-        UserDataDbIface dao = BeansFactory.getTypeFactory()
-                .getTypedBean(userdatadaos, UserDetails.class);
+        UserDataDbIface dao = BeansFactory.getTypeFactory().getTypedBean(
+                userdatadaos, UserDetails.class);
         assert dao != null;
         dao.store(d);
 
@@ -559,27 +594,33 @@
         s.readDefaults(attributes);
         s.checkRequired();
 
-        dao = BeansFactory.getTypeFactory()
-                .getTypedBean(userdatadaos, UserSettings.class);
+        dao = BeansFactory.getTypeFactory().getTypedBean(userdatadaos,
+                UserSettings.class);
         assert dao != null;
         dao.store(d);
 
         return user;
     }
 
+
     /**
      * link shibboleth and korap user account to one another.
-     *
-     * @param current    currently logged in user
-     * @param for_name   foreign user name the current account should be linked to
-     * @param transstrat transfer status of user data (details, settings, user queries)
-     *                   0 = the currently logged in data should be kept
-     *                   1 = the foreign account data should be kept
+     * 
+     * @param current
+     *            currently logged in user
+     * @param for_name
+     *            foreign user name the current account should be
+     *            linked to
+     * @param transstrat
+     *            transfer status of user data (details, settings,
+     *            user queries)
+     *            0 = the currently logged in data should be kept
+     *            1 = the foreign account data should be kept
      * @throws NotAuthorizedException
      * @throws KustvaktException
      */
     // todo:
-    public void accountLink(User current, String for_name, int transstrat)
+    public void accountLink (User current, String for_name, int transstrat)
             throws KustvaktException {
         //        User foreign = entHandler.getAccount(for_name);
 
@@ -606,7 +647,8 @@
         //        }
     }
 
-    public boolean updateAccount(User user) throws KustvaktException {
+
+    public boolean updateAccount (User user) throws KustvaktException {
         boolean result;
         String key = cache_key(user.getUsername());
         if (user instanceof DemoUser)
@@ -617,10 +659,10 @@
             //            crypto.validate(user);
             try {
                 result = entHandler.updateAccount(user) > 0;
-            }catch (KustvaktException e) {
+            }
+            catch (KustvaktException e) {
                 jlog.error("Error ", e);
-                throw new WrappedException(e,
-                        StatusCodes.UPDATE_ACCOUNT_FAILED);
+                throw new WrappedException(e, StatusCodes.UPDATE_ACCOUNT_FAILED);
             }
         }
         if (result) {
@@ -631,7 +673,8 @@
         return result;
     }
 
-    public boolean deleteAccount(User user) throws KustvaktException {
+
+    public boolean deleteAccount (User user) throws KustvaktException {
         boolean result;
         String key = cache_key(user.getUsername());
         if (user instanceof DemoUser)
@@ -639,10 +682,10 @@
         else {
             try {
                 result = entHandler.deleteAccount(user.getId()) > 0;
-            }catch (KustvaktException e) {
+            }
+            catch (KustvaktException e) {
                 jlog.error("Error ", e);
-                throw new WrappedException(e,
-                        StatusCodes.DELETE_ACCOUNT_FAILED);
+                throw new WrappedException(e, StatusCodes.DELETE_ACCOUNT_FAILED);
             }
         }
         if (result) {
@@ -653,7 +696,8 @@
         return result;
     }
 
-    public Object[] validateResetPasswordRequest(String username, String email)
+
+    public Object[] validateResetPasswordRequest (String username, String email)
             throws KustvaktException {
         String mail, uritoken;
         mail = crypto.validateEntry(email, Attributes.EMAIL);
@@ -665,7 +709,8 @@
                 //                    "password reset now allowed for DemoUser", "");
                 throw new WrappedException(username,
                         StatusCodes.PASSWORD_RESET_FAILED, username);
-        }catch (EmptyResultException e) {
+        }
+        catch (EmptyResultException e) {
             throw new WrappedException(new KustvaktException(username,
                     StatusCodes.ILLEGAL_ARGUMENT, "username not found",
                     username), StatusCodes.PASSWORD_RESET_FAILED, username);
@@ -681,57 +726,66 @@
                     StatusCodes.ILLEGAL_ARGUMENT, "email invalid", email),
                     StatusCodes.PASSWORD_RESET_FAILED, email);
         uritoken = crypto.encodeBase();
-        URIParam param = new URIParam(uritoken,
-                TimeUtils.plusHours(24).getMillis());
+        URIParam param = new URIParam(uritoken, TimeUtils.plusHours(24)
+                .getMillis());
         user.addField(param);
 
         try {
             entHandler.updateAccount(user);
-        }catch (KustvaktException e) {
+        }
+        catch (KustvaktException e) {
             jlog.error("Error ", e);
             throw new WrappedException(e, StatusCodes.PASSWORD_RESET_FAILED);
         }
-        return new Object[] { uritoken,
-                new DateTime(param.getUriExpiration()) };
+        return new Object[] { uritoken, new DateTime(param.getUriExpiration()) };
     }
 
+
     @Override
-    public <T extends Userdata> T getUserData(User user, Class<T> clazz)
+    public <T extends Userdata> T getUserData (User user, Class<T> clazz)
             throws WrappedException {
 
         try {
-            UserDataDbIface<T> dao = BeansFactory.getTypeFactory()
-                    .getTypedBean(BeansFactory.getKustvaktContext().getUserDataDaos(), clazz);
+            UserDataDbIface<T> dao = BeansFactory
+                    .getTypeFactory()
+                    .getTypedBean(
+                            BeansFactory.getKustvaktContext().getUserDataDaos(),
+                            clazz);
             T data = null;
             if (dao != null)
                 data = dao.get(user);
 
             if (data == null)
                 throw new WrappedException(user.getId(),
-                            StatusCodes.EMPTY_RESULTS, clazz.getSimpleName());
-                return data;
-        }catch (KustvaktException e) {
+                        StatusCodes.EMPTY_RESULTS, clazz.getSimpleName());
+            return data;
+        }
+        catch (KustvaktException e) {
             jlog.error("Error ", e);
             throw new WrappedException(e, StatusCodes.GET_ACCOUNT_FAILED);
         }
     }
 
+
     //todo: cache userdata outside of the user object!
     @Override
-    public void updateUserData(Userdata data) throws WrappedException {
+    public void updateUserData (Userdata data) throws WrappedException {
         try {
 
             data.validate(this.crypto);
-            UserDataDbIface dao = BeansFactory.getTypeFactory()
-                    .getTypedBean(BeansFactory.getKustvaktContext().getUserDataDaos(), data.getClass());
+            UserDataDbIface dao = BeansFactory.getTypeFactory().getTypedBean(
+                    BeansFactory.getKustvaktContext().getUserDataDaos(),
+                    data.getClass());
             if (dao != null)
                 dao.update(data);
-        }catch (KustvaktException e) {
+        }
+        catch (KustvaktException e) {
             jlog.error("Error ", e);
             throw new WrappedException(e, StatusCodes.UPDATE_ACCOUNT_FAILED);
         }
     }
 
+
     //    public UserDetails getUserDetails(User user) throws KustvaktException {
     //        try {
     //            if (user.getDetails() == null)
@@ -752,10 +806,11 @@
     //        return user.getSettings();
     //    }
 
-    private String cache_key(String input) throws KustvaktException {
+    private String cache_key (String input) throws KustvaktException {
         try {
             return crypto.hash(KEY + "@" + input);
-        }catch (Exception e) {
+        }
+        catch (Exception e) {
             jlog.error("illegal cache key input '{}'", input);
             throw new KustvaktException(StatusCodes.ILLEGAL_ARGUMENT,
                     "missing or illegal cache key", input);
diff --git a/src/main/java/de/ids_mannheim/korap/security/auth/LoginCounter.java b/src/main/java/de/ids_mannheim/korap/security/auth/LoginCounter.java
index 7f6ae2d..1ae589b 100644
--- a/src/main/java/de/ids_mannheim/korap/security/auth/LoginCounter.java
+++ b/src/main/java/de/ids_mannheim/korap/security/auth/LoginCounter.java
@@ -19,17 +19,20 @@
     private final Map<String, Long[]> failedLogins;
     private KustvaktConfiguration config;
 
-    public LoginCounter(KustvaktConfiguration config) {
+
+    public LoginCounter (KustvaktConfiguration config) {
         jlog.debug("init login counter for authentication management");
         this.config = config;
         this.failedLogins = new HashMap<>();
     }
 
-    public void resetFailedCounter(String username) {
+
+    public void resetFailedCounter (String username) {
         failedLogins.remove(username);
     }
 
-    public void registerFail(String username) {
+
+    public void registerFail (String username) {
         long expires = TimeUtils.plusSeconds(config.getLoginAttemptTTL())
                 .getMillis();
         long fail = 1;
@@ -46,13 +49,15 @@
                 Arrays.asList(failedLogins.get(username)));
     }
 
-    public boolean validate(String username) {
+
+    public boolean validate (String username) {
         Long[] set = failedLogins.get(username);
         if (set != null) {
             if (TimeUtils.isPassed(set[1])) {
                 failedLogins.remove(username);
                 return true;
-            }else if (set[0] < config.getLoginAttemptNum())
+            }
+            else if (set[0] < config.getLoginAttemptNum())
                 return true;
             return false;
         }
diff --git a/src/main/java/de/ids_mannheim/korap/security/auth/OpenIDconnectAuthentication.java b/src/main/java/de/ids_mannheim/korap/security/auth/OpenIDconnectAuthentication.java
index 3f0ebe4..98a8268 100644
--- a/src/main/java/de/ids_mannheim/korap/security/auth/OpenIDconnectAuthentication.java
+++ b/src/main/java/de/ids_mannheim/korap/security/auth/OpenIDconnectAuthentication.java
@@ -11,6 +11,7 @@
 import de.ids_mannheim.korap.user.Attributes;
 import de.ids_mannheim.korap.user.TokenContext;
 import de.ids_mannheim.korap.user.User;
+import de.ids_mannheim.korap.utils.NamingUtils;
 import de.ids_mannheim.korap.utils.StringUtils;
 import net.sf.ehcache.CacheManager;
 import net.sf.ehcache.Element;
@@ -29,22 +30,25 @@
     private OAuthDb database;
     private KustvaktConfiguration config;
 
-    public OpenIDconnectAuthentication(KustvaktConfiguration config,
-            PersistenceClient client) {
+
+    public OpenIDconnectAuthentication (KustvaktConfiguration config,
+                                        PersistenceClient client) {
         this.database = new OAuthDb(client);
         this.config = config;
     }
 
+
     @Cacheable(value = "id_tokens", key = "#authToken")
     @Override
-    public TokenContext getUserStatus(String authToken)
+    public TokenContext getUserStatus (String authToken)
             throws KustvaktException {
-        authToken = StringUtils.stripTokenType(authToken);
+        authToken = NamingUtils.stripTokenType(authToken);
         return this.database.getContext(authToken);
     }
 
+
     @Override
-    public TokenContext createUserSession(User user, Map<String, Object> attr)
+    public TokenContext createUserSession (User user, Map<String, Object> attr)
             throws KustvaktException {
         String cl_secret = (String) attr.get(Attributes.CLIENT_SECRET);
         if (cl_secret == null)
@@ -57,7 +61,8 @@
         SignedJWT jwt = signer.createJWT(user, attr);
         try {
             c.setExpirationTime(jwt.getJWTClaimsSet().getExpirationTimeClaim());
-        }catch (ParseException e) {
+        }
+        catch (ParseException e) {
             throw new KustvaktException(StatusCodes.ILLEGAL_ARGUMENT);
         }
         c.setTokenType(Attributes.OPENID_AUTHENTICATION);
@@ -67,19 +72,22 @@
         return c;
     }
 
+
     @CacheEvict(value = "id_tokens", key = "#token")
     @Override
-    public void removeUserSession(String token) throws KustvaktException {
+    public void removeUserSession (String token) throws KustvaktException {
         // emit token from cache only
     }
 
+
     @Override
-    public TokenContext refresh(TokenContext context) throws KustvaktException {
+    public TokenContext refresh (TokenContext context) throws KustvaktException {
         throw new UnsupportedOperationException("method not supported");
     }
 
+
     @Override
-    public String getIdentifier() {
+    public String getIdentifier () {
         return Attributes.OPENID_AUTHENTICATION;
     }
 }
diff --git a/src/main/java/de/ids_mannheim/korap/security/auth/SessionAuthentication.java b/src/main/java/de/ids_mannheim/korap/security/auth/SessionAuthentication.java
index 68b04c8..ceb1284 100644
--- a/src/main/java/de/ids_mannheim/korap/security/auth/SessionAuthentication.java
+++ b/src/main/java/de/ids_mannheim/korap/security/auth/SessionAuthentication.java
@@ -18,9 +18,10 @@
 import java.util.concurrent.TimeUnit;
 
 /**
- * implementation of the AuthenticationIface to handle korap authentication
+ * implementation of the AuthenticationIface to handle korap
+ * authentication
  * internals
- *
+ * 
  * @author hanl
  */
 public class SessionAuthentication implements AuthenticationIface {
@@ -32,8 +33,9 @@
     private EncryptionIface crypto;
     private KustvaktConfiguration config;
 
-    public SessionAuthentication(KustvaktConfiguration config,
-            EncryptionIface crypto) {
+
+    public SessionAuthentication (KustvaktConfiguration config,
+                                  EncryptionIface crypto) {
         jlog.info("initialize session authentication handler");
         this.crypto = crypto;
         this.config = config;
@@ -45,24 +47,25 @@
                 this.config.getInactiveTime(), TimeUnit.SECONDS);
     }
 
+
     @Override
-    public TokenContext getUserStatus(String authenticationToken)
+    public TokenContext getUserStatus (String authenticationToken)
             throws KustvaktException {
-        jlog.debug("retrieving user session for user '{}'",
-                authenticationToken);
+        jlog.debug("retrieving user session for user '{}'", authenticationToken);
         if (authenticationToken == null)
             throw new KustvaktException(StatusCodes.PERMISSION_DENIED);
         return this.sessions.getSession(authenticationToken);
     }
 
+
     @Override
-    public TokenContext createUserSession(User user, Map<String, Object> attr)
+    public TokenContext createUserSession (User user, Map<String, Object> attr)
             throws KustvaktException {
         DateTime now = TimeUtils.getNow();
-        DateTime ex = TimeUtils
-                .getExpiration(now.getMillis(), config.getExpiration());
-        String token = crypto
-                .createToken(true, user.getUsername(), now.getMillis());
+        DateTime ex = TimeUtils.getExpiration(now.getMillis(),
+                config.getExpiration());
+        String token = crypto.createToken(true, user.getUsername(),
+                now.getMillis());
         TokenContext ctx = new TokenContext();
         ctx.setUsername(user.getUsername());
         ctx.setTokenType(Attributes.SESSION_AUTHENTICATION);
@@ -75,18 +78,21 @@
         return ctx;
     }
 
+
     @Override
-    public void removeUserSession(String token) {
+    public void removeUserSession (String token) {
         this.sessions.removeSession(token);
     }
 
+
     @Override
-    public TokenContext refresh(TokenContext context) throws KustvaktException {
+    public TokenContext refresh (TokenContext context) throws KustvaktException {
         throw new UnsupportedOperationException("method not supported");
     }
 
+
     @Override
-    public String getIdentifier() {
+    public String getIdentifier () {
         return Attributes.SESSION_AUTHENTICATION;
     }
 
diff --git a/src/main/java/de/ids_mannheim/korap/security/auth/SessionFactory.java b/src/main/java/de/ids_mannheim/korap/security/auth/SessionFactory.java
index 34070b5..131f0b1 100644
--- a/src/main/java/de/ids_mannheim/korap/security/auth/SessionFactory.java
+++ b/src/main/java/de/ids_mannheim/korap/security/auth/SessionFactory.java
@@ -19,10 +19,12 @@
 import java.util.concurrent.ConcurrentMap;
 
 /**
- * session object to hold current user sessions and track inactive time to close
- * unused sessions. Inactive sessions are not enforced until user makes a
+ * session object to hold current user sessions and track inactive
+ * time to close
+ * unused sessions. Inactive sessions are not enforced until user
+ * makes a
  * request through thrift
- *
+ * 
  * @author hanl
  */
 //todo: use simple ehcache!
@@ -37,7 +39,8 @@
     private final boolean multipleEnabled;
     private final int inactive;
 
-    public SessionFactory(boolean multipleEnabled, int inactive) {
+
+    public SessionFactory (boolean multipleEnabled, int inactive) {
         jlog.debug("allow multiple sessions per user: '{}'", multipleEnabled);
         this.multipleEnabled = multipleEnabled;
         this.inactive = inactive;
@@ -46,43 +49,50 @@
         this.loggedInRecord = new ConcurrentMultiMap<>();
     }
 
-    public boolean hasSession(TokenContext context) {
+
+    public boolean hasSession (TokenContext context) {
         if (context.getUsername().equalsIgnoreCase(DemoUser.DEMOUSER_NAME))
             return false;
         return loggedInRecord.containsKey(context.getUsername())
                 && !loggedInRecord.get(context.getUsername()).isEmpty();
     }
 
+
     @Cacheable("session")
-    public TokenContext getSession(String token) throws KustvaktException {
+    public TokenContext getSession (String token) throws KustvaktException {
         jlog.debug("logged in users: {}", loggedInRecord);
         TokenContext context = sessionsObject.get(token);
         if (context != null) {
             if (isUserSessionValid(token)) {
                 resetInterval(token);
                 return context;
-            }else
+            }
+            else
                 throw new KustvaktException(StatusCodes.EXPIRED);
 
-        }else
+        }
+        else
             throw new KustvaktException(StatusCodes.PERMISSION_DENIED);
     }
 
+
     //todo: ?!
     @CacheEvict(value = "session", key = "#session.token")
-    public void putSession(final String token, final TokenContext activeUser)
+    public void putSession (final String token, final TokenContext activeUser)
             throws KustvaktException {
         if (!hasSession(activeUser) | multipleEnabled) {
             loggedInRecord.put(activeUser.getUsername(), token);
             sessionsObject.put(token, activeUser);
             timeCheck.put(token, TimeUtils.getNow());
-        }else {
+        }
+        else {
             removeAll(activeUser);
             throw new KustvaktException(StatusCodes.ALREADY_LOGGED_IN);
         }
     }
 
-    public void removeAll(final TokenContext activeUser) {
+
+    public void removeAll (final TokenContext activeUser) {
         for (String existing : loggedInRecord.get(activeUser.getUsername())) {
             timeCheck.remove(existing);
             sessionsObject.remove(existing);
@@ -90,8 +100,9 @@
         loggedInRecord.remove(activeUser.getUsername());
     }
 
+
     @CacheEvict(value = "session", key = "#session.token")
-    public void removeSession(String token) {
+    public void removeSession (String token) {
         String username = sessionsObject.get(token).getUsername();
         loggedInRecord.remove(username, token);
         if (loggedInRecord.get(username).isEmpty())
@@ -100,39 +111,42 @@
         sessionsObject.remove(token);
     }
 
+
     /**
      * reset inactive time interval to 0
-     *
+     * 
      * @param token
      */
-    private void resetInterval(String token) {
+    private void resetInterval (String token) {
         timeCheck.put(token, TimeUtils.getNow());
     }
 
+
     /**
      * if user possesses a valid non-expired session token
-     *
+     * 
      * @param token
      * @return validity of user to request a backend function
      */
-    private boolean isUserSessionValid(String token) {
+    private boolean isUserSessionValid (String token) {
         if (timeCheck.containsKey(token)) {
-            if (TimeUtils
-                    .plusSeconds(timeCheck.get(token).getMillis(), inactive)
-                    .isAfterNow()) {
+            if (TimeUtils.plusSeconds(timeCheck.get(token).getMillis(),
+                    inactive).isAfterNow()) {
                 jlog.debug("user has session");
                 return true;
-            }else
+            }
+            else
                 jlog.debug("user with token {} has an invalid session", token);
         }
         return false;
     }
 
+
     /**
      * clean inactive sessions from session object
      * TODO: persist userdata to database when session times out!
      */
-    private void timeoutMaintenance() {
+    private void timeoutMaintenance () {
         jlog.trace("running session cleanup thread");
         Set<String> inactive = new HashSet<>();
         for (Entry<String, DateTime> entry : timeCheck.entrySet()) {
@@ -150,11 +164,12 @@
                     inactive);
     }
 
+
     /**
      * run cleanup-thread
      */
     @Override
-    public void run() {
+    public void run () {
         timeoutMaintenance();
         if (loggedInRecord.size() > 0)
             jlog.debug("logged users: {}", loggedInRecord.toString());
diff --git a/src/main/java/de/ids_mannheim/korap/user/Attributes.java b/src/main/java/de/ids_mannheim/korap/user/Attributes.java
index 3fe16bd..9d4761b 100644
--- a/src/main/java/de/ids_mannheim/korap/user/Attributes.java
+++ b/src/main/java/de/ids_mannheim/korap/user/Attributes.java
@@ -160,4 +160,3 @@
     //    public static final String
 
 }
-
diff --git a/src/main/java/de/ids_mannheim/korap/user/DemoUser.java b/src/main/java/de/ids_mannheim/korap/user/DemoUser.java
index cdb6671..2be2efb 100644
--- a/src/main/java/de/ids_mannheim/korap/user/DemoUser.java
+++ b/src/main/java/de/ids_mannheim/korap/user/DemoUser.java
@@ -14,13 +14,15 @@
     private static final long ACCOUNT_CREATED = 1377102171202L;
     public static final String PASSPHRASE = "demo";
 
-    protected DemoUser() {
+
+    protected DemoUser () {
         super(DEMOUSER_NAME, 2);
         this.setId(-1);
         this.setAccountCreation(ACCOUNT_CREATED);
     }
 
-    protected User clone() {
+
+    protected User clone () {
         return new DemoUser();
     }
 
diff --git a/src/main/java/de/ids_mannheim/korap/user/KorAPUser.java b/src/main/java/de/ids_mannheim/korap/user/KorAPUser.java
index 87ec899..9c544f6 100644
--- a/src/main/java/de/ids_mannheim/korap/user/KorAPUser.java
+++ b/src/main/java/de/ids_mannheim/korap/user/KorAPUser.java
@@ -18,45 +18,49 @@
     private String URIFragment;
     private Long URIExpiration;
 
-    protected KorAPUser(String username) {
+
+    protected KorAPUser (String username) {
         super(username, 0);
         this.URIFragment = "";
         this.URIExpiration = 0L;
     }
 
-    public KorAPUser(Integer id, String username) {
+
+    public KorAPUser (Integer id, String username) {
         this(username);
         this.setId(id);
     }
 
-    public KorAPUser() {
+
+    public KorAPUser () {
         super();
     }
 
+
     @Override
-    protected User clone() {
+    protected User clone () {
         KorAPUser user = new KorAPUser(this.getUsername());
         user.setUsername(this.getUsername());
         user.setAccountCreation(this.getAccountCreation());
         return user;
     }
 
+
     @Override
-    public int hashCode() {
+    public int hashCode () {
         int result = super.hashCode();
         result = 31 * result + (jlog != null ? jlog.hashCode() : 0);
         result = 31 * result + (password != null ? password.hashCode() : 0);
-        result = 31 * result + (URIFragment != null ?
-                URIFragment.hashCode() :
-                0);
-        result = 31 * result + (URIExpiration != null ?
-                URIExpiration.hashCode() :
-                0);
+        result = 31 * result
+                + (URIFragment != null ? URIFragment.hashCode() : 0);
+        result = 31 * result
+                + (URIExpiration != null ? URIExpiration.hashCode() : 0);
         return result;
     }
 
+
     @Override
-    public boolean equals(Object o) {
+    public boolean equals (Object o) {
         if (this == o)
             return true;
         if (!(o instanceof KorAPUser))
@@ -67,9 +71,8 @@
         KorAPUser korAPUser = (KorAPUser) o;
         if (URIExpiration != korAPUser.URIExpiration)
             return false;
-        if (URIFragment != null ?
-                !URIFragment.equals(korAPUser.URIFragment) :
-                korAPUser.URIFragment != null)
+        if (URIFragment != null ? !URIFragment.equals(korAPUser.URIFragment)
+                : korAPUser.URIFragment != null)
             return false;
         return true;
     }
diff --git a/src/main/java/de/ids_mannheim/korap/user/ShibUser.java b/src/main/java/de/ids_mannheim/korap/user/ShibUser.java
index f3f60b1..d994721 100644
--- a/src/main/java/de/ids_mannheim/korap/user/ShibUser.java
+++ b/src/main/java/de/ids_mannheim/korap/user/ShibUser.java
@@ -14,11 +14,14 @@
     private String affiliation;
     private String cn;
 
-    protected ShibUser() {
+
+    protected ShibUser () {
         super(1);
     }
 
-    private ShibUser(String eduPersonID, String mail, String cn, String affiliation) {
+
+    private ShibUser (String eduPersonID, String mail, String cn,
+                      String affiliation) {
         this(eduPersonID);
         this.setUsername(eduPersonID);
         this.mail = mail;
@@ -26,13 +29,15 @@
         this.cn = cn;
     }
 
-    public ShibUser(String username) {
+
+    public ShibUser (String username) {
         super(username, 1);
 
     }
 
+
     @Override
-    public String toString() {
+    public String toString () {
         final StringBuffer sb = new StringBuffer("ShibUser{");
         sb.append(", mail='").append(mail).append('\'');
         sb.append(", affiliation='").append(affiliation).append('\'');
@@ -41,8 +46,10 @@
         return sb.toString();
     }
 
+
     @Override
-    protected User clone() {
-        return new ShibUser(this.getUsername(), this.getMail(), this.getCn(), this.getAffiliation());
+    protected User clone () {
+        return new ShibUser(this.getUsername(), this.getMail(), this.getCn(),
+                this.getAffiliation());
     }
 }
diff --git a/src/main/java/de/ids_mannheim/korap/user/TokenContext.java b/src/main/java/de/ids_mannheim/korap/user/TokenContext.java
index bdc2d36..8cf5ad8 100644
--- a/src/main/java/de/ids_mannheim/korap/user/TokenContext.java
+++ b/src/main/java/de/ids_mannheim/korap/user/TokenContext.java
@@ -37,14 +37,16 @@
     private String hostAddress;
     private String userAgent;
 
-    public TokenContext() {
+
+    public TokenContext () {
         this.parameters = new HashMap<>();
         this.setUsername("");
         this.setToken("");
         this.setSecureRequired(false);
     }
 
-    private Map statusMap() {
+
+    private Map statusMap () {
         Map m = new HashMap();
         if (username != null && !username.isEmpty())
             m.put(Attributes.USERNAME, username);
@@ -54,11 +56,13 @@
         return m;
     }
 
-    public Map<String, Object> params() {
+
+    public Map<String, Object> params () {
         return new HashMap<>(parameters);
     }
 
-    public boolean match(TokenContext other) {
+
+    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?
@@ -67,25 +71,30 @@
         return false;
     }
 
-    public void addContextParameter(String key, String value) {
+
+    public void addContextParameter (String key, String value) {
         this.parameters.put(key, value);
     }
 
-    public void addParams(Map<String, Object> map) {
+
+    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) {
+
+    public void removeContextParameter (String key) {
         this.parameters.remove(key);
     }
 
-    public void setExpirationTime(long date) {
+
+    public void setExpirationTime (long date) {
         this.expirationTime = new Date(date);
     }
 
+
     //todo: complete
-    public static TokenContext fromJSON(String s) {
+    public static TokenContext fromJSON (String s) {
         JsonNode node = JsonUtils.readTree(s);
         TokenContext c = new TokenContext();
         if (node != null) {
@@ -95,35 +104,40 @@
         return c;
     }
 
-    public static TokenContext fromOAuth2(String s) {
+
+    public static TokenContext fromOAuth2 (String s) {
         JsonNode node = JsonUtils.readTree(s);
         TokenContext c = new TokenContext();
         if (node != null) {
             c.setToken(node.path("token").asText());
             c.setTokenType(node.path("token_type").asText());
             c.setExpirationTime(node.path("expires_in").asLong());
-            c.addContextParameter("refresh_token",
-                    node.path("refresh_token").asText());
+            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 && !this.tokenType.isEmpty());
+
+    public boolean isValid () {
+        return (this.username != null && !this.username.isEmpty())
+                && (this.token != null && !this.token.isEmpty())
+                && (this.tokenType != null && !this.tokenType.isEmpty());
     }
 
-    public String getToken() {
+
+    public String getToken () {
         return token;
     }
 
-    public String toJSON() {
+
+    public String toJSON () {
         return JsonUtils.toJSON(this.statusMap());
     }
 
-    public String toResponse() {
+
+    public String toResponse () {
         ObjectNode node = JsonUtils.createObjectNode();
         node.put("token", this.getToken());
         node.put("expires", this.getExpirationTime().getTime());
@@ -131,8 +145,9 @@
         return JsonUtils.toJSON(node);
     }
 
+
     @Override
-    public String getName() {
+    public String getName () {
         return this.getUsername();
     }
 
diff --git a/src/main/java/de/ids_mannheim/korap/user/User.java b/src/main/java/de/ids_mannheim/korap/user/User.java
index 8161254..99f52d1 100644
--- a/src/main/java/de/ids_mannheim/korap/user/User.java
+++ b/src/main/java/de/ids_mannheim/korap/user/User.java
@@ -43,7 +43,8 @@
 
     private List<Userdata> userdata;
 
-    protected User() {
+
+    protected User () {
         this.fields = new ParamFields();
         this.accountCreation = TimeUtils.getNow().getMillis();
         this.isAccountLocked = false;
@@ -52,25 +53,30 @@
         this.userdata = new ArrayList<>();
     }
 
-    protected User(int type) {
+
+    protected User (int type) {
         this();
         this.type = type;
     }
 
-    protected User(String username, int type) {
+
+    protected User (String username, int type) {
         this(type);
         this.username = username;
     }
 
-    public void addField(ParamFields.Param param) {
+
+    public void addField (ParamFields.Param param) {
         this.fields.add(param);
     }
 
-    public <T extends ParamFields.Param> T getField(Class<T> cl) {
+
+    public <T extends ParamFields.Param> T getField (Class<T> cl) {
         return this.fields.get(cl);
     }
 
-    public void addUserData(Userdata data) {
+
+    public void addUserData (Userdata data) {
         if (data != null) {
             for (Userdata d : this.userdata) {
                 // already has an object of that type!
@@ -81,7 +87,8 @@
         }
     }
 
-    public void setId(Integer id) {
+
+    public void setId (Integer id) {
         this.id = id;
         //        if (this.settings != null)
         //            this.settings.setUserID(this.id);
@@ -89,7 +96,8 @@
         //            this.details.setUserID(this.id);
     }
 
-    public Map<String, Object> toMap() {
+
+    public Map<String, Object> toMap () {
         Map map = new HashMap();
         map.put(Attributes.USERNAME, this.username);
         //TimeUtils.format(new DateTime(this.accountCreation))
@@ -100,7 +108,8 @@
         return map;
     }
 
-    public Map toCache() {
+
+    public Map toCache () {
         Map map = new HashMap();
         map.put(Attributes.ID, this.id);
         map.put(Attributes.USERNAME, this.username);
@@ -111,8 +120,9 @@
         return map;
     }
 
+
     @Override
-    public boolean equals(Object o) {
+    public boolean equals (Object o) {
         if (this == o)
             return true;
         if (!(o instanceof User))
@@ -123,14 +133,17 @@
         return true;
     }
 
-    public boolean isAdmin() {
+
+    public boolean isAdmin () {
         return this.getUsername().equals(ADMINISTRATOR_ID);
     }
 
-    protected abstract User clone();
+
+    protected abstract User clone ();
+
 
     @Override
-    public String toString() {
+    public String toString () {
         final StringBuffer sb = new StringBuffer();
         sb.append("id='").append(id).append('\'');
         sb.append(", username='").append(username).append('\'');
@@ -139,36 +152,42 @@
 
     public static class UserFactory {
 
-        public static KorAPUser getUser(String username) {
+        public static KorAPUser getUser (String username) {
             return new KorAPUser(username);
         }
 
-        public static KorAPUser getUser(String username, String password) {
+
+        public static KorAPUser getUser (String username, String password) {
             KorAPUser user = new KorAPUser(username);
             user.setPassword(password);
             return user;
         }
 
-        public static KorAPUser getAdmin() {
+
+        public static KorAPUser getAdmin () {
             return new KorAPUser(ADMINISTRATOR_ID, ADMINISTRATOR_NAME);
         }
 
-        public static DemoUser getDemoUser() {
+
+        public static DemoUser getDemoUser () {
             return new DemoUser();
         }
 
-        public static DemoUser getDemoUser(Integer id) {
+
+        public static DemoUser getDemoUser (Integer id) {
             DemoUser demo = new DemoUser();
             demo.setId(id);
             return demo;
         }
 
-        public static boolean isDemo(String username) {
+
+        public static boolean isDemo (String username) {
             return new DemoUser().getUsername().equalsIgnoreCase(username);
         }
 
-        public static ShibUser getShibInstance(String eduPersonID, String mail,
-                String cn) {
+
+        public static ShibUser getShibInstance (String eduPersonID,
+                String mail, String cn) {
             ShibUser u = new ShibUser(eduPersonID);
             u.setAffiliation("");
             u.setMail(mail);
@@ -177,34 +196,32 @@
             return u;
         }
 
-        public static KorAPUser toKorAPUser(Map<String, Object> map) {
-            KorAPUser user = UserFactory
-                    .getUser((String) map.get(Attributes.USERNAME));
+
+        public static KorAPUser toKorAPUser (Map<String, Object> map) {
+            KorAPUser user = UserFactory.getUser((String) map
+                    .get(Attributes.USERNAME));
             user.setPassword((String) map.get(Attributes.PASSWORD));
-            int id = map.get(Attributes.ID) == null ?
-                    -1 :
-                    (int) map.get(Attributes.ID);
+            int id = map.get(Attributes.ID) == null ? -1 : (int) map
+                    .get(Attributes.ID);
             if (id != -1)
                 user.setId(id);
-            long cr = map.get(Attributes.ACCOUNT_CREATION) == null ?
-                    -1 :
-                    (long) map.get(Attributes.ACCOUNT_CREATION);
+            long cr = map.get(Attributes.ACCOUNT_CREATION) == null ? -1
+                    : (long) map.get(Attributes.ACCOUNT_CREATION);
             if (cr != -1)
-                user.setAccountCreation(
-                        (Long) map.get(Attributes.ACCOUNT_CREATION));
+                user.setAccountCreation((Long) map
+                        .get(Attributes.ACCOUNT_CREATION));
             return user;
         }
 
-        public static User toUser(Map<String, Object> map) {
+
+        public static User toUser (Map<String, Object> map) {
             KustvaktMap kmap = new KustvaktMap(map);
-            int type = map.get(Attributes.TYPE) == null ?
-                    0 :
-                    (Integer) kmap.get(Attributes.TYPE, Integer.class);
+            int type = map.get(Attributes.TYPE) == null ? 0 : (Integer) kmap
+                    .get(Attributes.TYPE, Integer.class);
             User user;
             long created = -1;
-            int id = kmap.get(Attributes.ID, Integer.class) == null ?
-                    -1 :
-                    (Integer) kmap.get(Attributes.ID, Integer.class);
+            int id = kmap.get(Attributes.ID, Integer.class) == null ? -1
+                    : (Integer) kmap.get(Attributes.ID, Integer.class);
 
             if (map.get(Attributes.ACCOUNT_CREATION) != null)
                 created = DateTime.parse(kmap.get(Attributes.ACCOUNT_CREATION))
@@ -213,13 +230,11 @@
                 case 0:
                     user = UserFactory.getUser(kmap.get(Attributes.USERNAME));
                     if (id != -1)
-                        user.setId((Integer) kmap
-                                .get(Attributes.ID, Integer.class));
-                    user.setAccountLocked(
-                            map.get(Attributes.ACCOUNTLOCK) == null ?
-                                    false :
-                                    (Boolean) kmap.get(Attributes.ACCOUNTLOCK,
-                                            Boolean.class));
+                        user.setId((Integer) kmap.get(Attributes.ID,
+                                Integer.class));
+                    user.setAccountLocked(map.get(Attributes.ACCOUNTLOCK) == null ? false
+                            : (Boolean) kmap.get(Attributes.ACCOUNTLOCK,
+                                    Boolean.class));
                     user.setAccountCreation(created);
                     break;
                 default:
@@ -229,15 +244,15 @@
             return user;
         }
 
-        public static KorAPUser toUser(String value) {
+
+        public static KorAPUser toUser (String value) {
             JsonNode node = JsonUtils.readTree(value);
-            KorAPUser user = UserFactory
-                    .getUser(node.path(Attributes.USERNAME).asText());
-            user.setAccountLocked(
-                    node.path(Attributes.ACCOUNTLOCK).asBoolean());
+            KorAPUser user = UserFactory.getUser(node.path(Attributes.USERNAME)
+                    .asText());
+            user.setAccountLocked(node.path(Attributes.ACCOUNTLOCK).asBoolean());
             user.setAccountLink(node.path(Attributes.ACCOUNTLINK).asText());
-            user.setAccountCreation(
-                    node.path(Attributes.ACCOUNT_CREATION).asLong());
+            user.setAccountCreation(node.path(Attributes.ACCOUNT_CREATION)
+                    .asLong());
             user.setPassword(node.path(Attributes.PASSWORD).asText());
             return user;
         }
diff --git a/src/main/java/de/ids_mannheim/korap/user/UserDetails.java b/src/main/java/de/ids_mannheim/korap/user/UserDetails.java
index 47ca9f7..a994eee 100644
--- a/src/main/java/de/ids_mannheim/korap/user/UserDetails.java
+++ b/src/main/java/de/ids_mannheim/korap/user/UserDetails.java
@@ -3,22 +3,24 @@
 /**
  * @author hanl
  * @date 22/01/2016
- * persistence issue with query request
+ *       persistence issue with query request
  */
 public class UserDetails extends Userdata {
 
-    public UserDetails(Integer userid) {
+    public UserDetails (Integer userid) {
         super(userid);
     }
 
+
     @Override
-    public String[] requiredFields() {
+    public String[] requiredFields () {
         return new String[] { Attributes.EMAIL, Attributes.ADDRESS,
                 Attributes.LASTNAME, Attributes.FIRSTNAME };
     }
 
+
     @Override
-    public String[] defaultFields() {
+    public String[] defaultFields () {
         return new String[] { Attributes.EMAIL, Attributes.ADDRESS,
                 Attributes.LASTNAME, Attributes.FIRSTNAME, Attributes.PHONE,
                 Attributes.COUNTRY, Attributes.INSTITUTION, Attributes.GENDER };
diff --git a/src/main/java/de/ids_mannheim/korap/user/UserQuery.java b/src/main/java/de/ids_mannheim/korap/user/UserQuery.java
index 0e53aa0..ad48a2d 100644
--- a/src/main/java/de/ids_mannheim/korap/user/UserQuery.java
+++ b/src/main/java/de/ids_mannheim/korap/user/UserQuery.java
@@ -22,7 +22,8 @@
     private String description;
     private Integer creator;
 
-    public UserQuery(Integer id, int creator) {
+
+    public UserQuery (Integer id, int creator) {
         setId(id);
         setCreator(creator);
         setName("");
@@ -31,34 +32,37 @@
         setQueryLanguage("");
     }
 
-    public UserQuery(String ql, String query, String description) {
+
+    public UserQuery (String ql, String query, String description) {
         setDescription(description);
         setQuery(query);
         setQueryLanguage(ql);
     }
 
-    public UserQuery() {
+
+    public UserQuery () {
         setDescription("");
         setQuery("");
         setQueryLanguage("");
         setName("");
     }
 
-    public void setQuery(String query) {
+
+    public void setQuery (String query) {
         this.query = query;
-        setName("Query: " + query
-                .substring(0, query.length() > 20 ? 20 : query.length()));
+        setName("Query: "
+                + query.substring(0, query.length() > 20 ? 20 : query.length()));
     }
 
+
     // todo: use example queries or store in database
-    public static List<UserQuery> demoUserQueries() {
+    public static List<UserQuery> demoUserQueries () {
 
         List<UserQuery> queries = new ArrayList<>();
         UserQuery q1 = new UserQuery();
         q1.setQueryLanguage("COSMAS2");
         q1.setQuery("$wegen #IN(L) <s>");
-        q1.setDescription(
-                "Findet 'wegen' an Satzanfängen. Berücksichtigt auch Groß- und Kleinschreibung");
+        q1.setDescription("Findet 'wegen' an Satzanfängen. Berücksichtigt auch Groß- und Kleinschreibung");
 
         //todo: change query
         UserQuery q2 = new UserQuery();
@@ -86,11 +90,12 @@
         return queries;
     }
 
+
     //id is irrevelant, since data was coming
     // from frontend and thus this object does not contain a id that could be compared!
     // same with the userAccount. Not set yet!
     @Override
-    public boolean equals(Object o) {
+    public boolean equals (Object o) {
         if (this == o)
             return true;
         if (!(o instanceof UserQuery))
@@ -103,18 +108,19 @@
         return true;
     }
 
+
     @Override
-    public int hashCode() {
+    public int hashCode () {
         int result = getId() != null ? getId().hashCode() : 0;
-        result = 31 * result + (queryLanguage != null ?
-                queryLanguage.hashCode() :
-                0);
+        result = 31 * result
+                + (queryLanguage != null ? queryLanguage.hashCode() : 0);
         result = 31 * result + (query != null ? query.hashCode() : 0);
         return result;
     }
 
+
     @Override
-    public String toString() {
+    public String toString () {
         final StringBuffer sb = new StringBuffer("UserQuery{");
         sb.append("id=").append(getId());
         //        sb.append(", owner=").append(getOwner());
@@ -125,7 +131,8 @@
         return sb.toString();
     }
 
-    public Map toMap() {
+
+    public Map toMap () {
         Map map = new HashMap();
         map.put("name", this.name);
         map.put("description", this.description);
diff --git a/src/main/java/de/ids_mannheim/korap/user/UserSettings.java b/src/main/java/de/ids_mannheim/korap/user/UserSettings.java
index 077c869..8eb855a 100644
--- a/src/main/java/de/ids_mannheim/korap/user/UserSettings.java
+++ b/src/main/java/de/ids_mannheim/korap/user/UserSettings.java
@@ -6,18 +6,20 @@
  */
 public class UserSettings extends Userdata {
 
-    public UserSettings(Integer userid) {
+    public UserSettings (Integer userid) {
         super(userid);
     }
 
+
     @Override
-    public String[] requiredFields() {
+    public String[] requiredFields () {
         return new String[] {};
     }
 
+
     //todo: define default fields and values --> so they can never be null!
     @Override
-    public String[] defaultFields() {
+    public String[] defaultFields () {
         return new String[] { Attributes.DEFAULT_REL_FOUNDRY,
                 Attributes.DEFAULT_POS_FOUNDRY,
                 Attributes.DEFAULT_CONST_FOUNDRY,
diff --git a/src/main/java/de/ids_mannheim/korap/user/Userdata.java b/src/main/java/de/ids_mannheim/korap/user/Userdata.java
index 7b88f00..bb3250d 100644
--- a/src/main/java/de/ids_mannheim/korap/user/Userdata.java
+++ b/src/main/java/de/ids_mannheim/korap/user/Userdata.java
@@ -25,13 +25,15 @@
     @Setter(AccessLevel.PRIVATE)
     private Integer userID;
 
-    public Userdata(Integer userid) {
+
+    public Userdata (Integer userid) {
         this.fields = new HashMap<>();
         this.userID = userid;
         this.id = -1;
     }
 
-    public void setData(Map<String, Object> map) throws KustvaktException {
+
+    public void setData (Map<String, Object> map) throws KustvaktException {
         Set missing = missing(map);
         if (!missing.isEmpty())
             throw new KustvaktException(StatusCodes.MISSING_ARGUMENTS,
@@ -40,7 +42,8 @@
         this.fields.putAll(map);
     }
 
-    private Set<String> missing(Map<String, Object> map) {
+
+    private Set<String> missing (Map<String, Object> map) {
         Set<String> missing = new HashSet<>();
         for (String key : requiredFields()) {
             if (!map.containsKey(key))
@@ -49,23 +52,27 @@
         return missing;
     }
 
-    public int size() {
+
+    public int size () {
         return this.fields.size();
     }
 
-    public Object get(String key) {
+
+    public Object get (String key) {
         return this.fields.get(key);
     }
 
+
     /**
-     *
+     * 
      * @return
      */
-    public boolean isValid() {
+    public boolean isValid () {
         return missing().length == 0;
     }
 
-    public String[] missing() {
+
+    public String[] missing () {
         StringBuilder b = new StringBuilder();
         Set<String> m = missing(this.fields);
 
@@ -78,51 +85,61 @@
         return b.toString().split(";");
     }
 
-    public void checkRequired() throws KustvaktException {
+
+    public void checkRequired () throws KustvaktException {
         if (!isValid()) {
             String[] fields = missing();
             throw new KustvaktException(StatusCodes.MISSING_ARGUMENTS,
-                    "User data object not valid. Missing fields: " + Arrays
-                            .asList(fields));
+                    "User data object not valid. Missing fields: "
+                            + Arrays.asList(fields));
         }
     }
 
-    public Set<String> keys() {
+
+    public Set<String> keys () {
         return this.fields.keySet();
     }
 
-    public Collection<Object> values() {
+
+    public Collection<Object> values () {
         return this.fields.values();
     }
 
-    public Map<String, Object> fields() {
+
+    public Map<String, Object> fields () {
         return new HashMap<>(this.fields);
     }
 
-    public void setData(String data) {
+
+    public void setData (String data) {
         Map m = JsonUtils.readSimple(data, Map.class);
         if (m != null)
             this.fields.putAll(m);
     }
 
-    public void update(Userdata other) {
+
+    public void update (Userdata other) {
         if (other != null && this.getClass().equals(other.getClass()))
             this.fields.putAll(other.fields);
     }
 
-    public String data() {
+
+    public String data () {
         return JsonUtils.toJSON(this.fields);
     }
 
-    public void setField(String key, Object value) {
+
+    public void setField (String key, Object value) {
         this.fields.put(key, value);
     }
 
-    public void validate(EncryptionIface crypto) throws KustvaktException {
+
+    public void validate (EncryptionIface crypto) throws KustvaktException {
         this.fields = crypto.validateMap(this.fields);
     }
 
-    public void readDefaults(Map<String, Object> map) throws KustvaktException {
+
+    public void readDefaults (Map<String, Object> map) throws KustvaktException {
         for (String k : defaultFields()) {
             Object o = map.get(k);
             if (o != null)
@@ -131,8 +148,10 @@
         this.checkRequired();
     }
 
-    public abstract String[] requiredFields();
 
-    public abstract String[] defaultFields();
+    public abstract String[] requiredFields ();
+
+
+    public abstract String[] defaultFields ();
 
 }
diff --git a/src/main/java/de/ids_mannheim/korap/user/UserdataFactory.java b/src/main/java/de/ids_mannheim/korap/user/UserdataFactory.java
index 3e899b2..cae83af 100644
--- a/src/main/java/de/ids_mannheim/korap/user/UserdataFactory.java
+++ b/src/main/java/de/ids_mannheim/korap/user/UserdataFactory.java
@@ -25,10 +25,11 @@
 
     private static final Map<Class<? extends Userdata>, UserDataDbIface> instances = new HashMap<>();
 
-    private UserdataFactory() {
-    }
 
-    public static UserDataDbIface getDaoInstanceFromBean(
+    private UserdataFactory () {}
+
+
+    public static UserDataDbIface getDaoInstanceFromBean (
             Class<? extends Userdata> type) {
         Collection<UserDataDbIface> daos = BeansFactory.getKustvaktContext()
                 .getUserDataDaos();
@@ -44,7 +45,8 @@
         return null;
     }
 
-    public static Class<? extends UserDataDbIface> getClassFromAnno(
+
+    public static Class<? extends UserDataDbIface> getClassFromAnno (
             Class<? extends Userdata> data) {
         Set<Class<? extends UserDataDbIface>> c = KustvaktClassLoader
                 .loadSubTypes(UserDataDbIface.class);
@@ -60,28 +62,32 @@
         return null;
     }
 
+
     // todo: remove and load userdata via bean context
     @Deprecated
-    public static UserDataDbIface getDaoInstance(Class<? extends Userdata> data)
+    public static UserDataDbIface getDaoInstance (Class<? extends Userdata> data)
             throws KustvaktException {
         if (instances.get(data) == null) {
             Class<? extends UserDataDbIface> cl = getClassFromAnno(data);
             if (cl != null) {
                 try {
                     Constructor c = cl.getConstructor(PersistenceClient.class);
-                    UserDataDbIface iface = (UserDataDbIface) c.newInstance(
-                            BeansFactory.getKustvaktContext()
+                    UserDataDbIface iface = (UserDataDbIface) c
+                            .newInstance(BeansFactory.getKustvaktContext()
                                     .getPersistenceClient());
                     instances.put(data, iface);
                     return iface;
-                }catch (NoSuchMethodException | InvocationTargetException | InstantiationException | IllegalAccessException e) {
+                }
+                catch (NoSuchMethodException | InvocationTargetException
+                        | InstantiationException | IllegalAccessException e) {
                     return null;
                 }
             }
             throw new KustvaktException(StatusCodes.NOT_SUPPORTED,
-                    "No database handler found for type " + data
-                            .getSimpleName());
-        }else
+                    "No database handler found for type "
+                            + data.getSimpleName());
+        }
+        else
             return instances.get(data);
     }
 }
diff --git a/src/main/java/de/ids_mannheim/korap/utils/BooleanUtils.java b/src/main/java/de/ids_mannheim/korap/utils/BooleanUtils.java
index 02d8cc3..8dbeb4f 100644
--- a/src/main/java/de/ids_mannheim/korap/utils/BooleanUtils.java
+++ b/src/main/java/de/ids_mannheim/korap/utils/BooleanUtils.java
@@ -8,13 +8,15 @@
 
     public static String dbname;
 
-    public static Object getBoolean(Object val) {
+
+    public static Object getBoolean (Object val) {
         if (val == null)
             val = false;
         if (dbname != null && dbname.equalsIgnoreCase("sqlite")) {
             if (val instanceof Boolean) {
                 return ((boolean) val) ? 1 : 0;
-            }else if (val instanceof Integer) {
+            }
+            else if (val instanceof Integer) {
                 return ((Integer) val == 1);
             }
         }
diff --git a/src/main/java/de/ids_mannheim/korap/utils/CollectionQueryBuilder3.java b/src/main/java/de/ids_mannheim/korap/utils/CollectionQueryBuilder3.java
index 49f7041..d26d910 100644
--- a/src/main/java/de/ids_mannheim/korap/utils/CollectionQueryBuilder3.java
+++ b/src/main/java/de/ids_mannheim/korap/utils/CollectionQueryBuilder3.java
@@ -9,7 +9,7 @@
 
 /**
  * convenience builder class for collection query
- *
+ * 
  * @author hanl
  * @date 16/09/2014
  */
@@ -23,16 +23,19 @@
     private JsonNode base;
     private StringBuilder builder;
 
-    public CollectionQueryBuilder3() {
+
+    public CollectionQueryBuilder3 () {
         this(false);
     }
 
-    public CollectionQueryBuilder3(boolean verbose) {
+
+    public CollectionQueryBuilder3 (boolean verbose) {
         this.verbose = verbose;
         this.builder = new StringBuilder();
         this.base = null;
     }
 
+
     //    /**
     //     * convencience method for equal field value search operation
     //     * @param field
@@ -56,14 +59,15 @@
     //    }
 
     /**
-     * raw method for field - value pair adding. Supports all operators (leq, geq, contains, etc.)
-     *
+     * raw method for field - value pair adding. Supports all
+     * operators (leq, geq, contains, etc.)
+     * 
      * @param field
      * @param op
      * @param value
      * @return
      */
-    public CollectionQueryBuilder3 fieldValue(String field, String op,
+    public CollectionQueryBuilder3 fieldValue (String field, String op,
             String value) {
         if (base == null)
             this.builder.append(field + op + value);
@@ -74,13 +78,17 @@
         return this;
     }
 
+
     /**
-     * element can be a more complex sub query like (textClass=freizeit & corpusID=WPD)
-     *
-     * @param query will be parenthised in order to make sub query element
+     * element can be a more complex sub query like
+     * (textClass=freizeit & corpusID=WPD)
+     * 
+     * @param query
+     *            will be parenthised in order to make sub query
+     *            element
      * @return
      */
-    public CollectionQueryBuilder3 addQuery(String query) {
+    public CollectionQueryBuilder3 addQuery (String query) {
         if (!query.startsWith("(") && !query.endsWith(")"))
             query = "(" + query + ")";
 
@@ -88,25 +96,29 @@
             CollectionQueryProcessor tree = new CollectionQueryProcessor(
                     this.verbose);
             tree.process(query);
-            JsonNode map = JsonUtils
-                    .valueToTree(tree.getRequestMap().get("collection"));
+            JsonNode map = JsonUtils.valueToTree(tree.getRequestMap().get(
+                    "collection"));
             appendToBaseGroup(map);
-        }else
+        }
+        else
             this.builder.append(query);
         return this;
     }
 
-    public CollectionQueryBuilder3 and() {
+
+    public CollectionQueryBuilder3 and () {
         this.builder.append(" & ");
         return this;
     }
 
-    public CollectionQueryBuilder3 or() {
+
+    public CollectionQueryBuilder3 or () {
         this.builder.append(" | ");
         return this;
     }
 
-    private Object build() {
+
+    private Object build () {
         Object request = base;
         if (request == null) {
             CollectionQueryProcessor tree = new CollectionQueryProcessor(
@@ -120,29 +132,34 @@
         return request;
     }
 
+
     /**
-     * sets base query. All consequent queries are added to the first koral:docGroup within the collection base query
+     * sets base query. All consequent queries are added to the first
+     * koral:docGroup within the collection base query
      * If no group in base query, consequent queries are skipped.
-     *
+     * 
      * @param query
      */
-    public CollectionQueryBuilder3 setBaseQuery(String query) {
+    public CollectionQueryBuilder3 setBaseQuery (String query) {
         this.base = JsonUtils.readTree(query);
         return this;
     }
 
-    public String toJSON() {
+
+    public String toJSON () {
         return JsonUtils.toJSON(build());
     }
 
-    private CollectionQueryBuilder3 appendToBaseGroup(JsonNode node) {
+
+    private CollectionQueryBuilder3 appendToBaseGroup (JsonNode node) {
         if (base.at("/collection/@type").asText().equals("koral:docGroup")) {
             ArrayNode group = (ArrayNode) base.at("/collection/operands");
             if (node instanceof ArrayNode)
                 group.addAll((ArrayNode) node);
             else
                 group.add(node);
-        }else
+        }
+        else
             throw new IllegalArgumentException("No group found to add to!");
         // fixme: if base is a doc only, this function is not supported. requirement is a koral:docGroup, since
         // combination operator is unknown otherwise
@@ -151,7 +168,7 @@
 
     public static class Utils {
 
-        public static JsonNode buildDoc(String key, String value, String op) {
+        public static JsonNode buildDoc (String key, String value, String op) {
             ObjectNode node = JsonUtils.createObjectNode();
             node.put("@type", "koral:doc");
             // eq.equals(EQ.EQUAL) ? "match:eq" : "match:ne"
@@ -162,7 +179,8 @@
             return node;
         }
 
-        public static JsonNode buildDocGroup() {
+
+        public static JsonNode buildDocGroup () {
             ObjectNode node = JsonUtils.createObjectNode();
 
             return node;
diff --git a/src/main/java/de/ids_mannheim/korap/utils/CollectionTypes.java b/src/main/java/de/ids_mannheim/korap/utils/CollectionTypes.java
index 2f90f57..6cb0dcd 100644
--- a/src/main/java/de/ids_mannheim/korap/utils/CollectionTypes.java
+++ b/src/main/java/de/ids_mannheim/korap/utils/CollectionTypes.java
@@ -15,11 +15,13 @@
 
     private ObjectMapper mapper;
 
-    public CollectionTypes() {
+
+    public CollectionTypes () {
         this.mapper = new ObjectMapper();
     }
 
-    public Map createGroup(String relation, String field, List terms) {
+
+    public Map createGroup (String relation, String field, List terms) {
         if (relation == null)
             return null;
 
@@ -32,7 +34,9 @@
         return kgroup;
     }
 
-    public Map createTerm(String field, String subtype, String value, String type) {
+
+    public Map createTerm (String field, String subtype, String value,
+            String type) {
         Map term = new LinkedHashMap<>();
         if (type == null)
             type = "korap:term";
@@ -45,15 +49,18 @@
         return term;
     }
 
-    public Map createTerm(String field, String value, String type) {
+
+    public Map createTerm (String field, String value, String type) {
         return createTerm(field, null, value, type);
     }
 
-    public Map createTerm(String field, String value) {
+
+    public Map createTerm (String field, String value) {
         return createTerm(field, value, null);
     }
 
-    public Map createResourceFilter(String resource, Map value) {
+
+    public Map createResourceFilter (String resource, Map value) {
         Map meta = new LinkedHashMap();
         meta.put("@type", "korap:meta-filter");
         meta.put("@id", "korap-filter#" + resource);
@@ -61,11 +68,14 @@
         return meta;
     }
 
-    public Map createResourceFilter(String resource, String value) throws IOException {
+
+    public Map createResourceFilter (String resource, String value)
+            throws IOException {
         return createResourceFilter(resource, mapify(value));
     }
 
-    public Map createResourceExtend(String resource, Map value) {
+
+    public Map createResourceExtend (String resource, Map value) {
         Map meta = new LinkedHashMap();
         meta.put("@type", "korap:meta-extend");
         meta.put("@id", "korap-filter#" + resource);
@@ -73,14 +83,16 @@
         return meta;
     }
 
-    public Map createMetaFilter(Map value) {
+
+    public Map createMetaFilter (Map value) {
         Map meta = new LinkedHashMap();
         meta.put("@type", "korap:meta-filter");
         meta.put("@value", value);
         return meta;
     }
 
-    public Map createMetaExtend(Map value) {
+
+    public Map createMetaExtend (Map value) {
         Map meta = new LinkedHashMap();
         meta.put("@type", "korap:meta-extend");
         meta.put("@value", value);
@@ -88,7 +100,7 @@
     }
 
 
-    public Map mapify(String s) throws IOException {
+    public Map mapify (String s) throws IOException {
         return mapper.readValue(s, Map.class);
     }
 
diff --git a/src/main/java/de/ids_mannheim/korap/utils/ConcurrentMultiMap.java b/src/main/java/de/ids_mannheim/korap/utils/ConcurrentMultiMap.java
index 5bb811e..ea02e44 100644
--- a/src/main/java/de/ids_mannheim/korap/utils/ConcurrentMultiMap.java
+++ b/src/main/java/de/ids_mannheim/korap/utils/ConcurrentMultiMap.java
@@ -32,21 +32,27 @@
     private final LockMap<K> locks;
     private final ConcurrentMap<K, List<V>> cache;
 
-    public ConcurrentMultiMap() {
+
+    public ConcurrentMultiMap () {
         this(16, 64);
     }
 
-    public ConcurrentMultiMap(final int concurrencyLevel) {
+
+    public ConcurrentMultiMap (final int concurrencyLevel) {
         this(concurrencyLevel, 64);
     }
 
-    public ConcurrentMultiMap(final int concurrencyLevel, final int initialCapacity) {
+
+    public ConcurrentMultiMap (final int concurrencyLevel,
+                               final int initialCapacity) {
         this.initialCapacity = initialCapacity;
-        cache = new MapMaker().concurrencyLevel(concurrencyLevel).initialCapacity(initialCapacity).makeMap();
+        cache = new MapMaker().concurrencyLevel(concurrencyLevel)
+                .initialCapacity(initialCapacity).makeMap();
         locks = new LockMap<K>(concurrencyLevel, initialCapacity);
     }
 
-    public void put(final K key, final V value) {
+
+    public void put (final K key, final V value) {
         synchronized (locks.getLock(key)) {
             List<V> set = cache.get(key);
             if (set == null) {
@@ -57,7 +63,8 @@
         }
     }
 
-    public void putAll(final K key, final Collection<V> values) {
+
+    public void putAll (final K key, final Collection<V> values) {
         synchronized (locks.getLock(key)) {
             List<V> set = cache.get(key);
             if (set == null) {
@@ -68,14 +75,15 @@
         }
     }
 
-    public List<V> remove(final K key) {
+
+    public List<V> remove (final K key) {
         synchronized (locks.getLock(key)) {
             return cache.remove(key);
         }
     }
 
 
-    public void remove(final K key, final V value) {
+    public void remove (final K key, final V value) {
         List<V> values = cache.get(key);
         synchronized (locks.getLock(key)) {
             values.remove(value);
@@ -83,19 +91,22 @@
     }
 
 
-    public Set<K> getKeySet() {
+    public Set<K> getKeySet () {
         return cache.keySet();
     }
 
-    public int size() {
+
+    public int size () {
         return cache.size();
     }
 
-    public boolean containsKey(K key) {
+
+    public boolean containsKey (K key) {
         return cache.containsKey(key);
     }
 
-    public List<V> get(K key) {
+
+    public List<V> get (K key) {
         return cache.get(key);
     }
 
@@ -103,19 +114,24 @@
     public class LockMap<K extends Comparable> {
         private final ConcurrentMap<K, Object> locks;
 
-        public LockMap() {
+
+        public LockMap () {
             this(16, 64);
         }
 
-        public LockMap(final int concurrencyLevel) {
+
+        public LockMap (final int concurrencyLevel) {
             this(concurrencyLevel, 64);
         }
 
-        public LockMap(final int concurrencyLevel, final int initialCapacity) {
-            locks = new MapMaker().concurrencyLevel(concurrencyLevel).initialCapacity(initialCapacity).weakValues().makeMap();
+
+        public LockMap (final int concurrencyLevel, final int initialCapacity) {
+            locks = new MapMaker().concurrencyLevel(concurrencyLevel)
+                    .initialCapacity(initialCapacity).weakValues().makeMap();
         }
 
-        public Object getLock(final K key) {
+
+        public Object getLock (final K key) {
             final Object object = new Object();
             Object lock = locks.putIfAbsent(key, object);
             return lock == null ? object : lock;
@@ -124,7 +140,7 @@
     }
 
 
-    public String toString() {
+    public String toString () {
         return cache.toString();
     }
 
diff --git a/src/main/java/de/ids_mannheim/korap/utils/IPNetMask.java b/src/main/java/de/ids_mannheim/korap/utils/IPNetMask.java
index 58e1ae7..c2511a7 100644
--- a/src/main/java/de/ids_mannheim/korap/utils/IPNetMask.java
+++ b/src/main/java/de/ids_mannheim/korap/utils/IPNetMask.java
@@ -8,9 +8,9 @@
  * User: hanl
  * Date: 9/13/13
  * Time: 2:25 PM
- *
+ * 
  * currently only supports IPv4!
- *
+ * 
  */
 // todo: integrate to gerrit
 public class IPNetMask {
@@ -23,7 +23,8 @@
 
     private static final int default_mask = 16;
 
-    private IPNetMask(Inet4Address i4addr, byte mask) {
+
+    private IPNetMask (Inet4Address i4addr, byte mask) {
         this.i4addr = i4addr;
         this.maskCtr = mask;
 
@@ -31,16 +32,20 @@
         this.maskInt = ~((1 << (32 - maskCtr)) - 1);
     }
 
+
     /**
      * IPNetMask factory method.
-     *
-     * @param addrSlashMask IP/Mask String in format "nnn.nnn.nnn.nnn/mask". If
-     *                      the "/mask" is omitted, "/32" (just the single address) is assumed.
+     * 
+     * @param addrSlashMask
+     *            IP/Mask String in format "nnn.nnn.nnn.nnn/mask". If
+     *            the "/mask" is omitted, "/32" (just the single
+     *            address) is assumed.
      * @return a new IPNetMask
-     * @throws UnknownHostException if address part cannot be parsed by
-     *                              InetAddress
+     * @throws UnknownHostException
+     *             if address part cannot be parsed by
+     *             InetAddress
      */
-    public static IPNetMask getIPMask(String addrSlashMask)
+    public static IPNetMask getIPMask (String addrSlashMask)
             throws UnknownHostException {
         int pos = addrSlashMask.indexOf('/');
         String addr;
@@ -48,55 +53,63 @@
         if (pos == -1) {
             addr = addrSlashMask;
             maskCtr = default_mask;
-        } else {
+        }
+        else {
             addr = addrSlashMask.substring(0, pos);
             maskCtr = Byte.parseByte(addrSlashMask.substring(pos + 1));
         }
 
-        return new IPNetMask((Inet4Address) InetAddress.getByName(addr), maskCtr);
+        return new IPNetMask((Inet4Address) InetAddress.getByName(addr),
+                maskCtr);
     }
 
+
     /**
      * Test given IPv4 address against this IPNetMask object.
-     *
-     * @param testAddr address to isSystem.
+     * 
+     * @param testAddr
+     *            address to isSystem.
      * @return true if address is in the IP Mask range, false if not.
      */
-    public boolean matches(Inet4Address testAddr) {
+    public boolean matches (Inet4Address testAddr) {
         int testAddrInt = addrToInt(testAddr);
         return ((addrInt & maskInt) == (testAddrInt & maskInt));
     }
 
+
     /**
      * Convenience method that converts String host to IPv4 address.
-     *
-     * @param addr IP address to match in nnn.nnn.nnn.nnn format or hostname.
+     * 
+     * @param addr
+     *            IP address to match in nnn.nnn.nnn.nnn format or
+     *            hostname.
      * @return true if address is in the IP Mask range, false if not.
-     * @throws UnknownHostException if the string cannot be decoded.
+     * @throws UnknownHostException
+     *             if the string cannot be decoded.
      */
-    public boolean matches(String addr)
-            throws UnknownHostException {
+    public boolean matches (String addr) throws UnknownHostException {
         return matches((Inet4Address) InetAddress.getByName(addr));
     }
 
+
     /**
      * Converts IPv4 address to integer representation.
      */
-    private int addrToInt(Inet4Address i4addr) {
+    private int addrToInt (Inet4Address i4addr) {
         byte[] ba = i4addr.getAddress();
-        return (ba[0] << 24)
-                | ((ba[1] & 0xFF) << 16)
-                | ((ba[2] & 0xFF) << 8)
+        return (ba[0] << 24) | ((ba[1] & 0xFF) << 16) | ((ba[2] & 0xFF) << 8)
                 | (ba[3] & 0xFF);
     }
 
+
     @Override
-    public String toString() {
+    public String toString () {
         return i4addr.getHostAddress() + "/" + maskCtr;
     }
 
+
     @Override
-    public boolean equals(Object obj) {
+    public boolean equals (Object obj) {
         if (obj == null)
             return false;
         if (getClass() != obj.getClass())
@@ -105,8 +118,9 @@
         return (this.addrInt == that.addrInt && this.maskInt == that.maskInt);
     }
 
+
     @Override
-    public int hashCode() {
+    public int hashCode () {
         return this.maskInt + this.addrInt;
     }
 
diff --git a/src/main/java/de/ids_mannheim/korap/utils/JsonUtils.java b/src/main/java/de/ids_mannheim/korap/utils/JsonUtils.java
index 85c7e3e..84537a5 100644
--- a/src/main/java/de/ids_mannheim/korap/utils/JsonUtils.java
+++ b/src/main/java/de/ids_mannheim/korap/utils/JsonUtils.java
@@ -20,70 +20,85 @@
 public class JsonUtils {
     private static ObjectMapper mapper = new ObjectMapper();
 
-    private JsonUtils() {
-    }
 
-    public static String toJSON(Object values) {
+    private JsonUtils () {}
+
+
+    public static String toJSON (Object values) {
         try {
             return mapper.writeValueAsString(values);
-        }catch (JsonProcessingException e) {
+        }
+        catch (JsonProcessingException e) {
             return "";
         }
     }
 
-    public static JsonNode readTree(String s) {
+
+    public static JsonNode readTree (String s) {
         try {
             return mapper.readTree(s);
-        }catch (IOException e) {
+        }
+        catch (IOException e) {
             return null;
         }
     }
 
-    public static ObjectNode createObjectNode() {
+
+    public static ObjectNode createObjectNode () {
         return mapper.createObjectNode();
     }
 
-    public static ArrayNode createArrayNode() {
+
+    public static ArrayNode createArrayNode () {
         return mapper.createArrayNode();
     }
 
-    public static JsonNode valueToTree(Object value) {
+
+    public static JsonNode valueToTree (Object value) {
         return mapper.valueToTree(value);
     }
 
-    public static <T> T read(String json, Class<T> cl) throws IOException {
+
+    public static <T> T read (String json, Class<T> cl) throws IOException {
         return mapper.readValue(json, cl);
     }
 
-    public static <T> T readFile(String path, Class<T> clazz)
+
+    public static <T> T readFile (String path, Class<T> clazz)
             throws IOException {
         return mapper.readValue(new File(path), clazz);
     }
 
-    public static void writeFile(String path, String content) throws IOException {
+
+    public static void writeFile (String path, String content)
+            throws IOException {
         mapper.writeValue(new File(path), content);
     }
 
-    public static <T> T readSimple(String json, Class<T> cl) {
+
+    public static <T> T readSimple (String json, Class<T> cl) {
         try {
             return mapper.readValue(json, cl);
-        }catch (IOException e) {
+        }
+        catch (IOException e) {
             return null;
         }
     }
 
-    public static List<Map<String, Object>> convertToList(String json)
+
+    public static List<Map<String, Object>> convertToList (String json)
             throws JsonProcessingException {
         List d = new ArrayList();
         JsonNode node = JsonUtils.readTree(json);
         if (node.isArray()) {
             Iterator<JsonNode> nodes = node.iterator();
             while (nodes.hasNext()) {
-                Map<String, Object> map = mapper
-                        .treeToValue(nodes.next(), Map.class);
+                Map<String, Object> map = mapper.treeToValue(nodes.next(),
+                        Map.class);
                 d.add(map);
             }
-        }else if (node.isObject()) {
+        }
+        else if (node.isObject()) {
             Map<String, Object> map = mapper.treeToValue(node, Map.class);
             d.add(map);
         }
diff --git a/src/main/java/de/ids_mannheim/korap/utils/KustvaktLogger.java b/src/main/java/de/ids_mannheim/korap/utils/KustvaktLogger.java
index cb7a976..e75db81 100644
--- a/src/main/java/de/ids_mannheim/korap/utils/KustvaktLogger.java
+++ b/src/main/java/de/ids_mannheim/korap/utils/KustvaktLogger.java
@@ -17,357 +17,415 @@
     public static final String ERROR_LOG = "errorLog";
     public static final String SECURITY_LOG = "securityLog";
 
-    //fixme:
-    public static final KustvaktLogger ERROR_LOGGER = KustvaktLogger
-            .getLogger(ERROR_LOG);
     public static final KustvaktLogger QUERY_LOGGER = KustvaktLogger
             .getLogger("ql");
 
-    @Deprecated
-    public static final KustvaktLogger SECURITY_LOGGER = KustvaktLogger
-            .getLogger("security");
     private Logger log;
 
-    public static KustvaktLogger getLogger(Class cl) {
+
+    public static KustvaktLogger getLogger (Class cl) {
         return new KustvaktLogger(LoggerFactory.getLogger(cl));
     }
 
-    public static KustvaktLogger getLogger(String name) {
+
+    public static KustvaktLogger getLogger (String name) {
         return new KustvaktLogger(LoggerFactory.getLogger(name));
 
     }
 
-    private KustvaktLogger(Logger log) {
+
+    private KustvaktLogger (Logger log) {
         this.log = log;
     }
 
+
     @Override
-    public String getName() {
+    public String getName () {
         return log.getName();
     }
 
+
     @Override
-    public boolean isTraceEnabled() {
+    public boolean isTraceEnabled () {
         return log.isTraceEnabled();
     }
 
+
     @Override
-    public void trace(String s) {
+    public void trace (String s) {
         if (DEBUG)
             this.log.trace(s);
 
     }
 
+
     @Override
-    public void trace(String s, Object o) {
+    public void trace (String s, Object o) {
         if (DEBUG)
             this.log.trace(s, o);
     }
 
+
     @Override
-    public void trace(String s, Object o, Object o2) {
+    public void trace (String s, Object o, Object o2) {
         if (DEBUG)
             this.log.trace(s, o, o2);
     }
 
+
     @Override
-    public void trace(String s, Object... objects) {
+    public void trace (String s, Object ... objects) {
         if (DEBUG)
             this.log.trace(s, objects);
     }
 
+
     @Override
-    public void trace(String s, Throwable throwable) {
+    public void trace (String s, Throwable throwable) {
         if (DEBUG)
             this.log.trace(s, throwable);
     }
 
+
     @Override
-    public boolean isTraceEnabled(Marker marker) {
+    public boolean isTraceEnabled (Marker marker) {
         if (DEBUG)
             return this.log.isTraceEnabled();
         return false;
     }
 
+
     @Override
-    public void trace(Marker marker, String s) {
+    public void trace (Marker marker, String s) {
         if (DEBUG)
             this.log.trace(marker, s);
     }
 
+
     @Override
-    public void trace(Marker marker, String s, Object o) {
+    public void trace (Marker marker, String s, Object o) {
         if (DEBUG)
             this.log.trace(marker, s, o);
     }
 
+
     @Override
-    public void trace(Marker marker, String s, Object o, Object o2) {
+    public void trace (Marker marker, String s, Object o, Object o2) {
         if (DEBUG)
             this.log.trace(marker, s, o, o2);
     }
 
+
     @Override
-    public void trace(Marker marker, String s, Object... objects) {
+    public void trace (Marker marker, String s, Object ... objects) {
         if (DEBUG)
             this.log.trace(marker, s, objects);
     }
 
+
     @Override
-    public void trace(Marker marker, String s, Throwable throwable) {
+    public void trace (Marker marker, String s, Throwable throwable) {
         if (DEBUG)
             this.log.trace(marker, s, throwable);
     }
 
+
     @Override
-    public boolean isDebugEnabled() {
+    public boolean isDebugEnabled () {
         if (DEBUG)
             return true;
         return false;
     }
 
+
     @Override
-    public void debug(String s) {
+    public void debug (String s) {
         if (DEBUG)
             this.log.debug(s);
     }
 
+
     @Override
-    public void debug(String s, Object o) {
+    public void debug (String s, Object o) {
         if (DEBUG)
             this.log.debug(s, o);
     }
 
+
     @Override
-    public void debug(String s, Object o, Object o2) {
+    public void debug (String s, Object o, Object o2) {
         if (DEBUG)
             this.log.debug(s, o, o2);
     }
 
+
     @Override
-    public void debug(String s, Object... objects) {
+    public void debug (String s, Object ... objects) {
         if (DEBUG)
             this.log.debug(s);
     }
 
+
     @Override
-    public void debug(String s, Throwable throwable) {
+    public void debug (String s, Throwable throwable) {
         if (DEBUG)
             this.log.debug(s, throwable);
     }
 
+
     @Override
-    public boolean isDebugEnabled(Marker marker) {
+    public boolean isDebugEnabled (Marker marker) {
         return this.log.isDebugEnabled(marker);
     }
 
+
     @Override
-    public void debug(Marker marker, String s) {
+    public void debug (Marker marker, String s) {
         if (DEBUG)
             this.log.debug(marker, s);
     }
 
+
     @Override
-    public void debug(Marker marker, String s, Object o) {
+    public void debug (Marker marker, String s, Object o) {
         if (DEBUG)
             this.log.debug(marker, s, o);
     }
 
+
     @Override
-    public void debug(Marker marker, String s, Object o, Object o2) {
+    public void debug (Marker marker, String s, Object o, Object o2) {
         if (DEBUG)
             this.log.debug(marker, s, o, o2);
     }
 
+
     @Override
-    public void debug(Marker marker, String s, Object... objects) {
+    public void debug (Marker marker, String s, Object ... objects) {
         if (DEBUG)
             this.log.debug(marker, s, objects);
     }
 
+
     @Override
-    public void debug(Marker marker, String s, Throwable throwable) {
+    public void debug (Marker marker, String s, Throwable throwable) {
         if (DEBUG)
             this.log.debug(marker, s, throwable);
     }
 
+
     @Override
-    public boolean isInfoEnabled() {
+    public boolean isInfoEnabled () {
         return this.log.isInfoEnabled();
     }
 
+
     @Override
-    public void info(String s) {
+    public void info (String s) {
         this.log.info(s);
     }
 
+
     @Override
-    public void info(String s, Object o) {
+    public void info (String s, Object o) {
         this.log.info(s, o);
     }
 
+
     @Override
-    public void info(String s, Object o, Object o2) {
+    public void info (String s, Object o, Object o2) {
         this.log.info(s, o, o2);
     }
 
+
     @Override
-    public void info(String s, Object... objects) {
+    public void info (String s, Object ... objects) {
         this.log.info(s, objects);
     }
 
+
     @Override
-    public void info(String s, Throwable throwable) {
+    public void info (String s, Throwable throwable) {
         this.log.info(s, throwable);
     }
 
+
     @Override
-    public boolean isInfoEnabled(Marker marker) {
+    public boolean isInfoEnabled (Marker marker) {
         return this.log.isInfoEnabled(marker);
     }
 
+
     @Override
-    public void info(Marker marker, String s) {
+    public void info (Marker marker, String s) {
         this.log.info(marker, s);
     }
 
+
     @Override
-    public void info(Marker marker, String s, Object o) {
+    public void info (Marker marker, String s, Object o) {
         this.log.info(marker, s, o);
     }
 
+
     @Override
-    public void info(Marker marker, String s, Object o, Object o2) {
+    public void info (Marker marker, String s, Object o, Object o2) {
         this.log.info(marker, s, o, o2);
     }
 
+
     @Override
-    public void info(Marker marker, String s, Object... objects) {
+    public void info (Marker marker, String s, Object ... objects) {
         this.log.info(marker, s, objects);
     }
 
+
     @Override
-    public void info(Marker marker, String s, Throwable throwable) {
+    public void info (Marker marker, String s, Throwable throwable) {
         this.log.info(marker, s, throwable);
     }
 
+
     @Override
-    public boolean isWarnEnabled() {
+    public boolean isWarnEnabled () {
         return this.log.isWarnEnabled();
     }
 
+
     @Override
-    public void warn(String s) {
+    public void warn (String s) {
         this.log.warn(s);
     }
 
+
     @Override
-    public void warn(String s, Object o) {
+    public void warn (String s, Object o) {
         this.log.warn(s, o);
     }
 
+
     @Override
-    public void warn(String s, Object... objects) {
+    public void warn (String s, Object ... objects) {
         this.log.warn(s, objects);
     }
 
+
     @Override
-    public void warn(String s, Object o, Object o2) {
+    public void warn (String s, Object o, Object o2) {
         this.log.warn(s, o, o2);
     }
 
+
     @Override
-    public void warn(String s, Throwable throwable) {
+    public void warn (String s, Throwable throwable) {
         this.log.warn(s, throwable);
     }
 
+
     @Override
-    public boolean isWarnEnabled(Marker marker) {
+    public boolean isWarnEnabled (Marker marker) {
         return this.log.isTraceEnabled(marker);
     }
 
+
     @Override
-    public void warn(Marker marker, String s) {
+    public void warn (Marker marker, String s) {
         this.log.warn(marker, s);
     }
 
+
     @Override
-    public void warn(Marker marker, String s, Object o) {
+    public void warn (Marker marker, String s, Object o) {
         this.log.warn(marker, s, o);
     }
 
+
     @Override
-    public void warn(Marker marker, String s, Object o, Object o2) {
+    public void warn (Marker marker, String s, Object o, Object o2) {
         this.log.warn(marker, s, o, o2);
     }
 
+
     @Override
-    public void warn(Marker marker, String s, Object... objects) {
+    public void warn (Marker marker, String s, Object ... objects) {
         this.log.warn(marker, s, objects);
     }
 
+
     @Override
-    public void warn(Marker marker, String s, Throwable throwable) {
+    public void warn (Marker marker, String s, Throwable throwable) {
         this.log.warn(marker, s, throwable);
     }
 
+
     @Override
-    public boolean isErrorEnabled() {
+    public boolean isErrorEnabled () {
         return this.log.isErrorEnabled();
     }
 
+
     @Override
-    public void error(String s) {
+    public void error (String s) {
         this.log.error(s);
     }
 
+
     @Override
-    public void error(String s, Object o) {
+    public void error (String s, Object o) {
         this.log.error(s, o);
     }
 
+
     @Override
-    public void error(String s, Object o, Object o2) {
+    public void error (String s, Object o, Object o2) {
         this.log.error(s, o, o2);
     }
 
+
     @Override
-    public void error(String s, Object... objects) {
+    public void error (String s, Object ... objects) {
         this.log.error(s, objects);
     }
 
+
     @Override
-    public void error(String s, Throwable throwable) {
+    public void error (String s, Throwable throwable) {
         this.log.error(s, throwable);
     }
 
+
     @Override
-    public boolean isErrorEnabled(Marker marker) {
+    public boolean isErrorEnabled (Marker marker) {
         return this.log.isErrorEnabled(marker);
     }
 
+
     @Override
-    public void error(Marker marker, String s) {
+    public void error (Marker marker, String s) {
         this.log.error(marker, s);
     }
 
+
     @Override
-    public void error(Marker marker, String s, Object o) {
+    public void error (Marker marker, String s, Object o) {
         this.log.error(marker, s, o);
     }
 
+
     @Override
-    public void error(Marker marker, String s, Object o, Object o2) {
+    public void error (Marker marker, String s, Object o, Object o2) {
         this.log.error(marker, s, o, o2);
     }
 
+
     @Override
-    public void error(Marker marker, String s, Object... objects) {
+    public void error (Marker marker, String s, Object ... objects) {
         this.log.error(marker, s, objects);
     }
 
+
     @Override
-    public void error(Marker marker, String s, Throwable throwable) {
+    public void error (Marker marker, String s, Throwable throwable) {
         this.log.error(marker, s, throwable);
     }
 }
diff --git a/src/main/java/de/ids_mannheim/korap/utils/PrefixTreeMap.java b/src/main/java/de/ids_mannheim/korap/utils/PrefixTreeMap.java
index b07df0d..20e94d5 100644
--- a/src/main/java/de/ids_mannheim/korap/utils/PrefixTreeMap.java
+++ b/src/main/java/de/ids_mannheim/korap/utils/PrefixTreeMap.java
@@ -10,7 +10,7 @@
 public class PrefixTreeMap<V> extends TreeMap<String, V> {
 
 
-    public SortedMap<String, V> getPrefixSubMap(String prefix) {
+    public SortedMap<String, V> getPrefixSubMap (String prefix) {
         if (prefix != null && prefix.length() > 0) {
             SortedMap d = this.subMap(prefix, getEnd(prefix));
             if (d.isEmpty())
@@ -20,13 +20,15 @@
         return null;
     }
 
-    private String getEnd(String prefix) {
+
+    private String getEnd (String prefix) {
         char nextLetter = (char) (prefix.charAt(prefix.length() - 1) + 1);
         return prefix.substring(0, prefix.length() - 1) + nextLetter;
 
     }
 
-    public V getFirstValue(String prefix) {
+
+    public V getFirstValue (String prefix) {
         if (prefix.length() > 0) {
             String first = this.subMap(prefix, getEnd(prefix)).firstKey();
             return this.get(first);
@@ -34,7 +36,8 @@
         return null;
     }
 
-    public V getLastValue(String prefix) {
+
+    public V getLastValue (String prefix) {
         if (prefix.length() > 0) {
             String last = this.subMap(prefix, getEnd(prefix)).lastKey();
             return this.get(last);
diff --git a/src/main/java/de/ids_mannheim/korap/utils/PropertyReader.java b/src/main/java/de/ids_mannheim/korap/utils/PropertyReader.java
index 9d953b5..0b16cc0 100644
--- a/src/main/java/de/ids_mannheim/korap/utils/PropertyReader.java
+++ b/src/main/java/de/ids_mannheim/korap/utils/PropertyReader.java
@@ -15,7 +15,7 @@
  */
 public abstract class PropertyReader {
 
-    protected Map<String, Properties> read(String path) throws IOException {
+    protected Map<String, Properties> read (String path) throws IOException {
         Map<String, Properties> res = new HashMap<>();
         Properties s = new Properties();
         s.load(new FileInputStream(new File(path)));
@@ -31,6 +31,7 @@
         return res;
     }
 
-    public abstract void load();
+
+    public abstract void load ();
 
 }
diff --git a/src/main/java/de/ids_mannheim/korap/utils/SqlBuilder.java b/src/main/java/de/ids_mannheim/korap/utils/SqlBuilder.java
index d3b5028..fa1314b 100644
--- a/src/main/java/de/ids_mannheim/korap/utils/SqlBuilder.java
+++ b/src/main/java/de/ids_mannheim/korap/utils/SqlBuilder.java
@@ -11,12 +11,14 @@
     private String[] fields;
     private String where;
 
-    public SqlBuilder(String table) {
+
+    public SqlBuilder (String table) {
         this.buffer = new StringBuffer();
         this.table = table;
     }
 
-    public SqlBuilder select(String... fields) {
+
+    public SqlBuilder select (String ... fields) {
         this.buffer.append("SELECT ");
         if (fields.length > 0) {
             for (int i = 0; i < fields.length; i++) {
@@ -24,30 +26,35 @@
                     this.buffer.append(", ");
                 this.buffer.append(fields[i]);
             }
-        }else
+        }
+        else
             this.buffer.append("*");
         this.buffer.append(" FROM ").append(table);
         return this;
     }
 
-    public SqlBuilder update(String... fields) {
+
+    public SqlBuilder update (String ... fields) {
         this.buffer.append("UPDATE ").append(table);
         this.fields = fields;
         return this;
     }
 
-    public SqlBuilder insert(String... fields) {
+
+    public SqlBuilder insert (String ... fields) {
         this.buffer.append("INSERT INTO ").append(table);
         this.fields = fields;
         return this;
     }
 
-    public SqlBuilder delete() {
+
+    public SqlBuilder delete () {
         this.buffer.append("DELETE FROM ").append(table);
         return this;
     }
 
-    public SqlBuilder params(String... values) {
+
+    public SqlBuilder params (String ... values) {
         if (values.length != fields.length)
             return this;
         if (this.buffer.lastIndexOf("INSERT INTO") != -1) {
@@ -77,13 +84,15 @@
         return this;
     }
 
-    public SqlBuilder where(String where) {
+
+    public SqlBuilder where (String where) {
         this.where = where;
         return this;
     }
 
+
     @Override
-    public String toString() {
+    public String toString () {
         StringBuffer b = new StringBuffer(this.buffer);
         //exclude where clauses from insert statements
         if (this.where != null && this.buffer.lastIndexOf("INSERT INTO") == -1)
diff --git a/src/main/java/de/ids_mannheim/korap/utils/StringUtils.java b/src/main/java/de/ids_mannheim/korap/utils/StringUtils.java
index 56e3c3d..7cd7b56 100644
--- a/src/main/java/de/ids_mannheim/korap/utils/StringUtils.java
+++ b/src/main/java/de/ids_mannheim/korap/utils/StringUtils.java
@@ -10,10 +10,10 @@
     private final static Logger jlog = LoggerFactory
             .getLogger(StringUtils.class);
 
-    private static final String SLASH = "/";
     private static final String SEP = ";";
 
-    public static Collection<UUID> stringToUUIDList(String s) {
+
+    public static Collection<UUID> stringToUUIDList (String s) {
         String[] array = s.split(SEP);
         List<UUID> list = new LinkedList<>();
         for (String att : array) {
@@ -22,7 +22,8 @@
         return list;
     }
 
-    public static List<String> toList(String values) {
+
+    public static List<String> toList (String values) {
         List<String> list = new ArrayList<>();
         StringTokenizer tokenizer = new StringTokenizer(values, SEP);
         while (tokenizer.hasMoreTokens())
@@ -30,7 +31,8 @@
         return list;
     }
 
-    public static Set<String> toSet(String values, String sep) {
+
+    public static Set<String> toSet (String values, String sep) {
         Set<String> set = new HashSet<>();
         if (values != null && !values.isEmpty()) {
             StringTokenizer tokenizer = new StringTokenizer(values, sep);
@@ -40,15 +42,18 @@
         return set;
     }
 
-    public static Set<String> toSet(String values) {
+
+    public static Set<String> toSet (String values) {
         return toSet(values, SEP);
     }
 
-    public static String toString(Collection<String> values) {
+
+    public static String toString (Collection<String> values) {
         return StringUtils.toString(values, SEP);
     }
 
-    public static String toString(Collection<String> values, String sep) {
+
+    public static String toString (Collection<String> values, String sep) {
         StringBuffer b = new StringBuffer();
         for (String s : values)
             b.append(s).append(sep);
@@ -58,12 +63,14 @@
         return b.toString();
     }
 
-    public static String orderedToString(Collection<String> hash) {
+
+    public static String orderedToString (Collection<String> hash) {
         Set<String> orderedSet = new TreeSet<>();
         orderedSet.addAll(hash);
         if (orderedSet.isEmpty()) {
             return "";
-        }else {
+        }
+        else {
             StringBuilder builder = new StringBuilder();
             for (String s : orderedSet) {
                 builder.append(s);
@@ -74,12 +81,14 @@
         }
     }
 
-    public static String UUIDsetToString(Collection<UUID> hash) {
+
+    public static String UUIDsetToString (Collection<UUID> hash) {
         Set<UUID> orderedSet = new TreeSet<>();
         orderedSet.addAll(hash);
         if (orderedSet.isEmpty()) {
             return "";
-        }else {
+        }
+        else {
             StringBuilder builder = new StringBuilder();
             for (UUID s : orderedSet) {
                 builder.append(s);
@@ -90,7 +99,8 @@
         }
     }
 
-    public static String buildSQLRegex(String path) {
+
+    public static String buildSQLRegex (String path) {
         StringBuilder b = new StringBuilder();
         String[] match = path.split("/");
         b.append(match[0]);
@@ -99,87 +109,49 @@
         return b.toString();
     }
 
-    public static Collection<String> joinStringSet(Collection<String> source,
-            String other) {
-        Set<String> set = new HashSet<>(source);
-        set.add(other);
-        return set;
-    }
 
-    public static Collection<UUID> joinUUIDSet(Collection<UUID> source,
-            UUID other) {
-        Set<UUID> set = new HashSet<>(source);
-        set.add(other);
-        return set;
-    }
-
-    public static String joinResources(String first, String second) {
-        String res;
-        if (first != null && !first.isEmpty())
-            res = first + SLASH + second;
-        else
-            res = second;
-        return res.replaceAll("\\s", "");
-    }
-
-    public static String[] splitAnnotations(String joined) {
-        String[] spl = joined.split(SLASH);
-        if (spl.length == 2)
-            return spl;
-        else
-            return null;
-    }
-
-    public static String stripTokenType(String token) {
-        int idx = token.lastIndexOf(" ");
-        if (idx == -1)
-            return token;
-        return token.substring(idx).replaceAll("\\s", "");
-    }
-
-    public static String getTokenType(String token) {
-        if (token.contains(" "))
-            return token.substring(0, token.lastIndexOf(" "))
-                    .replaceAll("\\s", "").toLowerCase();
-        else
-            return null;
-    }
-
-    public static boolean isInteger(String value) {
+    public static boolean isInteger (String value) {
         try {
             Integer.valueOf(value);
             return true;
-        }catch (IllegalArgumentException e) {
+        }
+        catch (IllegalArgumentException e) {
             // do nothing!
             return false;
         }
     }
 
-    public static String normalize(String value) {
+
+    public static String normalize (String value) {
         return value.trim().toLowerCase();
     }
 
-    public static String normalizeHTML(String value) {
+
+    public static String normalizeHTML (String value) {
         return StringEscapeUtils.escapeHtml(value);
     }
 
-    public static String decodeHTML(String value) {
+
+    public static String decodeHTML (String value) {
         return StringEscapeUtils.unescapeHtml(value);
     }
 
+
     /**
-     * constructs a lucene query from query string and corpus parameters as set
-     *
+     * constructs a lucene query from query string and corpus
+     * parameters as set
+     * 
      * @param query
      * @param corpusIDs
      * @return
      */
-    public static String queryBuilder(String query,
+    public static String queryBuilder (String query,
             Collection<String> corpusIDs) {
         String completeQuery; // holds original query and corpus
         // selection
         /**
-         * find documents with metadataquery TODO: does not intercept with
+         * find documents with metadataquery TODO: does not intercept
+         * with
          * parameters foundries and corpusIDs
          */
 
diff --git a/src/main/java/de/ids_mannheim/korap/utils/TimeUtils.java b/src/main/java/de/ids_mannheim/korap/utils/TimeUtils.java
index 1da1fdc..e632c50 100644
--- a/src/main/java/de/ids_mannheim/korap/utils/TimeUtils.java
+++ b/src/main/java/de/ids_mannheim/korap/utils/TimeUtils.java
@@ -18,7 +18,8 @@
 /**
  * @author hanl
  *         <p/>
- *         calculates current, expiration and inactive time for security
+ *         calculates current, expiration and inactive time for
+ *         security
  *         purposes.
  * @return
  */
@@ -28,7 +29,8 @@
     private static final DateTimeZone dtz = DateTimeZone.forID("Europe/Berlin");
     private static Logger jlog = LoggerFactory.getLogger(TimeUtils.class);
 
-    public static int convertTimeToSeconds(String expirationVal) {
+
+    public static int convertTimeToSeconds (String expirationVal) {
         expirationVal = expirationVal.trim();
         int finIndex = expirationVal.length() - 1;
         char entity = expirationVal.charAt(finIndex);
@@ -45,36 +47,40 @@
             case 'S':
                 return returnSec;
             default:
-                jlog.debug(
-                        "no time unit specified. Trying to read from default (minutes)");
+                jlog.debug("no time unit specified. Trying to read from default (minutes)");
                 return Integer.valueOf(expirationVal) * 60;
         }
 
     }
 
+
     //todo: time zone is wrong!
-    public static DateTime getNow() {
+    public static DateTime getNow () {
         return DateTime.now().withZone(dtz);
     }
 
+
     //returns difference in milliseconds
-    public static long calcDiff(DateTime now, DateTime future) {
+    public static long calcDiff (DateTime now, DateTime future) {
         long diff = (future.withZone(dtz).getMillis() - now.withZone(dtz)
                 .getMillis());
         return diff;
     }
 
-    public static boolean isPassed(long time) {
+
+    public static boolean isPassed (long time) {
         return getNow().isAfter(time);
 
     }
 
-    public static boolean isPassed(DateTime time) {
+
+    public static boolean isPassed (DateTime time) {
         return isPassed(time.getMillis());
     }
 
+
     // returns difference in seconds in floating number
-    public static float floating(DateTime past, DateTime now) {
+    public static float floating (DateTime past, DateTime now) {
         long diff = (now.withZone(dtz).getMillis() - past.withZone(dtz)
                 .getMillis());
         double fin = diff / 1000.0;
@@ -82,104 +88,120 @@
         return bd.floatValue();
     }
 
-    public static DateTime fromCosmas(String date) {
+
+    public static DateTime fromCosmas (String date) {
         int idx = date.length();
         try {
-            Integer sec = Integer.valueOf(
-                    date.substring((idx = idx - 2), date.length()).trim());
-            Integer min = Integer
-                    .valueOf(date.substring((idx = idx - 2), idx + 2).trim());
-            Integer hours = Integer
-                    .valueOf(date.substring((idx = idx - 2), idx + 2).trim());
-            Integer day = Integer
-                    .valueOf(date.substring((idx = idx - 2), idx + 2).trim());
-            Integer month = Integer
-                    .valueOf(date.substring((idx = idx - 2), idx + 2).trim());
-            Integer year = Integer
-                    .valueOf(date.substring((idx = idx - 4), idx + 4).trim());
+            Integer sec = Integer.valueOf(date.substring((idx = idx - 2),
+                    date.length()).trim());
+            Integer min = Integer.valueOf(date.substring((idx = idx - 2),
+                    idx + 2).trim());
+            Integer hours = Integer.valueOf(date.substring((idx = idx - 2),
+                    idx + 2).trim());
+            Integer day = Integer.valueOf(date.substring((idx = idx - 2),
+                    idx + 2).trim());
+            Integer month = Integer.valueOf(date.substring((idx = idx - 2),
+                    idx + 2).trim());
+            Integer year = Integer.valueOf(date.substring((idx = idx - 4),
+                    idx + 4).trim());
             return new DateTime(year, month, day, hours, min, sec);
-        }catch (NumberFormatException e) {
+        }
+        catch (NumberFormatException e) {
             return getNow().toDateTime();
         }
     }
 
-    public static String formatDiff(DateTime now, DateTime after) {
+
+    public static String formatDiff (DateTime now, DateTime after) {
         return df.format(calcDiff(now, after));
     }
 
+
     /**
      * converts time to the ISO8601 standard.
-     *
+     * 
      * @param time
      * @return
      */
-    public static String format(DateTime time) {
+    public static String format (DateTime time) {
         DateTimeFormatter fmt = ISODateTimeFormat.dateTime();
         return fmt.print(time);
     }
 
-    public static String format(long time) {
+
+    public static String format (long time) {
         DateTimeFormatter fmt = ISODateTimeFormat.dateTime();
         return fmt.print(time);
     }
 
+
     /**
      * calculate expiration time
-     *
+     * 
      * @param creation
-     * @param plus     time in seconds
+     * @param plus
+     *            time in seconds
      * @return
      */
-    public static DateTime plusSeconds(long creation, int plus) {
+    public static DateTime plusSeconds (long creation, int plus) {
         return new DateTime(creation).withZone(dtz).plusSeconds(plus);
     }
 
-    public static DateTime getExpiration(long now, int exp) {
+
+    public static DateTime getExpiration (long now, int exp) {
         return new DateTime(now).withZone(dtz).plusSeconds(exp);
     }
 
+
     /**
      * @param plus
      * @return
      */
-    public static DateTime plusSeconds(int plus) {
+    public static DateTime plusSeconds (int plus) {
         return getNow().withZone(dtz).plusSeconds(plus);
     }
 
-    public static DateTime plusHours(int hours) {
+
+    public static DateTime plusHours (int hours) {
         return getNow().withZone(dtz).plusHours(hours);
     }
 
-    public static DateTime plusMinutes(int minutes) {
+
+    public static DateTime plusMinutes (int minutes) {
         return getNow().withZone(dtz).plusMinutes(minutes);
     }
 
+
     /**
      * create time stamp from long value
-     *
-     * @param t time
+     * 
+     * @param t
+     *            time
      * @return Timestamp
      */
-    public static LocalDate getTimeStamp(long t) {
+    public static LocalDate getTimeStamp (long t) {
         return new DateTime(t).withZone(dtz).toLocalDate();
     }
 
-    public static DateTime getDate(int day, int month, int year) {
+
+    public static DateTime getDate (int day, int month, int year) {
         DateTime date = new DateTime().withZone(dtz);
         return date.withDate(year, month, day);
     }
 
-    public static String toString(long val, Locale locale) {
+
+    public static String toString (long val, Locale locale) {
         if (locale == Locale.GERMAN)
-            return new DateTime(val)
-                    .toString("dd. MMMM yyyy, HH:mm", Locale.GERMAN);
+            return new DateTime(val).toString("dd. MMMM yyyy, HH:mm",
+                    Locale.GERMAN);
         else
-            return new DateTime(val)
-                    .toString("MM-dd-yyyy, hh:mm", Locale.ENGLISH);
+            return new DateTime(val).toString("MM-dd-yyyy, hh:mm",
+                    Locale.ENGLISH);
 
     }
 
-    public static String dateToString(long val, int i) {
+
+    public static String dateToString (long val, int i) {
         switch (i) {
             case 1:
                 return new DateTime(val).toString("yyyy-MM");
@@ -192,14 +214,16 @@
 
     private static final List<DateTime> times = new ArrayList<>();
 
+
     @Deprecated
-    public static float benchmark(boolean getFinal) {
+    public static float benchmark (boolean getFinal) {
         float value = 0;
         times.add(getNow());
         if (getFinal && times.size() > 1) {
             value = floating(times.get(0), times.get(times.size() - 1));
             times.clear();
-        }else if (times.size() > 1)
+        }
+        else if (times.size() > 1)
             value = floating(times.get(times.size() - 2),
                     times.get(times.size() - 1));
         return value;
diff --git a/src/main/java/de/ids_mannheim/korap/utils/UserPropertyReader.java b/src/main/java/de/ids_mannheim/korap/utils/UserPropertyReader.java
index be187b7..4bc7055 100644
--- a/src/main/java/de/ids_mannheim/korap/utils/UserPropertyReader.java
+++ b/src/main/java/de/ids_mannheim/korap/utils/UserPropertyReader.java
@@ -30,33 +30,39 @@
     private static Logger jlog = LoggerFactory
             .getLogger(UserPropertyReader.class);
 
-    public UserPropertyReader(String path) {
+
+    public UserPropertyReader (String path) {
         this.path = path;
         this.iface = BeansFactory.getKustvaktContext().getUserDBHandler();
         this.crypto = BeansFactory.getKustvaktContext().getEncryption();
     }
 
+
     @Override
-    public void load() {
+    public void load () {
         try {
             props = super.read(this.path);
             for (Map.Entry<String, Properties> e : props.entrySet()) {
                 try {
                     createUser(e.getKey(), e.getValue());
-                }catch (KustvaktException ex) {
+                }
+                catch (KustvaktException ex) {
                     jlog.error("KorAP-Exception: {} for user {}",
                             ex.getStatusCode(), e.getKey());
                 }
             }
             iface.createAccount(User.UserFactory.getDemoUser());
-        }catch (IOException e) {
+        }
+        catch (IOException e) {
             jlog.error("Could not read from path {}", path);
-        }catch (KustvaktException e) {
+        }
+        catch (KustvaktException e) {
             jlog.error("KorAP-Exception: {}", e.getStatusCode());
         }
     }
 
-    private User createUser(String username, Properties p)
+
+    private User createUser (String username, Properties p)
             throws KustvaktException {
         KorAPUser user;
         if (username.equals(User.ADMINISTRATOR_NAME)) {
@@ -68,12 +74,14 @@
 
             try {
                 pass = crypto.produceSecureHash(pass);
-            }catch (NoSuchAlgorithmException | UnsupportedEncodingException e) {
+            }
+            catch (NoSuchAlgorithmException | UnsupportedEncodingException e) {
                 throw new KustvaktException(StatusCodes.REQUEST_INVALID);
             }
             user.setPassword(pass);
             iface.createAccount(user);
-        }else {
+        }
+        else {
             user = User.UserFactory.getUser(username);
             Map<String, Object> vals = new HashMap<>();
             for (Map.Entry e : p.entrySet()) {
@@ -86,13 +94,14 @@
 
             try {
                 pass = crypto.produceSecureHash(pass);
-            }catch (NoSuchAlgorithmException | UnsupportedEncodingException e) {
+            }
+            catch (NoSuchAlgorithmException | UnsupportedEncodingException e) {
                 throw new KustvaktException(StatusCodes.REQUEST_INVALID);
             }
 
             user.setPassword(pass);
-            user.setAccountLocked(Boolean.valueOf(
-                    p.getProperty(username + ".lock", "false")));
+            user.setAccountLocked(Boolean.valueOf(p.getProperty(username
+                    + ".lock", "false")));
             user.setAccountCreation(TimeUtils.getNow().getMillis());
 
             //todo: make sure uri is set to 0, so sql queries work with the null value
@@ -106,12 +115,14 @@
             set.readDefaults(vals);
             set.validate(crypto);
 
-            UserDataDbIface dao = BeansFactory.getTypeFactory()
-                    .getTypedBean(BeansFactory.getKustvaktContext().getUserDataDaos(), UserDetails.class);
+            UserDataDbIface dao = BeansFactory.getTypeFactory().getTypedBean(
+                    BeansFactory.getKustvaktContext().getUserDataDaos(),
+                    UserDetails.class);
             dao.store(det);
 
-            dao = BeansFactory.getTypeFactory()
-                    .getTypedBean(BeansFactory.getKustvaktContext().getUserDataDaos(), UserSettings.class);
+            dao = BeansFactory.getTypeFactory().getTypedBean(
+                    BeansFactory.getKustvaktContext().getUserDataDaos(),
+                    UserSettings.class);
             dao.store(set);
         }
 
diff --git a/src/main/java/de/ids_mannheim/korap/web/ClientsHandler.java b/src/main/java/de/ids_mannheim/korap/web/ClientsHandler.java
index 65fdafa..0207c54 100644
--- a/src/main/java/de/ids_mannheim/korap/web/ClientsHandler.java
+++ b/src/main/java/de/ids_mannheim/korap/web/ClientsHandler.java
@@ -21,32 +21,37 @@
 
     private WebResource service;
 
-    public ClientsHandler(URI address) {
+
+    public ClientsHandler (URI address) {
         ClientConfig config = new DefaultClientConfig();
         Client client = Client.create(config);
         this.service = client.resource(address);
     }
 
-    public String getResponse(String path, String key, Object value) throws
-            KustvaktException {
+
+    public String getResponse (String path, String key, Object value)
+            throws KustvaktException {
         MultivaluedMap map = new MultivaluedMapImpl();
         map.add(key, value);
         try {
             return service.path(path).queryParams(map).get(String.class);
-        } catch (UniformInterfaceException e) {
+        }
+        catch (UniformInterfaceException e) {
             throw new KustvaktException(StatusCodes.REQUEST_INVALID);
         }
     }
 
-    public String getResponse(MultivaluedMap map, String... paths) throws
-            KustvaktException {
+
+    public String getResponse (MultivaluedMap map, String ... paths)
+            throws KustvaktException {
         try {
             WebResource resource = service;
             for (String p : paths)
                 resource = resource.path(p);
             resource = resource.queryParams(map);
             return resource.get(String.class);
-        } catch (UniformInterfaceException e) {
+        }
+        catch (UniformInterfaceException e) {
             throw new KustvaktException(StatusCodes.REQUEST_INVALID);
         }
     }
diff --git a/src/main/java/de/ids_mannheim/korap/web/KustvaktBaseServer.java b/src/main/java/de/ids_mannheim/korap/web/KustvaktBaseServer.java
index b3fdb51..5b6ba71 100644
--- a/src/main/java/de/ids_mannheim/korap/web/KustvaktBaseServer.java
+++ b/src/main/java/de/ids_mannheim/korap/web/KustvaktBaseServer.java
@@ -29,7 +29,7 @@
  */
 public class KustvaktBaseServer {
 
-    public static void main(String[] args) throws Exception {
+    public static void main (String[] args) throws Exception {
         KustvaktConfiguration.loadLog4jLogger();
         KustvaktBaseServer server = new KustvaktBaseServer();
         KustvaktArgs kargs = server.readAttributes(args);
@@ -41,13 +41,13 @@
 
         KustvaktCacheManager.init();
 
-        kargs.setRootPackages(
-                new String[] { "de.ids_mannheim.korap.web.service.light" });
+        kargs.setRootPackages(new String[] { "de.ids_mannheim.korap.web.service.light" });
 
         server.startServer(kargs);
     }
 
-    protected KustvaktArgs readAttributes(String[] args) {
+
+    protected KustvaktArgs readAttributes (String[] args) {
         KustvaktArgs kargs = new KustvaktArgs();
         for (int i = 0; i < args.length; i++) {
             switch ((args[i])) {
@@ -79,7 +79,8 @@
         return kargs;
     }
 
-    public void runPreStart() {
+
+    public void runPreStart () {
         Set<Class<? extends BootableBeanInterface>> set = KustvaktClassLoader
                 .loadSubTypes(BootableBeanInterface.class);
 
@@ -89,7 +90,8 @@
             try {
                 iface = (BootableBeanInterface) cl.newInstance();
                 list.add(iface);
-            }catch (InstantiationException | IllegalAccessException e) {
+            }
+            catch (InstantiationException | IllegalAccessException e) {
                 continue;
             }
         }
@@ -99,11 +101,11 @@
             for (BootableBeanInterface iface : new ArrayList<>(list)) {
                 try {
                     iface.load(BeansFactory.getKustvaktContext());
-                }catch (KustvaktException e) {
+                }
+                catch (KustvaktException e) {
                     // don't do anything!
-                    System.out.println(
-                            "An error occurred in class " + iface.getClass()
-                                    .getSimpleName() + "!\n" + e);
+                    System.out.println("An error occurred in class "
+                            + iface.getClass().getSimpleName() + "!\n" + e);
                     continue;
                 }
                 list.remove(iface);
@@ -115,15 +117,17 @@
         }
     }
 
-    protected void startServer(KustvaktArgs kargs) {
+
+    protected void startServer (KustvaktArgs kargs) {
         if (kargs.init)
             runPreStart();
 
         if (kargs.port == -1)
-            kargs.setPort(BeansFactory.getKustvaktContext().getConfiguration().getPort());
+            kargs.setPort(BeansFactory.getKustvaktContext().getConfiguration()
+                    .getPort());
 
-        System.out.println(
-                "Starting Kustvakt Service on port '" + kargs.port + "'");
+        System.out.println("Starting Kustvakt Service on port '" + kargs.port
+                + "'");
         try {
             // from http://wiki.eclipse.org/Jetty/Tutorial/Embedding_Jetty
             Server server = new Server();
@@ -140,9 +144,8 @@
                     kargs.rootPackages);
 
             // from http://stackoverflow.com/questions/7421574/embedded-jetty-with-jersey-or-resteasy
-            contextHandler
-                    .addServlet(new ServletHolder(new ServletContainer(rc)),
-                            "/api/*");
+            contextHandler.addServlet(new ServletHolder(
+                    new ServletContainer(rc)), "/api/*");
 
             server.setHandler(contextHandler);
 
@@ -151,14 +154,15 @@
                         kargs.sslContext);
                 sslConnector.setPort(8443);
                 sslConnector.setMaxIdleTime(60000);
-                server.setConnectors(
-                        new Connector[] { connector, sslConnector });
-            }else
+                server.setConnectors(new Connector[] { connector, sslConnector });
+            }
+            else
                 server.setConnectors(new Connector[] { connector });
 
             server.start();
             server.join();
-        }catch (Exception e) {
+        }
+        catch (Exception e) {
             e.printStackTrace();
         }
 
@@ -175,7 +179,8 @@
         private String[] rootPackages;
         private boolean init;
 
-        public KustvaktArgs() {
+
+        public KustvaktArgs () {
             this.port = -1;
             this.sslContext = null;
             this.debug = false;
diff --git a/src/main/java/de/ids_mannheim/korap/web/SearchKrill.java b/src/main/java/de/ids_mannheim/korap/web/SearchKrill.java
index 18440a2..95d63f7 100644
--- a/src/main/java/de/ids_mannheim/korap/web/SearchKrill.java
+++ b/src/main/java/de/ids_mannheim/korap/web/SearchKrill.java
@@ -1,5 +1,6 @@
 // Connector to the Lucene Backend
 package de.ids_mannheim.korap.web;
+
 import de.ids_mannheim.korap.Krill;
 import de.ids_mannheim.korap.KrillCollection;
 import de.ids_mannheim.korap.KrillIndex;
@@ -15,21 +16,24 @@
 import java.io.File;
 import java.io.IOException;
 import java.util.List;
+
 /**
  * The SearchKrill class allows for searching in the
  * Lucene based Krill backend by applying KoralQuery.
- *
+ * 
  * @author Nils Diewald
  */
 public class SearchKrill {
     private final static Logger qlog = KustvaktLogger.getLogger("queryLogger");
-    private final static Logger log = LoggerFactory
+    private final static Logger jlog = LoggerFactory
             .getLogger(SearchKrill.class);
     // Temporary
     String indexDir = "/data/prep_corpus/index/";
     String i = "/Users/hanl/Projects/prep_corpus";
     String klinux10 = "/vol/work/hanl/indices";
     private KrillIndex index;
+
+
     /**
      * Constructor
      */
@@ -41,54 +45,74 @@
             }
             else {
                 File f = new File(path);
-                log.info("Loading index from " + path);
+                jlog.info("Loading index from " + path);
                 if (!f.exists()) {
-                    KustvaktLogger.ERROR_LOGGER.error("Index not found!");
+                    jlog.error("Index not found!");
                     System.exit(-1);
                 }
                 this.index = new KrillIndex(new MMapDirectory(Paths.get(path)));
             };
-        } catch (IOException e) {
-            KustvaktLogger.ERROR_LOGGER
-                    .error("Unable to loadSubTypes index: {}", e.getMessage());
+        }
+        catch (IOException e) {
+            jlog.error("Unable to loadSubTypes index: {}", e.getMessage());
         };
-    };
+    }
+
+
     public KrillIndex getIndex () {
         return this.index;
-    };
+    }
+
+    ;
+
+
     /**
      * Search in the Lucene index.
-     *
-     * @param json JSON-LD string with search and potential meta filters.
+     * 
+     * @param json
+     *            JSON-LD string with search and potential meta
+     *            filters.
      */
-    public String search(String json) {
+    public String search (String json) {
         qlog.trace(json);
         if (this.index != null)
             return new Krill(json).apply(this.index).toJsonString();
         Result kr = new Result();
         kr.addError(601, "Unable to find index");
         return kr.toJsonString();
-    };
+    }
+
+    ;
+
+
     /**
      * Search in the Lucene index and return matches as token lists.
-     *
-     * @param json JSON-LD string with search and potential meta filters.
+     * 
+     * @param json
+     *            JSON-LD string with search and potential meta
+     *            filters.
      */
     @Deprecated
-    public String searchTokenList(String json) {
+    public String searchTokenList (String json) {
         qlog.trace(json);
         if (this.index != null)
             return new Krill(json).apply(this.index).toTokenListJsonString();
         Result kr = new Result();
         kr.addError(601, "Unable to find index");
         return kr.toJsonString();
-    };
+    }
+
+    ;
+
+
     /**
-     * Get info on a match - by means of a richly annotated html snippet.
-     *
-     * @param id match id
+     * Get info on a match - by means of a richly annotated html
+     * snippet.
+     * 
+     * @param id
+     *            match id
      */
-    public String getMatch(String id) {
+    public String getMatch (String id) {
         if (this.index != null) {
             try {
                 return this.index.getMatch(id).toJsonString();
@@ -102,18 +126,22 @@
         Match km = new Match();
         km.addError(601, "Unable to find index");
         return km.toJsonString();
-    };
-    public String getMatch(String id, List<String> foundries,
+    }
+
+    ;
+
+
+    public String getMatch (String id, List<String> foundries,
             List<String> layers, boolean includeSpans,
             boolean includeHighlights, boolean sentenceExpansion) {
         if (this.index != null) {
             try {
 
-                return this.index
-                        .getMatchInfo(id, "tokens", true, foundries, layers,
-                                includeSpans, includeHighlights,
-                                sentenceExpansion).toJsonString();
-            } catch (QueryException qe) {
+                return this.index.getMatchInfo(id, "tokens", true, foundries,
+                        layers, includeSpans, includeHighlights,
+                        sentenceExpansion).toJsonString();
+            }
+            catch (QueryException qe) {
                 Match km = new Match();
                 km.addError(qe.getErrorCode(), qe.getMessage());
                 return km.toJsonString();
@@ -123,17 +151,27 @@
         Match km = new Match();
         km.addError(601, "Unable to find index");
         return km.toJsonString();
-    };
+    }
+
+    ;
+
+
     /**
-     * Get info on a match - by means of a richly annotated html snippet.
-     *
-     * @param id                match id
-     * @param foundry           the foundry of interest - may be null
-     * @param layer             the layer of interest - may be null
-     * @param includeSpans      Should spans be included (or only token infos)?
-     * @param includeHighlights Should highlight markup be included?
+     * Get info on a match - by means of a richly annotated html
+     * snippet.
+     * 
+     * @param id
+     *            match id
+     * @param foundry
+     *            the foundry of interest - may be null
+     * @param layer
+     *            the layer of interest - may be null
+     * @param includeSpans
+     *            Should spans be included (or only token infos)?
+     * @param includeHighlights
+     *            Should highlight markup be included?
      */
-    public String getMatch(String id, String foundry, String layer,
+    public String getMatch (String id, String foundry, String layer,
             boolean includeSpans, boolean includeHighlights,
             boolean sentenceExpansion) {
 
@@ -151,8 +189,7 @@
                   boolean extendToSentence
                 */
                 return this.index.getMatchInfo(id, "tokens", foundry, layer,
-                        includeSpans, includeHighlights,
-                        sentenceExpansion)
+                        includeSpans, includeHighlights, sentenceExpansion)
                         .toJsonString();
             }
             catch (QueryException qe) {
@@ -164,16 +201,19 @@
         Match km = new Match();
         km.addError(601, "Unable to find index");
         return km.toJsonString();
-    };
+    }
+
+    ;
 
 
     /**
      * Get statistics on (virtual) collections.
-     *
-     * @param json JSON-LD string with potential meta filters.
+     * 
+     * @param json
+     *            JSON-LD string with potential meta filters.
      */
     @Deprecated
-    public String getStatistics(String json) {
+    public String getStatistics (String json) {
         qlog.trace(json);
         if (this.index == null) {
             return "{\"documents\" : -1, error\" : \"No index given\" }";
@@ -182,10 +222,7 @@
         KrillCollection kc = new KrillCollection(json);
         // Set index
         kc.setIndex(this.index);
-        long docs = 0,
-                tokens = 0,
-                sentences = 0,
-                paragraphs = 0;
+        long docs = 0, tokens = 0, sentences = 0, paragraphs = 0;
         // Get numbers from index (currently slow)
         try {
             docs = kc.numberOf("documents");
@@ -202,10 +239,16 @@
                 .append(tokens).append(",\"sentences\":").append(sentences)
                 .append(",\"paragraphs\":").append(paragraphs).append("}");
         return sb.toString();
-    };
-    public String getMatchId(String type, String docid, String tofrom) {
+    }
+
+    ;
+
+
+    public String getMatchId (String type, String docid, String tofrom) {
         return new StringBuilder().append("match-").append(type).append("!")
                 .append(type).append("_").append(docid).append("-")
                 .append(tofrom).toString();
-    };
+    }
+
+    ;
 };
\ No newline at end of file
diff --git a/src/main/java/de/ids_mannheim/korap/web/TRACE.java b/src/main/java/de/ids_mannheim/korap/web/TRACE.java
index e33089d..05d511b 100644
--- a/src/main/java/de/ids_mannheim/korap/web/TRACE.java
+++ b/src/main/java/de/ids_mannheim/korap/web/TRACE.java
@@ -10,8 +10,7 @@
  * @author hanl
  * @date 03/07/2014
  */
-@Target({ElementType.METHOD})
+@Target({ ElementType.METHOD })
 @Retention(RetentionPolicy.RUNTIME)
 @HttpMethod("TRACE")
-public @interface TRACE {
-}
+public @interface TRACE {}
diff --git a/src/main/java/de/ids_mannheim/korap/web/filter/AuthFilter.java b/src/main/java/de/ids_mannheim/korap/web/filter/AuthFilter.java
index cc4e68c..df3157b 100644
--- a/src/main/java/de/ids_mannheim/korap/web/filter/AuthFilter.java
+++ b/src/main/java/de/ids_mannheim/korap/web/filter/AuthFilter.java
@@ -22,13 +22,15 @@
 
     private AuthenticationManagerIface userController;
 
-    public AuthFilter() {
+
+    public AuthFilter () {
         this.userController = BeansFactory.getKustvaktContext()
                 .getAuthenticationManager();
     }
 
+
     @Override
-    public ContainerRequest filter(ContainerRequest request) {
+    public ContainerRequest filter (ContainerRequest request) {
         String host = request.getHeaderValue(ContainerRequest.HOST);
         String ua = request.getHeaderValue(ContainerRequest.USER_AGENT);
 
@@ -37,15 +39,17 @@
         if (authentication != null && !authentication.isEmpty()) {
             TokenContext context;
             try {
-                context = userController
-                        .getTokenStatus(authentication, host, ua);
-            }catch (KustvaktException e) {
+                context = userController.getTokenStatus(authentication, host,
+                        ua);
+            }
+            catch (KustvaktException e) {
                 throw KustvaktResponseHandler.throwAuthenticationException();
             }
             // fixme: give reason why access is not granted?
-            if (context != null && context.isValid() && (
-                    (context.isSecureRequired() && request.isSecure())
-                            | !context.isSecureRequired()))
+            if (context != null
+                    && context.isValid()
+                    && ((context.isSecureRequired() && request.isSecure()) | !context
+                            .isSecureRequired()))
                 request.setSecurityContext(new KorAPContext(context));
             else
                 throw KustvaktResponseHandler.throwAuthenticationException();
@@ -53,13 +57,15 @@
         return request;
     }
 
+
     @Override
-    public ContainerRequestFilter getRequestFilter() {
+    public ContainerRequestFilter getRequestFilter () {
         return this;
     }
 
+
     @Override
-    public ContainerResponseFilter getResponseFilter() {
+    public ContainerResponseFilter getResponseFilter () {
         return null;
     }
 }
diff --git a/src/main/java/de/ids_mannheim/korap/web/filter/BlockingFilter.java b/src/main/java/de/ids_mannheim/korap/web/filter/BlockingFilter.java
index ff15fe1..4bdaa07 100644
--- a/src/main/java/de/ids_mannheim/korap/web/filter/BlockingFilter.java
+++ b/src/main/java/de/ids_mannheim/korap/web/filter/BlockingFilter.java
@@ -11,29 +11,33 @@
 /**
  * @author hanl
  * @date 11/12/2014
- * <p/>
- * endpoint filter to block access to an endpoint, in case no anonymous access should be allowed!
+ *       <p/>
+ *       endpoint filter to block access to an endpoint, in case no
+ *       anonymous access should be allowed!
  */
 @Provider
 public class BlockingFilter implements ContainerRequestFilter, ResourceFilter {
 
     @Override
-    public ContainerRequest filter(ContainerRequest request) {
+    public ContainerRequest filter (ContainerRequest request) {
         try {
             request.getUserPrincipal();
-        }catch (UnsupportedOperationException e) {
+        }
+        catch (UnsupportedOperationException e) {
             throw KustvaktResponseHandler.throwAuthenticationException();
         }
         return request;
     }
 
+
     @Override
-    public ContainerRequestFilter getRequestFilter() {
+    public ContainerRequestFilter getRequestFilter () {
         return this;
     }
 
+
     @Override
-    public ContainerResponseFilter getResponseFilter() {
+    public ContainerResponseFilter getResponseFilter () {
         return null;
     }
 }
diff --git a/src/main/java/de/ids_mannheim/korap/web/filter/DefaultFilter.java b/src/main/java/de/ids_mannheim/korap/web/filter/DefaultFilter.java
index 2626349..107c5e1 100644
--- a/src/main/java/de/ids_mannheim/korap/web/filter/DefaultFilter.java
+++ b/src/main/java/de/ids_mannheim/korap/web/filter/DefaultFilter.java
@@ -24,8 +24,9 @@
     @Context
     UriInfo info;
 
+
     @Override
-    public ContainerRequest filter(ContainerRequest request) {
+    public ContainerRequest filter (ContainerRequest request) {
         String host = request.getHeaderValue(ContainerRequest.HOST);
         String ua = request.getHeaderValue(ContainerRequest.USER_AGENT);
         String authentication = request
@@ -36,18 +37,20 @@
             Principal pr = null;
             try {
                 pr = request.getUserPrincipal();
-            }catch (UnsupportedOperationException e) {
+            }
+            catch (UnsupportedOperationException e) {
                 // do nothing
             }
             if (pr == null)
-                request.setSecurityContext(
-                        new KorAPContext(createShorterToken(host, ua)));
+                request.setSecurityContext(new KorAPContext(createShorterToken(
+                        host, ua)));
 
         }
         return request;
     }
 
-    private TokenContext createShorterToken(String host, String agent) {
+
+    private TokenContext createShorterToken (String host, String agent) {
         User demo = User.UserFactory.getDemoUser();
         TokenContext c = new TokenContext();
         c.setUsername(demo.getUsername());
@@ -59,13 +62,15 @@
         return c;
     }
 
+
     @Override
-    public ContainerRequestFilter getRequestFilter() {
+    public ContainerRequestFilter getRequestFilter () {
         return this;
     }
 
+
     @Override
-    public ContainerResponseFilter getResponseFilter() {
+    public ContainerResponseFilter getResponseFilter () {
         return null;
     }
 }
diff --git a/src/main/java/de/ids_mannheim/korap/web/filter/PiwikFilter.java b/src/main/java/de/ids_mannheim/korap/web/filter/PiwikFilter.java
index 3fdec88..fc32b67 100644
--- a/src/main/java/de/ids_mannheim/korap/web/filter/PiwikFilter.java
+++ b/src/main/java/de/ids_mannheim/korap/web/filter/PiwikFilter.java
@@ -39,8 +39,10 @@
     private Map<String, String> customVars;
     private AuthenticationManagerIface controller;
 
-    public PiwikFilter() {
-        controller = BeansFactory.getKustvaktContext().getAuthenticationManager();
+
+    public PiwikFilter () {
+        controller = BeansFactory.getKustvaktContext()
+                .getAuthenticationManager();
         ClientConfig config = new DefaultClientConfig();
         Client client = Client.create(config);
         if (jlog.isDebugEnabled())
@@ -50,7 +52,8 @@
         this.customVars = new HashMap<>();
     }
 
-    private void send(ContainerRequest request) {
+
+    private void send (ContainerRequest request) {
         Random random = new SecureRandom();
         MultivaluedMap<String, String> params = new MultivaluedMapImpl();
         params.add("idsite", "2");
@@ -66,7 +69,8 @@
         if (request.getAcceptableLanguages() != null)
             l = request.getAcceptableLanguages().get(0);
         try {
-            service.path("piwik/piwik.php").queryParam("idsite", "2")
+            service.path("piwik/piwik.php")
+                    .queryParam("idsite", "2")
                     .queryParam("rec", "1")
                     //todo check for empty container
                     .queryParam("_cvar", translateCustomData())
@@ -79,16 +83,17 @@
                     .header("Host", request.getHeaderValue("Host"))
                     .header("User-Agent", request.getHeaderValue("User-Agent"))
                     .acceptLanguage(l).method("GET");
-        }catch (Exception e) {
+        }
+        catch (Exception e) {
             // do nothing if piwik not available!
         }
     }
 
-    private String translateCustomData() {
+
+    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()) {
+        for (final Map.Entry<String, String> entry : this.customVars.entrySet()) {
             i++;
             final List<String> list = new ArrayList<String>();
             list.add(entry.getKey());
@@ -100,14 +105,15 @@
         json.add(customVariables);
 
         // remove unnecessary parent square brackets from JSON-string
-        String jsonString = json.toString()
-                .substring(1, json.toString().length() - 1);
+        String jsonString = json.toString().substring(1,
+                json.toString().length() - 1);
         customVars.clear();
         return jsonString;
     }
 
+
     @Override
-    public ContainerRequest filter(ContainerRequest request) {
+    public ContainerRequest filter (ContainerRequest request) {
         if (ENABLED) {
             try {
                 TokenContext context = (TokenContext) request
@@ -118,7 +124,8 @@
                         .getUserData(user, UserSettings.class);
                 if ((Boolean) data.get(Attributes.COLLECT_AUDITING_DATA))
                     customVars.put("username", context.getUsername());
-            }catch (KustvaktException | UnsupportedOperationException e) {
+            }
+            catch (KustvaktException | UnsupportedOperationException e) {
                 //do nothing
             }
             send(request);
@@ -126,13 +133,15 @@
         return request;
     }
 
+
     @Override
-    public ContainerRequestFilter getRequestFilter() {
+    public ContainerRequestFilter getRequestFilter () {
         return this;
     }
 
+
     @Override
-    public ContainerResponseFilter getResponseFilter() {
+    public ContainerResponseFilter getResponseFilter () {
         return null;
     }
 }
diff --git a/src/main/java/de/ids_mannheim/korap/web/service/BootupInterface.java b/src/main/java/de/ids_mannheim/korap/web/service/BootupInterface.java
index 8ed79af..f421e92 100644
--- a/src/main/java/de/ids_mannheim/korap/web/service/BootupInterface.java
+++ b/src/main/java/de/ids_mannheim/korap/web/service/BootupInterface.java
@@ -8,8 +8,9 @@
  */
 public interface BootupInterface {
 
-    void load() throws KustvaktException;
+    void load () throws KustvaktException;
 
-    Class<? extends BootupInterface>[] getDependencies();
+
+    Class<? extends BootupInterface>[] getDependencies ();
 
 }
diff --git a/src/main/java/de/ids_mannheim/korap/web/service/CollectionLoader.java b/src/main/java/de/ids_mannheim/korap/web/service/CollectionLoader.java
index aaf5146..a88cb1b 100644
--- a/src/main/java/de/ids_mannheim/korap/web/service/CollectionLoader.java
+++ b/src/main/java/de/ids_mannheim/korap/web/service/CollectionLoader.java
@@ -21,7 +21,7 @@
 public class CollectionLoader implements BootableBeanInterface {
 
     @Override
-    public void load(ContextHolder beans) throws KustvaktException {
+    public void load (ContextHolder beans) throws KustvaktException {
         SecurityManager.overrideProviders(beans);
         ResourceFinder.overrideProviders(beans);
 
@@ -64,8 +64,9 @@
                     "creating collections caused errors", result);
     }
 
+
     @Override
-    public Class<? extends BootableBeanInterface>[] getDependencies() {
+    public Class<? extends BootableBeanInterface>[] getDependencies () {
         return new Class[] { UserLoader.class };
     }
 }
diff --git a/src/main/java/de/ids_mannheim/korap/web/service/PolicyLoader.java b/src/main/java/de/ids_mannheim/korap/web/service/PolicyLoader.java
index f568c88..5765778 100644
--- a/src/main/java/de/ids_mannheim/korap/web/service/PolicyLoader.java
+++ b/src/main/java/de/ids_mannheim/korap/web/service/PolicyLoader.java
@@ -19,7 +19,7 @@
 public class PolicyLoader implements BootableBeanInterface {
 
     @Override
-    public void load(ContextHolder beans) throws KustvaktException {
+    public void load (ContextHolder beans) throws KustvaktException {
         SecurityManager.overrideProviders(beans);
         ResourceFinder.overrideProviders(beans);
 
@@ -47,8 +47,9 @@
         builder.create();
     }
 
+
     @Override
-    public Class<? extends BootableBeanInterface>[] getDependencies() {
+    public Class<? extends BootableBeanInterface>[] getDependencies () {
         return new Class[] { UserLoader.class };
     }
 }
diff --git a/src/main/java/de/ids_mannheim/korap/web/service/UserLoader.java b/src/main/java/de/ids_mannheim/korap/web/service/UserLoader.java
index 4ea11db..14614c6 100644
--- a/src/main/java/de/ids_mannheim/korap/web/service/UserLoader.java
+++ b/src/main/java/de/ids_mannheim/korap/web/service/UserLoader.java
@@ -12,15 +12,14 @@
 public class UserLoader implements BootableBeanInterface {
 
     @Override
-    public void load(ContextHolder beans) throws KustvaktException {
-        AuthenticationManagerIface manager = beans
-                .getAuthenticationManager();
-        manager.createUserAccount(KustvaktConfiguration.KUSTVAKT_USER,
-                false);
+    public void load (ContextHolder beans) throws KustvaktException {
+        AuthenticationManagerIface manager = beans.getAuthenticationManager();
+        manager.createUserAccount(KustvaktConfiguration.KUSTVAKT_USER, false);
     }
 
+
     @Override
-    public Class<? extends BootableBeanInterface>[] getDependencies() {
+    public Class<? extends BootableBeanInterface>[] getDependencies () {
         return new Class[0];
     }
 }
diff --git a/src/main/java/de/ids_mannheim/korap/web/service/full/AuthService.java b/src/main/java/de/ids_mannheim/korap/web/service/full/AuthService.java
index 27de612..23852b1 100644
--- a/src/main/java/de/ids_mannheim/korap/web/service/full/AuthService.java
+++ b/src/main/java/de/ids_mannheim/korap/web/service/full/AuthService.java
@@ -41,28 +41,32 @@
     private static Logger jlog = KustvaktLogger.getLogger(AuthService.class);
 
     private AuthenticationManagerIface controller;
+
+
     //    private SendMail mail;
 
-    public AuthService() {
+    public AuthService () {
         this.controller = BeansFactory.getKustvaktContext()
                 .getAuthenticationManager();
         //todo: replace with real property values
         //        this.mail = new SendMail(ExtConfiguration.getMailProperties());
     }
 
+
     /**
-     * represents json string with data. All GUI clients can access this method to get certain default values
+     * represents json string with data. All GUI clients can access
+     * this method to get certain default values
      * --> security checks?
-     *
+     * 
      * @return String
      */
     @Deprecated
     @GET
     @Path("bootstrap")
     @Produces(MediaType.APPLICATION_JSON)
-    public Response bootstrap() {
+    public Response bootstrap () {
         Map m = new HashMap();
-//        m.put("settings", new UserSettings().toObjectMap());
+        //        m.put("settings", new UserSettings().toObjectMap());
         m.put("ql", BeansFactory.getKustvaktContext().getConfiguration()
                 .getQueryLanguages());
         m.put("SortTypes", null); // types of sorting that are supported!
@@ -70,11 +74,12 @@
         return Response.ok(JsonUtils.toJSON(m)).build();
     }
 
+
     // fixme: moved to user
     @GET
     @Path("status")
     @ResourceFilters({ AuthFilter.class, DefaultFilter.class })
-    public Response getStatus(@Context SecurityContext context,
+    public Response getStatus (@Context SecurityContext context,
             @HeaderParam(ContainerRequest.USER_AGENT) String agent,
             @HeaderParam(ContainerRequest.HOST) String host,
             @Context Locale locale) {
@@ -82,9 +87,10 @@
         return Response.ok(ctx.toJSON()).build();
     }
 
+
     @GET
     @Path("apiToken")
-    public Response requestAPIToken(@Context HttpHeaders headers,
+    public Response requestAPIToken (@Context HttpHeaders headers,
             @Context Locale locale,
             @HeaderParam(ContainerRequest.USER_AGENT) String agent,
             @HeaderParam(ContainerRequest.HOST) String host,
@@ -103,8 +109,8 @@
             throw KustvaktResponseHandler
                     .throwit(StatusCodes.PERMISSION_DENIED);
 
-        if (values[0].equalsIgnoreCase("null") | values[1]
-                .equalsIgnoreCase("null"))
+        if (values[0].equalsIgnoreCase("null")
+                | values[1].equalsIgnoreCase("null"))
             // is actual an invalid request
             throw KustvaktResponseHandler.throwit(StatusCodes.REQUEST_INVALID);
 
@@ -119,21 +125,23 @@
             Userdata data = this.controller
                     .getUserData(user, UserDetails.class);
             // todo: is this necessary?
-//            attr.putAll(data.fields());
+            //            attr.putAll(data.fields());
             context = controller.createTokenContext(user, attr,
                     Attributes.API_AUTHENTICATION);
-        }catch (KustvaktException e) {
+        }
+        catch (KustvaktException e) {
             throw KustvaktResponseHandler.throwit(e);
         }
 
         return Response.ok(context.toResponse()).build();
     }
 
+
     // todo:
     @Deprecated
     @GET
     @Path("refresh")
-    public Response refresh(@Context SecurityContext context,
+    public Response refresh (@Context SecurityContext context,
             @Context Locale locale) {
         TokenContext ctx = (TokenContext) context.getUserPrincipal();
         TokenContext newContext;
@@ -148,9 +156,10 @@
         return null;
     }
 
+
     @GET
     @Path("sessionToken")
-    public Response requestSession(@Context HttpHeaders headers,
+    public Response requestSession (@Context HttpHeaders headers,
             @Context Locale locale,
             @HeaderParam(ContainerRequest.USER_AGENT) String agent,
             @HeaderParam(ContainerRequest.HOST) String host) {
@@ -172,8 +181,8 @@
             throw KustvaktResponseHandler
                     .throwit(StatusCodes.PERMISSION_DENIED);
 
-        if (values[0].equalsIgnoreCase("null") | values[1]
-                .equalsIgnoreCase("null"))
+        if (values[0].equalsIgnoreCase("null")
+                | values[1].equalsIgnoreCase("null"))
             throw KustvaktResponseHandler.throwit(StatusCodes.REQUEST_INVALID);
 
         Map<String, Object> attr = new HashMap<>();
@@ -184,19 +193,21 @@
             User user = controller.authenticate(0, values[0], values[1], attr);
             context = controller.createTokenContext(user, attr,
                     Attributes.SESSION_AUTHENTICATION);
-        }catch (KustvaktException e) {
+        }
+        catch (KustvaktException e) {
             throw KustvaktResponseHandler.throwit(e);
         }
         return Response.ok().entity(context.toJSON()).build();
     }
 
+
     // fixme: security issues: setup shibboleth compatible authentication system
     // todo: will be purged with token authentication --> shib is client side
     @POST
     @Consumes("application/x-www-form-urlencoded")
     @Produces("application/json")
     @Path("shibboleth")
-    public Response loginshib(@Context HttpHeaders headers,
+    public Response loginshib (@Context HttpHeaders headers,
             @Context Locale locale,
             @HeaderParam(ContainerRequest.USER_AGENT) String agent,
             @HeaderParam(ContainerRequest.HOST) String host,
@@ -215,23 +226,24 @@
             // todo: distinguish type KorAP/Shibusers
             User user = controller.authenticate(1, null, null, attr);
             context = controller.createTokenContext(user, attr, null);
-        }catch (KustvaktException e) {
+        }
+        catch (KustvaktException e) {
             throw KustvaktResponseHandler.throwit(e);
         }
         return Response.ok().entity(context.toJSON()).build();
     }
 
+
     //fixme: moved from userservice
     @GET
     @Path("logout")
-    @ResourceFilters({ AuthFilter.class, DefaultFilter.class,
-            PiwikFilter.class })
-    public Response logout(@Context SecurityContext ctx,
-            @Context Locale locale) {
+    @ResourceFilters({ AuthFilter.class, DefaultFilter.class, PiwikFilter.class })
+    public Response logout (@Context SecurityContext ctx, @Context Locale locale) {
         TokenContext context = (TokenContext) ctx.getUserPrincipal();
         try {
             controller.logout(context);
-        }catch (KustvaktException e) {
+        }
+        catch (KustvaktException e) {
             jlog.error("Logout Exception", e);
             throw KustvaktResponseHandler.throwit(e);
         }
diff --git a/src/main/java/de/ids_mannheim/korap/web/service/full/OAuthService.java b/src/main/java/de/ids_mannheim/korap/web/service/full/OAuthService.java
index 463e068..76bd9de 100644
--- a/src/main/java/de/ids_mannheim/korap/web/service/full/OAuthService.java
+++ b/src/main/java/de/ids_mannheim/korap/web/service/full/OAuthService.java
@@ -63,19 +63,21 @@
     private EncryptionIface crypto;
     private KustvaktConfiguration config;
 
-    public OAuthService() {
-        this.handler = new OAuth2Handler(
-                BeansFactory.getKustvaktContext().getPersistenceClient());
+
+    public OAuthService () {
+        this.handler = new OAuth2Handler(BeansFactory.getKustvaktContext()
+                .getPersistenceClient());
         this.controller = BeansFactory.getKustvaktContext()
                 .getAuthenticationManager();
         this.crypto = BeansFactory.getKustvaktContext().getEncryption();
         this.config = BeansFactory.getKustvaktContext().getConfiguration();
     }
 
+
     @POST
     @Path("unregister")
     @ResourceFilters({ AuthFilter.class, BlockingFilter.class })
-    public Response unregisterClient(@Context SecurityContext context,
+    public Response unregisterClient (@Context SecurityContext context,
             @HeaderParam("Host") String host,
             @QueryParam("client_secret") String secret,
             @QueryParam("client_id") String client_id) {
@@ -85,41 +87,43 @@
         try {
             this.handler.removeClient(info,
                     this.controller.getUser(ctx.getUsername()));
-        }catch (KustvaktException e) {
+        }
+        catch (KustvaktException e) {
             throw KustvaktResponseHandler.throwit(e);
         }
         return Response.ok().build();
     }
 
+
     @POST
     @Path("register")
     @ResourceFilters({ AuthFilter.class, BlockingFilter.class })
-    public Response registerClient(@Context SecurityContext context,
+    public Response registerClient (@Context SecurityContext context,
             @HeaderParam("Host") String host,
             @QueryParam("redirect_url") String rurl) {
         ClientInfo info = new ClientInfo(crypto.createID(),
                 crypto.createToken());
         info.setUrl(host);
         if (rurl == null)
-            throw KustvaktResponseHandler
-                    .throwit(StatusCodes.ILLEGAL_ARGUMENT, "Missing parameter!",
-                            "redirect_url");
+            throw KustvaktResponseHandler.throwit(StatusCodes.ILLEGAL_ARGUMENT,
+                    "Missing parameter!", "redirect_url");
         info.setRedirect_uri(rurl);
         TokenContext ctx = (TokenContext) context.getUserPrincipal();
         try {
             this.handler.registerClient(info,
                     this.controller.getUser(ctx.getUsername()));
-        }catch (KustvaktException e) {
+        }
+        catch (KustvaktException e) {
             throw KustvaktResponseHandler.throwit(e);
         }
         return Response.ok(info.toJSON()).build();
     }
 
+
     @GET
     @Path("info")
-    @ResourceFilters({ AuthFilter.class, DefaultFilter.class,
-            PiwikFilter.class })
-    public Response getStatus(@Context SecurityContext context,
+    @ResourceFilters({ AuthFilter.class, DefaultFilter.class, PiwikFilter.class })
+    public Response getStatus (@Context SecurityContext context,
             @QueryParam("scope") String scopes) {
         TokenContext ctx = (TokenContext) context.getUserPrincipal();
         Map<String, Object> details;
@@ -131,19 +135,21 @@
             Set<String> base_scope = StringUtils.toSet(scopes, " ");
             base_scope.retainAll(StringUtils.toSet(scopes));
             scopes = StringUtils.toString(base_scope);
-        }catch (KustvaktException e) {
+        }
+        catch (KustvaktException e) {
             throw KustvaktResponseHandler.throwit(e);
         }
         // json format with scope callback parameter
         // todo: add other scopes as well!
-        return Response.ok(JsonUtils
-                .toJSON(Scopes.mapScopes(scopes, details))).build();
+        return Response.ok(JsonUtils.toJSON(Scopes.mapScopes(scopes, details)))
+                .build();
     }
 
+
     @GET
     @Path("authorizations")
     @ResourceFilters({ AuthFilter.class, BlockingFilter.class })
-    public Response getAuthorizations(@Context SecurityContext context,
+    public Response getAuthorizations (@Context SecurityContext context,
             @HeaderParam(ContainerRequest.USER_AGENT) String agent,
             @HeaderParam(ContainerRequest.HOST) String host) {
         // works on all tokens, but access to native apps cannot be revoked!
@@ -155,11 +161,13 @@
             if (auths.isEmpty())
                 return Response.noContent().build();
             return Response.ok(JsonUtils.toJSON(auths)).build();
-        }catch (KustvaktException e) {
+        }
+        catch (KustvaktException e) {
             throw KustvaktResponseHandler.throwit(e);
         }
     }
 
+
     // todo: scopes for access_token are defined here
     // todo: if user already has an access token registered for client and application, then redirect to token endpoint to retrieve that token
     // todo: demo account should be disabled for this function --> if authentication failed, client must redirect to login url (little login window)
@@ -168,12 +176,12 @@
     @Consumes("application/x-www-form-urlencoded")
     @Produces("application/json")
     @ResourceFilters({ BlockingFilter.class })
-    public Response authorize(@Context HttpServletRequest request,
+    public Response authorize (@Context HttpServletRequest request,
             @Context SecurityContext context,
             @HeaderParam(ContainerRequest.USER_AGENT) String agent,
             @HeaderParam(ContainerRequest.HOST) String host,
-            MultivaluedMap<String, Object> form)
-            throws OAuthSystemException, URISyntaxException {
+            MultivaluedMap<String, Object> form) throws OAuthSystemException,
+            URISyntaxException {
         // user needs to be authenticated to this service!
         TokenContext c = (TokenContext) context.getUserPrincipal();
 
@@ -198,10 +206,10 @@
 
             try {
                 user = controller.getUser(c.getUsername());
-                Userdata data = controller
-                        .getUserData(user, UserDetails.class);
+                Userdata data = controller.getUserData(user, UserDetails.class);
                 user.addUserData(data);
-            }catch (KustvaktException e) {
+            }
+            catch (KustvaktException e) {
                 throw KustvaktResponseHandler.throwit(e);
             }
 
@@ -214,8 +222,9 @@
             ClientInfo info = this.handler
                     .getClient(oauthRequest.getClientId());
 
-            if (info == null || !info.getClient_secret()
-                    .equals(oauthRequest.getClientSecret())) {
+            if (info == null
+                    || !info.getClient_secret().equals(
+                            oauthRequest.getClientSecret())) {
                 OAuthResponse res = OAuthASResponse
                         .errorResponse(HttpServletResponse.SC_BAD_REQUEST)
                         .setError(OAuthError.CodeResponse.UNAUTHORIZED_CLIENT)
@@ -225,8 +234,7 @@
                         .entity(res.getBody()).build();
             }
 
-            if (!info.getRedirect_uri()
-                    .contains(oauthRequest.getRedirectURI())) {
+            if (!info.getRedirect_uri().contains(oauthRequest.getRedirectURI())) {
                 OAuthResponse res = OAuthASResponse
                         .errorResponse(HttpServletResponse.SC_BAD_REQUEST)
                         .setError(OAuthError.CodeResponse.INVALID_REQUEST)
@@ -236,15 +244,16 @@
                         .entity(res.getBody()).build();
             }
 
-            String accessToken = this.handler
-                    .getToken(oauthRequest.getClientId(), user.getId());
+            String accessToken = this.handler.getToken(
+                    oauthRequest.getClientId(), user.getId());
 
             //todo: test correct redirect and parameters
             if (accessToken != null) {
                 // fixme: correct status code?
                 OAuthASResponse.OAuthResponseBuilder builder = OAuthASResponse
                         .status(HttpServletResponse.SC_FOUND);
-                final OAuthResponse response = builder.location("/oauth2/token")
+                final OAuthResponse response = builder
+                        .location("/oauth2/token")
                         .setParam(OAuth.OAUTH_CLIENT_ID,
                                 oauthRequest.getClientId())
                         .setParam(OAuth.OAUTH_CLIENT_SECRET,
@@ -272,10 +281,11 @@
                 try {
                     AuthCodeInfo codeInfo = new AuthCodeInfo(
                             info.getClient_id(), authorizationCode);
-                    codeInfo.setScopes(StringUtils
-                            .toString(oauthRequest.getScopes(), " "));
+                    codeInfo.setScopes(StringUtils.toString(
+                            oauthRequest.getScopes(), " "));
                     this.handler.authorize(codeInfo, user);
-                }catch (KustvaktException e) {
+                }
+                catch (KustvaktException e) {
                     throw KustvaktResponseHandler.throwit(e);
                 }
                 builder.setParam(OAuth.OAUTH_RESPONSE_TYPE,
@@ -283,7 +293,8 @@
                 builder.setCode(authorizationCode);
                 response = builder.buildBodyMessage();
 
-            }else if (responseType.contains(ResponseType.TOKEN.toString())) {
+            }
+            else if (responseType.contains(ResponseType.TOKEN.toString())) {
                 OAuthASResponse.OAuthTokenResponseBuilder builder = OAuthASResponse
                         .tokenResponse(HttpServletResponse.SC_OK);
                 builder.setParam(OAuth.OAUTH_RESPONSE_TYPE,
@@ -308,12 +319,14 @@
                                 .createTokenContext(user, attr, null);
                         builder.setParam(new_context.getTokenType(),
                                 new_context.getToken());
-                    }catch (KustvaktException e) {
+                    }
+                    catch (KustvaktException e) {
                         throw KustvaktResponseHandler.throwit(e);
                     }
                 }
                 response = builder.buildBodyMessage();
-            }else {
+            }
+            else {
                 OAuthResponse res = OAuthASResponse
                         .errorResponse(HttpServletResponse.SC_BAD_REQUEST)
                         .setError(
@@ -338,30 +351,34 @@
 
             return Response.status(response.getResponseStatus())
                     .location(new URI(response.getLocationUri())).build();
-        }catch (OAuthProblemException e) {
+        }
+        catch (OAuthProblemException e) {
             final Response.ResponseBuilder responseBuilder = Response
                     .status(HttpServletResponse.SC_BAD_REQUEST);
             String redirectUri = e.getRedirectUri();
 
             if (OAuthUtils.isEmpty(redirectUri))
-                throw new WebApplicationException(responseBuilder
-                        .entity("OAuth callback url needs to be provided by client!!!\n")
-                        .build());
+                throw new WebApplicationException(
+                        responseBuilder
+                                .entity("OAuth callback url needs to be provided by client!!!\n")
+                                .build());
 
             final OAuthResponse response = OAuthASResponse
                     .errorResponse(HttpServletResponse.SC_BAD_REQUEST).error(e)
                     .location(redirectUri).buildQueryMessage();
             final URI location = new URI(response.getLocationUri());
             return responseBuilder.location(location).build();
-        }catch (OAuthSystemException | URISyntaxException | KustvaktException e) {
+        }
+        catch (OAuthSystemException | URISyntaxException | KustvaktException e) {
             e.printStackTrace();
         }
         return Response.noContent().build();
     }
 
+
     @POST
     @Path("revoke")
-    public Response revokeToken(@Context HttpServletRequest request,
+    public Response revokeToken (@Context HttpServletRequest request,
             @Context SecurityContext context,
             @HeaderParam(ContainerRequest.USER_AGENT) String agent,
             @HeaderParam(ContainerRequest.HOST) String host)
@@ -379,33 +396,37 @@
                         .entity(res.getBody()).build();
             }
 
-        }catch (KustvaktException e) {
+        }
+        catch (KustvaktException e) {
             e.printStackTrace();
             // fixme: do something
             /**
-             * final Response.ResponseBuilder responseBuilder = Response
-             .status(HttpServletResponse.SC_FOUND);
-             String redirectUri = e.getRedirectUri();
-
-             final OAuthResponse response = OAuthASResponse
-             .errorResponse(HttpServletResponse.SC_FOUND).error(e)
-             .location(redirectUri).buildQueryMessage();
-             final URI location = new URI(response.getLocationUri());
-             return responseBuilder.location(location).build();
+             * final Response.ResponseBuilder responseBuilder =
+             * Response
+             * .status(HttpServletResponse.SC_FOUND);
+             * String redirectUri = e.getRedirectUri();
+             * 
+             * final OAuthResponse response = OAuthASResponse
+             * .errorResponse(HttpServletResponse.SC_FOUND).error(e)
+             * .location(redirectUri).buildQueryMessage();
+             * final URI location = new
+             * URI(response.getLocationUri());
+             * return responseBuilder.location(location).build();
              */
         }
 
         return Response.ok().build();
     }
 
+
     @POST
     @Consumes("application/x-www-form-urlencoded")
     @Produces("application/json")
     @Path("token")
-    public Response requestToken(@Context HttpServletRequest request,
+    public Response requestToken (@Context HttpServletRequest request,
             @HeaderParam(ContainerRequest.USER_AGENT) String agent,
-            @HeaderParam(ContainerRequest.HOST) String host,
-            MultivaluedMap form) throws OAuthSystemException {
+            @HeaderParam(ContainerRequest.HOST) String host, MultivaluedMap form)
+            throws OAuthSystemException {
         boolean openid_valid = false;
         User user = null;
         OAuthTokenRequest oauthRequest;
@@ -415,11 +436,10 @@
         OAuthIssuer oauthIssuerImpl = new OAuthIssuerImpl(new MD5Generator());
         ClientInfo info;
         try {
-            oauthRequest = new OAuthTokenRequest(
-                    new FormRequestWrapper(request, form));
+            oauthRequest = new OAuthTokenRequest(new FormRequestWrapper(
+                    request, form));
 
-            if ((info = this.handler.getClient(oauthRequest.getClientId()))
-                    == null) {
+            if ((info = this.handler.getClient(oauthRequest.getClientId())) == null) {
                 OAuthResponse res = OAuthASResponse
                         .errorResponse(HttpServletResponse.SC_BAD_REQUEST)
                         .setError(OAuthError.TokenResponse.INVALID_CLIENT)
@@ -427,8 +447,9 @@
                         .buildJSONMessage();
                 return Response.status(res.getResponseStatus())
                         .entity(res.getBody()).build();
-            }else if (!info.getClient_secret()
-                    .equals(oauthRequest.getClientSecret())) {
+            }
+            else if (!info.getClient_secret().equals(
+                    oauthRequest.getClientSecret())) {
                 OAuthResponse res = OAuthASResponse
                         .errorResponse(HttpServletResponse.SC_UNAUTHORIZED)
                         .setError(OAuthError.TokenResponse.UNAUTHORIZED_CLIENT)
@@ -454,18 +475,21 @@
                     //can this be joined with the simple retrieval of access tokens?
                     // partially yes: auth code can be valid, even though no access token exists
                     // --> zero result set
-                    codeInfo = this.handler
-                            .getAuthorization(oauthRequest.getCode());
+                    codeInfo = this.handler.getAuthorization(oauthRequest
+                            .getCode());
                     if (codeInfo == null) {
-                        OAuthResponse res = OAuthASResponse.errorResponse(
-                                HttpServletResponse.SC_UNAUTHORIZED).setError(
-                                OAuthError.TokenResponse.INVALID_REQUEST)
+                        OAuthResponse res = OAuthASResponse
+                                .errorResponse(
+                                        HttpServletResponse.SC_UNAUTHORIZED)
+                                .setError(
+                                        OAuthError.TokenResponse.INVALID_REQUEST)
                                 .setErrorDescription(
                                         "Invalid authorization code\n")
                                 .buildJSONMessage();
                         return Response.status(res.getResponseStatus())
                                 .entity(res.getBody()).build();
-                    }else {
+                    }
+                    else {
                         openid_valid = codeInfo.getScopes().contains("openid");
                         String accessToken = oauthIssuerImpl.accessToken();
                         String refreshToken = oauthIssuerImpl.refreshToken();
@@ -475,20 +499,22 @@
                                         refreshToken, config.getTokenTTL());
 
                         builder.setTokenType(TokenType.BEARER.toString());
-                        builder.setExpiresIn(
-                                String.valueOf(config.getLongTokenTTL()));
+                        builder.setExpiresIn(String.valueOf(config
+                                .getLongTokenTTL()));
                         builder.setAccessToken(accessToken);
                         builder.setRefreshToken(refreshToken);
                     }
-                }catch (KustvaktException e) {
+                }
+                catch (KustvaktException e) {
                     throw KustvaktResponseHandler.throwit(e);
                 }
                 // todo: errors for invalid scopes or different scopes then during authorization request?
                 //todo ??
                 attr.put(Attributes.SCOPES, codeInfo.getScopes());
 
-            }else if (oauthRequest.getGrantType()
-                    .equalsIgnoreCase(GrantType.PASSWORD.toString())) {
+            }
+            else if (oauthRequest.getGrantType().equalsIgnoreCase(
+                    GrantType.PASSWORD.toString())) {
                 //fixme: via https; as basic auth header and only if client is native!
                 if (!info.isConfidential()) {
                     OAuthResponse res = OAuthASResponse
@@ -504,46 +530,47 @@
 
                 openid_valid = true;
                 try {
-                    user = controller
-                            .authenticate(0, oauthRequest.getUsername(),
-                                    oauthRequest.getPassword(), attr);
-                }catch (KustvaktException e) {
+                    user = controller.authenticate(0,
+                            oauthRequest.getUsername(),
+                            oauthRequest.getPassword(), attr);
+                }
+                catch (KustvaktException e) {
                     throw KustvaktResponseHandler.throwit(e);
                 }
 
                 try {
-                    String accessToken = this.handler
-                            .getToken(oauthRequest.getClientId(), user.getId());
+                    String accessToken = this.handler.getToken(
+                            oauthRequest.getClientId(), user.getId());
                     if (accessToken == null) {
                         String refresh = oauthIssuerImpl.refreshToken();
                         accessToken = oauthIssuerImpl.accessToken();
-                        this.handler
-                                .addToken(accessToken, refresh, user.getId(),
-                                        oauthRequest.getClientId(), StringUtils
-                                                .toString(oauthRequest
-                                                        .getScopes(), " "),
-                                        config.getLongTokenTTL());
+                        this.handler.addToken(accessToken, refresh, user
+                                .getId(), oauthRequest.getClientId(),
+                                StringUtils.toString(oauthRequest.getScopes(),
+                                        " "), config.getLongTokenTTL());
                         builder.setRefreshToken(refresh);
                     }
                     builder.setTokenType(TokenType.BEARER.toString());
-                    builder.setExpiresIn(
-                            String.valueOf(config.getLongTokenTTL()));
+                    builder.setExpiresIn(String.valueOf(config
+                            .getLongTokenTTL()));
                     builder.setAccessToken(accessToken);
 
-                }catch (KustvaktException e) {
+                }
+                catch (KustvaktException e) {
                     throw KustvaktResponseHandler.throwit(e);
                 }
             }
 
-            if (openid_valid && oauthRequest.getScopes()
-                    .contains(Scopes.Scope.openid.toString())) {
+            if (openid_valid
+                    && oauthRequest.getScopes().contains(
+                            Scopes.Scope.openid.toString())) {
                 try {
                     if (user == null)
-                        user = controller
-                                .authenticate(0, oauthRequest.getUsername(),
-                                        oauthRequest.getPassword(), attr);
-                    Userdata data = controller
-                            .getUserData(user, UserDetails.class);
+                        user = controller.authenticate(0,
+                                oauthRequest.getUsername(),
+                                oauthRequest.getPassword(), attr);
+                    Userdata data = controller.getUserData(user,
+                            UserDetails.class);
                     user.addUserData(data);
 
                     attr.put(Attributes.CLIENT_SECRET,
@@ -551,7 +578,8 @@
                     TokenContext c = controller.createTokenContext(user, attr,
                             Attributes.OPENID_AUTHENTICATION);
                     builder.setParam(c.getTokenType(), c.getToken());
-                }catch (KustvaktException e) {
+                }
+                catch (KustvaktException e) {
                     throw KustvaktResponseHandler.throwit(e);
                 }
             }
@@ -559,12 +587,14 @@
             OAuthResponse r = builder.buildJSONMessage();
             return Response.status(r.getResponseStatus()).entity(r.getBody())
                     .build();
-        }catch (OAuthProblemException ex) {
+        }
+        catch (OAuthProblemException ex) {
             OAuthResponse r = OAuthResponse.errorResponse(401).error(ex)
                     .buildJSONMessage();
             return Response.status(r.getResponseStatus()).entity(r.getBody())
                     .build();
-        }catch (OAuthSystemException e) {
+        }
+        catch (OAuthSystemException e) {
             e.printStackTrace();
             // todo: throw error
         }
diff --git a/src/main/java/de/ids_mannheim/korap/web/service/full/ResourceService.java b/src/main/java/de/ids_mannheim/korap/web/service/full/ResourceService.java
index cd10d64..73e3047 100644
--- a/src/main/java/de/ids_mannheim/korap/web/service/full/ResourceService.java
+++ b/src/main/java/de/ids_mannheim/korap/web/service/full/ResourceService.java
@@ -19,10 +19,7 @@
 import de.ids_mannheim.korap.security.ac.SecurityManager;
 import de.ids_mannheim.korap.user.TokenContext;
 import de.ids_mannheim.korap.user.User;
-import de.ids_mannheim.korap.utils.CollectionQueryBuilder3;
-import de.ids_mannheim.korap.utils.JsonUtils;
-import de.ids_mannheim.korap.utils.KustvaktLogger;
-import de.ids_mannheim.korap.utils.StringUtils;
+import de.ids_mannheim.korap.utils.*;
 import de.ids_mannheim.korap.web.ClientsHandler;
 import de.ids_mannheim.korap.web.KustvaktServer;
 import de.ids_mannheim.korap.web.SearchKrill;
@@ -58,7 +55,8 @@
     private KustvaktConfiguration config;
     private RewriteHandler processor;
 
-    public ResourceService() {
+
+    public ResourceService () {
         this.controller = BeansFactory.getKustvaktContext()
                 .getAuthenticationManager();
         this.config = BeansFactory.getKustvaktContext().getConfiguration();
@@ -73,10 +71,12 @@
         this.processor.insertBeans(BeansFactory.getKustvaktContext());
     }
 
+
     /**
      * retrieve resources dependent by type. determines based on
-     * the user's permission or resource owner if the user can access the resource.
-     *
+     * the user's permission or resource owner if the user can access
+     * the resource.
+     * 
      * @param locale
      * @param context
      * @param type
@@ -84,7 +84,7 @@
      */
     @GET
     @Path("{type}")
-    public Response getResources(@Context Locale locale,
+    public Response getResources (@Context Locale locale,
             @Context SecurityContext context, @PathParam("type") String type) {
         TokenContext ctx = (TokenContext) context.getUserPrincipal();
         Set<KustvaktResource> resources = new HashSet<>();
@@ -97,9 +97,10 @@
         try {
             User user = controller.getUser(ctx.getUsername());
 
-            resources = ResourceFinder
-                    .search(user, ResourceFactory.getResourceClass(type));
-        }catch (KustvaktException e) {
+            resources = ResourceFinder.search(user,
+                    ResourceFactory.getResourceClass(type));
+        }
+        catch (KustvaktException e) {
             throw KustvaktResponseHandler.throwit(e);
         }
 
@@ -126,15 +127,17 @@
         return Response.ok(JsonUtils.toJSON(values)).build();
     }
 
+
     @GET
     @Path("{type}/{id}/{child}")
-    public Response getResource(@Context SecurityContext context,
+    public Response getResource (@Context SecurityContext context,
             @Context Locale locale, @PathParam("type") String type,
             @PathParam("id") String id, @PathParam("child") String child) {
         return getResource(context, locale, type,
-                StringUtils.joinResources(id, child));
+                NamingUtils.joinResources(id, child));
     }
 
+
     /**
      * @param context
      * @param locale
@@ -144,7 +147,7 @@
      */
     @GET
     @Path("{type}/{id}")
-    public Response getResource(@Context SecurityContext context,
+    public Response getResource (@Context SecurityContext context,
             @Context Locale locale, @PathParam("type") String type,
             @PathParam("id") String id) {
         TokenContext ctx = (TokenContext) context.getUserPrincipal();
@@ -154,19 +157,21 @@
         try {
             User user = controller.getUser(ctx.getUsername());
             if (StringUtils.isInteger(id))
-                resource = resourceHandler
-                        .findbyIntId(Integer.valueOf(id), user);
+                resource = resourceHandler.findbyIntId(Integer.valueOf(id),
+                        user);
             else
                 resource = resourceHandler.findbyStrId(id, user,
                         ResourceFactory.getResourceClass(type));
-        }catch (KustvaktException e) {
+        }
+        catch (KustvaktException e) {
             throw KustvaktResponseHandler.throwit(e);
         }
         CollectionQueryBuilder3 query = new CollectionQueryBuilder3();
         if (cl_type.equals(VirtualCollection.class)) {
             VirtualCollection c = (VirtualCollection) resource;
             query.setBaseQuery((String) c.getData());
-        }else if (cl_type.equals(Corpus.class)) {
+        }
+        else if (cl_type.equals(Corpus.class)) {
             Corpus c = (Corpus) resource;
             query.addQuery("corpusID=" + c.getPersistentID());
         }
@@ -174,6 +179,7 @@
         return Response.ok(JsonUtils.toJSON(resource.toMap())).build();
     }
 
+
     //    @GET
     //    @Path("colloc")
     //    public Response getCollocationsAll(@Context SecurityContext ctx,
@@ -275,27 +281,30 @@
     //    }
     @POST
     @Path("colloc")
-    public Response getCollocationBase(@QueryParam("q") String query) {
+    public Response getCollocationBase (@QueryParam("q") String query) {
         String result;
         try {
             result = graphDBhandler.getResponse("distCollo", "q", query);
-        }catch (KustvaktException e) {
+        }
+        catch (KustvaktException e) {
             throw KustvaktResponseHandler.throwit(e);
         }
         return Response.ok(result).build();
     }
 
+
     @Deprecated
-    public Response postMatchFavorite() {
+    public Response postMatchFavorite () {
         return Response.ok().build();
     }
 
+
     @TRACE
     @Path("search")
-    public Response buildQuery(@Context Locale locale,
-            @Context SecurityContext securityContext, @QueryParam("q") String q,
-            @QueryParam("ql") String ql, @QueryParam("v") String v,
-            @QueryParam("context") String context,
+    public Response buildQuery (@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,
@@ -316,11 +325,12 @@
                 resources = ResourceFinder.searchPublic(Corpus.class);
             else
                 resources = ResourceFinder.search(user, Corpus.class);
-            System.out.println("RESOURCES FOUND "+ resources);
+            System.out.println("RESOURCES FOUND " + resources);
 
             for (KustvaktResource corpus : resources)
                 cquery.addQuery("corpusID=" + corpus.getPersistentID());
-        }catch (KustvaktException e) {
+        }
+        catch (KustvaktException e) {
             throw KustvaktResponseHandler.throwit(e);
         }
 
@@ -344,10 +354,12 @@
         return Response.ok(query).build();
     }
 
+
     /**
-     * currently only supports either no reference at all in which case all corpora are retrieved or a corpus name like "WPD".
+     * currently only supports either no reference at all in which
+     * case all corpora are retrieved or a corpus name like "WPD".
      * No virtual collections supported!
-     *
+     * 
      * @param locale
      * @param q
      * @param ql
@@ -360,10 +372,10 @@
     //todo: does cq have any sensable worth here?
     @TRACE
     @Path("{type}/{id}/search")
-    public Response buildQuery(@Context Locale locale,
-            @Context SecurityContext securityContext, @QueryParam("q") String q,
-            @QueryParam("ql") String ql, @QueryParam("v") String v,
-            @QueryParam("context") String context,
+    public Response buildQuery (@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,
@@ -385,8 +397,8 @@
             //todo: instead of throwing exception, build notification and rewrites into result query
             KustvaktResource resource;
             if (StringUtils.isInteger(id))
-                resource = this.resourceHandler
-                        .findbyIntId(Integer.valueOf(id), user);
+                resource = this.resourceHandler.findbyIntId(
+                        Integer.valueOf(id), user);
             else
                 resource = this.resourceHandler.findbyStrId(id, user,
                         ResourceFactory.getResourceClass(type));
@@ -396,8 +408,9 @@
             else if (resource instanceof Corpus)
                 cquery.addQuery("corpusID=" + resource.getPersistentID());
 
-        }catch (KustvaktException e) {
-            KustvaktLogger.ERROR_LOGGER.error("Exception encountered!", e);
+        }
+        catch (KustvaktException e) {
+            jlog.error("Exception encountered!", e);
             //throw KustvaktResponseHandler.throwit(e);
         }
 
@@ -421,9 +434,10 @@
         return Response.ok(ss.toJSON()).build();
     }
 
+
     @POST
     @Path("search")
-    public Response queryRaw(@Context SecurityContext context,
+    public Response queryRaw (@Context SecurityContext context,
             @Context Locale locale, @QueryParam("engine") String engine,
             String jsonld) {
         TokenContext ctx = (TokenContext) context.getUserPrincipal();
@@ -434,7 +448,8 @@
         try {
             User user = controller.getUser(ctx.getUsername());
             jsonld = this.processor.preProcess(jsonld, user);
-        }catch (KustvaktException e) {
+        }
+        catch (KustvaktException e) {
             throw KustvaktResponseHandler.throwit(e);
         }
         jlog.info("Serialized search: {}", jsonld);
@@ -444,9 +459,10 @@
         return Response.ok(result).build();
     }
 
+
     @GET
     @Path("search")
-    public Response searchbyNameAll(@Context SecurityContext securityContext,
+    public Response searchbyNameAll (@Context SecurityContext securityContext,
             @Context Locale locale, @QueryParam("q") String q,
             @QueryParam("ql") String ql, @QueryParam("v") String v,
             @QueryParam("context") String ctx,
@@ -466,8 +482,9 @@
             Set<Corpus> resources = ResourceFinder.search(user, Corpus.class);
             for (KustvaktResource resource : resources)
                 cquery.addQuery("corpusID=" + resource.getPersistentID());
-        }catch (KustvaktException e) {
-            KustvaktLogger.ERROR_LOGGER.error("Exception encountered!", e);
+        }
+        catch (KustvaktException e) {
+            jlog.error("Exception encountered!", e);
             throw KustvaktResponseHandler.throwit(e);
         }
         String result;
@@ -505,23 +522,27 @@
                     String.valueOf(meta.getSpanContext().getRight_size()));
             try {
                 result = this.graphDBhandler.getResponse(map, "distKwic");
-            }catch (KustvaktException e) {
+            }
+            catch (KustvaktException e) {
                 throw KustvaktResponseHandler.throwit(e);
             }
-        }else
+        }
+        else
             result = searchKrill.search(query);
         KustvaktLogger.QUERY_LOGGER.trace("The result set: {}", result);
         return Response.ok(result).build();
     }
 
+
     /**
      * String search, String ql, List<String> parents,
      * String cli, String cri, int cls, int crs,
      * int num, int page, boolean cutoff)
      * param context will be like this: context: "3-t,2-c"
      * <p/>
-     * id does not have to be an integer. name is also possible, in which case a type reference is required
-     *
+     * id does not have to be an integer. name is also possible, in
+     * which case a type reference is required
+     * 
      * @param securityContext
      * @param locale
      * @return
@@ -529,16 +550,16 @@
     //fixme: does not use policyrewrite!
     @GET
     @Path("/{type}/{id}/search")
-    public Response searchbyName(@Context SecurityContext securityContext,
+    public Response searchbyName (@Context SecurityContext securityContext,
             @Context Locale locale, @QueryParam("q") String query,
             @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, @PathParam("id") String id,
-            @PathParam("type") String type, @QueryParam("cq") String cq,
-            @QueryParam("raw") Boolean raw,
+            @QueryParam("page") Integer pageInteger,
+            @PathParam("id") String id, @PathParam("type") String type,
+            @QueryParam("cq") String cq, @QueryParam("raw") Boolean raw,
             @QueryParam("engine") String engine) {
         // ref is a virtual collection id!
         TokenContext context = (TokenContext) securityContext
@@ -559,8 +580,8 @@
 
                 KustvaktResource resource;
                 if (StringUtils.isInteger(id))
-                    resource = this.resourceHandler
-                            .findbyIntId(Integer.valueOf(id), user);
+                    resource = this.resourceHandler.findbyIntId(
+                            Integer.valueOf(id), user);
                 else
                     resource = this.resourceHandler.findbyStrId(id, user,
                             ResourceFactory.getResourceClass(type));
@@ -570,9 +591,9 @@
                 else if (resource instanceof Corpus)
                     builder.addQuery("corpusID=" + resource.getPersistentID());
                 else
-                    throw KustvaktResponseHandler
-                            .throwit(StatusCodes.ILLEGAL_ARGUMENT,
-                                    "Type parameter not supported", type);
+                    throw KustvaktResponseHandler.throwit(
+                            StatusCodes.ILLEGAL_ARGUMENT,
+                            "Type parameter not supported", type);
 
                 meta.addEntry("startIndex", pageIndex);
                 meta.addEntry("startPage", pageInteger);
@@ -598,39 +619,42 @@
 
                 if (eng.equals(KustvaktConfiguration.BACKENDS.NEO4J)) {
                     if (raw)
-                        throw KustvaktResponseHandler
-                                .throwit(StatusCodes.ILLEGAL_ARGUMENT,
-                                        "raw not supported!", null);
+                        throw KustvaktResponseHandler.throwit(
+                                StatusCodes.ILLEGAL_ARGUMENT,
+                                "raw not supported!", null);
                     MultivaluedMap map = new MultivaluedMapImpl();
                     map.add("q", query);
                     map.add("count", String.valueOf(pageLength));
-                    map.add("lctxs", String.valueOf(
-                            meta.getSpanContext().getLeft_size()));
-                    map.add("rctxs", String.valueOf(
-                            meta.getSpanContext().getRight_size()));
+                    map.add("lctxs", String.valueOf(meta.getSpanContext()
+                            .getLeft_size()));
+                    map.add("rctxs", String.valueOf(meta.getSpanContext()
+                            .getRight_size()));
                     result = this.graphDBhandler.getResponse(map, "distKwic");
-                }else
+                }
+                else
                     result = searchKrill.search(query);
 
-            }catch (Exception e) {
-                KustvaktLogger.ERROR_LOGGER
-                        .error("Exception for serialized query: " + query, e);
+            }
+            catch (Exception e) {
+                jlog.error("Exception for serialized query: " + query, e);
                 throw KustvaktResponseHandler
                         .throwit(500, e.getMessage(), null);
             }
 
             KustvaktLogger.QUERY_LOGGER.trace("The result set: {}", result);
             return Response.ok(result).build();
-        }catch (KustvaktException e) {
-            KustvaktLogger.ERROR_LOGGER.error("Exception encountered!", e);
+        }
+        catch (KustvaktException e) {
+            jlog.error("Exception encountered!", e);
             throw KustvaktResponseHandler.throwit(e);
         }
 
     }
 
+
     @POST
     @Path("stats")
-    public Response getStats(@Context SecurityContext context,
+    public Response getStats (@Context SecurityContext context,
             @Context Locale locale, String json) {
         CollectionQueryBuilder3 builder = new CollectionQueryBuilder3();
         builder.addQuery(json);
@@ -642,18 +666,20 @@
         return Response.ok(stats).build();
     }
 
+
     @GET
     @Path("{type}/{id}/{child}/stats")
-    public Response getStatisticsbyName(@Context SecurityContext context,
+    public Response getStatisticsbyName (@Context SecurityContext context,
             @Context Locale locale, @PathParam("type") String type,
             @PathParam("id") String id, @PathParam("child") String child) {
         return getStatisticsbyId(context, locale, type,
-                StringUtils.joinResources(id, child));
+                NamingUtils.joinResources(id, child));
     }
 
+
     @GET
     @Path("{type}/{id}/stats")
-    public Response getStatisticsbyId(@Context SecurityContext context,
+    public Response getStatisticsbyId (@Context SecurityContext context,
             @Context Locale locale, @PathParam("type") String type,
             @PathParam("id") String id) {
         TokenContext ctx = (TokenContext) context.getUserPrincipal();
@@ -669,8 +695,8 @@
             User user = controller.getUser(ctx.getUsername());
             KustvaktResource resource;
             if (StringUtils.isInteger(id))
-                resource = this.resourceHandler
-                        .findbyIntId(Integer.valueOf(id), user);
+                resource = this.resourceHandler.findbyIntId(
+                        Integer.valueOf(id), user);
             else
                 resource = this.resourceHandler.findbyStrId(id, user,
                         ResourceFactory.getResourceClass(type));
@@ -679,18 +705,21 @@
             CollectionQueryBuilder3 query = new CollectionQueryBuilder3();
             if (resource instanceof VirtualCollection) {
                 query.setBaseQuery(resource.getData());
-            }else if (resource instanceof Corpus) {
+            }
+            else if (resource instanceof Corpus) {
                 query.addQuery("corpusID=" + resource.getName());
             }
 
             // rewrite process
             String qstr = processor.preProcess(query.toJSON(), user);
             return Response.ok(searchKrill.getStatistics(qstr)).build();
-        }catch (KustvaktException e) {
+        }
+        catch (KustvaktException e) {
             throw KustvaktResponseHandler.throwit(e);
         }
     }
 
+
     /**
      * @param context
      * @param locale
@@ -700,28 +729,30 @@
     //todo: rename
     @POST
     @Path("collection_raw")
-    public Response createRawCollection(@Context SecurityContext context,
+    public Response createRawCollection (@Context SecurityContext context,
             @Context Locale locale, String json) {
         TokenContext c = (TokenContext) context.getUserPrincipal();
         VirtualCollection cache = ResourceFactory.getCachedCollection(json);
         User user;
         try {
             user = controller.getUser(c.getUsername());
-        }catch (KustvaktException e) {
+        }
+        catch (KustvaktException e) {
             throw KustvaktResponseHandler.throwit(e);
         }
 
-        VirtualCollection tmp = resourceHandler
-                .getCache(cache.getId(), VirtualCollection.class);
+        VirtualCollection tmp = resourceHandler.getCache(cache.getId(),
+                VirtualCollection.class);
         if (tmp == null) {
             CollectionQueryBuilder3 cquery = new CollectionQueryBuilder3()
                     .setBaseQuery((String) cache.getData());
-            String query = this.processor
-                    .preProcess((String) cache.getData(), user);
+            String query = this.processor.preProcess((String) cache.getData(),
+                    user);
             String stats = searchKrill.getStatistics(query);
             cache.setStats(JsonUtils.readSimple(stats, Map.class));
             resourceHandler.cache(cache);
-        }else
+        }
+        else
             cache = tmp;
 
         Map vals = new HashMap();
@@ -730,44 +761,47 @@
         return Response.ok(JsonUtils.toJSON(vals)).build();
     }
 
+
     @POST
     @Path("{type}/{id}")
-    public Response updateResource(@Context SecurityContext context,
+    public Response updateResource (@Context SecurityContext context,
             @Context Locale locale, @PathParam("type") String type,
             @PathParam("id") String id, String json) {
         TokenContext ctx = (TokenContext) context.getUserPrincipal();
         User user;
         try {
             user = controller.getUser(ctx.getUsername());
-            KustvaktResource resource = this.resourceHandler
-                    .findbyStrId(id, user,
-                            ResourceFactory.getResourceClass(type));
+            KustvaktResource resource = this.resourceHandler.findbyStrId(id,
+                    user, ResourceFactory.getResourceClass(type));
             JsonNode node = JsonUtils.readTree(json);
 
             if (node.isObject() && !node.path("name").isMissingNode()) {
                 String s = node.path("name").asText();
                 if (s.equals("null") || s.isEmpty())
-                    throw KustvaktResponseHandler
-                            .throwit(StatusCodes.ILLEGAL_ARGUMENT,
-                                    "Name must be set", "name");
+                    throw KustvaktResponseHandler.throwit(
+                            StatusCodes.ILLEGAL_ARGUMENT, "Name must be set",
+                            "name");
                 resource.setName(s);
             }
 
             if (node.isObject() && !node.path("description").isMissingNode())
                 resource.setDescription(node.path("description").asText());
             this.resourceHandler.updateResources(user, resource);
-        }catch (KustvaktException e) {
-            KustvaktLogger.ERROR_LOGGER.error("Exception encountered!", e);
+        }
+        catch (KustvaktException e) {
+            jlog.error("Exception encountered!", e);
             throw KustvaktResponseHandler.throwit(e);
         }
         return Response.ok().build();
     }
 
+
     //todo: change or deprecate
     @POST
     @Path("nv/{type}")
-    public Response storeResource(@Context SecurityContext context,
-            @Context Locale locale, @PathParam("type") String type,
+    public Response storeResource (@Context SecurityContext context,
+            @Context Locale locale,
+            @PathParam("type") String type,
             @QueryParam("name") String name,
             @QueryParam("description") String description,
             // deprecate -> if you want to store a resource based on another, build the query first yourself or via a function
@@ -782,24 +816,27 @@
         User user;
         try {
             user = controller.getUser(ctx.getUsername());
-        }catch (KustvaktException e) {
-            KustvaktLogger.ERROR_LOGGER.error("Exception encountered!", e);
+        }
+        catch (KustvaktException e) {
+            jlog.error("Exception encountered!", e);
             throw KustvaktResponseHandler.throwit(e);
         }
-        if (VirtualCollection.class
-                .equals(ResourceFactory.getResourceClass(type))) {
+        if (VirtualCollection.class.equals(ResourceFactory
+                .getResourceClass(type))) {
             VirtualCollection cachetmp, collection;
 
             String base;
             if (reference != null && !reference.equals("null")) {
                 try {
-                    base = (String) resourceHandler.findbyStrId(reference, user,
-                            VirtualCollection.class).getData();
-                }catch (KustvaktException e) {
+                    base = (String) resourceHandler.findbyStrId(reference,
+                            user, VirtualCollection.class).getData();
+                }
+                catch (KustvaktException e) {
                     throw KustvaktResponseHandler.throwit(e);
                 }
 
-            }else if (query != null)
+            }
+            else if (query != null)
                 base = query;
             else
                 // todo: throw exception response for no resource to save!
@@ -811,8 +848,8 @@
             cachetmp = ResourceFactory.getCachedCollection(cquery.toJSON());
 
             // see if collection was cached!
-            VirtualCollection tmp = resourceHandler
-                    .getCache(cachetmp.getId(), VirtualCollection.class);
+            VirtualCollection tmp = resourceHandler.getCache(cachetmp.getId(),
+                    VirtualCollection.class);
             // if not cached, fill with stats values
             if (tmp == null) {
                 String stats = searchKrill.getStatistics(cquery.toJSON());
@@ -820,17 +857,18 @@
             }
 
             if (!cache) {
-                collection = ResourceFactory
-                        .getPermanentCollection(cachetmp, name, description);
+                collection = ResourceFactory.getPermanentCollection(cachetmp,
+                        name, description);
                 vals = collection.toMap();
                 try {
                     resourceHandler.storeResources(user, collection);
-                }catch (KustvaktException e) {
-                    KustvaktLogger.ERROR_LOGGER
-                            .error("Exception encountered!", e);
+                }
+                catch (KustvaktException e) {
+                    jlog.error("Exception encountered!", e);
                     throw KustvaktResponseHandler.throwit(e);
                 }
-            }else {
+            }
+            else {
                 resourceHandler.cache(cachetmp);
                 vals = cachetmp.toMap();
             }
@@ -838,9 +876,11 @@
         return Response.ok(JsonUtils.toJSON(vals)).build();
     }
 
+
     /**
-     * store a virtual collection. Retrieve cached entry first and then store VCollection
-     *
+     * store a virtual collection. Retrieve cached entry first and
+     * then store VCollection
+     * 
      * @param context
      * @param locale
      * @param query
@@ -848,7 +888,7 @@
      */
     @POST
     @Path("{type}")
-    public Response storeResource(@Context SecurityContext context,
+    public Response storeResource (@Context SecurityContext context,
             @Context Locale locale, @PathParam("type") String type,
             @QueryParam("filter") Boolean filter,
             @QueryParam("name") String name,
@@ -864,12 +904,13 @@
         User user;
         try {
             user = controller.getUser(ctx.getUsername());
-        }catch (KustvaktException e) {
-            KustvaktLogger.ERROR_LOGGER.error("Exception encountered!", e);
+        }
+        catch (KustvaktException e) {
+            jlog.error("Exception encountered!", e);
             throw KustvaktResponseHandler.throwit(e);
         }
-        if (VirtualCollection.class
-                .equals(ResourceFactory.getResourceClass(type))) {
+        if (VirtualCollection.class.equals(ResourceFactory
+                .getResourceClass(type))) {
 
             VirtualCollection cachetmp, collection;
             // todo: ??
@@ -877,10 +918,10 @@
             CollectionQueryBuilder3 cquery = new CollectionQueryBuilder3();
             if (reference != null && !reference.equals("null")) {
                 try {
-                    cquery.addQuery((String) resourceHandler
-                            .findbyStrId(reference, user,
-                                    VirtualCollection.class).getData());
-                }catch (KustvaktException e) {
+                    cquery.addQuery((String) resourceHandler.findbyStrId(
+                            reference, user, VirtualCollection.class).getData());
+                }
+                catch (KustvaktException e) {
                     throw KustvaktResponseHandler.throwit(e);
                 }
                 // todo: 11.01
@@ -897,8 +938,8 @@
             cachetmp = ResourceFactory.getCachedCollection(cquery.toJSON());
 
             // see if vc was cached!
-            VirtualCollection tmp = resourceHandler
-                    .getCache(cachetmp.getId(), VirtualCollection.class);
+            VirtualCollection tmp = resourceHandler.getCache(cachetmp.getId(),
+                    VirtualCollection.class);
 
             // if not cached, fill with stats values
             if (tmp == null) {
@@ -907,17 +948,18 @@
             }
 
             if (!cache && !User.UserFactory.isDemo(ctx.getUsername())) {
-                collection = ResourceFactory
-                        .getPermanentCollection(cachetmp, name, description);
+                collection = ResourceFactory.getPermanentCollection(cachetmp,
+                        name, description);
                 vals = collection.toMap();
                 try {
                     resourceHandler.storeResources(user, collection);
-                }catch (KustvaktException e) {
-                    KustvaktLogger.ERROR_LOGGER
-                            .error("Exception encountered!", e);
+                }
+                catch (KustvaktException e) {
+                    jlog.error("Exception encountered!", e);
                     throw KustvaktResponseHandler.throwit(e);
                 }
-            }else {
+            }
+            else {
                 resourceHandler.cache(cachetmp);
                 vals = cachetmp.toMap();
             }
@@ -925,18 +967,20 @@
         return Response.ok(JsonUtils.toJSON(vals)).build();
     }
 
+
     @DELETE
     @Path("{type}/{id}/{child}")
-    public Response deleteResourcewChild(@Context SecurityContext context,
+    public Response deleteResourceChild (@Context SecurityContext context,
             @Context Locale locale, @PathParam("type") String type,
             @PathParam("id") String id, @PathParam("child") String child) {
         return deleteResource(context, locale, type,
-                StringUtils.joinResources(id, child));
+                NamingUtils.joinResources(id, child));
     }
 
+
     @DELETE
     @Path("{type}/{id}")
-    public Response deleteResource(@Context SecurityContext context,
+    public Response deleteResource (@Context SecurityContext context,
             @Context Locale locale, @PathParam("type") String type,
             @PathParam("id") String id) {
         TokenContext ctx = (TokenContext) context.getUserPrincipal();
@@ -948,18 +992,20 @@
             r.setPersistentID(id);
             //todo: eliminate the need to find the resource first!
             resourceHandler.deleteResources(user, r);
-        }catch (KustvaktException e) {
-            KustvaktLogger.ERROR_LOGGER.error("Exception encountered!", e);
+        }
+        catch (KustvaktException e) {
+            jlog.error("Exception encountered!", e);
             throw KustvaktResponseHandler.throwit(e);
         }
 
         return Response.ok().build();
     }
 
+
     //fixme: only allowed for corpus?!
     @GET
     @Path("/corpus/{id}/{docid}/{rest}/matchInfo")
-    public Response getMatchInfo(@Context SecurityContext ctx,
+    public Response getMatchInfo (@Context SecurityContext ctx,
             @Context Locale locale, @PathParam("id") String id,
             @PathParam("docid") String docid, @PathParam("rest") String rest,
             @QueryParam("foundry") Set<String> foundries,
@@ -977,8 +1023,9 @@
         User user;
         try {
             user = controller.getUser(tokenContext.getUsername());
-        }catch (KustvaktException e) {
-            KustvaktLogger.ERROR_LOGGER.error("Exception encountered!", e);
+        }
+        catch (KustvaktException e) {
+            jlog.error("Exception encountered!", e);
             throw KustvaktResponseHandler.throwit(e);
         }
 
@@ -997,33 +1044,36 @@
                     if (!manager.isAllowed())
                         continue;
 
-                    String[] sep = StringUtils.splitAnnotations(spl);
+                    String[] sep = NamingUtils.splitAnnotations(spl);
                     if (spl != null) {
                         f_list.add(sep[0]);
                         l_list.add(sep[1]);
                     }
-                    results = searchKrill
-                            .getMatch(matchid, new ArrayList<>(f_list),
-                                    new ArrayList<>(l_list), spans, false,
-                                    true);
-                }catch (EmptyResultException e) {
-                    throw KustvaktResponseHandler
-                            .throwit(StatusCodes.EMPTY_RESULTS,
-                                    "Resource not found!", id);
-                }catch (NotAuthorizedException e) {
-                    throw KustvaktResponseHandler
-                            .throwit(StatusCodes.PERMISSION_DENIED,
-                                    "Permission denied", id);
+                    results = searchKrill.getMatch(matchid, new ArrayList<>(
+                            f_list), new ArrayList<>(l_list), spans, false,
+                            true);
+                }
+                catch (EmptyResultException e) {
+                    throw KustvaktResponseHandler.throwit(
+                            StatusCodes.EMPTY_RESULTS, "Resource not found!",
+                            id);
+                }
+                catch (NotAuthorizedException e) {
+                    throw KustvaktResponseHandler.throwit(
+                            StatusCodes.PERMISSION_DENIED, "Permission denied",
+                            id);
                 }
 
             }
             // all foundries shall be returned
-        }else if (foundries != null && foundries.contains("*")) {
+        }
+        else if (foundries != null && foundries.contains("*")) {
             Set<Layer> resources;
             try {
                 resources = ResourceFinder.search(user, Layer.class);
-            }catch (KustvaktException e) {
-                KustvaktLogger.ERROR_LOGGER.error("Exception encountered!", e);
+            }
+            catch (KustvaktException e) {
+                jlog.error("Exception encountered!", e);
                 throw KustvaktResponseHandler.throwit(e);
             }
             // returns foundries and layers.
@@ -1031,7 +1081,7 @@
             foundries = new HashSet<>();
             layers = new HashSet<>();
             for (Layer r : resources) {
-                String[] spl = StringUtils.splitAnnotations(r.getName());
+                String[] spl = NamingUtils.splitAnnotations(r.getName());
                 if (spl != null) {
                     foundries.add(spl[0]);
                     layers.add(spl[1]);
@@ -1045,19 +1095,21 @@
                                 new ArrayList<>(layers), spans, false, true);
             else
                 results = searchKrill.getMatch(matchid);
-        }catch (Exception e) {
-            KustvaktLogger.ERROR_LOGGER.error("Exception encountered!", e);
-            throw KustvaktResponseHandler
-                    .throwit(StatusCodes.ILLEGAL_ARGUMENT, e.getMessage(), "");
+        }
+        catch (Exception e) {
+            jlog.error("Exception encountered!", e);
+            throw KustvaktResponseHandler.throwit(StatusCodes.ILLEGAL_ARGUMENT,
+                    e.getMessage(), "");
         }
         return Response.ok(results).build();
     }
 
+
     // todo:?!
     @POST
     @Path("match/{id}/save")
     @Deprecated
-    public Response save(@PathParam("{id}") String id,
+    public Response save (@PathParam("{id}") String id,
             @QueryParam("d") String description,
             @Context SecurityContext context) {
         TokenContext ctx = (TokenContext) context.getUserPrincipal();
@@ -1075,28 +1127,30 @@
         return Response.ok().build();
     }
 
+
     @GET
     @Path("matches")
     @Deprecated
-    public Response get(@Context SecurityContext context) {
+    public Response get (@Context SecurityContext context) {
         TokenContext ctx = (TokenContext) context.getUserPrincipal();
         //todo save match for user and later retrieval!
         //todo: retrieve matches in range! --choices: date, document, id (matchid)
         return Response.ok().build();
     }
 
+
     @POST
     @Path("match/{id}/delete")
     @Deprecated
-    public Response remove(@PathParam("{id}") String id,
+    public Response remove (@PathParam("{id}") String id,
             @Context SecurityContext context) {
         TokenContext ctx = (TokenContext) context.getUserPrincipal();
         // save match for user and later retrieval!
         try {
-            this.resourceHandler
-                    .deleteResources(this.controller.getUser(ctx.getUsername()),
-                            id);
-        }catch (KustvaktException e) {
+            this.resourceHandler.deleteResources(
+                    this.controller.getUser(ctx.getUsername()), id);
+        }
+        catch (KustvaktException e) {
             throw KustvaktResponseHandler.throwit(e);
         }
 
diff --git a/src/main/java/de/ids_mannheim/korap/web/service/full/UserService.java b/src/main/java/de/ids_mannheim/korap/web/service/full/UserService.java
index 45999fc..9273171 100644
--- a/src/main/java/de/ids_mannheim/korap/web/service/full/UserService.java
+++ b/src/main/java/de/ids_mannheim/korap/web/service/full/UserService.java
@@ -40,26 +40,27 @@
     private static Logger jlog = LoggerFactory.getLogger(UserService.class);
     private AuthenticationManagerIface controller;
 
-    private
-    @Context
+    private @Context
     UriInfo info;
 
-    public UserService() {
+
+    public UserService () {
         this.controller = BeansFactory.getKustvaktContext()
                 .getAuthenticationManager();
     }
 
+
     // fixme: json contains password in clear text. Encrypt request?
     // fixme: should also collect service exception, not just db exception!
     @POST
     @Path("register")
     @Consumes(MediaType.APPLICATION_FORM_URLENCODED)
-    public Response signUp(
+    public Response signUp (
             @HeaderParam(ContainerRequest.USER_AGENT) String agent,
             @HeaderParam(ContainerRequest.HOST) String host,
             @Context Locale locale, MultivaluedMap form_values) {
-        Map<String, Object> wrapper = FormRequestWrapper
-                .toMap(form_values, true);
+        Map<String, Object> wrapper = FormRequestWrapper.toMap(form_values,
+                true);
 
         wrapper.put(Attributes.HOST, host);
         wrapper.put(Attributes.USER_AGENT, agent);
@@ -71,15 +72,15 @@
                     .path("confirm");
 
             user = controller.createUserAccount(wrapper, true);
-        }catch (KustvaktException e) {
+        }
+        catch (KustvaktException e) {
             throw KustvaktResponseHandler.throwit(e);
         }
         URIParam uri = user.getField(URIParam.class);
         if (uri.hasValues()) {
             uriBuilder.queryParam(Attributes.QUERY_PARAM_URI,
-                    uri.getUriFragment())
-                    .queryParam(Attributes.QUERY_PARAM_USER,
-                            user.getUsername());
+                    uri.getUriFragment()).queryParam(
+                    Attributes.QUERY_PARAM_USER, user.getUsername());
             jlog.info("registration was successful for user '{}'",
                     form_values.get(Attributes.USERNAME));
             Map object = new HashMap();
@@ -87,7 +88,8 @@
             object.put("uri_expiration",
                     TimeUtils.format(uri.getUriExpiration()));
             return Response.ok(JsonUtils.toJSON(object)).build();
-        }else {
+        }
+        else {
             // todo: return error or warning
             throw KustvaktResponseHandler.throwit(StatusCodes.ILLEGAL_ARGUMENT,
                     "failed to validate uri paramter", "confirmation fragment");
@@ -95,13 +97,14 @@
 
     }
 
+
     //todo: password update in special function? --> password reset only!
     @POST
     @Path("update")
     @Consumes(MediaType.APPLICATION_FORM_URLENCODED)
-    @ResourceFilters({ AuthFilter.class, DefaultFilter.class, PiwikFilter.class,
-            BlockingFilter.class })
-    public Response updateAccount(@Context SecurityContext ctx, String json) {
+    @ResourceFilters({ AuthFilter.class, DefaultFilter.class,
+            PiwikFilter.class, BlockingFilter.class })
+    public Response updateAccount (@Context SecurityContext ctx, String json) {
         TokenContext context = (TokenContext) ctx.getUserPrincipal();
         try {
             User user = controller.getUser(context.getUsername());
@@ -113,41 +116,43 @@
             //                    .checkPasswordAllowance(ident, values.getPassword(),
             //                            node.path("new_password").asText());
             //            controller.updateAccount(user);
-        }catch (KustvaktException e) {
+        }
+        catch (KustvaktException e) {
             throw KustvaktResponseHandler.throwit(e);
         }
         return Response.ok().build();
     }
 
+
     @GET
     @Path("confirm")
     @Produces(MediaType.TEXT_HTML)
-    public Response confirmRegistration(@QueryParam("uri") String uritoken,
+    public Response confirmRegistration (@QueryParam("uri") String uritoken,
             @Context Locale locale, @QueryParam("user") String username) {
         if (uritoken == null || uritoken.isEmpty())
-            throw KustvaktResponseHandler
-                    .throwit(StatusCodes.ILLEGAL_ARGUMENT, "parameter missing",
-                            "uri parameter");
+            throw KustvaktResponseHandler.throwit(StatusCodes.ILLEGAL_ARGUMENT,
+                    "parameter missing", "uri parameter");
         if (username == null || username.isEmpty())
-            throw KustvaktResponseHandler
-                    .throwit(StatusCodes.ILLEGAL_ARGUMENT, "parameter missing",
-                            "Username");
+            throw KustvaktResponseHandler.throwit(StatusCodes.ILLEGAL_ARGUMENT,
+                    "parameter missing", "Username");
 
         try {
             controller.confirmRegistration(uritoken, username);
-        }catch (KustvaktException e) {
+        }
+        catch (KustvaktException e) {
             e.printStackTrace();
             throw KustvaktResponseHandler.throwit(e);
         }
         return Response.ok("success").build();
     }
 
+
     // todo: auditing!
     @POST
     @Path("requestReset")
     @Produces(MediaType.TEXT_HTML)
     @Consumes(MediaType.APPLICATION_FORM_URLENCODED)
-    public Response requestPasswordReset(@Context Locale locale, String json) {
+    public Response requestPasswordReset (@Context Locale locale, String json) {
         JsonNode node = JsonUtils.readTree(json);
         StringBuilder builder = new StringBuilder();
         String username, email;
@@ -173,7 +178,8 @@
                     .append(objects[0]);
             builder.append(Attributes.QUERY_PARAM_USER).append("=")
                     .append(username);
-        }catch (KustvaktException e) {
+        }
+        catch (KustvaktException e) {
             jlog.error("Eoxception encountered!", e);
             throw KustvaktResponseHandler.throwit(e);
         }
@@ -184,28 +190,31 @@
         return Response.ok(JsonUtils.toJSON(obj)).build();
     }
 
+
     @POST
     @Path("reset")
     @Produces(MediaType.TEXT_HTML)
     @Consumes(MediaType.APPLICATION_FORM_URLENCODED)
-    public Response resetPassword(
+    public Response resetPassword (
             @QueryParam(Attributes.QUERY_PARAM_URI) String uri,
             @QueryParam(Attributes.QUERY_PARAM_USER) String username,
             @Context HttpHeaders headers, String passphrase) {
         try {
             controller.resetPassword(uri, username, passphrase);
-        }catch (KustvaktException e) {
+        }
+        catch (KustvaktException e) {
             jlog.error("Exception encountered!", e);
             return Response.notModified().build();
         }
         return Response.ok().build();
     }
 
+
     @GET
     @Path("info")
-    @ResourceFilters({ AuthFilter.class, DefaultFilter.class, PiwikFilter.class,
-            BlockingFilter.class })
-    public Response getStatus(@Context SecurityContext context,
+    @ResourceFilters({ AuthFilter.class, DefaultFilter.class,
+            PiwikFilter.class, BlockingFilter.class })
+    public Response getStatus (@Context SecurityContext context,
             @QueryParam("scopes") String scopes) {
         TokenContext ctx = (TokenContext) context.getUserPrincipal();
         Scopes m;
@@ -218,17 +227,19 @@
                 base_scope.retainAll(StringUtils.toSet(scopes));
             scopes = StringUtils.toString(base_scope);
             m = Scopes.mapScopes(scopes, data.fields());
-        }catch (KustvaktException e) {
+        }
+        catch (KustvaktException e) {
             throw KustvaktResponseHandler.throwit(e);
         }
         return Response.ok(m.toEntity()).build();
     }
 
+
     @GET
     @Path("settings")
-    @ResourceFilters({ AuthFilter.class, DefaultFilter.class, PiwikFilter.class,
-            BlockingFilter.class })
-    public Response getUserSettings(@Context SecurityContext context,
+    @ResourceFilters({ AuthFilter.class, DefaultFilter.class,
+            PiwikFilter.class, BlockingFilter.class })
+    public Response getUserSettings (@Context SecurityContext context,
             @Context Locale locale) {
         TokenContext ctx = (TokenContext) context.getUserPrincipal();
         String result;
@@ -237,20 +248,22 @@
             Userdata data = controller.getUserData(user, UserSettings.class);
             data.setField(Attributes.USERNAME, ctx.getUsername());
             result = data.data();
-        }catch (KustvaktException e) {
+        }
+        catch (KustvaktException e) {
             jlog.error("Exception encountered!", e);
             throw KustvaktResponseHandler.throwit(e);
         }
         return Response.ok(result).build();
     }
 
+
     // todo: test
     @POST
     @Path("settings")
     @Consumes(MediaType.APPLICATION_FORM_URLENCODED)
-    @ResourceFilters({ AuthFilter.class, DefaultFilter.class, PiwikFilter.class,
-            BlockingFilter.class })
-    public Response updateSettings(@Context SecurityContext context,
+    @ResourceFilters({ AuthFilter.class, DefaultFilter.class,
+            PiwikFilter.class, BlockingFilter.class })
+    public Response updateSettings (@Context SecurityContext context,
             @Context Locale locale, MultivaluedMap form) {
         TokenContext ctx = (TokenContext) context.getUserPrincipal();
         Map<String, Object> settings = FormRequestWrapper.toMap(form, false);
@@ -272,7 +285,8 @@
             data.update(new_data);
 
             controller.updateUserData(data);
-        }catch (KustvaktException e) {
+        }
+        catch (KustvaktException e) {
             jlog.error("Exception encountered!", e);
             throw KustvaktResponseHandler.throwit(e);
         }
@@ -280,11 +294,12 @@
         return Response.ok().build();
     }
 
+
     @GET
     @Path("details")
-    @ResourceFilters({ AuthFilter.class, DefaultFilter.class, PiwikFilter.class,
-            BlockingFilter.class })
-    public Response getDetails(@Context SecurityContext context,
+    @ResourceFilters({ AuthFilter.class, DefaultFilter.class,
+            PiwikFilter.class, BlockingFilter.class })
+    public Response getDetails (@Context SecurityContext context,
             @Context Locale locale) {
         TokenContext ctx = (TokenContext) context.getUserPrincipal();
         String result;
@@ -293,19 +308,21 @@
             Userdata data = controller.getUserData(user, UserDetails.class);
             data.setField(Attributes.USERNAME, ctx.getUsername());
             result = data.data();
-        }catch (KustvaktException e) {
+        }
+        catch (KustvaktException e) {
             jlog.error("Exception encountered!", e);
             throw KustvaktResponseHandler.throwit(e);
         }
         return Response.ok(result).build();
     }
 
+
     @POST
     @Path("details")
     @Consumes(MediaType.APPLICATION_FORM_URLENCODED)
-    @ResourceFilters({ AuthFilter.class, DefaultFilter.class, PiwikFilter.class,
-            BlockingFilter.class })
-    public Response updateDetails(@Context SecurityContext context,
+    @ResourceFilters({ AuthFilter.class, DefaultFilter.class,
+            PiwikFilter.class, BlockingFilter.class })
+    public Response updateDetails (@Context SecurityContext context,
             @Context Locale locale, MultivaluedMap form) {
         TokenContext ctx = (TokenContext) context.getUserPrincipal();
 
@@ -322,7 +339,8 @@
             UserDetails det = controller.getUserData(user, UserDetails.class);
             det.update(new_data);
             controller.updateUserData(det);
-        }catch (KustvaktException e) {
+        }
+        catch (KustvaktException e) {
             jlog.error("Exception encountered!", e);
             throw KustvaktResponseHandler.throwit(e);
         }
@@ -330,14 +348,14 @@
         return Response.ok().build();
     }
 
+
     //fixme: if policy allows, foreign user might be allowed to change search!
     @POST
     @Path("queries")
     @Consumes(MediaType.APPLICATION_FORM_URLENCODED)
-    @ResourceFilters({ AuthFilter.class, DefaultFilter.class, PiwikFilter.class,
-            BlockingFilter.class })
-    public Response updateQueries(@Context SecurityContext context,
-            String json) {
+    @ResourceFilters({ AuthFilter.class, DefaultFilter.class,
+            PiwikFilter.class, BlockingFilter.class })
+    public Response updateQueries (@Context SecurityContext context, String json) {
         TokenContext ctx = (TokenContext) context.getUserPrincipal();
         Collection<UserQuery> add = new HashSet<>();
         try {
@@ -377,35 +395,39 @@
             //                resourceHandler.deleteResources(user,
             //                        resources.toArray(new UserQuery[resources.size()]));
             //            }
-        }catch (KustvaktException e) {
+        }
+        catch (KustvaktException e) {
             jlog.error("Exception encountered!", e);
             throw KustvaktResponseHandler.throwit(e);
         }
         return Response.ok(JsonUtils.toJSON(add)).build();
     }
 
+
     @DELETE
-    @ResourceFilters({ AuthFilter.class, DefaultFilter.class, PiwikFilter.class,
-            BlockingFilter.class })
-    public Response deleteUser(@Context SecurityContext context) {
+    @ResourceFilters({ AuthFilter.class, DefaultFilter.class,
+            PiwikFilter.class, BlockingFilter.class })
+    public Response deleteUser (@Context SecurityContext context) {
         TokenContext ctx = (TokenContext) context.getUserPrincipal();
         try {
             User user = controller.getUser(ctx.getUsername());
             if (User.UserFactory.isDemo(ctx.getUsername()))
                 return Response.notModified().build();
             controller.deleteAccount(user);
-        }catch (KustvaktException e) {
+        }
+        catch (KustvaktException e) {
             jlog.error("Exception encountered!", e);
             throw KustvaktResponseHandler.throwit(e);
         }
         return Response.ok().build();
     }
 
+
     @GET
     @Path("queries")
-    @ResourceFilters({ AuthFilter.class, DefaultFilter.class, PiwikFilter.class,
-            BlockingFilter.class })
-    public Response getQueries(@Context SecurityContext context,
+    @ResourceFilters({ AuthFilter.class, DefaultFilter.class,
+            PiwikFilter.class, BlockingFilter.class })
+    public Response getQueries (@Context SecurityContext context,
             @Context Locale locale) {
         TokenContext ctx = (TokenContext) context.getUserPrincipal();
         String queryStr;
@@ -416,7 +438,8 @@
             //            queryStr = JsonUtils.toJSON(queries);
             //todo:
             queryStr = "";
-        }catch (KustvaktException e) {
+        }
+        catch (KustvaktException e) {
             jlog.error("Exception encountered!", e);
             throw KustvaktResponseHandler.throwit(e);
         }
diff --git a/src/main/java/de/ids_mannheim/korap/web/service/light/LightService.java b/src/main/java/de/ids_mannheim/korap/web/service/light/LightService.java
index 783e7e2..1d7e556 100644
--- a/src/main/java/de/ids_mannheim/korap/web/service/light/LightService.java
+++ b/src/main/java/de/ids_mannheim/korap/web/service/light/LightService.java
@@ -43,7 +43,8 @@
     private RewriteHandler processor;
     private KustvaktConfiguration config;
 
-    public LightService() {
+
+    public LightService () {
         this.config = BeansFactory.getKustvaktContext().getConfiguration();
         this.searchKrill = new SearchKrill(config.getIndexDir());
         UriBuilder builder = UriBuilder.fromUri("http://10.0.10.13").port(9997);
@@ -53,38 +54,42 @@
         this.processor.insertBeans(BeansFactory.getKustvaktContext());
     }
 
+
     /**
      * @param query
      * @return response
      */
     @POST
     @Path("colloc")
-    public Response getCollocationBase(@QueryParam("q") String query) {
+    public Response getCollocationBase (@QueryParam("q") String query) {
         String result;
         try {
             result = graphDBhandler.getResponse("distCollo", "q", query);
-        }catch (KustvaktException e) {
+        }
+        catch (KustvaktException e) {
             throw KustvaktResponseHandler.throwit(e);
         }
         return Response.ok(result).build();
     }
 
+
     // todo
     @Deprecated
-    public Response postMatchFavorite() {
+    public Response postMatchFavorite () {
         return Response.ok().build();
     }
 
+
     @TRACE
     @Path("search")
-    public Response buildQuery(@QueryParam("q") String q,
+    public Response buildQuery (@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,
-                               // fixme: remove cq from light service
+            // fixme: remove cq from light service
             @QueryParam("cq") String cq) {
         QuerySerializer ss = new QuerySerializer().setQuery(q, ql, v);
 
@@ -101,10 +106,10 @@
         return Response.ok(processor.preProcess(ss.toJSON(), null)).build();
     }
 
+
     @POST
     @Path("search")
-    public Response queryRaw(@QueryParam("engine") String engine,
-            String jsonld) {
+    public Response queryRaw (@QueryParam("engine") String engine, String jsonld) {
         jsonld = processor.preProcess(jsonld, null);
         // todo: should be possible to add the meta part to the query serialization
         jlog.info("Serialized search: {}", jsonld);
@@ -114,9 +119,10 @@
         return Response.ok(result).build();
     }
 
+
     @GET
     @Path("search")
-    public Response searchbyNameAll(@QueryParam("q") String q,
+    public Response searchbyNameAll (@QueryParam("q") String q,
             @QueryParam("ql") String ql, @QueryParam("v") String v,
             @QueryParam("context") String ctx,
             @QueryParam("cutoff") Boolean cutoff,
@@ -124,15 +130,14 @@
             @QueryParam("offset") Integer pageIndex,
             @QueryParam("page") Integer pageInteger,
             @QueryParam("fields") Set<String> fields,
-                                    // fixme: remove cq value from lightservice
+            // fixme: remove cq value from lightservice
             @QueryParam("cq") String cq, @QueryParam("engine") String engine) {
         KustvaktConfiguration.BACKENDS eng = this.config.chooseBackend(engine);
 
         String result;
         QuerySerializer serializer = new QuerySerializer().setQuery(q, ql, v);
-        MetaQueryBuilder meta = QueryBuilderUtil
-                .defaultMetaBuilder(pageIndex, pageInteger, pageLength, ctx,
-                        cutoff);
+        MetaQueryBuilder meta = QueryBuilderUtil.defaultMetaBuilder(pageIndex,
+                pageInteger, pageLength, ctx, cutoff);
         if (fields != null && !fields.isEmpty())
             meta.addEntry("fields", fields);
         serializer.setMeta(meta);
@@ -154,20 +159,24 @@
 
             try {
                 result = this.graphDBhandler.getResponse(map, "distKwic");
-            }catch (KustvaktException e) {
+            }
+            catch (KustvaktException e) {
                 throw KustvaktResponseHandler.throwit(e);
             }
-        }else
+        }
+        else
             result = searchKrill.search(query);
         KustvaktLogger.QUERY_LOGGER.trace("The result set: {}", result);
         return Response.ok(result).build();
     }
 
+
     /**
      * param context will be like this: context: "3-t,2-c"
      * <p/>
-     * id does not have to be an integer. name is also possible, in which case a type reference is required
-     *
+     * id does not have to be an integer. name is also possible, in
+     * which case a type reference is required
+     * 
      * @param query
      * @param ql
      * @param v
@@ -186,7 +195,7 @@
     //fixme: search in collection /collection/collection-id/search
     @GET
     @Path("/{type}/{id}/search")
-    public Response searchbyName(@PathParam("id") String id,
+    public Response searchbyName (@PathParam("id") String id,
             @PathParam("type") String type, @QueryParam("q") String query,
             @QueryParam("ql") String ql, @QueryParam("v") String v,
             @QueryParam("context") String ctx,
@@ -199,9 +208,8 @@
         // ref is a virtual collection id!
         KustvaktConfiguration.BACKENDS eng = this.config.chooseBackend(engine);
         raw = raw == null ? false : raw;
-        MetaQueryBuilder meta = QueryBuilderUtil
-                .defaultMetaBuilder(pageIndex, pageInteger, pageLength, ctx,
-                        cutoff);
+        MetaQueryBuilder meta = QueryBuilderUtil.defaultMetaBuilder(pageIndex,
+                pageInteger, pageLength, ctx, cutoff);
         if (!raw) {
             // should only apply to CQL queries
             //                meta.addEntry("itemsPerResource", 1);
@@ -213,9 +221,9 @@
         try {
             if (eng.equals(KustvaktConfiguration.BACKENDS.NEO4J)) {
                 if (raw)
-                    throw KustvaktResponseHandler
-                            .throwit(StatusCodes.ILLEGAL_ARGUMENT,
-                                    "raw not supported!", null);
+                    throw KustvaktResponseHandler.throwit(
+                            StatusCodes.ILLEGAL_ARGUMENT, "raw not supported!",
+                            null);
                 MultivaluedMap map = new MultivaluedMapImpl();
                 map.add("q", query);
                 map.add("count", String.valueOf(pageLength));
@@ -224,12 +232,13 @@
                 map.add("rctxs",
                         String.valueOf(meta.getSpanContext().getRight_size()));
                 result = this.graphDBhandler.getResponse(map, "distKwic");
-            }else
+            }
+            else
                 result = searchKrill.search(query);
 
-        }catch (Exception e) {
-            KustvaktLogger.ERROR_LOGGER
-                    .error("Exception for serialized query: " + query, e);
+        }
+        catch (Exception e) {
+            jlog.error("Exception for serialized query: " + query, e);
             throw KustvaktResponseHandler.throwit(500, e.getMessage(), null);
         }
 
@@ -237,10 +246,11 @@
         return Response.ok(result).build();
     }
 
+
     //todo: switch to new serialization
     @POST
     @Path("stats")
-    public Response getStats(String json) {
+    public Response getStats (String json) {
         CollectionQueryBuilder3 builder = new CollectionQueryBuilder3();
         builder.addQuery(json);
 
@@ -252,9 +262,10 @@
         return Response.ok(stats).build();
     }
 
+
     @GET
     @Path("/corpus/{id}/{docid}/{rest}/matchInfo")
-    public Response getMatchInfo(@PathParam("id") String id,
+    public Response getMatchInfo (@PathParam("id") String id,
             @PathParam("docid") String docid, @PathParam("rest") String rest,
             @QueryParam("foundry") Set<String> foundries,
             @QueryParam("layer") Set<String> layers,
@@ -265,8 +276,8 @@
         if (layers != null && !layers.isEmpty())
             l_list = new ArrayList<>(layers);
 
-        if (foundries != null && !foundries.isEmpty() && !foundries
-                .contains("*"))
+        if (foundries != null && !foundries.isEmpty()
+                && !foundries.contains("*"))
             f_list = new ArrayList<>(foundries);
 
         boolean match_only = foundries == null || foundries.isEmpty();
@@ -274,8 +285,8 @@
         if (match_only)
             results = searchKrill.getMatch(matchid);
         else
-            results = searchKrill
-                    .getMatch(matchid, f_list, l_list, spans, false, true);
+            results = searchKrill.getMatch(matchid, f_list, l_list, spans,
+                    false, true);
 
         return Response.ok(results).build();
     }
diff --git a/src/main/java/de/ids_mannheim/korap/web/utils/FormRequestWrapper.java b/src/main/java/de/ids_mannheim/korap/web/utils/FormRequestWrapper.java
index f486b1b..b17ed94 100644
--- a/src/main/java/de/ids_mannheim/korap/web/utils/FormRequestWrapper.java
+++ b/src/main/java/de/ids_mannheim/korap/web/utils/FormRequestWrapper.java
@@ -8,9 +8,10 @@
 import java.util.Map;
 
 /**
- * Helper class to wrapp multivaluedmap into a hashmap. Depending on the strict parameter,
+ * Helper class to wrapp multivaluedmap into a hashmap. Depending on
+ * the strict parameter,
  * list values are retained in the resulting wrapper map.
- *
+ * 
  * @author hanl
  * @date 25/04/2015
  */
@@ -18,28 +19,32 @@
 
     private MultivaluedMap<String, Object> form;
 
+
     /**
      * Constructs a request object wrapping the given request.
-     *
+     * 
      * @param request
-     * @throws IllegalArgumentException if the request is null
+     * @throws IllegalArgumentException
+     *             if the request is null
      */
-    public FormRequestWrapper(HttpServletRequest request,
-            MultivaluedMap<String, Object> form) {
+    public FormRequestWrapper (HttpServletRequest request,
+                               MultivaluedMap<String, Object> form) {
         super(request);
         this.form = form;
     }
 
+
     @Override
-    public String getParameter(String name) {
+    public String getParameter (String name) {
         String value = super.getParameter(name);
         if (value == null)
             value = String.valueOf(form.getFirst(name));
         return value;
     }
 
+
     @Override
-    public String[] getParameterValues(String name) {
+    public String[] getParameterValues (String name) {
         String[] values = super.getParameterValues(name);
         if (values == null && form.get(name) != null) {
             values = new String[form.get(name).size()];
@@ -48,17 +53,21 @@
         return values;
     }
 
-    public Map<String, Object> singleValueMap() {
+
+    public Map<String, Object> singleValueMap () {
         return toMap(this.form, false);
     }
 
+
     /**
-     * @param strict returns only values with size equal to one. If false pairs key to first value
-     *               in value list and returns the result
+     * @param strict
+     *            returns only values with size equal to one. If false
+     *            pairs key to first value
+     *            in value list and returns the result
      * @return key/value map
      */
-    public static Map<String, Object> toMap(MultivaluedMap<String, Object> form,
-            boolean strict) {
+    public static Map<String, Object> toMap (
+            MultivaluedMap<String, Object> form, boolean strict) {
         HashMap<String, Object> map = new HashMap<>();
         for (String key : form.keySet()) {
             if (strict && form.get(key).size() > 1)
@@ -69,14 +78,14 @@
         return map;
     }
 
-    public void put(String key, String value) {
+
+    public void put (String key, String value) {
         this.form.putSingle(key, value);
     }
 
-    public void put(String key, String... values) {
-        this.form.put(key, Arrays.<Object>asList(values));
+
+    public void put (String key, String ... values) {
+        this.form.put(key, Arrays.<Object> asList(values));
     }
 
 }
-
-
diff --git a/src/main/java/de/ids_mannheim/korap/web/utils/HTMLBuilder.java b/src/main/java/de/ids_mannheim/korap/web/utils/HTMLBuilder.java
index f6da418..543fbae 100644
--- a/src/main/java/de/ids_mannheim/korap/web/utils/HTMLBuilder.java
+++ b/src/main/java/de/ids_mannheim/korap/web/utils/HTMLBuilder.java
@@ -10,7 +10,8 @@
     private StringBuilder body;
     private String bodyAttr;
 
-    public HTMLBuilder() {
+
+    public HTMLBuilder () {
         html = new StringBuilder();
         body = new StringBuilder();
         bodyAttr = "";
@@ -18,22 +19,25 @@
     }
 
 
-    public void addHeader(String header, int h) {
+    public void addHeader (String header, int h) {
         html.append("<h" + h + ">");
         html.append(header);
         html.append("</h" + h + ">");
     }
 
-    public void addToBody(String body) {
+
+    public void addToBody (String body) {
         this.body.append(body);
     }
 
-    public void addToBody(String body, String attributes) {
+
+    public void addToBody (String body, String attributes) {
         this.body.append(body);
         bodyAttr = attributes;
     }
 
-    public String build() {
+
+    public String build () {
         if (bodyAttr.isEmpty())
             html.append("<body>");
         else {
@@ -50,7 +54,7 @@
 
 
     @Override
-    public String toString() {
+    public String toString () {
         return build();
     }
 }
diff --git a/src/main/java/de/ids_mannheim/korap/web/utils/KorAPContext.java b/src/main/java/de/ids_mannheim/korap/web/utils/KorAPContext.java
index e341c14..2424d4b 100644
--- a/src/main/java/de/ids_mannheim/korap/web/utils/KorAPContext.java
+++ b/src/main/java/de/ids_mannheim/korap/web/utils/KorAPContext.java
@@ -8,35 +8,40 @@
 /**
  * @author hanl
  * @date 13/05/2014
- *
- * wrapper for REST security context
- *
+ * 
+ *       wrapper for REST security context
+ * 
  */
 public class KorAPContext implements SecurityContext {
 
     private TokenContext user;
 
-    public KorAPContext(final TokenContext user) {
+
+    public KorAPContext (final TokenContext user) {
         this.user = user;
     }
 
+
     @Override
-    public Principal getUserPrincipal() {
+    public Principal getUserPrincipal () {
         return this.user;
     }
 
+
     @Override
-    public boolean isUserInRole(String role) {
+    public boolean isUserInRole (String role) {
         throw new UnsupportedOperationException();
     }
 
+
     @Override
-    public boolean isSecure() {
+    public boolean isSecure () {
         return false;
     }
 
+
     @Override
-    public String getAuthenticationScheme() {
+    public String getAuthenticationScheme () {
         return SecurityContext.BASIC_AUTH;
     }
 }
diff --git a/src/main/java/de/ids_mannheim/korap/web/utils/KustvaktMap.java b/src/main/java/de/ids_mannheim/korap/web/utils/KustvaktMap.java
index c6b618a..d657149 100644
--- a/src/main/java/de/ids_mannheim/korap/web/utils/KustvaktMap.java
+++ b/src/main/java/de/ids_mannheim/korap/web/utils/KustvaktMap.java
@@ -13,26 +13,31 @@
     private boolean mono;
     private Map<String, Object> values;
 
-    public KustvaktMap() {
+
+    public KustvaktMap () {
         this.values = new HashMap<>();
         this.mono = false;
     }
 
-    public KustvaktMap(Map<String, Object> m) {
+
+    public KustvaktMap (Map<String, Object> m) {
         this();
         setMap(m);
     }
 
-    public void setMap(Map<String, Object> m) {
+
+    public void setMap (Map<String, Object> m) {
         if (!isGeneric(m) | !this.mono)
             this.values.putAll(m);
     }
 
-    public boolean isGeneric() {
+
+    public boolean isGeneric () {
         return !this.mono && isGeneric(this.values);
     }
 
-    private static boolean isGeneric(Map<String, Object> map) {
+
+    private static boolean isGeneric (Map<String, Object> map) {
         int i = 0;
         for (Object o : map.values()) {
             if (o instanceof String)
@@ -41,28 +46,33 @@
         return !(i == map.size());
     }
 
-    public void setMonoValue(boolean monovalue) {
+
+    public void setMonoValue (boolean monovalue) {
         this.mono = monovalue;
     }
 
-    public String get(String key) {
+
+    public String get (String key) {
         Object o = this.values.get(key);
         if (!isGeneric())
             return (String) o;
         return String.valueOf(o);
     }
 
-    public Object getRaw(String key) {
+
+    public Object getRaw (String key) {
         return this.values.get(key);
     }
 
-    public <T extends Object> Object get(String key, Class<T> cl) {
+
+    public <T extends Object> Object get (String key, Class<T> cl) {
         if (isGeneric())
             return (T) this.values.get(key);
         return get(key);
     }
 
-    public Set<String> keySet() {
+
+    public Set<String> keySet () {
         return this.values.keySet();
     }
 
diff --git a/src/main/java/de/ids_mannheim/korap/web/utils/KustvaktResponseHandler.java b/src/main/java/de/ids_mannheim/korap/web/utils/KustvaktResponseHandler.java
index bd4c675..6b66d54 100644
--- a/src/main/java/de/ids_mannheim/korap/web/utils/KustvaktResponseHandler.java
+++ b/src/main/java/de/ids_mannheim/korap/web/utils/KustvaktResponseHandler.java
@@ -19,58 +19,67 @@
 
     private static AuditingIface auditing;
 
-    public static void init(AuditingIface iface) {
+
+    public static void init (AuditingIface iface) {
         if (auditing == null)
             auditing = iface;
     }
 
-    private static void register(List<AuditRecord> records) {
+
+    private static void register (List<AuditRecord> records) {
         if (auditing != null && !records.isEmpty())
             auditing.audit(records);
         else if (auditing == null)
             throw new RuntimeException("Auditing handler must be set!");
     }
 
-    public static WebApplicationException throwit(KustvaktException e) {
+
+    public static WebApplicationException throwit (KustvaktException e) {
         Response s = Response.status(getStatus(e.getStatusCode()))
                 .entity(buildNotification(e)).build();
         return new WebApplicationException(s);
     }
 
-    public static WebApplicationException throwit(int code) {
+
+    public static WebApplicationException throwit (int code) {
         return new WebApplicationException(Response.status(getStatus(code))
                 .entity(buildNotification(code, "", "")).build());
     }
 
-    public static WebApplicationException throwit(int code, String message,
+
+    public static WebApplicationException throwit (int code, String message,
             String entity) {
         return new WebApplicationException(Response.status(getStatus(code))
                 .entity(buildNotification(code, message, entity)).build());
     }
 
-    private static String buildNotification(KustvaktException e) {
+
+    private static String buildNotification (KustvaktException e) {
         register(e.getRecords());
         return buildNotification(e.getStatusCode(), e.getMessage(),
                 e.getEntity());
     }
 
-    public static String buildNotification(int code, String message,
+
+    public static String buildNotification (int code, String message,
             String entity) {
         Notifications notif = new Notifications();
         notif.addError(code, message, entity);
         return notif.toJsonString() + "\n";
     }
 
-    public static WebApplicationException throwAuthenticationException() {
-        return new WebApplicationException(
-                Response.status(Response.Status.UNAUTHORIZED)
-                        .header(HttpHeaders.WWW_AUTHENTICATE,
-                                "Basic realm=Kustvakt Authentication Service")
-                        .entity(buildNotification(StatusCodes.BAD_CREDENTIALS,
-                                "Unauthorized access", "")).build());
+
+    public static WebApplicationException throwAuthenticationException () {
+        return new WebApplicationException(Response
+                .status(Response.Status.UNAUTHORIZED)
+                .header(HttpHeaders.WWW_AUTHENTICATE,
+                        "Basic realm=Kustvakt Authentication Service")
+                .entity(buildNotification(StatusCodes.BAD_CREDENTIALS,
+                        "Unauthorized access", "")).build());
     }
 
-    private static Response.Status getStatus(int code) {
+
+    private static Response.Status getStatus (int code) {
         Response.Status status = Response.Status.BAD_REQUEST;
         switch (code) {
             case StatusCodes.EMPTY_RESULTS:
diff --git a/src/main/java/de/ids_mannheim/korap/web/utils/LocaleProvider.java b/src/main/java/de/ids_mannheim/korap/web/utils/LocaleProvider.java
index 47e8e03..cb76260 100644
--- a/src/main/java/de/ids_mannheim/korap/web/utils/LocaleProvider.java
+++ b/src/main/java/de/ids_mannheim/korap/web/utils/LocaleProvider.java
@@ -18,28 +18,30 @@
  * @date 04/02/2014
  */
 @Provider
-public class LocaleProvider
-        extends AbstractHttpContextInjectable<Locale>
+public class LocaleProvider extends AbstractHttpContextInjectable<Locale>
         implements InjectableProvider<Context, Type> {
 
     @Override
-    public Locale getValue(HttpContext httpContext) {
-        final List<Locale> locales = httpContext.getRequest().getAcceptableLanguages();
+    public Locale getValue (HttpContext httpContext) {
+        final List<Locale> locales = httpContext.getRequest()
+                .getAcceptableLanguages();
         if (locales.isEmpty())
             return Locale.US;
         return locales.get(0);
     }
 
+
     @Override
-    public ComponentScope getScope() {
+    public ComponentScope getScope () {
         return ComponentScope.PerRequest;
     }
 
+
     @Override
-    public Injectable getInjectable(ComponentContext ic, Context context, Type type) {
+    public Injectable getInjectable (ComponentContext ic, Context context,
+            Type type) {
         if (type.equals(Locale.class))
             return this;
         return null;
     }
 }
-
diff --git a/src/test/java/CollectionQueryBuilderTest.java b/src/test/java/CollectionQueryBuilderTest.java
index ab9706a..0840e20 100644
--- a/src/test/java/CollectionQueryBuilderTest.java
+++ b/src/test/java/CollectionQueryBuilderTest.java
@@ -15,33 +15,36 @@
 public class CollectionQueryBuilderTest {
 
     @Test
-    public void testsimpleAdd() {
+    public void testsimpleAdd () {
         CollectionQueryBuilder3 b = new CollectionQueryBuilder3();
         b.addQuery("corpusID=WPD");
 
         JsonNode node = JsonUtils.readTree(b.toJSON());
 
         assertNotNull(node);
-        assertEquals("koral:doc",node.at("/collection/@type").asText());
-        assertEquals("corpusID",node.at("/collection/key").asText());
+        assertEquals("koral:doc", node.at("/collection/@type").asText());
+        assertEquals("corpusID", node.at("/collection/key").asText());
     }
 
+
     @Test
-    public void testSimpleConjunction() {
+    public void testSimpleConjunction () {
         CollectionQueryBuilder3 b = new CollectionQueryBuilder3();
         b.addQuery("corpusID=WPD & textClass=freizeit");
         JsonNode node = JsonUtils.readTree(b.toJSON());
 
         assertNotNull(node);
-        assertEquals("koral:docGroup",node.at("/collection/@type").asText());
-        assertEquals("operation:and",node.at("/collection/operation").asText());
+        assertEquals("koral:docGroup", node.at("/collection/@type").asText());
+        assertEquals("operation:and", node.at("/collection/operation").asText());
 
-        assertEquals("corpusID",node.at("/collection/operands/0/key").asText());
-        assertEquals("textClass",node.at("/collection/operands/1/key").asText());
+        assertEquals("corpusID", node.at("/collection/operands/0/key").asText());
+        assertEquals("textClass", node.at("/collection/operands/1/key")
+                .asText());
     }
 
+
     @Test
-    public void testSimpleDisjunction() {
+    public void testSimpleDisjunction () {
         CollectionQueryBuilder3 b = new CollectionQueryBuilder3();
         b.addQuery("corpusID=WPD | textClass=freizeit");
         JsonNode node = JsonUtils.readTree(b.toJSON());
@@ -57,15 +60,15 @@
                 .equals("textClass");
     }
 
+
     @Test
-    public void testComplexSubQuery() {
+    public void testComplexSubQuery () {
         CollectionQueryBuilder3 b = new CollectionQueryBuilder3();
-        b.addQuery(
-                "(corpusID=WPD) | (textClass=freizeit & corpusID=WPD)");
+        b.addQuery("(corpusID=WPD) | (textClass=freizeit & corpusID=WPD)");
         JsonNode node = JsonUtils.readTree(b.toJSON());
 
-        System.out.println(
-                "_____________________________________________ COMPLEX");
+        System.out
+                .println("_____________________________________________ COMPLEX");
         System.out.println(node);
         assert node != null;
         assert node.at("/collection/operation").asText().equals("operation:or");
@@ -76,8 +79,9 @@
 
     }
 
+
     @Test
-    public void testAddResourceQueryAfter() {
+    public void testAddResourceQueryAfter () {
         CollectionQueryBuilder3 b = new CollectionQueryBuilder3();
         b.addQuery("(corpusID=ADF) | (textClass=freizeit & corpusID=WPD)");
 
@@ -94,8 +98,9 @@
                 .equals("wissenschaft");
     }
 
+
     @Test
-    public void testAddComplexResourceQueryAfter() {
+    public void testAddComplexResourceQueryAfter () {
         CollectionQueryBuilder3 b = new CollectionQueryBuilder3();
         b.addQuery("(corpusID=ADF) | (textClass=freizeit & corpusID=WPD)");
 
@@ -115,8 +120,9 @@
 
     }
 
+
     @Test
-    public void buildQuery() {
+    public void buildQuery () {
         String query = "[base=Haus]";
         QuerySerializer s = new QuerySerializer();
         s.setQuery(query, "poliqarp");
@@ -127,8 +133,9 @@
         System.out.println("QUERY " + s.toJSON());
     }
 
+
     @Test
-    public void testBaseQueryBuild() {
+    public void testBaseQueryBuild () {
 
     }
 
diff --git a/src/test/java/FileAuditingTest.java b/src/test/java/FileAuditingTest.java
index fecc338..9804107 100644
--- a/src/test/java/FileAuditingTest.java
+++ b/src/test/java/FileAuditingTest.java
@@ -15,22 +15,24 @@
 public class FileAuditingTest extends BeanConfigTest {
 
     @Override
-    public void initMethod() throws KustvaktException {
+    public void initMethod () throws KustvaktException {
 
     }
 
+
     @Test
-    public void testAdd() {
+    public void testAdd () {
         for (int i = 0; i < 20; i++) {
-            AuditRecord record = AuditRecord
-                    .serviceRecord("MichaelHanl", StatusCodes.ILLEGAL_ARGUMENT,
-                            String.valueOf(i), "string value");
+            AuditRecord record = AuditRecord.serviceRecord("MichaelHanl",
+                    StatusCodes.ILLEGAL_ARGUMENT, String.valueOf(i),
+                    "string value");
             helper().getContext().getAuditingProvider().audit(record);
         }
     }
 
+
     @Test(expected = UnsupportedOperationException.class)
-    public void testRetrieval() {
+    public void testRetrieval () {
         helper().getContext().getAuditingProvider()
                 .retrieveRecords(new LocalDate(new Date().getTime()), 10);
     }
diff --git a/src/test/java/de/ids_mannheim/korap/config/ClassLoaderTest.java b/src/test/java/de/ids_mannheim/korap/config/ClassLoaderTest.java
index b40b8c7..0f95b20 100644
--- a/src/test/java/de/ids_mannheim/korap/config/ClassLoaderTest.java
+++ b/src/test/java/de/ids_mannheim/korap/config/ClassLoaderTest.java
@@ -17,29 +17,31 @@
 public class ClassLoaderTest extends BeanConfigTest {
 
     @Test
-    public void testDefaultCreationThrowsNoException() {
+    public void testDefaultCreationThrowsNoException () {
         DefaultHandler pl = new DefaultHandler();
         Object o = pl.getDefault(ContextHolder.KUSTVAKT_AUDITING);
         assertNotNull(o);
         assertTrue(o instanceof AuditingIface);
     }
 
+
     @Test
-    public void testDefaultCreation2ThrowsNoException() {
+    public void testDefaultCreation2ThrowsNoException () {
         AuthenticationManagerIface iface = helper().getContext()
                 .getAuthenticationManager();
         assertNotNull(iface);
         assertTrue(iface instanceof KustvaktAuthenticationManager);
     }
 
+
     @Test
-    public void testDefaultInterfaceMatchThrowsNoException() {
+    public void testDefaultInterfaceMatchThrowsNoException () {
         AuditingIface iface = helper().getContext().getAuditingProvider();
         assertNotNull(iface);
         assertTrue(iface instanceof JDBCAuditing);
     }
 
+
     @Override
-    public void initMethod() throws KustvaktException {
-    }
+    public void initMethod () throws KustvaktException {}
 }
diff --git a/src/test/java/de/ids_mannheim/korap/config/CollectionLoaderTest.java b/src/test/java/de/ids_mannheim/korap/config/CollectionLoaderTest.java
index d3bffd4..6f0ee8b 100644
--- a/src/test/java/de/ids_mannheim/korap/config/CollectionLoaderTest.java
+++ b/src/test/java/de/ids_mannheim/korap/config/CollectionLoaderTest.java
@@ -14,9 +14,9 @@
 public class CollectionLoaderTest extends BeanConfigTest {
 
     @Test
-    public void testCollectionLoader() {
-        ResourceDao dao = new ResourceDao(
-                helper().getContext().getPersistenceClient());
+    public void testCollectionLoader () {
+        ResourceDao dao = new ResourceDao(helper().getContext()
+                .getPersistenceClient());
 
         boolean error = false;
         UserLoader u = new UserLoader();
@@ -24,15 +24,17 @@
         try {
             u.load(helper().getContext());
             l.load(helper().getContext());
-        }catch (KustvaktException e) {
+        }
+        catch (KustvaktException e) {
             error = true;
         }
         Assert.assertFalse(error);
         Assert.assertNotEquals("Is not supposed to be zero", 0, dao.size());
     }
 
+
     @Override
-    public void initMethod() throws KustvaktException {
+    public void initMethod () throws KustvaktException {
 
     }
 }
diff --git a/src/test/java/de/ids_mannheim/korap/config/ConfigTest.java b/src/test/java/de/ids_mannheim/korap/config/ConfigTest.java
index d9e28e3..fe2201f 100644
--- a/src/test/java/de/ids_mannheim/korap/config/ConfigTest.java
+++ b/src/test/java/de/ids_mannheim/korap/config/ConfigTest.java
@@ -20,35 +20,40 @@
 public class ConfigTest extends BeanConfigTest {
 
     @Test
-    public void testServiceInfo() {
+    public void testServiceInfo () {
         String version = ServiceInfo.getInfo().getVersion();
         String name = ServiceInfo.getInfo().getName();
         assertNotEquals("wrong version", "UNKNOWN", version);
         assertNotEquals("wrong name", "UNKNOWN", name);
     }
 
+
     @Test
-    public void testProperties() {
-        assertEquals("token layer does not match", "opennlp",
-                helper().getContext().getConfiguration().getDefault_token());
+    public void testProperties () {
+        assertEquals("token layer does not match", "opennlp", helper()
+                .getContext().getConfiguration().getDefault_token());
         assertEquals("token expiration does not match",
-                TimeUtils.convertTimeToSeconds("1D"),
-                helper().getContext().getConfiguration().getLongTokenTTL());
+                TimeUtils.convertTimeToSeconds("1D"), helper().getContext()
+                        .getConfiguration().getLongTokenTTL());
     }
 
+
     @Test(expected = KustvaktException.class)
-    public void testBeanOverrideInjection() throws KustvaktException {
-        helper().getContext().getConfiguration().setPropertiesAsStream(
-                ConfigTest.class.getClassLoader()
-                        .getResourceAsStream("kustvakt.conf"));
+    public void testBeanOverrideInjection () throws KustvaktException {
+        helper().getContext()
+                .getConfiguration()
+                .setPropertiesAsStream(
+                        ConfigTest.class.getClassLoader().getResourceAsStream(
+                                "kustvakt.conf"));
 
         String v = "testmail_&234@ids-mannheim.de";
         helper().getContext().getEncryption()
                 .validateEntry(v, Attributes.EMAIL);
     }
 
+
     @Test
-    public void testBootConfigRun() {
+    public void testBootConfigRun () {
         helper().runBootInterfaces();
         helper().setupAccount();
         assertNotNull(helper().getUser());
@@ -64,14 +69,14 @@
             try {
                 iface = (BootableBeanInterface) cl.newInstance();
                 list.add(iface);
-            }catch (InstantiationException | IllegalAccessException e) {
+            }
+            catch (InstantiationException | IllegalAccessException e) {
                 // do nothing
             }
         }
 
         while (!set.isEmpty()) {
-            out_loop:
-            for (BootableBeanInterface iface : new ArrayList<>(list)) {
+            out_loop: for (BootableBeanInterface iface : new ArrayList<>(list)) {
                 for (Class cl : iface.getDependencies()) {
                     if (set.contains(cl))
                         continue out_loop;
@@ -84,16 +89,16 @@
         assertEquals(check, tracker.size());
     }
 
+
     @Test
-    public void testBootConfigDependencyOrder() {
+    public void testBootConfigDependencyOrder () {
         // todo:
 
     }
 
+
     @Override
-    public void initMethod() throws KustvaktException {
+    public void initMethod () throws KustvaktException {
 
     }
 }
-
-
diff --git a/src/test/java/de/ids_mannheim/korap/config/PolicyLoaderTest.java b/src/test/java/de/ids_mannheim/korap/config/PolicyLoaderTest.java
index a9270d2..3d3f8f7 100644
--- a/src/test/java/de/ids_mannheim/korap/config/PolicyLoaderTest.java
+++ b/src/test/java/de/ids_mannheim/korap/config/PolicyLoaderTest.java
@@ -17,7 +17,7 @@
 public class PolicyLoaderTest extends BeanConfigTest {
 
     @Test
-    public void testPolicyLoader() {
+    public void testPolicyLoader () {
         boolean error = false;
         UserLoader u = new UserLoader();
         CollectionLoader c = new CollectionLoader();
@@ -26,17 +26,20 @@
             u.load(helper().getContext());
             c.load(helper().getContext());
             l.load(helper().getContext());
-        }catch (KustvaktException e) {
+        }
+        catch (KustvaktException e) {
             e.printStackTrace();
             error = true;
         }
         assertFalse(error);
-        PolicyDao dao = new PolicyDao(helper().getContext().getPersistenceClient());
+        PolicyDao dao = new PolicyDao(helper().getContext()
+                .getPersistenceClient());
         assertNotEquals("Is not supposed to be zero", 0, dao.size());
     }
 
+
     @Override
-    public void initMethod() throws KustvaktException {
+    public void initMethod () throws KustvaktException {
 
     }
 }
diff --git a/src/test/java/de/ids_mannheim/korap/config/TestBeans.java b/src/test/java/de/ids_mannheim/korap/config/TestBeans.java
index 6961289..7d33ba2 100644
--- a/src/test/java/de/ids_mannheim/korap/config/TestBeans.java
+++ b/src/test/java/de/ids_mannheim/korap/config/TestBeans.java
@@ -15,24 +15,33 @@
 
     protected PersistenceClient dataSource;
 
-    public abstract PolicyHandlerIface getPolicyDao();
 
-    public abstract KustvaktConfiguration getConfig();
+    public abstract PolicyHandlerIface getPolicyDao ();
 
-    public abstract EntityHandlerIface getUserDao();
 
-    public abstract AuditingIface getAuditingDao();
+    public abstract KustvaktConfiguration getConfig ();
 
-    public abstract List<ResourceOperationIface> getResourceDaos();
 
-    public abstract List<UserDataDbIface> getUserdataDaos();
+    public abstract EntityHandlerIface getUserDao ();
 
-    public abstract EncryptionIface getCrypto();
 
-    public abstract AuthenticationManagerIface getAuthManager();
+    public abstract AuditingIface getAuditingDao ();
+
+
+    public abstract List<ResourceOperationIface> getResourceDaos ();
+
+
+    public abstract List<UserDataDbIface> getUserdataDaos ();
+
+
+    public abstract EncryptionIface getCrypto ();
+
+
+    public abstract AuthenticationManagerIface getAuthManager ();
+
 
     @Bean(name = "kustvakt_db")
-    public PersistenceClient getDataSource() {
+    public PersistenceClient getDataSource () {
         return this.dataSource;
     }
 }
diff --git a/src/test/java/de/ids_mannheim/korap/config/TestHelper.java b/src/test/java/de/ids_mannheim/korap/config/TestHelper.java
index 607cc71..0746293 100644
--- a/src/test/java/de/ids_mannheim/korap/config/TestHelper.java
+++ b/src/test/java/de/ids_mannheim/korap/config/TestHelper.java
@@ -39,7 +39,7 @@
 
 /**
  * creates a test user that can be used to access protected functions
- *
+ * 
  * @author hanl
  * @date 16/10/2015
  */
@@ -51,37 +51,41 @@
 
     private ContextHolder beansHolder;
 
-    public static TestHelper newInstance(ApplicationContext ctx)
+
+    public static TestHelper newInstance (ApplicationContext ctx)
             throws Exception {
         TestHelper b = new TestHelper();
-        b.beansHolder = new ContextHolder(ctx) {
-        };
+        b.beansHolder = new ContextHolder(ctx) {};
         return b;
     }
 
-    public <T> T getBean(Class<T> type) {
+
+    public <T> T getBean (Class<T> type) {
         return this.beansHolder.getBean(type);
     }
 
-    public ContextHolder getContext() {
+
+    public ContextHolder getContext () {
         return this.beansHolder;
     }
 
-    public <T> T getBean(String name) {
+
+    public <T> T getBean (String name) {
         return (T) this.beansHolder.getBean(name);
     }
 
-    public TestHelper setupAccount() {
+
+    public TestHelper setupAccount () {
         KustvaktBaseDaoInterface dao = getBean(ContextHolder.KUSTVAKT_USERDB);
 
-        KustvaktAuthenticationManager manager = getBean(
-                ContextHolder.KUSTVAKT_AUTHENTICATION_MANAGER);
+        KustvaktAuthenticationManager manager = getBean(ContextHolder.KUSTVAKT_AUTHENTICATION_MANAGER);
 
         try {
             getUser();
             System.out.println("found user, skipping setup ...");
             return this;
-        }catch (RuntimeException e) {
+        }
+        catch (RuntimeException e) {
             // do nothing and continue
         }
 
@@ -101,7 +105,8 @@
 
         try {
             manager.createUserAccount(m, false);
-        }catch (KustvaktException e) {
+        }
+        catch (KustvaktException e) {
             // do nothing
             e.printStackTrace();
             assertNotNull("Test user could not be set up", null);
@@ -110,7 +115,8 @@
         return this;
     }
 
-    public TestHelper setupSimpleAccount(String username, String password) {
+
+    public TestHelper setupSimpleAccount (String username, String password) {
         KustvaktBaseDaoInterface dao = getBean(ContextHolder.KUSTVAKT_USERDB);
 
         if (dao.size() == 0) {
@@ -118,11 +124,12 @@
             m.put(Attributes.USERNAME, username);
 
             try {
-                String hash = ((EncryptionIface) getBean(
-                        ContextHolder.KUSTVAKT_ENCRYPTION))
+                String hash = ((EncryptionIface) getBean(ContextHolder.KUSTVAKT_ENCRYPTION))
                         .produceSecureHash(password);
                 m.put(Attributes.PASSWORD, hash);
-            }catch (NoSuchAlgorithmException | UnsupportedEncodingException | KustvaktException e) {
+            }
+            catch (NoSuchAlgorithmException | UnsupportedEncodingException
+                    | KustvaktException e) {
                 // do nohting
                 assertNotNull("Exception thrown", null);
             }
@@ -134,7 +141,8 @@
                 assert BeansFactory.getKustvaktContext().getUserDBHandler()
                         .getAccount(credentials[0]) != null;
                 assert i == 1;
-            }catch (KustvaktException e) {
+            }
+            catch (KustvaktException e) {
                 // do nothing
                 Assert.assertNull("Test user could not be set up", true);
             }
@@ -142,20 +150,22 @@
         return this;
     }
 
-    public User getUser() {
+
+    public User getUser () {
         try {
             return ((EntityHandlerIface) getBean(ContextHolder.KUSTVAKT_USERDB))
                     .getAccount(credentials[0]);
-        }catch (KustvaktException e) {
+        }
+        catch (KustvaktException e) {
             // do nothing
         }
         throw new RuntimeException("User could not be retrieved!");
     }
 
-    public TestHelper dropUser(String... usernames) throws KustvaktException {
+
+    public TestHelper dropUser (String ... usernames) throws KustvaktException {
         if (usernames == null || usernames.length == 0) {
-            KustvaktBaseDaoInterface dao = getBean(
-                    ContextHolder.KUSTVAKT_USERDB);
+            KustvaktBaseDaoInterface dao = getBean(ContextHolder.KUSTVAKT_USERDB);
             dao.truncate();
         }
         for (String name : Arrays.asList(usernames)) {
@@ -165,14 +175,16 @@
         return this;
     }
 
-    private boolean remove(String username) throws KustvaktException {
+
+    private boolean remove (String username) throws KustvaktException {
         EntityHandlerIface dao = getBean(ContextHolder.KUSTVAKT_USERDB);
         User us = dao.getAccount(username);
         dao.deleteAccount(us.getId());
         return true;
     }
 
-    public TestHelper truncateAll() {
+
+    public TestHelper truncateAll () {
         String sql = "SELECT Concat('TRUNCATE TABLE ', TABLE_NAME) FROM INFORMATION_SCHEMA.TABLES";
         final Set<String> queries = new HashSet<>();
         PersistenceClient cl = getBean(ContextHolder.KUSTVAKT_POLICIES);
@@ -181,7 +193,7 @@
 
         source.query(sql, new RowCallbackHandler() {
             @Override
-            public void processRow(ResultSet rs) throws SQLException {
+            public void processRow (ResultSet rs) throws SQLException {
                 queries.add(rs.getString(1));
 
             }
@@ -192,11 +204,13 @@
         return this;
     }
 
-    public static final String[] getUserCredentials() {
+
+    public static final String[] getUserCredentials () {
         return Arrays.copyOf(credentials, 2);
     }
 
-    public TestHelper runBootInterfaces() {
+
+    public TestHelper runBootInterfaces () {
         Set<Class<? extends BootableBeanInterface>> set = KustvaktClassLoader
                 .loadSubTypes(BootableBeanInterface.class);
 
@@ -206,18 +220,17 @@
             try {
                 iface = (BootableBeanInterface) cl.newInstance();
                 list.add(iface);
-            }catch (InstantiationException | IllegalAccessException e) {
+            }
+            catch (InstantiationException | IllegalAccessException e) {
                 // do nothing
             }
         }
         System.out.println("Found boot loading interfaces: " + list);
         while (!set.isEmpty()) {
-            out_loop:
-            for (BootableBeanInterface iface : new ArrayList<>(list)) {
+            out_loop: for (BootableBeanInterface iface : new ArrayList<>(list)) {
                 try {
-                    System.out.println(
-                            "Running boot instructions from class " + iface
-                                    .getClass().getSimpleName());
+                    System.out.println("Running boot instructions from class "
+                            + iface.getClass().getSimpleName());
                     for (Class cl : iface.getDependencies()) {
                         if (set.contains(cl))
                             continue out_loop;
@@ -225,11 +238,11 @@
                     set.remove(iface.getClass());
                     list.remove(iface);
                     iface.load(beansHolder);
-                }catch (KustvaktException e) {
+                }
+                catch (KustvaktException e) {
                     // don't do anything!
-                    System.out.println(
-                            "An error occurred in class " + iface.getClass()
-                                    .getSimpleName() + "!\n" + e);
+                    System.out.println("An error occurred in class "
+                            + iface.getClass().getSimpleName() + "!\n" + e);
                     throw new RuntimeException(
                             "Boot loading interface failed ...");
                 }
@@ -238,24 +251,27 @@
         return this;
     }
 
-    public int setupResource(KustvaktResource resource)
+
+    public int setupResource (KustvaktResource resource)
             throws KustvaktException {
         ResourceDao dao = new ResourceDao(
                 (PersistenceClient) getBean(ContextHolder.KUSTVAKT_DB));
         return dao.storeResource(resource, getUser());
     }
 
-    public KustvaktResource getResource(String name) throws KustvaktException {
+
+    public KustvaktResource getResource (String name) throws KustvaktException {
         ResourceDao dao = new ResourceDao(
                 (PersistenceClient) getBean(ContextHolder.KUSTVAKT_DB));
         KustvaktResource res = dao.findbyId(name, getUser());
         if (res == null)
-            throw new RuntimeException(
-                    "resource with name " + name + " not found ...");
+            throw new RuntimeException("resource with name " + name
+                    + " not found ...");
         return res;
     }
 
-    public TestHelper dropResource(String... names) throws KustvaktException {
+
+    public TestHelper dropResource (String ... names) throws KustvaktException {
         ResourceDao dao = new ResourceDao(
                 (PersistenceClient) getBean(ContextHolder.KUSTVAKT_DB));
         if (names == null || names.length == 0)
@@ -265,15 +281,18 @@
         return this;
     }
 
-    public void close() {
+
+    public void close () {
         BeansFactory.closeApplication();
     }
 
-    private TestHelper() {
+
+    private TestHelper () {
 
     }
 
-    private static PersistenceClient mysql_db() throws IOException {
+
+    private static PersistenceClient mysql_db () throws IOException {
         BasicDataSource dataSource = new BasicDataSource();
         dataSource.setDriverClassName("com.mysql.jdbc.Driver");
         dataSource.setUrl("jdbc:mysql://localhost:3306/kustvakt_test");
@@ -290,7 +309,8 @@
         return client;
     }
 
-    private static PersistenceClient sqlite_db(Class testclass, boolean memory)
+
+    private static PersistenceClient sqlite_db (Class testclass, boolean memory)
             throws InterruptedException {
         SingleConnectionDataSource dataSource = new SingleConnectionDataSource();
         dataSource.setDriverClassName("org.sqlite.JDBC");
@@ -303,8 +323,8 @@
             File tmp = new File("tmp");
             if (!tmp.exists())
                 tmp.mkdirs();
-            dataSource.setUrl("jdbc:sqlite:tmp/sqlite_" + name +
-                    t.getMillis() + ".sqlite");
+            dataSource.setUrl("jdbc:sqlite:tmp/sqlite_" + name + t.getMillis()
+                    + ".sqlite");
         }
         dataSource.setSuppressClose(true);
 
@@ -318,7 +338,8 @@
         return client;
     }
 
-    public static PersistenceClient sqlite_db_norm(boolean memory) {
+
+    public static PersistenceClient sqlite_db_norm (boolean memory) {
         BasicDataSource dataSource = new BasicDataSource();
         dataSource.setDriverClassName("org.sqlite.JDBC");
         dataSource.setMaxTotal(1);
@@ -345,7 +366,8 @@
         return client;
     }
 
-    public static PersistenceClient h2_emb() throws SQLException {
+
+    public static PersistenceClient h2_emb () throws SQLException {
         BasicDataSource dataSource = new BasicDataSource();
         dataSource.setUrl("jdbc:h2:mem:");
         dataSource.getConnection().nativeSQL("SET MODE MySQL;");
@@ -365,26 +387,29 @@
 
     public static class AppTestConfig extends TestBeans {
 
-        public AppTestConfig() throws InterruptedException, IOException {
+        public AppTestConfig () throws InterruptedException, IOException {
             this.dataSource = TestHelper.sqlite_db(TestHelper.clazz, false);
             //this.dataSource = TestHelper.mysql_db();
         }
 
+
         @Bean(name = ContextHolder.KUSTVAKT_POLICIES)
         @Override
-        public PolicyHandlerIface getPolicyDao() {
+        public PolicyHandlerIface getPolicyDao () {
             return new PolicyDao(this.dataSource);
         }
 
+
         @Bean(name = ContextHolder.KUSTVAKT_USERDB)
         @Override
-        public EntityHandlerIface getUserDao() {
+        public EntityHandlerIface getUserDao () {
             return new EntityDao(this.dataSource);
         }
 
+
         @Bean(name = ContextHolder.KUSTVAKT_CONFIG)
         @Override
-        public KustvaktConfiguration getConfig() {
+        public KustvaktConfiguration getConfig () {
             KustvaktConfiguration c = new KustvaktConfiguration();
             InputStream s = TestHelper.class.getClassLoader()
                     .getResourceAsStream("kustvakt.conf");
@@ -397,39 +422,44 @@
             return c;
         }
 
+
         @Bean(name = ContextHolder.KUSTVAKT_AUDITING)
         @Override
-        public AuditingIface getAuditingDao() {
+        public AuditingIface getAuditingDao () {
             return new JDBCAuditing(this.dataSource);
         }
 
+
         @Bean(name = ContextHolder.KUSTVAKT_RESOURCES)
         @Override
-        public List<ResourceOperationIface> getResourceDaos() {
+        public List<ResourceOperationIface> getResourceDaos () {
             List<ResourceOperationIface> res = new ArrayList<>();
             res.add(new ResourceDao(getDataSource()));
             res.add(new DocumentDao(getDataSource()));
             return res;
         }
 
+
         @Bean(name = ContextHolder.KUSTVAKT_USERDATA)
         @Override
-        public List<UserDataDbIface> getUserdataDaos() {
+        public List<UserDataDbIface> getUserdataDaos () {
             List<UserDataDbIface> ud = new ArrayList<>();
             ud.add(new UserSettingsDao(getDataSource()));
             ud.add(new UserDetailsDao(getDataSource()));
             return ud;
         }
 
+
         @Bean(name = ContextHolder.KUSTVAKT_ENCRYPTION)
         @Override
-        public EncryptionIface getCrypto() {
+        public EncryptionIface getCrypto () {
             return new KustvaktEncryption(getConfig());
         }
 
+
         @Bean(name = ContextHolder.KUSTVAKT_AUTHENTICATION_MANAGER)
         @Override
-        public AuthenticationManagerIface getAuthManager() {
+        public AuthenticationManagerIface getAuthManager () {
             AuthenticationManagerIface manager = new KustvaktAuthenticationManager(
                     getUserDao(), getCrypto(), getConfig(), getAuditingDao(),
                     getUserdataDaos());
diff --git a/src/test/java/de/ids_mannheim/korap/config/UserLoaderTest.java b/src/test/java/de/ids_mannheim/korap/config/UserLoaderTest.java
index 4e28c4d..91ad661 100644
--- a/src/test/java/de/ids_mannheim/korap/config/UserLoaderTest.java
+++ b/src/test/java/de/ids_mannheim/korap/config/UserLoaderTest.java
@@ -13,14 +13,16 @@
 public class UserLoaderTest extends BeanConfigTest {
 
     @Test
-    public void testUserLoader() {
-        EntityDao dao = new EntityDao(helper().getContext().getPersistenceClient());
+    public void testUserLoader () {
+        EntityDao dao = new EntityDao(helper().getContext()
+                .getPersistenceClient());
 
         boolean error = false;
         UserLoader l = new UserLoader();
         try {
             l.load(helper().getContext());
-        }catch (KustvaktException e) {
+        }
+        catch (KustvaktException e) {
             e.printStackTrace();
             error = true;
         }
@@ -28,8 +30,9 @@
         Assert.assertNotEquals("Is not supposed to be zero", 0, dao.size());
     }
 
+
     @Override
-    public void initMethod() throws KustvaktException {
+    public void initMethod () throws KustvaktException {
 
     }
 }
diff --git a/src/test/java/de/ids_mannheim/korap/handlers/DocumentDaoTest.java b/src/test/java/de/ids_mannheim/korap/handlers/DocumentDaoTest.java
index 9a13eb4..b3387c6 100644
--- a/src/test/java/de/ids_mannheim/korap/handlers/DocumentDaoTest.java
+++ b/src/test/java/de/ids_mannheim/korap/handlers/DocumentDaoTest.java
@@ -17,33 +17,38 @@
 
     private static DocumentDao dao;
 
+
     @After
-    public void clear() {
+    public void clear () {
         dao.truncate();
     }
 
+
     @Test
-    public void testSet() throws KustvaktException {
+    public void testSet () throws KustvaktException {
         Document doc = new Document("BRZ13_APR.00001");
         doc.setDisabled(true);
         dao.storeResource(doc, null);
     }
 
+
     @Test
-    public void testGet() {
+    public void testGet () {
         Document doc = new Document("BRZ13_APR.00002");
         doc.setDisabled(true);
         try {
             dao.storeResource(doc, null);
             Document doc1 = dao.findbyId(doc.getPersistentID(), null);
             assert doc1 != null && doc.isDisabled();
-        }catch (KustvaktException e) {
+        }
+        catch (KustvaktException e) {
             e.printStackTrace();
         }
     }
 
+
     @Test
-    public void testRemove() {
+    public void testRemove () {
         Document doc = new Document("BRZ13_APR.00003");
         doc.setDisabled(true);
         try {
@@ -52,18 +57,21 @@
             assert dao.deleteResource(doc.getPersistentID(), null) == 1;
             doc1 = dao.findbyId(doc.getPersistentID(), null);
             assert doc1 == null;
-        }catch (KustvaktException e) {
+        }
+        catch (KustvaktException e) {
             e.printStackTrace();
 
         }
     }
 
+
     @Test
-    public void testEmptyFind() {
+    public void testEmptyFind () {
         List<String> dc = null;
         try {
             dc = dao.findbyCorpus("WPD", true);
-        }catch (KustvaktException e) {
+        }
+        catch (KustvaktException e) {
             e.printStackTrace();
         }
 
@@ -71,15 +79,17 @@
         Assert.assertEquals("should be empty", 0, dc.size());
     }
 
+
     @Test
-    public void testFind() {
+    public void testFind () {
         int length = 10;
         for (int i = 0; i < length; i++) {
             Document doc = new Document("WPD_APR.0000" + i);
             doc.setDisabled(true);
             try {
                 dao.storeResource(doc, null);
-            }catch (KustvaktException e) {
+            }
+            catch (KustvaktException e) {
                 e.printStackTrace();
                 break;
             }
@@ -88,7 +98,8 @@
         List<String> dc = null;
         try {
             dc = dao.findbyCorpus("WPD", true);
-        }catch (KustvaktException e) {
+        }
+        catch (KustvaktException e) {
             e.printStackTrace();
         }
 
@@ -97,8 +108,9 @@
         Assert.assertEquals("not all found", length, dc.size());
     }
 
+
     @Override
-    public void initMethod() throws KustvaktException {
+    public void initMethod () throws KustvaktException {
         dao = new DocumentDao(helper().getContext().getPersistenceClient());
     }
 }
diff --git a/src/test/java/de/ids_mannheim/korap/handlers/ResourceDaoTest.java b/src/test/java/de/ids_mannheim/korap/handlers/ResourceDaoTest.java
index 20825a7..04d3eef 100644
--- a/src/test/java/de/ids_mannheim/korap/handlers/ResourceDaoTest.java
+++ b/src/test/java/de/ids_mannheim/korap/handlers/ResourceDaoTest.java
@@ -25,8 +25,9 @@
 
     private static List<Integer> ids = new ArrayList<>();
 
+
     @Override
-    public void initMethod() {
+    public void initMethod () {
         helper().setupAccount();
 
         List classes = new ArrayList<>(
@@ -40,41 +41,48 @@
                 r.setPersistentID(r.getName());
                 int id = helper().setupResource(r);
                 ids.add(id);
-                assertNotEquals(0,
-                        new ResourceDao<>(helper().getContext().getPersistenceClient())
-                                .size());
-            }catch (InstantiationException e) {
+                assertNotEquals(0, new ResourceDao<>(helper().getContext()
+                        .getPersistenceClient()).size());
+            }
+            catch (InstantiationException e) {
                 if (i < classes.size())
                     classes.remove(i);
-            }catch (KustvaktException | IllegalAccessException e) {
+            }
+            catch (KustvaktException | IllegalAccessException e) {
                 e.printStackTrace();
             }
         }
     }
 
+
     @Test
-    public void testBatchGetResources() throws KustvaktException {
-        ResourceDao dao = new ResourceDao(helper().getContext().getPersistenceClient());
+    public void testBatchGetResources () throws KustvaktException {
+        ResourceDao dao = new ResourceDao(helper().getContext()
+                .getPersistenceClient());
         assertNotEquals(0, dao.size());
         Collection res = dao.getResources(ids, User.UserFactory.getDemoUser());
         assertEquals(ids.size(), res.size());
     }
 
+
     @Test
-    public void testGetResource() throws KustvaktException {
-        ResourceDao dao = new ResourceDao(helper().getContext().getPersistenceClient());
-        assertEquals("sqlite",
-                helper().getContext().getPersistenceClient().getDatabase());
+    public void testGetResource () throws KustvaktException {
+        ResourceDao dao = new ResourceDao(helper().getContext()
+                .getPersistenceClient());
+        assertEquals("sqlite", helper().getContext().getPersistenceClient()
+                .getDatabase());
 
         assertNotEquals(0, dao.size());
-        KustvaktResource res = dao
-                .findbyId(ids.get(0), User.UserFactory.getDemoUser());
+        KustvaktResource res = dao.findbyId(ids.get(0),
+                User.UserFactory.getDemoUser());
         assertNotNull(res);
     }
 
+
     @Test
-    public void createCollection() throws KustvaktException {
-        ResourceDao dao = new ResourceDao(helper().getContext().getPersistenceClient());
+    public void createCollection () throws KustvaktException {
+        ResourceDao dao = new ResourceDao(helper().getContext()
+                .getPersistenceClient());
         VirtualCollection c = new VirtualCollection("testColl1");
         c.addField("key_1", "this is a test");
         c.addField("key_2", 2);
@@ -85,15 +93,17 @@
         int id = dao.storeResource(c, user);
 
         KustvaktResource r = dao.findbyId(id, user);
-        assertNotEquals(dao.size(),0);
+        assertNotEquals(dao.size(), 0);
         assertNotNull(r);
-        assertEquals(r.getField("key_1") instanceof String,true);
-        assertEquals(r.getField("key_2") instanceof Integer,true);
+        assertEquals(r.getField("key_1") instanceof String, true);
+        assertEquals(r.getField("key_2") instanceof Integer, true);
     }
 
+
     @Test
-    public void ResourceDataUpdate() throws KustvaktException {
-        ResourceDao dao = new ResourceDao(helper().getContext().getPersistenceClient());
+    public void ResourceDataUpdate () throws KustvaktException {
+        ResourceDao dao = new ResourceDao(helper().getContext()
+                .getPersistenceClient());
         VirtualCollection c = new VirtualCollection("testColl2");
         c.addField("key_1", "this is a test");
         c.addField("key_2", 2);
diff --git a/src/test/java/de/ids_mannheim/korap/handlers/UserDaoTest.java b/src/test/java/de/ids_mannheim/korap/handlers/UserDaoTest.java
index 0c9be7c..d3bdc84 100644
--- a/src/test/java/de/ids_mannheim/korap/handlers/UserDaoTest.java
+++ b/src/test/java/de/ids_mannheim/korap/handlers/UserDaoTest.java
@@ -24,53 +24,58 @@
 public class UserDaoTest extends BeanConfigTest {
 
     @Test
-    public void userput() throws KustvaktException {
+    public void userput () throws KustvaktException {
         User user1 = helper().getContext().getUserDBHandler()
                 .getAccount(TestHelper.getUserCredentials()[0]);
         assertEquals("user creation failed", true, user1.getId() != -1);
     }
 
+
     @Test
-    public void userputBatch() {
+    public void userputBatch () {
         //todo:
     }
 
+
     @Test
-    public void userget() throws KustvaktException {
+    public void userget () throws KustvaktException {
         User user1 = helper().getContext().getUserDBHandler()
                 .getAccount(TestHelper.getUserCredentials()[0]);
         assertEquals("User Retrieval does not work",
                 TestHelper.getUserCredentials()[0], user1.getUsername());
     }
 
+
     //    @Test
-    public void testUserdetailsGetNonExistent() throws KustvaktException {
+    public void testUserdetailsGetNonExistent () throws KustvaktException {
         helper().setupSimpleAccount("userdbtest", "userdbTest");
         User user = helper().getContext().getUserDBHandler()
                 .getAccount("userdbtest");
-        UserDataDbIface dao = BeansFactory.getTypeFactory().getTypedBean(helper()
-                .getContext().getUserDataDaos(), UserDetails.class);
+        UserDataDbIface dao = BeansFactory.getTypeFactory().getTypedBean(
+                helper().getContext().getUserDataDaos(), UserDetails.class);
         Userdata data = dao.get(user);
         assertNull(data);
         helper().dropUser("userdbtest");
     }
 
+
     //    @Test
-    public void testUserSettingsGetNonExistent() throws KustvaktException {
+    public void testUserSettingsGetNonExistent () throws KustvaktException {
         helper().setupSimpleAccount("userdbtest", "userdbTest");
         User user = helper().getContext().getUserDBHandler()
                 .getAccount("userdbtest");
-        UserDataDbIface dao = BeansFactory.getTypeFactory().getTypedBean(helper()
-                .getContext().getUserDataDaos(), UserSettings.class);
+        UserDataDbIface dao = BeansFactory.getTypeFactory().getTypedBean(
+                helper().getContext().getUserDataDaos(), UserSettings.class);
         Userdata data = dao.get(user);
         assertNull(data);
         helper().dropUser("userdbtest");
 
     }
 
+
     // username cannot currently be changed
     //    @Test
-    public void updateUsername() throws KustvaktException {
+    public void updateUsername () throws KustvaktException {
         User user1 = helper().getContext().getUserDBHandler()
                 .getAccount(TestHelper.getUserCredentials()[0]);
         user1.setUsername("new_user");
@@ -80,18 +85,20 @@
         assertEquals("not found", user1.getUsername(), u2.getUsername());
     }
 
+
     @Test
-    public void userupdate() throws KustvaktException {
+    public void userupdate () throws KustvaktException {
         EntityHandlerIface dao = helper().getContext().getUserDBHandler();
         User user1 = dao.getAccount(TestHelper.getUserCredentials()[0]);
         user1.setAccountLocked(true);
         dao.updateAccount(user1);
-        assertEquals("not valid", true,
-                dao.getAccount(user1.getUsername()).isAccountLocked());
+        assertEquals("not valid", true, dao.getAccount(user1.getUsername())
+                .isAccountLocked());
     }
 
+
     @Override
-    public void initMethod() throws KustvaktException {
+    public void initMethod () throws KustvaktException {
         helper().setupAccount();
         helper().runBootInterfaces();
     }
diff --git a/src/test/java/de/ids_mannheim/korap/resource/rewrite/CollectionRewriteTest.java b/src/test/java/de/ids_mannheim/korap/resource/rewrite/CollectionRewriteTest.java
index 6574d09..0c7035b 100644
--- a/src/test/java/de/ids_mannheim/korap/resource/rewrite/CollectionRewriteTest.java
+++ b/src/test/java/de/ids_mannheim/korap/resource/rewrite/CollectionRewriteTest.java
@@ -26,14 +26,16 @@
 
     private static KustvaktConfiguration config;
 
+
     @Override
-    public void initMethod() throws KustvaktException {
+    public void initMethod () throws KustvaktException {
         config = helper().getContext().getConfiguration();
     }
 
+
     @Deprecated
     @Test
-    public void test2() {
+    public void test2 () {
         Pattern p = Pattern.compile("([\\.\\w]+)\\((.+)\\)");
         String cl = de.ids_mannheim.korap.security.ac.SecurityManager.class
                 .getCanonicalName();
@@ -43,8 +45,9 @@
 
     }
 
+
     @Test
-    public void testCollectionNodeRemoveCorpusIdNoErrors() {
+    public void testCollectionNodeRemoveCorpusIdNoErrors () {
         RewriteHandler handler = new RewriteHandler();
         handler.insertBeans(helper().getContext());
         handler.add(CollectionConstraint.class);
@@ -58,8 +61,9 @@
         assertEquals(1, node.at("/collection/operands").size());
     }
 
+
     @Test
-    public void testCollectionNodeRemoveAllCorpusIdNoErrors() {
+    public void testCollectionNodeRemoveAllCorpusIdNoErrors () {
         RewriteHandler handler = new RewriteHandler();
         handler.insertBeans(helper().getContext());
         handler.add(CollectionConstraint.class);
@@ -74,49 +78,54 @@
         assertEquals(0, node.at("/collection/operands").size());
     }
 
+
     @Test
-    public void testCollectionNodeRemoveGroupedCorpusIdNoErrors() {
+    public void testCollectionNodeRemoveGroupedCorpusIdNoErrors () {
         RewriteHandler handler = new RewriteHandler();
         handler.insertBeans(helper().getContext());
         handler.add(CollectionConstraint.class);
         QuerySerializer s = new QuerySerializer();
         s.setQuery(simple_add_query, "poliqarp");
-        s.setCollection(
-                "(corpusID=BRZ13 & textClass=Wissenschaft) & corpusID=WPD");
+        s.setCollection("(corpusID=BRZ13 & textClass=Wissenschaft) & corpusID=WPD");
         String result = s.toJSON();
         JsonNode node = JsonUtils.readTree(handler.preProcess(result,
                 User.UserFactory.getUser("test_user")));
 
         assertNotNull(node);
-        assertEquals("koral:docGroup",node.at("/collection/operands/0/@type").asText());
-        assertEquals("textClass",node.at("/collection/operands/0/operands/0/key").asText());
+        assertEquals("koral:docGroup", node.at("/collection/operands/0/@type")
+                .asText());
+        assertEquals("textClass",
+                node.at("/collection/operands/0/operands/0/key").asText());
     }
 
+
     //fixme: will probably fail when one doc groups are being refactored
     @Test
-    public void testCollectionCleanEmptyDocGroupNoErrors() {
+    public void testCollectionCleanEmptyDocGroupNoErrors () {
         RewriteHandler handler = new RewriteHandler();
         handler.insertBeans(helper().getContext());
         handler.add(CollectionConstraint.class);
         handler.add(CollectionCleanupFilter.class);
         QuerySerializer s = new QuerySerializer();
         s.setQuery(simple_add_query, "poliqarp");
-        s.setCollection(
-                "(corpusID=BRZ13 & corpusID=WPD) & textClass=Wissenschaft & textClass=Sport");
+        s.setCollection("(corpusID=BRZ13 & corpusID=WPD) & textClass=Wissenschaft & textClass=Sport");
         String result = s.toJSON();
         JsonNode node = JsonUtils.readTree(handler.preProcess(result,
                 User.UserFactory.getUser("test_user")));
 
         assertNotNull(node);
-        assertEquals("koral:docGroup",node.at("/collection/@type").asText());
-        assertEquals(2,node.at("/collection/operands").size());
+        assertEquals("koral:docGroup", node.at("/collection/@type").asText());
+        assertEquals(2, node.at("/collection/operands").size());
 
-        assertEquals("textClass",node.at("/collection/operands/0/key").asText());
-        assertEquals("textClass",node.at("/collection/operands/1/key").asText());
+        assertEquals("textClass", node.at("/collection/operands/0/key")
+                .asText());
+        assertEquals("textClass", node.at("/collection/operands/1/key")
+                .asText());
     }
 
+
     @Test
-    public void testCollectionCleanMoveOneDocFromGroupUpNoErrors() {
+    public void testCollectionCleanMoveOneDocFromGroupUpNoErrors () {
         RewriteHandler handler = new RewriteHandler();
         handler.insertBeans(helper().getContext());
         handler.add(CollectionConstraint.class);
@@ -128,46 +137,47 @@
         JsonNode node = JsonUtils.readTree(handler.preProcess(result,
                 User.UserFactory.getUser("test_user")));
         assertNotNull(node);
-        assertEquals("koral:doc",node.at("/collection/@type").asText());
+        assertEquals("koral:doc", node.at("/collection/@type").asText());
     }
 
+
     @Test
-    public void testCollectionCleanEmptyGroupAndMoveOneFromGroupUpNoErrors() {
+    public void testCollectionCleanEmptyGroupAndMoveOneFromGroupUpNoErrors () {
         RewriteHandler handler = new RewriteHandler();
         handler.insertBeans(helper().getContext());
         handler.add(CollectionConstraint.class);
         handler.add(CollectionCleanupFilter.class);
         QuerySerializer s = new QuerySerializer();
         s.setQuery(simple_add_query, "poliqarp");
-        s.setCollection(
-                "(corpusID=BRZ13 & corpusID=WPD) & textClass=Wissenschaft");
+        s.setCollection("(corpusID=BRZ13 & corpusID=WPD) & textClass=Wissenschaft");
         String result = s.toJSON();
         JsonNode node = JsonUtils.readTree(handler.preProcess(result,
                 User.UserFactory.getUser("test_user")));
 
         assertNotNull(node);
-        assertEquals("koral:doc",node.at("/collection/@type").asText());
-        assertEquals("textClass",node.at("/collection/key").asText());
+        assertEquals("koral:doc", node.at("/collection/@type").asText());
+        assertEquals("textClass", node.at("/collection/key").asText());
     }
 
+
     @Test
-    public void testCollectionRemoveAndMoveOneFromGroupUpNoErrors() {
+    public void testCollectionRemoveAndMoveOneFromGroupUpNoErrors () {
         RewriteHandler handler = new RewriteHandler();
         handler.insertBeans(helper().getContext());
         handler.add(CollectionConstraint.class);
         handler.add(CollectionCleanupFilter.class);
         QuerySerializer s = new QuerySerializer();
         s.setQuery(simple_add_query, "poliqarp");
-        s.setCollection(
-                "(docID=random & textClass=Wissenschaft) & corpusID=WPD");
+        s.setCollection("(docID=random & textClass=Wissenschaft) & corpusID=WPD");
         String org = s.toJSON();
         JsonNode node = JsonUtils.readTree(handler.preProcess(org,
                 User.UserFactory.getUser("test_user")));
 
         assertNotNull(node);
-        assertEquals("koral:docGroup",node.at("/collection/@type").asText());
+        assertEquals("koral:docGroup", node.at("/collection/@type").asText());
         assertEquals(2, node.at("/collection/operands").size());
-        assertEquals("koral:doc",node.at("/collection/operands/0/@type").asText());
+        assertEquals("koral:doc", node.at("/collection/operands/0/@type")
+                .asText());
     }
 
 
diff --git a/src/test/java/de/ids_mannheim/korap/resource/rewrite/FoundryRewriteTest.java b/src/test/java/de/ids_mannheim/korap/resource/rewrite/FoundryRewriteTest.java
index 0cbd369..cb7d38d 100644
--- a/src/test/java/de/ids_mannheim/korap/resource/rewrite/FoundryRewriteTest.java
+++ b/src/test/java/de/ids_mannheim/korap/resource/rewrite/FoundryRewriteTest.java
@@ -32,14 +32,16 @@
 
     private static KustvaktConfiguration config;
 
+
     @Override
-    public void initMethod() throws KustvaktException {
+    public void initMethod () throws KustvaktException {
         config = helper().getContext().getConfiguration();
         helper().setupAccount();
     }
 
+
     @Test
-    public void testDefaultLayerMapperThrowsNoException() {
+    public void testDefaultLayerMapperThrowsNoException () {
         LayerMapper m = new LayerMapper(config);
 
         assertEquals(config.getDefault_lemma(), m.findFoundry("lemma"));
@@ -49,11 +51,12 @@
         assertEquals(config.getDefault_const(), m.findFoundry("c"));
     }
 
-    @Test
-    public void testDefaultFoundryInjectLemmaThrowsNoError() {
 
-        KustvaktConfiguration c = helper()
-                .getBean(ContextHolder.KUSTVAKT_CONFIG);
+    @Test
+    public void testDefaultFoundryInjectLemmaThrowsNoError () {
+
+        KustvaktConfiguration c = helper().getBean(
+                ContextHolder.KUSTVAKT_CONFIG);
 
         RewriteHandler processor = new RewriteHandler();
         processor.insertBeans(helper().getContext());
@@ -65,19 +68,20 @@
 
         assertNotNull(node);
         assertFalse(node.at("/query/wrap/foundry").isMissingNode());
-        assertEquals(c.getDefault_lemma(),
-                node.at("/query/wrap/foundry").asText());
+        assertEquals(c.getDefault_lemma(), node.at("/query/wrap/foundry")
+                .asText());
         assertEquals("lemma", node.at("/query/wrap/layer").asText());
         assertFalse(node.at("/query/wrap/rewrites").isMissingNode());
-        assertEquals("koral:rewrite",
-                node.at("/query/wrap/rewrites/0/@type").asText());
+        assertEquals("koral:rewrite", node.at("/query/wrap/rewrites/0/@type")
+                .asText());
     }
 
-    @Test
-    public void testDefaultFoundryInjectPOSNoErrors() {
 
-        KustvaktConfiguration c = helper()
-                .getBean(ContextHolder.KUSTVAKT_CONFIG);
+    @Test
+    public void testDefaultFoundryInjectPOSNoErrors () {
+
+        KustvaktConfiguration c = helper().getBean(
+                ContextHolder.KUSTVAKT_CONFIG);
 
         QuerySerializer s = new QuerySerializer();
         RewriteHandler handler = new RewriteHandler();
@@ -89,17 +93,18 @@
 
         assertNotNull(node);
         assertFalse(node.at("/query/wrap/foundry").isMissingNode());
-        assertEquals(c.getDefault_pos(),
-                node.at("/query/wrap/foundry").asText());
+        assertEquals(c.getDefault_pos(), node.at("/query/wrap/foundry")
+                .asText());
         assertEquals("pos", node.at("/query/wrap/layer").asText());
         assertFalse(node.at("/query/wrap/rewrites").isMissingNode());
-        assertEquals("koral:rewrite",
-                node.at("/query/wrap/rewrites/0/@type").asText());
+        assertEquals("koral:rewrite", node.at("/query/wrap/rewrites/0/@type")
+                .asText());
 
     }
 
+
     @Test
-    public void testRewriteFoundryInjectPOSThrowsNoError()
+    public void testRewriteFoundryInjectPOSThrowsNoError ()
             throws KustvaktException {
         User user = helper().getUser();
 
@@ -111,9 +116,8 @@
         String result = handler.preProcess(s.toJSON(), user);
         JsonNode node = JsonUtils.readTree(result);
 
-        UserDataDbIface dao = BeansFactory.getTypeFactory()
-                .getTypedBean(helper().getContext().getUserDataDaos(),
-                        UserSettings.class);
+        UserDataDbIface dao = BeansFactory.getTypeFactory().getTypedBean(
+                helper().getContext().getUserDataDaos(), UserSettings.class);
         UserSettings settings = (UserSettings) dao.get(user);
         assertTrue(settings.isValid());
         String pos = (String) settings.get(Attributes.DEFAULT_POS_FOUNDRY);
@@ -122,15 +126,16 @@
         assertEquals("pos", node.at("/query/wrap/layer").asText());
         assertEquals(pos, node.at("/query/wrap/foundry").asText());
         assertFalse(node.at("/query/wrap/rewrites").isMissingNode());
-        assertEquals("koral:rewrite",
-                node.at("/query/wrap/rewrites/0/@type").asText());
+        assertEquals("koral:rewrite", node.at("/query/wrap/rewrites/0/@type")
+                .asText());
     }
 
+
     @Test
-    public void testRewriteFoundryInjectLemmaThrowsNoError()
+    public void testRewriteFoundryInjectLemmaThrowsNoError ()
             throws KustvaktException {
-        KustvaktConfiguration c = helper()
-                .getBean(ContextHolder.KUSTVAKT_CONFIG);
+        KustvaktConfiguration c = helper().getBean(
+                ContextHolder.KUSTVAKT_CONFIG);
         User user = helper().getUser();
 
         RewriteHandler handler = new RewriteHandler();
@@ -141,9 +146,8 @@
         String result = handler.preProcess(s.toJSON(), user);
         JsonNode node = JsonUtils.readTree(result);
 
-        UserDataDbIface dao = BeansFactory.getTypeFactory()
-                .getTypedBean(helper().getContext().getUserDataDaos(),
-                        UserSettings.class);
+        UserDataDbIface dao = BeansFactory.getTypeFactory().getTypedBean(
+                helper().getContext().getUserDataDaos(), UserSettings.class);
         UserSettings settings = (UserSettings) dao.get(user);
         assertTrue(settings.isValid());
         String lemma = (String) settings.get(Attributes.DEFAULT_LEMMA_FOUNDRY);
@@ -152,14 +156,15 @@
         assertEquals("lemma", node.at("/query/wrap/layer").asText());
         assertEquals(lemma, node.at("/query/wrap/foundry").asText());
         assertFalse(node.at("/query/wrap/rewrites").isMissingNode());
-        assertEquals("koral:rewrite",
-                node.at("/query/wrap/rewrites/0/@type").asText());
+        assertEquals("koral:rewrite", node.at("/query/wrap/rewrites/0/@type")
+                .asText());
     }
 
+
     @Test
-    public void testFoundryInjectJoinedQueryNoErrors() {
-        KustvaktConfiguration c = helper()
-                .getBean(ContextHolder.KUSTVAKT_CONFIG);
+    public void testFoundryInjectJoinedQueryNoErrors () {
+        KustvaktConfiguration c = helper().getBean(
+                ContextHolder.KUSTVAKT_CONFIG);
 
         QuerySerializer s = new QuerySerializer();
         RewriteHandler handler = new RewriteHandler();
@@ -177,8 +182,9 @@
         assertFalse(node.at("/query/wrap/operands/1/rewrites").isMissingNode());
     }
 
+
     @Test
-    public void testFoundryInjectGroupedQueryNoErrors() {
+    public void testFoundryInjectGroupedQueryNoErrors () {
         QuerySerializer s = new QuerySerializer();
         RewriteHandler handler = new RewriteHandler();
         handler.insertBeans(helper().getContext());
diff --git a/src/test/java/de/ids_mannheim/korap/resource/rewrite/IdRewriteTest.java b/src/test/java/de/ids_mannheim/korap/resource/rewrite/IdRewriteTest.java
index 09be840..2f069f1 100644
--- a/src/test/java/de/ids_mannheim/korap/resource/rewrite/IdRewriteTest.java
+++ b/src/test/java/de/ids_mannheim/korap/resource/rewrite/IdRewriteTest.java
@@ -16,7 +16,7 @@
 public class IdRewriteTest extends BeanConfigTest {
 
     @Test
-    public void insertTokenId() {
+    public void insertTokenId () {
         RewriteHandler handler = new RewriteHandler();
         handler.insertBeans(helper().getContext());
         assertTrue(handler.add(IdWriter.class));
@@ -32,8 +32,9 @@
         assertTrue(result.path("query").has("idn"));
     }
 
+
     @Test
-    public void testIdWriterTest() {
+    public void testIdWriterTest () {
         RewriteHandler handler = new RewriteHandler();
         handler.insertBeans(helper().getContext());
         assertTrue(handler.add(IdWriter.class));
@@ -47,8 +48,9 @@
         assertFalse(node.at("/query/idn").isMissingNode());
     }
 
+
     @Override
-    public void initMethod() throws KustvaktException {
+    public void initMethod () throws KustvaktException {
 
     }
 }
diff --git a/src/test/java/de/ids_mannheim/korap/resource/rewrite/PostRewriteTest.java b/src/test/java/de/ids_mannheim/korap/resource/rewrite/PostRewriteTest.java
index a3b19a0..91ee4e0 100644
--- a/src/test/java/de/ids_mannheim/korap/resource/rewrite/PostRewriteTest.java
+++ b/src/test/java/de/ids_mannheim/korap/resource/rewrite/PostRewriteTest.java
@@ -21,49 +21,54 @@
 public class PostRewriteTest extends BeanConfigTest {
 
     @Override
-    public void initMethod() throws KustvaktException {
+    public void initMethod () throws KustvaktException {
 
     }
 
+
     // otherwise cache will maintain values not relevant for other tests
     @Before
-    public void before() {
+    public void before () {
         CacheManager.getInstance().getCache("documents").removeAll();
-        DocumentDao dao = new DocumentDao(
-                helper().getContext().getPersistenceClient());
+        DocumentDao dao = new DocumentDao(helper().getContext()
+                .getPersistenceClient());
         dao.truncate();
     }
 
+
     @Test
-    public void testPostRewriteNothingToDo() throws KustvaktException {
+    public void testPostRewriteNothingToDo () throws KustvaktException {
         RewriteHandler ha = new RewriteHandler();
         ha.insertBeans(helper().getContext());
         assertEquals("Handler could not be added to rewriter instance!", true,
                 ha.add(DocMatchRewrite.class));
 
-        DocumentDao dao = new DocumentDao(
-                helper().getContext().getPersistenceClient());
+        DocumentDao dao = new DocumentDao(helper().getContext()
+                .getPersistenceClient());
         try {
             Document d = dao.findbyId("BRZ13_APR.00014", null);
             assertNull(d);
             String v = ha.postProcess(RESULT, null);
             assertEquals("results do not match", JsonUtils.readTree(RESULT),
                     JsonUtils.readTree(v));
-        }catch (Exception e) {
+        }
+        catch (Exception e) {
             e.printStackTrace();
         }
     }
 
+
     @Test
-    public void testPostRewriteRemoveDoc() {
-        DocumentDao dao = new DocumentDao(
-                helper().getContext().getPersistenceClient());
+    public void testPostRewriteRemoveDoc () {
+        DocumentDao dao = new DocumentDao(helper().getContext()
+                .getPersistenceClient());
 
         Document doc = new Document("BRZ13_APR.00014");
         doc.setDisabled(true);
         try {
             dao.storeResource(doc, null);
-        }catch (KustvaktException e) {
+        }
+        catch (KustvaktException e) {
             return;
         }
 
@@ -84,15 +89,17 @@
             Document d = dao.findbyId(doc.getPersistentID(), null);
             if (d != null)
                 System.out.println("IS SUPPOSED TO BE NULL! " + d);
-        }catch (KustvaktException e) {
+        }
+        catch (KustvaktException e) {
             e.printStackTrace();
             return;
         }
 
     }
 
+
     @Test
-    public void testPath() {
+    public void testPath () {
         String v = "{\n" + "    \"meta\": {\n" + "        \"count\": 25,\n"
                 + "        \"startIndex\": 0,\n"
                 + "        \"timeout\": 120000,\n" + "        \"context\": {\n"
@@ -104,368 +111,409 @@
 
     }
 
-    private static final String RESULT =
-            "{\n" + "    \"meta\": {\n" + "        \"count\": 25,\n"
-                    + "        \"startIndex\": 0,\n"
-                    + "        \"timeout\": 120000,\n"
-                    + "        \"context\": {\n" + "            \"left\": [\n"
-                    + "                \"token\",\n" + "                6\n"
-                    + "            ],\n" + "            \"right\": [\n"
-                    + "                \"token\",\n" + "                6\n"
-                    + "            ]\n" + "        },\n"
-                    + "        \"fields\": [\n" + "            \"textSigle\",\n"
-                    + "            \"author\",\n"
-                    + "            \"docSigle\",\n" + "            \"title\",\n"
-                    + "            \"pubDate\",\n" + "            \"UID\",\n"
-                    + "            \"corpusID\",\n"
-                    + "            \"textClass\",\n"
-                    + "            \"subTitle\",\n"
-                    + "            \"layerInfos\",\n" + "            \"ID\",\n"
-                    + "            \"pubPlace\",\n"
-                    + "            \"corpusSigle\"\n" + "        ],\n"
-                    + "        \"version\": \"unknown\",\n"
-                    + "        \"benchmark\": \"0.204314141 s\",\n"
-                    + "        \"totalResults\": 1755,\n"
-                    + "        \"serialQuery\": \"tokens:tt/l:Wort\",\n"
-                    + "        \"itemsPerPage\": 25\n" + "    },\n"
-                    + "    \"query\": {\n"
-                    + "        \"@type\": \"koral:token\",\n"
-                    + "        \"wrap\": {\n"
-                    + "            \"@type\": \"koral:term\",\n"
-                    + "            \"key\": \"Wort\",\n"
-                    + "            \"layer\": \"lemma\",\n"
-                    + "            \"match\": \"match:eq\",\n"
-                    + "            \"foundry\": \"tt\",\n"
-                    + "            \"rewrites\": [\n" + "                {\n"
-                    + "                    \"@type\": \"koral:rewrite\",\n"
-                    + "                    \"src\": \"Kustvakt\",\n"
-                    + "                    \"operation\": \"operation:injection\"\n"
-                    + "                }\n" + "            ]\n" + "        }\n"
-                    + "    },\n" + "    \"matches\": [\n" + "        {\n"
-                    + "            \"field\": \"tokens\",\n"
-                    + "            \"textClass\": \"staat-gesellschaft familie-geschlecht\",\n"
-                    + "            \"title\": \"Sexueller Missbrauch –„Das schreiende Kind steckt noch tief in mir“\",\n"
-                    + "            \"author\": \"\",\n"
-                    + "            \"startMore\": true,\n"
-                    + "            \"endMore\": true,\n"
-                    + "            \"corpusID\": \"BRZ13\",\n"
-                    + "            \"snippet\": \"<span class=\\\"context-left\\\"><span class=\\\"more\\\"></span>in ihrer Stimme schwingt bei diesem </span><mark>Wort</mark><span class=\\\"context-right\\\"> Sarkasmus mit. Bis man einen passenden<span class=\\\"more\\\"></span></span>\",\n"
-                    + "            \"matchID\": \"match-BRZ13!BRZ13_APR.00001-p454-455\",\n"
-                    + "            \"docID\": \"BRZ13_APR.00001\",\n"
-                    + "            \"UID\": 0,\n"
-                    + "            \"pubDate\": \"2013-04-02\"\n"
-                    + "        },\n" + "        {\n"
-                    + "            \"field\": \"tokens\",\n"
-                    + "            \"textClass\": \"freizeit-unterhaltung reisen\",\n"
-                    + "            \"title\": \"Leben dick und prall\",\n"
-                    + "            \"author\": \"\",\n"
-                    + "            \"startMore\": true,\n"
-                    + "            \"endMore\": true,\n"
-                    + "            \"corpusID\": \"BRZ13\",\n"
-                    + "            \"snippet\": \"<span class=\\\"context-left\\\"><span class=\\\"more\\\"></span>der DLRG, ausgelassene Partys und markige </span><mark>Worte</mark><span class=\\\"context-right\\\"> des Dompredigers: „Ostern ist kein goethischer<span class=\\\"more\\\"></span></span>\",\n"
-                    + "            \"matchID\": \"match-BRZ13!BRZ13_APR.00014-p96-97\",\n"
-                    + "            \"docID\": \"BRZ13_APR.00014\",\n"
-                    + "            \"UID\": 0,\n"
-                    + "            \"pubDate\": \"2013-04-02\"\n"
-                    + "        },\n" + "        {\n"
-                    + "            \"field\": \"tokens\",\n"
-                    + "            \"textClass\": \"staat-gesellschaft biographien-interviews kultur musik\",\n"
-                    + "            \"title\": \"So wird es gemacht:\",\n"
-                    + "            \"author\": \"\",\n"
-                    + "            \"startMore\": true,\n"
-                    + "            \"endMore\": true,\n"
-                    + "            \"corpusID\": \"BRZ13\",\n"
-                    + "            \"snippet\": \"<span class=\\\"context-left\\\"><span class=\\\"more\\\"></span>derfehlende Buchstabe.Gelingt es dir,das </span><mark>Wort</mark><span class=\\\"context-right\\\"> vervollständigen? Tipp: Probiere auch mal rückwärts<span class=\\\"more\\\"></span></span>\",\n"
-                    + "            \"matchID\": \"match-BRZ13!BRZ13_APR.00055-p19-20\",\n"
-                    + "            \"docID\": \"BRZ13_APR.00055\",\n"
-                    + "            \"UID\": 0,\n"
-                    + "            \"pubDate\": \"2013-04-02\"\n"
-                    + "        },\n" + "        {\n"
-                    + "            \"field\": \"tokens\",\n"
-                    + "            \"textClass\": \"politik ausland\",\n"
-                    + "            \"title\": \"Südkorea droht mit Angriffen – USA rüsten auf\",\n"
-                    + "            \"author\": \"\",\n"
-                    + "            \"startMore\": true,\n"
-                    + "            \"endMore\": true,\n"
-                    + "            \"corpusID\": \"BRZ13\",\n"
-                    + "            \"snippet\": \"<span class=\\\"context-left\\\"><span class=\\\"more\\\"></span>der Stunde. „Aus einem Krieg der </span><mark>Worte</mark><span class=\\\"context-right\\\"> darf kein echter Krieg werden“, sagte<span class=\\\"more\\\"></span></span>\",\n"
-                    + "            \"matchID\": \"match-BRZ13!BRZ13_APR.00076-p238-239\",\n"
-                    + "            \"docID\": \"BRZ13_APR.00076\",\n"
-                    + "            \"UID\": 0,\n"
-                    + "            \"pubDate\": \"2013-04-02\"\n"
-                    + "        },\n" + "        {\n"
-                    + "            \"field\": \"tokens\",\n"
-                    + "            \"textClass\": \"politik inland freizeit-unterhaltung reisen\",\n"
-                    + "            \"title\": \"Dauercamper kämpfen für ihren Platz\",\n"
-                    + "            \"author\": \"\",\n"
-                    + "            \"startMore\": true,\n"
-                    + "            \"endMore\": true,\n"
-                    + "            \"corpusID\": \"BRZ13\",\n"
-                    + "            \"snippet\": \"<span class=\\\"context-left\\\"><span class=\\\"more\\\"></span>„Initiative Campingplatz Räbke“. „Als ich das </span><mark>Wort</mark><span class=\\\"context-right\\\"> Schließung gelesen habe, war ich richtig<span class=\\\"more\\\"></span></span>\",\n"
-                    + "            \"matchID\": \"match-BRZ13!BRZ13_APR.00200-p255-256\",\n"
-                    + "            \"docID\": \"BRZ13_APR.00200\",\n"
-                    + "            \"UID\": 0,\n"
-                    + "            \"pubDate\": \"2013-04-02\"\n"
-                    + "        },\n" + "        {\n"
-                    + "            \"field\": \"tokens\",\n"
-                    + "            \"textClass\": \"freizeit-unterhaltung reisen\",\n"
-                    + "            \"title\": \"Neue Aktionen lockten Besucher\",\n"
-                    + "            \"author\": \"\",\n"
-                    + "            \"startMore\": true,\n"
-                    + "            \"endMore\": true,\n"
-                    + "            \"corpusID\": \"BRZ13\",\n"
-                    + "            \"snippet\": \"<span class=\\\"context-left\\\"><span class=\\\"more\\\"></span>Jan Waldheim (CWG) unter den aufmunternden </span><mark>Worten</mark><span class=\\\"context-right\\\"> eines augenzwinkernden Axel Schnalke („Ein bisschen<span class=\\\"more\\\"></span></span>\",\n"
-                    + "            \"matchID\": \"match-BRZ13!BRZ13_APR.00210-p142-143\",\n"
-                    + "            \"docID\": \"BRZ13_APR.00210\",\n"
-                    + "            \"UID\": 0,\n"
-                    + "            \"pubDate\": \"2013-04-02\"\n"
-                    + "        },\n" + "        {\n"
-                    + "            \"field\": \"tokens\",\n"
-                    + "            \"textClass\": \"kultur musik\",\n"
-                    + "            \"title\": \"Travestie – Helden in Strumpfhosen\",\n"
-                    + "            \"author\": \"\",\n"
-                    + "            \"startMore\": true,\n"
-                    + "            \"endMore\": true,\n"
-                    + "            \"corpusID\": \"BRZ13\",\n"
-                    + "            \"snippet\": \"<span class=\\\"context-left\\\"><span class=\\\"more\\\"></span>trotzdem nicht. Selten wurden so viele </span><mark>Worte</mark><span class=\\\"context-right\\\">, die der Autor hier lieber verschweigt<span class=\\\"more\\\"></span></span>\",\n"
-                    + "            \"matchID\": \"match-BRZ13!BRZ13_APR.00253-p166-167\",\n"
-                    + "            \"docID\": \"BRZ13_APR.00253\",\n"
-                    + "            \"UID\": 0,\n"
-                    + "            \"pubDate\": \"2013-04-02\"\n"
-                    + "        },\n" + "        {\n"
-                    + "            \"field\": \"tokens\",\n"
-                    + "            \"textClass\": \"kultur musik\",\n"
-                    + "            \"title\": \"Travestie – Helden in Strumpfhosen\",\n"
-                    + "            \"author\": \"\",\n"
-                    + "            \"startMore\": true,\n"
-                    + "            \"endMore\": true,\n"
-                    + "            \"corpusID\": \"BRZ13\",\n"
-                    + "            \"snippet\": \"<span class=\\\"context-left\\\"><span class=\\\"more\\\"></span>zudem nicht immer nur bei den </span><mark>Worten</mark><span class=\\\"context-right\\\"> geblieben) und dabei gleichzeitig soviel Charme<span class=\\\"more\\\"></span></span>\",\n"
-                    + "            \"matchID\": \"match-BRZ13!BRZ13_APR.00253-p191-192\",\n"
-                    + "            \"docID\": \"BRZ13_APR.00253\",\n"
-                    + "            \"UID\": 0,\n"
-                    + "            \"pubDate\": \"2013-04-02\"\n"
-                    + "        },\n" + "        {\n"
-                    + "            \"field\": \"tokens\",\n"
-                    + "            \"textClass\": \"kultur musik\",\n"
-                    + "            \"title\": \"Travestie – Helden in Strumpfhosen\",\n"
-                    + "            \"author\": \"\",\n"
-                    + "            \"startMore\": true,\n"
-                    + "            \"endMore\": true,\n"
-                    + "            \"corpusID\": \"BRZ13\",\n"
-                    + "            \"snippet\": \"<span class=\\\"context-left\\\"><span class=\\\"more\\\"></span>bedeutet Travestie sich zu verkleiden, das </span><mark>Wort</mark><span class=\\\"context-right\\\"> stammt aus dem Französischen. Traditionell belegten<span class=\\\"more\\\"></span></span>\",\n"
-                    + "            \"matchID\": \"match-BRZ13!BRZ13_APR.00253-p371-372\",\n"
-                    + "            \"docID\": \"BRZ13_APR.00253\",\n"
-                    + "            \"UID\": 0,\n"
-                    + "            \"pubDate\": \"2013-04-02\"\n"
-                    + "        },\n" + "        {\n"
-                    + "            \"field\": \"tokens\",\n"
-                    + "            \"textClass\": \"sport fussball\",\n"
-                    + "            \"title\": \"VfL kommt nicht vom Fleck\",\n"
-                    + "            \"author\": \"\",\n"
-                    + "            \"startMore\": true,\n"
-                    + "            \"endMore\": true,\n"
-                    + "            \"corpusID\": \"BRZ13\",\n"
-                    + "            \"snippet\": \"<span class=\\\"context-left\\\"><span class=\\\"more\\\"></span>am internationalen Geschäft berechtigt. Mit anderen </span><mark>Worten</mark><span class=\\\"context-right\\\">: Die „Wölfe“ stecken im grauen Mittelmaß<span class=\\\"more\\\"></span></span>\",\n"
-                    + "            \"matchID\": \"match-BRZ13!BRZ13_APR.00260-p93-94\",\n"
-                    + "            \"docID\": \"BRZ13_APR.00260\",\n"
-                    + "            \"UID\": 0,\n"
-                    + "            \"pubDate\": \"2013-04-02\"\n"
-                    + "        },\n" + "        {\n"
-                    + "            \"field\": \"tokens\",\n"
-                    + "            \"textClass\": \"sport fussball\",\n"
-                    + "            \"title\": \"Mensch, Mayer! Super Tor\",\n"
-                    + "            \"author\": \"\",\n"
-                    + "            \"startMore\": true,\n"
-                    + "            \"endMore\": true,\n"
-                    + "            \"corpusID\": \"BRZ13\",\n"
-                    + "            \"snippet\": \"<span class=\\\"context-left\\\"><span class=\\\"more\\\"></span>bekommst, ist das unbezahlbar – ein Bonus.“ </span><mark>Worte</mark><span class=\\\"context-right\\\">, die dem Torschützen weiteres Selbstvertrauen geben<span class=\\\"more\\\"></span></span>\",\n"
-                    + "            \"matchID\": \"match-BRZ13!BRZ13_APR.00275-p271-272\",\n"
-                    + "            \"docID\": \"BRZ13_APR.00275\",\n"
-                    + "            \"UID\": 0,\n"
-                    + "            \"pubDate\": \"2013-04-02\"\n"
-                    + "        },\n" + "        {\n"
-                    + "            \"field\": \"tokens\",\n"
-                    + "            \"textClass\": \"sport fussball\",\n"
-                    + "            \"title\": \"Nur Gerücht? KHL-Klub will „Dshuni“\",\n"
-                    + "            \"author\": \"\",\n"
-                    + "            \"startMore\": true,\n"
-                    + "            \"endMore\": true,\n"
-                    + "            \"corpusID\": \"BRZ13\",\n"
-                    + "            \"snippet\": \"<span class=\\\"context-left\\\"><span class=\\\"more\\\"></span>und hakt das Thema ab.cb Kein </span><mark>Wort</mark><span class=\\\"context-right\\\"> zum Interesse aus Astana: Daniar Dshunussow.Foto<span class=\\\"more\\\"></span></span>\",\n"
-                    + "            \"matchID\": \"match-BRZ13!BRZ13_APR.00277-p163-164\",\n"
-                    + "            \"docID\": \"BRZ13_APR.00277\",\n"
-                    + "            \"UID\": 0,\n"
-                    + "            \"pubDate\": \"2013-04-02\"\n"
-                    + "        },\n" + "        {\n"
-                    + "            \"field\": \"tokens\",\n"
-                    + "            \"textClass\": \"staat-gesellschaft biographien-interviews\",\n"
-                    + "            \"title\": \"Das Leben ist nicht auf diese Erde beschränkt\",\n"
-                    + "            \"author\": \"\",\n"
-                    + "            \"startMore\": true,\n"
-                    + "            \"endMore\": true,\n"
-                    + "            \"corpusID\": \"BRZ13\",\n"
-                    + "            \"snippet\": \"<span class=\\\"context-left\\\"><span class=\\\"more\\\"></span>1. Korinther 1,18 denken: Denn das </span><mark>Wort</mark><span class=\\\"context-right\\\"> vom Kreuz ist eine Torheit denen<span class=\\\"more\\\"></span></span>\",\n"
-                    + "            \"matchID\": \"match-BRZ13!BRZ13_APR.00520-p32-33\",\n"
-                    + "            \"docID\": \"BRZ13_APR.00520\",\n"
-                    + "            \"UID\": 0,\n"
-                    + "            \"pubDate\": \"2013-04-03\"\n"
-                    + "        },\n" + "        {\n"
-                    + "            \"field\": \"tokens\",\n"
-                    + "            \"textClass\": \"sport fussball\",\n"
-                    + "            \"title\": \"Allofs und Hecking knöpfensich die VfL-Profis vor\",\n"
-                    + "            \"author\": \"\",\n"
-                    + "            \"startMore\": true,\n"
-                    + "            \"endMore\": true,\n"
-                    + "            \"corpusID\": \"BRZ13\",\n"
-                    + "            \"snippet\": \"<span class=\\\"context-left\\\"><span class=\\\"more\\\"></span>für die Profis am Dienstag klare </span><mark>Worte</mark><span class=\\\"context-right\\\"> vom Führungsduo. Von Thorsten Grunow Wolfsburg<span class=\\\"more\\\"></span></span>\",\n"
-                    + "            \"matchID\": \"match-BRZ13!BRZ13_APR.00557-p17-18\",\n"
-                    + "            \"docID\": \"BRZ13_APR.00557\",\n"
-                    + "            \"UID\": 0,\n"
-                    + "            \"pubDate\": \"2013-04-03\"\n"
-                    + "        },\n" + "        {\n"
-                    + "            \"field\": \"tokens\",\n"
-                    + "            \"textClass\": \"sport fussball\",\n"
-                    + "            \"title\": \"Allofs und Hecking knöpfensich die VfL-Profis vor\",\n"
-                    + "            \"author\": \"\",\n"
-                    + "            \"startMore\": true,\n"
-                    + "            \"endMore\": true,\n"
-                    + "            \"corpusID\": \"BRZ13\",\n"
-                    + "            \"snippet\": \"<span class=\\\"context-left\\\"><span class=\\\"more\\\"></span>Minuten setzte es am Dienstagnachmittag klare </span><mark>Worte</mark><span class=\\\"context-right\\\"> für die kickende Belegschaft, die durchaus<span class=\\\"more\\\"></span></span>\",\n"
-                    + "            \"matchID\": \"match-BRZ13!BRZ13_APR.00557-p60-61\",\n"
-                    + "            \"docID\": \"BRZ13_APR.00557\",\n"
-                    + "            \"UID\": 0,\n"
-                    + "            \"pubDate\": \"2013-04-03\"\n"
-                    + "        },\n" + "        {\n"
-                    + "            \"field\": \"tokens\",\n"
-                    + "            \"textClass\": \"sport fussball\",\n"
-                    + "            \"title\": \"Allofs und Hecking knöpfensich die VfL-Profis vor\",\n"
-                    + "            \"author\": \"\",\n"
-                    + "            \"startMore\": true,\n"
-                    + "            \"endMore\": true,\n"
-                    + "            \"corpusID\": \"BRZ13\",\n"
-                    + "            \"snippet\": \"<span class=\\\"context-left\\\"><span class=\\\"more\\\"></span>Manager ist überzeugt, dass die klaren </span><mark>Worte</mark><span class=\\\"context-right\\\"> auf fruchtbaren Boden gefallen sind. „Ich<span class=\\\"more\\\"></span></span>\",\n"
-                    + "            \"matchID\": \"match-BRZ13!BRZ13_APR.00557-p235-236\",\n"
-                    + "            \"docID\": \"BRZ13_APR.00557\",\n"
-                    + "            \"UID\": 0,\n"
-                    + "            \"pubDate\": \"2013-04-03\"\n"
-                    + "        },\n" + "        {\n"
-                    + "            \"field\": \"tokens\",\n"
-                    + "            \"textClass\": \"politik inland politik ausland\",\n"
-                    + "            \"title\": \"Zeitungsartikelzufällig deponiert?\",\n"
-                    + "            \"author\": \"\",\n"
-                    + "            \"startMore\": true,\n"
-                    + "            \"endMore\": true,\n"
-                    + "            \"corpusID\": \"BRZ13\",\n"
-                    + "            \"snippet\": \"<span class=\\\"context-left\\\"><span class=\\\"more\\\"></span>erspart“, lautete die Schlagzeile – wobei das </span><mark>Wort</mark><span class=\\\"context-right\\\"> „erspart“ abgeschnitten war. Ein plumper Versuch<span class=\\\"more\\\"></span></span>\",\n"
-                    + "            \"matchID\": \"match-BRZ13!BRZ13_JAN.07616-p31-32\",\n"
-                    + "            \"docID\": \"BRZ13_JAN.07616\",\n"
-                    + "            \"UID\": 0,\n"
-                    + "            \"pubDate\": \"2013-01-21\"\n"
-                    + "        },\n" + "        {\n"
-                    + "            \"field\": \"tokens\",\n"
-                    + "            \"textClass\": \"politik inland\",\n"
-                    + "            \"title\": \"„Philipp Rösler wackelt nicht“\",\n"
-                    + "            \"author\": \"\",\n"
-                    + "            \"startMore\": true,\n"
-                    + "            \"endMore\": true,\n"
-                    + "            \"corpusID\": \"BRZ13\",\n"
-                    + "            \"snippet\": \"<span class=\\\"context-left\\\"><span class=\\\"more\\\"></span>Vizekanzler bei all dem Jubel zu </span><mark>Wort</mark><span class=\\\"context-right\\\"> kommt. „Ein großartiger Tag“, sagt er<span class=\\\"more\\\"></span></span>\",\n"
-                    + "            \"matchID\": \"match-BRZ13!BRZ13_JAN.07617-p177-178\",\n"
-                    + "            \"docID\": \"BRZ13_JAN.07617\",\n"
-                    + "            \"UID\": 0,\n"
-                    + "            \"pubDate\": \"2013-01-21\"\n"
-                    + "        },\n" + "        {\n"
-                    + "            \"field\": \"tokens\",\n"
-                    + "            \"textClass\": \"freizeit-unterhaltung reisen\",\n"
-                    + "            \"title\": \"Lanz gibt den charmanten, zurückhaltenden Gastgeber\",\n"
-                    + "            \"author\": \"\",\n"
-                    + "            \"startMore\": true,\n"
-                    + "            \"endMore\": true,\n"
-                    + "            \"corpusID\": \"BRZ13\",\n"
-                    + "            \"snippet\": \"<span class=\\\"context-left\\\"><span class=\\\"more\\\"></span>er, als seine Assistentin ihm ins </span><mark>Wort</mark><span class=\\\"context-right\\\"> fiel. Dennoch holte das ungleiche Duo<span class=\\\"more\\\"></span></span>\",\n"
-                    + "            \"matchID\": \"match-BRZ13!BRZ13_JAN.07621-p261-262\",\n"
-                    + "            \"docID\": \"BRZ13_JAN.07621\",\n"
-                    + "            \"UID\": 0,\n"
-                    + "            \"pubDate\": \"2013-01-21\"\n"
-                    + "        },\n" + "        {\n"
-                    + "            \"field\": \"tokens\",\n"
-                    + "            \"textClass\": \"politik inland\",\n"
-                    + "            \"title\": \"Mundlos denkt über Rücktritt nach\",\n"
-                    + "            \"author\": \"\",\n"
-                    + "            \"startMore\": true,\n"
-                    + "            \"endMore\": true,\n"
-                    + "            \"corpusID\": \"BRZ13\",\n"
-                    + "            \"snippet\": \"<span class=\\\"context-left\\\"><span class=\\\"more\\\"></span>räumte selbst ein, wie sarkastisch diese </span><mark>Worte</mark><span class=\\\"context-right\\\"> nach einer solchen Wahlnacht klingen mussten<span class=\\\"more\\\"></span></span>\",\n"
-                    + "            \"matchID\": \"match-BRZ13!BRZ13_JAN.07694-p192-193\",\n"
-                    + "            \"docID\": \"BRZ13_JAN.07694\",\n"
-                    + "            \"UID\": 0,\n"
-                    + "            \"pubDate\": \"2013-01-21\"\n"
-                    + "        },\n" + "        {\n"
-                    + "            \"field\": \"tokens\",\n"
-                    + "            \"textClass\": \"politik inland\",\n"
-                    + "            \"title\": \"BraunschweigGold – Hannover Blech\",\n"
-                    + "            \"author\": \"\",\n"
-                    + "            \"startMore\": true,\n"
-                    + "            \"endMore\": true,\n"
-                    + "            \"corpusID\": \"BRZ13\",\n"
-                    + "            \"snippet\": \"<span class=\\\"context-left\\\"><span class=\\\"more\\\"></span>im Volksfreundhaus hört man kein schlechtes </span><mark>Wort</mark><span class=\\\"context-right\\\"> über den Kanzlerkandidaten Peer Steinbrück – und<span class=\\\"more\\\"></span></span>\",\n"
-                    + "            \"matchID\": \"match-BRZ13!BRZ13_JAN.07695-p169-170\",\n"
-                    + "            \"docID\": \"BRZ13_JAN.07695\",\n"
-                    + "            \"UID\": 0,\n"
-                    + "            \"pubDate\": \"2013-01-21\"\n"
-                    + "        },\n" + "        {\n"
-                    + "            \"field\": \"tokens\",\n"
-                    + "            \"textClass\": \"politik inland\",\n"
-                    + "            \"title\": \"BraunschweigGold – Hannover Blech\",\n"
-                    + "            \"author\": \"\",\n"
-                    + "            \"startMore\": true,\n"
-                    + "            \"endMore\": true,\n"
-                    + "            \"corpusID\": \"BRZ13\",\n"
-                    + "            \"snippet\": \"<span class=\\\"context-left\\\"><span class=\\\"more\\\"></span>Volksfreundhaus merklich steigen. Hier hat das </span><mark>Wort</mark><span class=\\\"context-right\\\"> von der Wahlparty bei Bier, Bockwurst<span class=\\\"more\\\"></span></span>\",\n"
-                    + "            \"matchID\": \"match-BRZ13!BRZ13_JAN.07695-p266-267\",\n"
-                    + "            \"docID\": \"BRZ13_JAN.07695\",\n"
-                    + "            \"UID\": 0,\n"
-                    + "            \"pubDate\": \"2013-01-21\"\n"
-                    + "        },\n" + "        {\n"
-                    + "            \"field\": \"tokens\",\n"
-                    + "            \"textClass\": \"staat-gesellschaft kirche\",\n"
-                    + "            \"title\": \"Fernsehen überträgt Gottesdienst\",\n"
-                    + "            \"author\": \"\",\n"
-                    + "            \"startMore\": true,\n"
-                    + "            \"endMore\": true,\n"
-                    + "            \"corpusID\": \"BRZ13\",\n"
-                    + "            \"snippet\": \"<span class=\\\"context-left\\\"><span class=\\\"more\\\"></span>schon mal von der Sendung „Das </span><mark>Wort</mark><span class=\\\"context-right\\\"> zum Sonntag“ gehört. Das sind Predigten<span class=\\\"more\\\"></span></span>\",\n"
-                    + "            \"matchID\": \"match-BRZ13!BRZ13_JAN.07840-p37-38\",\n"
-                    + "            \"docID\": \"BRZ13_JAN.07840\",\n"
-                    + "            \"UID\": 0,\n"
-                    + "            \"pubDate\": \"2013-01-21\"\n"
-                    + "        },\n" + "        {\n"
-                    + "            \"field\": \"tokens\",\n"
-                    + "            \"textClass\": \"politik inland\",\n"
-                    + "            \"title\": \"Wahlkrimi im Ratssaal\",\n"
-                    + "            \"author\": \"\",\n"
-                    + "            \"startMore\": true,\n"
-                    + "            \"endMore\": true,\n"
-                    + "            \"corpusID\": \"BRZ13\",\n"
-                    + "            \"snippet\": \"<span class=\\\"context-left\\\"><span class=\\\"more\\\"></span>ihre Konkurrentin Glosemeyer hatte sie warme </span><mark>Worte</mark><span class=\\\"context-right\\\"> übrig. „Für den ersten Anlauf eine<span class=\\\"more\\\"></span></span>\",\n"
-                    + "            \"matchID\": \"match-BRZ13!BRZ13_JAN.07848-p147-148\",\n"
-                    + "            \"docID\": \"BRZ13_JAN.07848\",\n"
-                    + "            \"UID\": 0,\n"
-                    + "            \"pubDate\": \"2013-01-21\"\n"
-                    + "        },\n" + "        {\n"
-                    + "            \"field\": \"tokens\",\n"
-                    + "            \"textClass\": \"politik inland\",\n"
-                    + "            \"title\": \"Warme Worte nach eiskaltem Wahlkampf\",\n"
-                    + "            \"author\": \"\",\n"
-                    + "            \"startMore\": true,\n"
-                    + "            \"endMore\": true,\n"
-                    + "            \"corpusID\": \"BRZ13\",\n"
-                    + "            \"snippet\": \"<span class=\\\"context-left\\\">Warme </span><mark>Worte</mark><span class=\\\"context-right\\\"> nach eiskaltem Wahlkampf Die SPD feierte<span class=\\\"more\\\"></span></span>\",\n"
-                    + "            \"matchID\": \"match-BRZ13!BRZ13_JAN.07850-p1-2\",\n"
-                    + "            \"docID\": \"BRZ13_JAN.07850\",\n"
-                    + "            \"UID\": 0,\n"
-                    + "            \"pubDate\": \"2013-01-21\"\n"
-                    + "        }\n" + "    ]\n" + "}";
+    private static final String RESULT = "{\n"
+            + "    \"meta\": {\n"
+            + "        \"count\": 25,\n"
+            + "        \"startIndex\": 0,\n"
+            + "        \"timeout\": 120000,\n"
+            + "        \"context\": {\n"
+            + "            \"left\": [\n"
+            + "                \"token\",\n"
+            + "                6\n"
+            + "            ],\n"
+            + "            \"right\": [\n"
+            + "                \"token\",\n"
+            + "                6\n"
+            + "            ]\n"
+            + "        },\n"
+            + "        \"fields\": [\n"
+            + "            \"textSigle\",\n"
+            + "            \"author\",\n"
+            + "            \"docSigle\",\n"
+            + "            \"title\",\n"
+            + "            \"pubDate\",\n"
+            + "            \"UID\",\n"
+            + "            \"corpusID\",\n"
+            + "            \"textClass\",\n"
+            + "            \"subTitle\",\n"
+            + "            \"layerInfos\",\n"
+            + "            \"ID\",\n"
+            + "            \"pubPlace\",\n"
+            + "            \"corpusSigle\"\n"
+            + "        ],\n"
+            + "        \"version\": \"unknown\",\n"
+            + "        \"benchmark\": \"0.204314141 s\",\n"
+            + "        \"totalResults\": 1755,\n"
+            + "        \"serialQuery\": \"tokens:tt/l:Wort\",\n"
+            + "        \"itemsPerPage\": 25\n"
+            + "    },\n"
+            + "    \"query\": {\n"
+            + "        \"@type\": \"koral:token\",\n"
+            + "        \"wrap\": {\n"
+            + "            \"@type\": \"koral:term\",\n"
+            + "            \"key\": \"Wort\",\n"
+            + "            \"layer\": \"lemma\",\n"
+            + "            \"match\": \"match:eq\",\n"
+            + "            \"foundry\": \"tt\",\n"
+            + "            \"rewrites\": [\n"
+            + "                {\n"
+            + "                    \"@type\": \"koral:rewrite\",\n"
+            + "                    \"src\": \"Kustvakt\",\n"
+            + "                    \"operation\": \"operation:injection\"\n"
+            + "                }\n"
+            + "            ]\n"
+            + "        }\n"
+            + "    },\n"
+            + "    \"matches\": [\n"
+            + "        {\n"
+            + "            \"field\": \"tokens\",\n"
+            + "            \"textClass\": \"staat-gesellschaft familie-geschlecht\",\n"
+            + "            \"title\": \"Sexueller Missbrauch –„Das schreiende Kind steckt noch tief in mir“\",\n"
+            + "            \"author\": \"\",\n"
+            + "            \"startMore\": true,\n"
+            + "            \"endMore\": true,\n"
+            + "            \"corpusID\": \"BRZ13\",\n"
+            + "            \"snippet\": \"<span class=\\\"context-left\\\"><span class=\\\"more\\\"></span>in ihrer Stimme schwingt bei diesem </span><mark>Wort</mark><span class=\\\"context-right\\\"> Sarkasmus mit. Bis man einen passenden<span class=\\\"more\\\"></span></span>\",\n"
+            + "            \"matchID\": \"match-BRZ13!BRZ13_APR.00001-p454-455\",\n"
+            + "            \"docID\": \"BRZ13_APR.00001\",\n"
+            + "            \"UID\": 0,\n"
+            + "            \"pubDate\": \"2013-04-02\"\n"
+            + "        },\n"
+            + "        {\n"
+            + "            \"field\": \"tokens\",\n"
+            + "            \"textClass\": \"freizeit-unterhaltung reisen\",\n"
+            + "            \"title\": \"Leben dick und prall\",\n"
+            + "            \"author\": \"\",\n"
+            + "            \"startMore\": true,\n"
+            + "            \"endMore\": true,\n"
+            + "            \"corpusID\": \"BRZ13\",\n"
+            + "            \"snippet\": \"<span class=\\\"context-left\\\"><span class=\\\"more\\\"></span>der DLRG, ausgelassene Partys und markige </span><mark>Worte</mark><span class=\\\"context-right\\\"> des Dompredigers: „Ostern ist kein goethischer<span class=\\\"more\\\"></span></span>\",\n"
+            + "            \"matchID\": \"match-BRZ13!BRZ13_APR.00014-p96-97\",\n"
+            + "            \"docID\": \"BRZ13_APR.00014\",\n"
+            + "            \"UID\": 0,\n"
+            + "            \"pubDate\": \"2013-04-02\"\n"
+            + "        },\n"
+            + "        {\n"
+            + "            \"field\": \"tokens\",\n"
+            + "            \"textClass\": \"staat-gesellschaft biographien-interviews kultur musik\",\n"
+            + "            \"title\": \"So wird es gemacht:\",\n"
+            + "            \"author\": \"\",\n"
+            + "            \"startMore\": true,\n"
+            + "            \"endMore\": true,\n"
+            + "            \"corpusID\": \"BRZ13\",\n"
+            + "            \"snippet\": \"<span class=\\\"context-left\\\"><span class=\\\"more\\\"></span>derfehlende Buchstabe.Gelingt es dir,das </span><mark>Wort</mark><span class=\\\"context-right\\\"> vervollständigen? Tipp: Probiere auch mal rückwärts<span class=\\\"more\\\"></span></span>\",\n"
+            + "            \"matchID\": \"match-BRZ13!BRZ13_APR.00055-p19-20\",\n"
+            + "            \"docID\": \"BRZ13_APR.00055\",\n"
+            + "            \"UID\": 0,\n"
+            + "            \"pubDate\": \"2013-04-02\"\n"
+            + "        },\n"
+            + "        {\n"
+            + "            \"field\": \"tokens\",\n"
+            + "            \"textClass\": \"politik ausland\",\n"
+            + "            \"title\": \"Südkorea droht mit Angriffen – USA rüsten auf\",\n"
+            + "            \"author\": \"\",\n"
+            + "            \"startMore\": true,\n"
+            + "            \"endMore\": true,\n"
+            + "            \"corpusID\": \"BRZ13\",\n"
+            + "            \"snippet\": \"<span class=\\\"context-left\\\"><span class=\\\"more\\\"></span>der Stunde. „Aus einem Krieg der </span><mark>Worte</mark><span class=\\\"context-right\\\"> darf kein echter Krieg werden“, sagte<span class=\\\"more\\\"></span></span>\",\n"
+            + "            \"matchID\": \"match-BRZ13!BRZ13_APR.00076-p238-239\",\n"
+            + "            \"docID\": \"BRZ13_APR.00076\",\n"
+            + "            \"UID\": 0,\n"
+            + "            \"pubDate\": \"2013-04-02\"\n"
+            + "        },\n"
+            + "        {\n"
+            + "            \"field\": \"tokens\",\n"
+            + "            \"textClass\": \"politik inland freizeit-unterhaltung reisen\",\n"
+            + "            \"title\": \"Dauercamper kämpfen für ihren Platz\",\n"
+            + "            \"author\": \"\",\n"
+            + "            \"startMore\": true,\n"
+            + "            \"endMore\": true,\n"
+            + "            \"corpusID\": \"BRZ13\",\n"
+            + "            \"snippet\": \"<span class=\\\"context-left\\\"><span class=\\\"more\\\"></span>„Initiative Campingplatz Räbke“. „Als ich das </span><mark>Wort</mark><span class=\\\"context-right\\\"> Schließung gelesen habe, war ich richtig<span class=\\\"more\\\"></span></span>\",\n"
+            + "            \"matchID\": \"match-BRZ13!BRZ13_APR.00200-p255-256\",\n"
+            + "            \"docID\": \"BRZ13_APR.00200\",\n"
+            + "            \"UID\": 0,\n"
+            + "            \"pubDate\": \"2013-04-02\"\n"
+            + "        },\n"
+            + "        {\n"
+            + "            \"field\": \"tokens\",\n"
+            + "            \"textClass\": \"freizeit-unterhaltung reisen\",\n"
+            + "            \"title\": \"Neue Aktionen lockten Besucher\",\n"
+            + "            \"author\": \"\",\n"
+            + "            \"startMore\": true,\n"
+            + "            \"endMore\": true,\n"
+            + "            \"corpusID\": \"BRZ13\",\n"
+            + "            \"snippet\": \"<span class=\\\"context-left\\\"><span class=\\\"more\\\"></span>Jan Waldheim (CWG) unter den aufmunternden </span><mark>Worten</mark><span class=\\\"context-right\\\"> eines augenzwinkernden Axel Schnalke („Ein bisschen<span class=\\\"more\\\"></span></span>\",\n"
+            + "            \"matchID\": \"match-BRZ13!BRZ13_APR.00210-p142-143\",\n"
+            + "            \"docID\": \"BRZ13_APR.00210\",\n"
+            + "            \"UID\": 0,\n"
+            + "            \"pubDate\": \"2013-04-02\"\n"
+            + "        },\n"
+            + "        {\n"
+            + "            \"field\": \"tokens\",\n"
+            + "            \"textClass\": \"kultur musik\",\n"
+            + "            \"title\": \"Travestie – Helden in Strumpfhosen\",\n"
+            + "            \"author\": \"\",\n"
+            + "            \"startMore\": true,\n"
+            + "            \"endMore\": true,\n"
+            + "            \"corpusID\": \"BRZ13\",\n"
+            + "            \"snippet\": \"<span class=\\\"context-left\\\"><span class=\\\"more\\\"></span>trotzdem nicht. Selten wurden so viele </span><mark>Worte</mark><span class=\\\"context-right\\\">, die der Autor hier lieber verschweigt<span class=\\\"more\\\"></span></span>\",\n"
+            + "            \"matchID\": \"match-BRZ13!BRZ13_APR.00253-p166-167\",\n"
+            + "            \"docID\": \"BRZ13_APR.00253\",\n"
+            + "            \"UID\": 0,\n"
+            + "            \"pubDate\": \"2013-04-02\"\n"
+            + "        },\n"
+            + "        {\n"
+            + "            \"field\": \"tokens\",\n"
+            + "            \"textClass\": \"kultur musik\",\n"
+            + "            \"title\": \"Travestie – Helden in Strumpfhosen\",\n"
+            + "            \"author\": \"\",\n"
+            + "            \"startMore\": true,\n"
+            + "            \"endMore\": true,\n"
+            + "            \"corpusID\": \"BRZ13\",\n"
+            + "            \"snippet\": \"<span class=\\\"context-left\\\"><span class=\\\"more\\\"></span>zudem nicht immer nur bei den </span><mark>Worten</mark><span class=\\\"context-right\\\"> geblieben) und dabei gleichzeitig soviel Charme<span class=\\\"more\\\"></span></span>\",\n"
+            + "            \"matchID\": \"match-BRZ13!BRZ13_APR.00253-p191-192\",\n"
+            + "            \"docID\": \"BRZ13_APR.00253\",\n"
+            + "            \"UID\": 0,\n"
+            + "            \"pubDate\": \"2013-04-02\"\n"
+            + "        },\n"
+            + "        {\n"
+            + "            \"field\": \"tokens\",\n"
+            + "            \"textClass\": \"kultur musik\",\n"
+            + "            \"title\": \"Travestie – Helden in Strumpfhosen\",\n"
+            + "            \"author\": \"\",\n"
+            + "            \"startMore\": true,\n"
+            + "            \"endMore\": true,\n"
+            + "            \"corpusID\": \"BRZ13\",\n"
+            + "            \"snippet\": \"<span class=\\\"context-left\\\"><span class=\\\"more\\\"></span>bedeutet Travestie sich zu verkleiden, das </span><mark>Wort</mark><span class=\\\"context-right\\\"> stammt aus dem Französischen. Traditionell belegten<span class=\\\"more\\\"></span></span>\",\n"
+            + "            \"matchID\": \"match-BRZ13!BRZ13_APR.00253-p371-372\",\n"
+            + "            \"docID\": \"BRZ13_APR.00253\",\n"
+            + "            \"UID\": 0,\n"
+            + "            \"pubDate\": \"2013-04-02\"\n"
+            + "        },\n"
+            + "        {\n"
+            + "            \"field\": \"tokens\",\n"
+            + "            \"textClass\": \"sport fussball\",\n"
+            + "            \"title\": \"VfL kommt nicht vom Fleck\",\n"
+            + "            \"author\": \"\",\n"
+            + "            \"startMore\": true,\n"
+            + "            \"endMore\": true,\n"
+            + "            \"corpusID\": \"BRZ13\",\n"
+            + "            \"snippet\": \"<span class=\\\"context-left\\\"><span class=\\\"more\\\"></span>am internationalen Geschäft berechtigt. Mit anderen </span><mark>Worten</mark><span class=\\\"context-right\\\">: Die „Wölfe“ stecken im grauen Mittelmaß<span class=\\\"more\\\"></span></span>\",\n"
+            + "            \"matchID\": \"match-BRZ13!BRZ13_APR.00260-p93-94\",\n"
+            + "            \"docID\": \"BRZ13_APR.00260\",\n"
+            + "            \"UID\": 0,\n"
+            + "            \"pubDate\": \"2013-04-02\"\n"
+            + "        },\n"
+            + "        {\n"
+            + "            \"field\": \"tokens\",\n"
+            + "            \"textClass\": \"sport fussball\",\n"
+            + "            \"title\": \"Mensch, Mayer! Super Tor\",\n"
+            + "            \"author\": \"\",\n"
+            + "            \"startMore\": true,\n"
+            + "            \"endMore\": true,\n"
+            + "            \"corpusID\": \"BRZ13\",\n"
+            + "            \"snippet\": \"<span class=\\\"context-left\\\"><span class=\\\"more\\\"></span>bekommst, ist das unbezahlbar – ein Bonus.“ </span><mark>Worte</mark><span class=\\\"context-right\\\">, die dem Torschützen weiteres Selbstvertrauen geben<span class=\\\"more\\\"></span></span>\",\n"
+            + "            \"matchID\": \"match-BRZ13!BRZ13_APR.00275-p271-272\",\n"
+            + "            \"docID\": \"BRZ13_APR.00275\",\n"
+            + "            \"UID\": 0,\n"
+            + "            \"pubDate\": \"2013-04-02\"\n"
+            + "        },\n"
+            + "        {\n"
+            + "            \"field\": \"tokens\",\n"
+            + "            \"textClass\": \"sport fussball\",\n"
+            + "            \"title\": \"Nur Gerücht? KHL-Klub will „Dshuni“\",\n"
+            + "            \"author\": \"\",\n"
+            + "            \"startMore\": true,\n"
+            + "            \"endMore\": true,\n"
+            + "            \"corpusID\": \"BRZ13\",\n"
+            + "            \"snippet\": \"<span class=\\\"context-left\\\"><span class=\\\"more\\\"></span>und hakt das Thema ab.cb Kein </span><mark>Wort</mark><span class=\\\"context-right\\\"> zum Interesse aus Astana: Daniar Dshunussow.Foto<span class=\\\"more\\\"></span></span>\",\n"
+            + "            \"matchID\": \"match-BRZ13!BRZ13_APR.00277-p163-164\",\n"
+            + "            \"docID\": \"BRZ13_APR.00277\",\n"
+            + "            \"UID\": 0,\n"
+            + "            \"pubDate\": \"2013-04-02\"\n"
+            + "        },\n"
+            + "        {\n"
+            + "            \"field\": \"tokens\",\n"
+            + "            \"textClass\": \"staat-gesellschaft biographien-interviews\",\n"
+            + "            \"title\": \"Das Leben ist nicht auf diese Erde beschränkt\",\n"
+            + "            \"author\": \"\",\n"
+            + "            \"startMore\": true,\n"
+            + "            \"endMore\": true,\n"
+            + "            \"corpusID\": \"BRZ13\",\n"
+            + "            \"snippet\": \"<span class=\\\"context-left\\\"><span class=\\\"more\\\"></span>1. Korinther 1,18 denken: Denn das </span><mark>Wort</mark><span class=\\\"context-right\\\"> vom Kreuz ist eine Torheit denen<span class=\\\"more\\\"></span></span>\",\n"
+            + "            \"matchID\": \"match-BRZ13!BRZ13_APR.00520-p32-33\",\n"
+            + "            \"docID\": \"BRZ13_APR.00520\",\n"
+            + "            \"UID\": 0,\n"
+            + "            \"pubDate\": \"2013-04-03\"\n"
+            + "        },\n"
+            + "        {\n"
+            + "            \"field\": \"tokens\",\n"
+            + "            \"textClass\": \"sport fussball\",\n"
+            + "            \"title\": \"Allofs und Hecking knöpfensich die VfL-Profis vor\",\n"
+            + "            \"author\": \"\",\n"
+            + "            \"startMore\": true,\n"
+            + "            \"endMore\": true,\n"
+            + "            \"corpusID\": \"BRZ13\",\n"
+            + "            \"snippet\": \"<span class=\\\"context-left\\\"><span class=\\\"more\\\"></span>für die Profis am Dienstag klare </span><mark>Worte</mark><span class=\\\"context-right\\\"> vom Führungsduo. Von Thorsten Grunow Wolfsburg<span class=\\\"more\\\"></span></span>\",\n"
+            + "            \"matchID\": \"match-BRZ13!BRZ13_APR.00557-p17-18\",\n"
+            + "            \"docID\": \"BRZ13_APR.00557\",\n"
+            + "            \"UID\": 0,\n"
+            + "            \"pubDate\": \"2013-04-03\"\n"
+            + "        },\n"
+            + "        {\n"
+            + "            \"field\": \"tokens\",\n"
+            + "            \"textClass\": \"sport fussball\",\n"
+            + "            \"title\": \"Allofs und Hecking knöpfensich die VfL-Profis vor\",\n"
+            + "            \"author\": \"\",\n"
+            + "            \"startMore\": true,\n"
+            + "            \"endMore\": true,\n"
+            + "            \"corpusID\": \"BRZ13\",\n"
+            + "            \"snippet\": \"<span class=\\\"context-left\\\"><span class=\\\"more\\\"></span>Minuten setzte es am Dienstagnachmittag klare </span><mark>Worte</mark><span class=\\\"context-right\\\"> für die kickende Belegschaft, die durchaus<span class=\\\"more\\\"></span></span>\",\n"
+            + "            \"matchID\": \"match-BRZ13!BRZ13_APR.00557-p60-61\",\n"
+            + "            \"docID\": \"BRZ13_APR.00557\",\n"
+            + "            \"UID\": 0,\n"
+            + "            \"pubDate\": \"2013-04-03\"\n"
+            + "        },\n"
+            + "        {\n"
+            + "            \"field\": \"tokens\",\n"
+            + "            \"textClass\": \"sport fussball\",\n"
+            + "            \"title\": \"Allofs und Hecking knöpfensich die VfL-Profis vor\",\n"
+            + "            \"author\": \"\",\n"
+            + "            \"startMore\": true,\n"
+            + "            \"endMore\": true,\n"
+            + "            \"corpusID\": \"BRZ13\",\n"
+            + "            \"snippet\": \"<span class=\\\"context-left\\\"><span class=\\\"more\\\"></span>Manager ist überzeugt, dass die klaren </span><mark>Worte</mark><span class=\\\"context-right\\\"> auf fruchtbaren Boden gefallen sind. „Ich<span class=\\\"more\\\"></span></span>\",\n"
+            + "            \"matchID\": \"match-BRZ13!BRZ13_APR.00557-p235-236\",\n"
+            + "            \"docID\": \"BRZ13_APR.00557\",\n"
+            + "            \"UID\": 0,\n"
+            + "            \"pubDate\": \"2013-04-03\"\n"
+            + "        },\n"
+            + "        {\n"
+            + "            \"field\": \"tokens\",\n"
+            + "            \"textClass\": \"politik inland politik ausland\",\n"
+            + "            \"title\": \"Zeitungsartikelzufällig deponiert?\",\n"
+            + "            \"author\": \"\",\n"
+            + "            \"startMore\": true,\n"
+            + "            \"endMore\": true,\n"
+            + "            \"corpusID\": \"BRZ13\",\n"
+            + "            \"snippet\": \"<span class=\\\"context-left\\\"><span class=\\\"more\\\"></span>erspart“, lautete die Schlagzeile – wobei das </span><mark>Wort</mark><span class=\\\"context-right\\\"> „erspart“ abgeschnitten war. Ein plumper Versuch<span class=\\\"more\\\"></span></span>\",\n"
+            + "            \"matchID\": \"match-BRZ13!BRZ13_JAN.07616-p31-32\",\n"
+            + "            \"docID\": \"BRZ13_JAN.07616\",\n"
+            + "            \"UID\": 0,\n"
+            + "            \"pubDate\": \"2013-01-21\"\n"
+            + "        },\n"
+            + "        {\n"
+            + "            \"field\": \"tokens\",\n"
+            + "            \"textClass\": \"politik inland\",\n"
+            + "            \"title\": \"„Philipp Rösler wackelt nicht“\",\n"
+            + "            \"author\": \"\",\n"
+            + "            \"startMore\": true,\n"
+            + "            \"endMore\": true,\n"
+            + "            \"corpusID\": \"BRZ13\",\n"
+            + "            \"snippet\": \"<span class=\\\"context-left\\\"><span class=\\\"more\\\"></span>Vizekanzler bei all dem Jubel zu </span><mark>Wort</mark><span class=\\\"context-right\\\"> kommt. „Ein großartiger Tag“, sagt er<span class=\\\"more\\\"></span></span>\",\n"
+            + "            \"matchID\": \"match-BRZ13!BRZ13_JAN.07617-p177-178\",\n"
+            + "            \"docID\": \"BRZ13_JAN.07617\",\n"
+            + "            \"UID\": 0,\n"
+            + "            \"pubDate\": \"2013-01-21\"\n"
+            + "        },\n"
+            + "        {\n"
+            + "            \"field\": \"tokens\",\n"
+            + "            \"textClass\": \"freizeit-unterhaltung reisen\",\n"
+            + "            \"title\": \"Lanz gibt den charmanten, zurückhaltenden Gastgeber\",\n"
+            + "            \"author\": \"\",\n"
+            + "            \"startMore\": true,\n"
+            + "            \"endMore\": true,\n"
+            + "            \"corpusID\": \"BRZ13\",\n"
+            + "            \"snippet\": \"<span class=\\\"context-left\\\"><span class=\\\"more\\\"></span>er, als seine Assistentin ihm ins </span><mark>Wort</mark><span class=\\\"context-right\\\"> fiel. Dennoch holte das ungleiche Duo<span class=\\\"more\\\"></span></span>\",\n"
+            + "            \"matchID\": \"match-BRZ13!BRZ13_JAN.07621-p261-262\",\n"
+            + "            \"docID\": \"BRZ13_JAN.07621\",\n"
+            + "            \"UID\": 0,\n"
+            + "            \"pubDate\": \"2013-01-21\"\n"
+            + "        },\n"
+            + "        {\n"
+            + "            \"field\": \"tokens\",\n"
+            + "            \"textClass\": \"politik inland\",\n"
+            + "            \"title\": \"Mundlos denkt über Rücktritt nach\",\n"
+            + "            \"author\": \"\",\n"
+            + "            \"startMore\": true,\n"
+            + "            \"endMore\": true,\n"
+            + "            \"corpusID\": \"BRZ13\",\n"
+            + "            \"snippet\": \"<span class=\\\"context-left\\\"><span class=\\\"more\\\"></span>räumte selbst ein, wie sarkastisch diese </span><mark>Worte</mark><span class=\\\"context-right\\\"> nach einer solchen Wahlnacht klingen mussten<span class=\\\"more\\\"></span></span>\",\n"
+            + "            \"matchID\": \"match-BRZ13!BRZ13_JAN.07694-p192-193\",\n"
+            + "            \"docID\": \"BRZ13_JAN.07694\",\n"
+            + "            \"UID\": 0,\n"
+            + "            \"pubDate\": \"2013-01-21\"\n"
+            + "        },\n"
+            + "        {\n"
+            + "            \"field\": \"tokens\",\n"
+            + "            \"textClass\": \"politik inland\",\n"
+            + "            \"title\": \"BraunschweigGold – Hannover Blech\",\n"
+            + "            \"author\": \"\",\n"
+            + "            \"startMore\": true,\n"
+            + "            \"endMore\": true,\n"
+            + "            \"corpusID\": \"BRZ13\",\n"
+            + "            \"snippet\": \"<span class=\\\"context-left\\\"><span class=\\\"more\\\"></span>im Volksfreundhaus hört man kein schlechtes </span><mark>Wort</mark><span class=\\\"context-right\\\"> über den Kanzlerkandidaten Peer Steinbrück – und<span class=\\\"more\\\"></span></span>\",\n"
+            + "            \"matchID\": \"match-BRZ13!BRZ13_JAN.07695-p169-170\",\n"
+            + "            \"docID\": \"BRZ13_JAN.07695\",\n"
+            + "            \"UID\": 0,\n"
+            + "            \"pubDate\": \"2013-01-21\"\n"
+            + "        },\n"
+            + "        {\n"
+            + "            \"field\": \"tokens\",\n"
+            + "            \"textClass\": \"politik inland\",\n"
+            + "            \"title\": \"BraunschweigGold – Hannover Blech\",\n"
+            + "            \"author\": \"\",\n"
+            + "            \"startMore\": true,\n"
+            + "            \"endMore\": true,\n"
+            + "            \"corpusID\": \"BRZ13\",\n"
+            + "            \"snippet\": \"<span class=\\\"context-left\\\"><span class=\\\"more\\\"></span>Volksfreundhaus merklich steigen. Hier hat das </span><mark>Wort</mark><span class=\\\"context-right\\\"> von der Wahlparty bei Bier, Bockwurst<span class=\\\"more\\\"></span></span>\",\n"
+            + "            \"matchID\": \"match-BRZ13!BRZ13_JAN.07695-p266-267\",\n"
+            + "            \"docID\": \"BRZ13_JAN.07695\",\n"
+            + "            \"UID\": 0,\n"
+            + "            \"pubDate\": \"2013-01-21\"\n"
+            + "        },\n"
+            + "        {\n"
+            + "            \"field\": \"tokens\",\n"
+            + "            \"textClass\": \"staat-gesellschaft kirche\",\n"
+            + "            \"title\": \"Fernsehen überträgt Gottesdienst\",\n"
+            + "            \"author\": \"\",\n"
+            + "            \"startMore\": true,\n"
+            + "            \"endMore\": true,\n"
+            + "            \"corpusID\": \"BRZ13\",\n"
+            + "            \"snippet\": \"<span class=\\\"context-left\\\"><span class=\\\"more\\\"></span>schon mal von der Sendung „Das </span><mark>Wort</mark><span class=\\\"context-right\\\"> zum Sonntag“ gehört. Das sind Predigten<span class=\\\"more\\\"></span></span>\",\n"
+            + "            \"matchID\": \"match-BRZ13!BRZ13_JAN.07840-p37-38\",\n"
+            + "            \"docID\": \"BRZ13_JAN.07840\",\n"
+            + "            \"UID\": 0,\n"
+            + "            \"pubDate\": \"2013-01-21\"\n"
+            + "        },\n"
+            + "        {\n"
+            + "            \"field\": \"tokens\",\n"
+            + "            \"textClass\": \"politik inland\",\n"
+            + "            \"title\": \"Wahlkrimi im Ratssaal\",\n"
+            + "            \"author\": \"\",\n"
+            + "            \"startMore\": true,\n"
+            + "            \"endMore\": true,\n"
+            + "            \"corpusID\": \"BRZ13\",\n"
+            + "            \"snippet\": \"<span class=\\\"context-left\\\"><span class=\\\"more\\\"></span>ihre Konkurrentin Glosemeyer hatte sie warme </span><mark>Worte</mark><span class=\\\"context-right\\\"> übrig. „Für den ersten Anlauf eine<span class=\\\"more\\\"></span></span>\",\n"
+            + "            \"matchID\": \"match-BRZ13!BRZ13_JAN.07848-p147-148\",\n"
+            + "            \"docID\": \"BRZ13_JAN.07848\",\n"
+            + "            \"UID\": 0,\n"
+            + "            \"pubDate\": \"2013-01-21\"\n"
+            + "        },\n"
+            + "        {\n"
+            + "            \"field\": \"tokens\",\n"
+            + "            \"textClass\": \"politik inland\",\n"
+            + "            \"title\": \"Warme Worte nach eiskaltem Wahlkampf\",\n"
+            + "            \"author\": \"\",\n"
+            + "            \"startMore\": true,\n"
+            + "            \"endMore\": true,\n"
+            + "            \"corpusID\": \"BRZ13\",\n"
+            + "            \"snippet\": \"<span class=\\\"context-left\\\">Warme </span><mark>Worte</mark><span class=\\\"context-right\\\"> nach eiskaltem Wahlkampf Die SPD feierte<span class=\\\"more\\\"></span></span>\",\n"
+            + "            \"matchID\": \"match-BRZ13!BRZ13_JAN.07850-p1-2\",\n"
+            + "            \"docID\": \"BRZ13_JAN.07850\",\n"
+            + "            \"UID\": 0,\n"
+            + "            \"pubDate\": \"2013-01-21\"\n" + "        }\n"
+            + "    ]\n" + "}";
 
 }
diff --git a/src/test/java/de/ids_mannheim/korap/resource/rewrite/RewriteHandlerTest.java b/src/test/java/de/ids_mannheim/korap/resource/rewrite/RewriteHandlerTest.java
index d41a3a2..5eea4e2 100644
--- a/src/test/java/de/ids_mannheim/korap/resource/rewrite/RewriteHandlerTest.java
+++ b/src/test/java/de/ids_mannheim/korap/resource/rewrite/RewriteHandlerTest.java
@@ -20,19 +20,21 @@
 public class RewriteHandlerTest extends BeanConfigTest {
 
     @Test
-    public void initHandler() {
+    public void initHandler () {
         try {
             RewriteHandler handler = new RewriteHandler();
             handler.insertBeans(helper().getContext());
             assertTrue(handler.add(FoundryInject.class));
-        }catch (Exception e) {
+        }
+        catch (Exception e) {
             e.printStackTrace();
 
         }
     }
 
+
     @Test
-    public void testRewriteTaskAdd() {
+    public void testRewriteTaskAdd () {
         RewriteHandler handler = new RewriteHandler();
         handler.insertBeans(helper().getContext());
         assertTrue(handler.add(FoundryInject.class));
@@ -41,9 +43,10 @@
         assertTrue(handler.add(IdWriter.class));
     }
 
+
     // throws exception cause of missing configuration
     @Test(expected = RuntimeException.class)
-    public void testRewriteConfigThrowsException() {
+    public void testRewriteConfigThrowsException () {
         RewriteHandler handler = new RewriteHandler();
         QuerySerializer s = new QuerySerializer();
         s.setQuery("[(base=laufen | base=gehen) & tt/pos=VVFIN]", "poliqarp");
@@ -51,9 +54,11 @@
         handler.preProcess(s.toJSON(), null);
     }
 
+
     @Test
-    public void testRewriteNoBeanInject() {
-        RewriteHandler handler = new RewriteHandler(helper().getContext().getConfiguration());
+    public void testRewriteNoBeanInject () {
+        RewriteHandler handler = new RewriteHandler(helper().getContext()
+                .getConfiguration());
         QuerySerializer s = new QuerySerializer();
         s.setQuery("[(base=laufen | base=gehen) & tt/pos=VVFIN]", "poliqarp");
         assertTrue(handler.add(FoundryInject.class));
@@ -61,8 +66,9 @@
         assertNotNull(res);
     }
 
+
     @Test
-    public void testRewriteBeanInject() {
+    public void testRewriteBeanInject () {
         RewriteHandler handler = new RewriteHandler();
         handler.insertBeans(helper().getContext());
         QuerySerializer s = new QuerySerializer();
@@ -72,13 +78,16 @@
         JsonNode node = JsonUtils.readTree(res);
         assertNotNull(node);
 
-        assertEquals("tt", node.at("/query/wrap/operands/0/operands/0/foundry").asText());
-        assertEquals("tt", node.at("/query/wrap/operands/0/operands/1/foundry").asText());
+        assertEquals("tt", node.at("/query/wrap/operands/0/operands/0/foundry")
+                .asText());
+        assertEquals("tt", node.at("/query/wrap/operands/0/operands/1/foundry")
+                .asText());
         assertEquals("tt", node.at("/query/wrap/operands/1/foundry").asText());
     }
 
+
     @Test
-    public void testRewriteUserSpecific() {
+    public void testRewriteUserSpecific () {
         RewriteHandler handler = new RewriteHandler();
         handler.insertBeans(helper().getContext());
         QuerySerializer s = new QuerySerializer();
@@ -87,16 +96,21 @@
         String res = handler.preProcess(s.toJSON(), helper().getUser());
         JsonNode node = JsonUtils.readTree(res);
         assertNotNull(node);
-        assertEquals("tt_test", node.at("/query/wrap/operands/0/operands/0/foundry").asText());
-        assertEquals("tt_test", node.at("/query/wrap/operands/0/operands/1/foundry").asText());
-        assertNotEquals("tt_test", node.at("/query/wrap/operands/1/foundry").asText());
+        assertEquals("tt_test",
+                node.at("/query/wrap/operands/0/operands/0/foundry").asText());
+        assertEquals("tt_test",
+                node.at("/query/wrap/operands/0/operands/1/foundry").asText());
+        assertNotEquals("tt_test", node.at("/query/wrap/operands/1/foundry")
+                .asText());
     }
 
+
     @Override
-    public void initMethod() throws KustvaktException {
+    public void initMethod () throws KustvaktException {
         helper().setupAccount();
         UserDataDbIface settingsdao = BeansFactory.getTypeFactory()
-                .getTypedBean(helper().getContext().getUserDataDaos(),UserSettings.class);
+                .getTypedBean(helper().getContext().getUserDataDaos(),
+                        UserSettings.class);
         UserSettings s = (UserSettings) settingsdao.get(helper().getUser());
         s.setField(Attributes.DEFAULT_LEMMA_FOUNDRY, "tt_test");
         settingsdao.update(s);
diff --git a/src/test/java/de/ids_mannheim/korap/security/PolicyDaoTest.java b/src/test/java/de/ids_mannheim/korap/security/PolicyDaoTest.java
index cc3afda..404b86a 100644
--- a/src/test/java/de/ids_mannheim/korap/security/PolicyDaoTest.java
+++ b/src/test/java/de/ids_mannheim/korap/security/PolicyDaoTest.java
@@ -29,14 +29,15 @@
 
 
     @Override
-    public void initMethod() throws KustvaktException {
+    public void initMethod () throws KustvaktException {
         helper().setupAccount();
         helper().runBootInterfaces();
         helper().setupResource(new Corpus("WPD_1"));
     }
 
+
     @Test
-    public void testPoliciesGet() throws KustvaktException {
+    public void testPoliciesGet () throws KustvaktException {
         User user = helper().getUser();
         SecurityPolicy policy = new SecurityPolicy();
         policy.addNewCondition(new PolicyCondition("test_1"));
@@ -49,8 +50,9 @@
         dao.getPolicies("WPD_1", user, Permissions.Permission.READ.toByte());
     }
 
+
     @Test
-    public void testPolicyCreate() throws KustvaktException {
+    public void testPolicyCreate () throws KustvaktException {
         User user = helper().getUser();
         SecurityPolicy policy = new SecurityPolicy();
         policy.addNewCondition(new PolicyCondition("test_1"));
@@ -64,13 +66,15 @@
         assertTrue(dao.deleteResourcePolicies("WPD_1", user) > 0);
     }
 
+
     @Test
-    public void testMappingConditions() {
+    public void testMappingConditions () {
 
     }
 
+
     @Test
-    public void failAddToConditionEqual() throws KustvaktException {
+    public void failAddToConditionEqual () throws KustvaktException {
         User user = helper().getUser();
         SecurityPolicy policy = new SecurityPolicy();
         policy.addNewCondition(new PolicyCondition("test_1"));
@@ -88,8 +92,9 @@
 
     }
 
+
     @Test
-    public void failAddToConditionUnEqual() throws KustvaktException {
+    public void failAddToConditionUnEqual () throws KustvaktException {
         User user = helper().getUser();
         SecurityPolicy policy = new SecurityPolicy();
         policy.addNewCondition(new PolicyCondition("test_1"));
@@ -107,8 +112,9 @@
 
     }
 
+
     @Test
-    public void removeUserFromCondition() throws KustvaktException {
+    public void removeUserFromCondition () throws KustvaktException {
         User user = helper().getUser();
         PolicyHandlerIface dao = helper().getContext().getPolicyDbProvider();
 
@@ -125,8 +131,9 @@
         assertTrue(dao.deleteResourcePolicies("WPD_1", user) > 0);
     }
 
+
     @Test
-    public void testPolicyHierarchySelfSameType() throws KustvaktException {
+    public void testPolicyHierarchySelfSameType () throws KustvaktException {
         String res = "WPD_child";
         User user = helper().getUser();
         Corpus c = new Corpus(res);
@@ -144,9 +151,10 @@
         helper().dropResource(res);
     }
 
+
     @Test
     @Ignore
-    public void testPolicyHierarchySelfDifferentType()
+    public void testPolicyHierarchySelfDifferentType ()
             throws KustvaktException {
         String res = "WPD_child";
         User user = helper().getUser();
@@ -165,43 +173,45 @@
         helper().dropResource(res);
     }
 
+
     @Test
-    public void testPolicyHierarchyPublic() {
+    public void testPolicyHierarchyPublic () {
 
     }
 
+
     @Test
-    public void testPoliciesPublic() {
+    public void testPoliciesPublic () {
         PolicyHandlerIface dao = helper().getContext().getPolicyDbProvider();
-        Collection<SecurityPolicy> policies = dao
-                .getPolicies(new PolicyCondition("public"), Corpus.class,
-                        Permissions.Permission.READ.toByte());
+        Collection<SecurityPolicy> policies = dao.getPolicies(
+                new PolicyCondition("public"), Corpus.class,
+                Permissions.Permission.READ.toByte());
         assertNotEquals(0, policies.size());
     }
 
+
     @Test
     @Ignore
-    public void testPoliciesPublicGeneric() {
+    public void testPoliciesPublicGeneric () {
         PolicyHandlerIface dao = helper().getContext().getPolicyDbProvider();
-        Collection<SecurityPolicy> policies = dao
-                .getPolicies(new PolicyCondition("public"),
-                        KustvaktResource.class,
-                        Permissions.Permission.READ.toByte());
+        Collection<SecurityPolicy> policies = dao.getPolicies(
+                new PolicyCondition("public"), KustvaktResource.class,
+                Permissions.Permission.READ.toByte());
         assertNotEquals(0, policies.size());
     }
 
+
     @Test
-    public void searchResourcePoliciesPublic() throws KustvaktException {
+    public void searchResourcePoliciesPublic () throws KustvaktException {
         User user = helper().getUser();
         new PolicyBuilder(user).setConditions(new PolicyCondition("public"))
                 .setPermissions(Permissions.Permission.READ)
                 .setResources(new VirtualCollection("new_corpus")).create();
 
         PolicyHandlerIface dao = helper().getContext().getPolicyDbProvider();
-        List<SecurityPolicy> list = dao
-                .getPolicies(new PolicyCondition(Attributes.PUBLIC_GROUP),
-                        VirtualCollection.class,
-                        Permissions.Permission.READ.toByte());
+        List<SecurityPolicy> list = dao.getPolicies(new PolicyCondition(
+                Attributes.PUBLIC_GROUP), VirtualCollection.class,
+                Permissions.Permission.READ.toByte());
         assertNotEquals(0, list.size());
         Set<String> ids = new HashSet<>();
         for (SecurityPolicy p : list)
@@ -209,23 +219,27 @@
         assertNotEquals(0, ids.size());
     }
 
+
     @Test
-    public void testPolicyHierarchyRestricted() {
+    public void testPolicyHierarchyRestricted () {
 
     }
 
+
     @Test
-    public void testSelfPolicies() {
+    public void testSelfPolicies () {
 
     }
 
+
     @Test
-    public void testPublicPolicies() {
+    public void testPublicPolicies () {
 
     }
 
+
     @Test
-    public void testConditions() {
+    public void testConditions () {
 
     }
 
diff --git a/src/test/java/de/ids_mannheim/korap/security/auth/KustvaktAuthenticationManagerTest.java b/src/test/java/de/ids_mannheim/korap/security/auth/KustvaktAuthenticationManagerTest.java
index 681c197..973087b 100644
--- a/src/test/java/de/ids_mannheim/korap/security/auth/KustvaktAuthenticationManagerTest.java
+++ b/src/test/java/de/ids_mannheim/korap/security/auth/KustvaktAuthenticationManagerTest.java
@@ -22,18 +22,23 @@
 public class KustvaktAuthenticationManagerTest extends BeanConfigTest {
 
     @After
-    public void after() {
+    public void after () {
         try {
-            User user = helper().getContext().getAuthenticationManager().getUser(
-                    (String) KustvaktConfiguration.KUSTVAKT_USER
-                            .get(Attributes.USERNAME));
-            helper().getContext().getAuthenticationManager().deleteAccount(user);
-        } catch (KustvaktException e) {
+            User user = helper()
+                    .getContext()
+                    .getAuthenticationManager()
+                    .getUser(
+                            (String) KustvaktConfiguration.KUSTVAKT_USER
+                                    .get(Attributes.USERNAME));
+            helper().getContext().getAuthenticationManager()
+                    .deleteAccount(user);
         }
+        catch (KustvaktException e) {}
     }
 
+
     @Test
-    public void testCreateUser() throws KustvaktException {
+    public void testCreateUser () throws KustvaktException {
         User user = helper().getContext().getAuthenticationManager()
                 .createUserAccount(KustvaktConfiguration.KUSTVAKT_USER, false);
 
@@ -43,45 +48,50 @@
         assertNotNull(check);
     }
 
+
     @Test
-    public void testBatchStore() {
+    public void testBatchStore () {
         int i = 6;
 
         AuthenticationManagerIface manager = helper().getContext()
                 .getAuthenticationManager();
-        for (int ix = 0; ix < i; ix++) {
-        }
+        for (int ix = 0; ix < i; ix++) {}
 
     }
 
+
     @Test
-    public void testUserdetailsGet() throws KustvaktException {
+    public void testUserdetailsGet () throws KustvaktException {
         testCreateUser();
         AuthenticationManagerIface manager = helper().getContext()
                 .getAuthenticationManager();
 
-        User user = manager.getUser((String) KustvaktConfiguration.KUSTVAKT_USER
-                .get(Attributes.USERNAME));
+        User user = manager
+                .getUser((String) KustvaktConfiguration.KUSTVAKT_USER
+                        .get(Attributes.USERNAME));
 
         Userdata data = manager.getUserData(user, UserDetails.class);
         assertNotNull(data);
     }
 
+
     @Test
-    public void testUsersettingsGet() throws KustvaktException {
+    public void testUsersettingsGet () throws KustvaktException {
         testCreateUser();
         AuthenticationManagerIface manager = helper().getContext()
                 .getAuthenticationManager();
 
-        User user = manager.getUser((String) KustvaktConfiguration.KUSTVAKT_USER
-                .get(Attributes.USERNAME));
+        User user = manager
+                .getUser((String) KustvaktConfiguration.KUSTVAKT_USER
+                        .get(Attributes.USERNAME));
 
         Userdata data = manager.getUserData(user, UserSettings.class);
         assertNotNull(data);
     }
 
+
     @Test(expected = KustvaktException.class)
-    public void testUserDetailsGetNonExistent() throws KustvaktException {
+    public void testUserDetailsGetNonExistent () throws KustvaktException {
         testCreateUser();
         AuthenticationManagerIface manager = helper().getContext()
                 .getAuthenticationManager();
@@ -92,8 +102,9 @@
         assertNotNull(data);
     }
 
+
     @Test(expected = KustvaktException.class)
-    public void testUserSettingsGetNonExistent() throws KustvaktException {
+    public void testUserSettingsGetNonExistent () throws KustvaktException {
         testCreateUser();
         AuthenticationManagerIface manager = helper().getContext()
                 .getAuthenticationManager();
@@ -104,8 +115,9 @@
         assertNotNull(data);
     }
 
+
     @Override
-    public void initMethod() throws KustvaktException {
+    public void initMethod () throws KustvaktException {
         helper().setupAccount();
     }
 }
diff --git a/src/test/java/de/ids_mannheim/korap/suites/DaoTestSuite.java b/src/test/java/de/ids_mannheim/korap/suites/DaoTestSuite.java
index d569aa9..fdd328d 100644
--- a/src/test/java/de/ids_mannheim/korap/suites/DaoTestSuite.java
+++ b/src/test/java/de/ids_mannheim/korap/suites/DaoTestSuite.java
@@ -16,5 +16,4 @@
 @RunWith(Suite.class)
 @Suite.SuiteClasses({ PolicyDaoTest.class, UserdataTest.class,
         UserDaoTest.class, ResourceDaoTest.class })
-public class DaoTestSuite {
-}
+public class DaoTestSuite {}
diff --git a/src/test/java/de/ids_mannheim/korap/user/UserdataTest.java b/src/test/java/de/ids_mannheim/korap/user/UserdataTest.java
index de082af..65b93c8 100644
--- a/src/test/java/de/ids_mannheim/korap/user/UserdataTest.java
+++ b/src/test/java/de/ids_mannheim/korap/user/UserdataTest.java
@@ -19,34 +19,36 @@
 public class UserdataTest extends BeanConfigTest {
 
     @Before
-    public void clear() {
-        UserDetailsDao dao = new UserDetailsDao(
-                helper().getContext().getPersistenceClient());
-        UserSettingsDao sdao = new UserSettingsDao(
-                helper().getContext().getPersistenceClient());
+    public void clear () {
+        UserDetailsDao dao = new UserDetailsDao(helper().getContext()
+                .getPersistenceClient());
+        UserSettingsDao sdao = new UserSettingsDao(helper().getContext()
+                .getPersistenceClient());
         assertNotEquals(-1, dao.deleteAll());
         assertNotEquals(-1, sdao.deleteAll());
     }
 
+
     @Test
-    public void testDataStore() {
+    public void testDataStore () {
         String val = "value1;value_data";
         User user = new KorAPUser();
         user.setId(1);
-        UserDetailsDao dao = new UserDetailsDao(
-                helper().getContext().getPersistenceClient());
+        UserDetailsDao dao = new UserDetailsDao(helper().getContext()
+                .getPersistenceClient());
         UserDetails d = new UserDetails(1);
         d.setField("key_1", val);
         assertNotEquals(-1, dao.store(d));
     }
 
+
     @Test
-    public void testDataGet() throws dbException {
+    public void testDataGet () throws dbException {
         String val = "value1;value_data";
         User user = new KorAPUser();
         user.setId(1);
-        UserDetailsDao dao = new UserDetailsDao(
-                helper().getContext().getPersistenceClient());
+        UserDetailsDao dao = new UserDetailsDao(helper().getContext()
+                .getPersistenceClient());
         UserDetails d = new UserDetails(1);
         d.setField("key_1", val);
         assertNotEquals(-1, dao.store(d));
@@ -60,8 +62,9 @@
         assertEquals(val, d.get("key_1"));
     }
 
+
     @Test
-    public void testDataValidation() {
+    public void testDataValidation () {
         Userdata data = new UserDetails(1);
         data.setField(Attributes.COUNTRY, "Germany");
 
@@ -72,8 +75,9 @@
         assertFalse(data.isValid());
     }
 
+
     @Test
-    public void testSettingsValidation() {
+    public void testSettingsValidation () {
         Userdata data = new UserSettings(1);
         data.setField(Attributes.FILE_FORMAT_FOR_EXPORT, "export");
 
@@ -84,37 +88,40 @@
         assertTrue(data.isValid());
     }
 
+
     @Test
-    public void testUserdatafactory() throws KustvaktException {
-        UserDataDbIface dao = BeansFactory.getTypeFactory()
-                .getTypedBean(helper().getContext().getUserDataDaos(), UserDetails.class);
+    public void testUserdatafactory () throws KustvaktException {
+        UserDataDbIface dao = BeansFactory.getTypeFactory().getTypedBean(
+                helper().getContext().getUserDataDaos(), UserDetails.class);
         assertNotNull(dao);
         assertEquals(UserDetailsDao.class, dao.getClass());
 
-        dao = BeansFactory.getTypeFactory()
-                .getTypedBean(helper().getContext().getUserDataDaos(), UserSettings.class);
+        dao = BeansFactory.getTypeFactory().getTypedBean(
+                helper().getContext().getUserDataDaos(), UserSettings.class);
         assertNotNull(dao);
         assertEquals(UserSettingsDao.class, dao.getClass());
 
     }
 
+
     @Test(expected = RuntimeException.class)
-    public void testUserdatafactoryError() throws KustvaktException {
-        BeansFactory.getTypeFactory()
-                .getTypedBean(helper().getContext().getUserDataDaos(), new Userdata(1) {
+    public void testUserdatafactoryError () throws KustvaktException {
+        BeansFactory.getTypeFactory().getTypedBean(
+                helper().getContext().getUserDataDaos(), new Userdata(1) {
                     @Override
-                    public String[] requiredFields() {
+                    public String[] requiredFields () {
                         return new String[0];
                     }
 
+
                     @Override
-                    public String[] defaultFields() {
+                    public String[] defaultFields () {
                         return new String[0];
                     }
                 }.getClass());
     }
 
+
     @Override
-    public void initMethod() throws KustvaktException {
-    }
+    public void initMethod () throws KustvaktException {}
 }
diff --git a/src/test/java/de/ids_mannheim/korap/web/service/FastJerseyTest.java b/src/test/java/de/ids_mannheim/korap/web/service/FastJerseyTest.java
index 83e1438..db7a860 100644
--- a/src/test/java/de/ids_mannheim/korap/web/service/FastJerseyTest.java
+++ b/src/test/java/de/ids_mannheim/korap/web/service/FastJerseyTest.java
@@ -37,49 +37,57 @@
     private static Client client;
     private static String[] classPackages = null;
 
-    public static void addClass(Class<?> resourceClass) {
+
+    public static void addClass (Class<?> resourceClass) {
         resourceConfig.getClasses().add(resourceClass);
     }
 
-    public static void setPackages(String... pack) {
+
+    public static void setPackages (String ... pack) {
         classPackages = pack;
     }
 
-    public static void addSingleton(Object resourceSingleton) {
+
+    public static void addSingleton (Object resourceSingleton) {
         resourceConfig.getSingletons().add(resourceSingleton);
     }
 
-    public String getAPIVersion() {
+
+    public String getAPIVersion () {
         return API_VERSION;
     }
 
-    public static <T> void addProviderForContext(Class<T> contextClass,
+
+    public static <T> void addProviderForContext (Class<T> contextClass,
             T contextObject) {
-        addSingleton(
-                new SingletonTypeInjectableProvider<Context, T>(contextClass,
-                        contextObject) {
-                });
+        addSingleton(new SingletonTypeInjectableProvider<Context, T>(
+                contextClass, contextObject) {});
     }
 
-    public static void addRequestFilter(Object filter) {
+
+    public static void addRequestFilter (Object filter) {
         resourceConfig.getContainerRequestFilters().add(filter);
     }
 
-    public static void addResponseFilter(Object filter) {
+
+    public static void addResponseFilter (Object filter) {
         resourceConfig.getContainerResponseFilters().add(filter);
     }
 
-    public static void setTestContainerFactory(
+
+    public static void setTestContainerFactory (
             TestContainerFactory newTestContainerFactory) {
         testContainerFactory = newTestContainerFactory;
     }
 
+
     @BeforeClass
-    public static void cleanStaticVariables() {
+    public static void cleanStaticVariables () {
         resourceConfig = new DefaultResourceConfig();
     }
 
-    public static void initServer() {
+
+    public static void initServer () {
         AppDescriptor ad;
         if (classPackages == null)
             ad = new LowLevelAppDescriptor.Builder(resourceConfig).build();
@@ -94,42 +102,47 @@
                 tcf = new GrizzlyWebTestContainerFactory();
         }
 
-        testContainer = tcf
-                .create(UriBuilder.fromUri("http://localhost/").port(9998)
-                        .build(), ad);
+        testContainer = tcf.create(UriBuilder.fromUri("http://localhost/")
+                .port(9998).build(), ad);
         client = testContainer.getClient();
         if (client == null) {
             client = Client.create(ad.getClientConfig());
         }
     }
 
-    public static void startServer() {
+
+    public static void startServer () {
         if (testContainer != null) {
             testContainer.start();
         }
     }
 
+
     @AfterClass
-    public static void stopServer() {
+    public static void stopServer () {
         testContainer.stop();
         testContainer = null;
         client = null;
     }
 
-    public Client client() {
+
+    public Client client () {
         return client;
     }
 
-    public URI getBaseUri() {
+
+    public URI getBaseUri () {
         return testContainer.getBaseUri();
     }
 
-    public WebResource resource() {
+
+    public WebResource resource () {
         return client.resource(getBaseUri());
     }
 
+
     @Before
-    public void startServerBeforeFirstTestRun() {
+    public void startServerBeforeFirstTestRun () {
         if (testContainer == null) {
             initServer();
             startServer();
diff --git a/src/test/java/de/ids_mannheim/korap/web/service/OAuth2HandlerTest.java b/src/test/java/de/ids_mannheim/korap/web/service/OAuth2HandlerTest.java
index ce7851d..0a55637 100644
--- a/src/test/java/de/ids_mannheim/korap/web/service/OAuth2HandlerTest.java
+++ b/src/test/java/de/ids_mannheim/korap/web/service/OAuth2HandlerTest.java
@@ -24,13 +24,14 @@
 
     private static final String SCOPES = "search preferences queries account";
 
+
     @BeforeClass
-    public static void setup() throws Exception {
+    public static void setup () throws Exception {
         //        BeanConfiguration.loadClasspathContext("default-config.xml");
         //        handler = new OAuth2Handler(
         //                BeanConfiguration.getKustvaktContext().getPersistenceClient());
         //        crypto = BeanConfiguration.getKustvaktContext().getEncryption();
-//        info = new ClientInfo(crypto.createID(), crypto.createToken());
+        //        info = new ClientInfo(crypto.createID(), crypto.createToken());
         //        info.setConfidential(true);
         //        //todo: support for subdomains?!
         //        info.setUrl("http://localhost:8080/api/v0.1");
@@ -44,6 +45,7 @@
         //        crypto = helper.getBean(ContextHolder.KUSTVAKT_ENCRYPTION);
     }
 
+
     //    @AfterClass
     //    public static void drop() throws KustvaktException {
     //        assert handler != null;
@@ -53,28 +55,29 @@
     //    }
 
     @Test
-    public void testStoreAuthorizationCodeThrowsNoException()
+    public void testStoreAuthorizationCodeThrowsNoException ()
             throws KustvaktException {
         String auth_code = helper().getContext().getEncryption().createToken();
-        AuthCodeInfo codeInfo = new AuthCodeInfo(info.getClient_id(),
-                auth_code);
+        AuthCodeInfo codeInfo = new AuthCodeInfo(info.getClient_id(), auth_code);
         codeInfo.setScopes(SCOPES);
 
-        OAuth2Handler handler = new OAuth2Handler(helper().getContext().getPersistenceClient());
+        OAuth2Handler handler = new OAuth2Handler(helper().getContext()
+                .getPersistenceClient());
         handler.authorize(codeInfo, helper().getUser());
         codeInfo = handler.getAuthorization(auth_code);
         Assert.assertNotNull("client is null!", codeInfo);
     }
 
+
     @Test
-    public void testAuthorizationCodeRemoveThrowsNoException()
+    public void testAuthorizationCodeRemoveThrowsNoException ()
             throws KustvaktException {
         String auth_code = helper().getContext().getEncryption().createToken();
-        AuthCodeInfo codeInfo = new AuthCodeInfo(info.getClient_id(),
-                auth_code);
+        AuthCodeInfo codeInfo = new AuthCodeInfo(info.getClient_id(), auth_code);
         codeInfo.setScopes(SCOPES);
 
-        OAuth2Handler handler = new OAuth2Handler(helper().getContext().getPersistenceClient());
+        OAuth2Handler handler = new OAuth2Handler(helper().getContext()
+                .getPersistenceClient());
         handler.authorize(codeInfo, helper().getUser());
         String t = helper().getContext().getEncryption().createToken();
         String refresh = helper().getContext().getEncryption().createToken();
@@ -87,43 +90,49 @@
         Assert.assertNull("clearing authorization failed", c2);
     }
 
+
     @Test
-    public void testTokenEndpointRedirect() {
+    public void testTokenEndpointRedirect () {
 
     }
 
+
     @Test
-    public void testStoreAccessCodeViaAuthCodeThrowsNoException() {
+    public void testStoreAccessCodeViaAuthCodeThrowsNoException () {
         String auth_code = helper().getContext().getEncryption().createToken();
-        AuthCodeInfo codeInfo = new AuthCodeInfo(info.getClient_id(),
-                auth_code);
+        AuthCodeInfo codeInfo = new AuthCodeInfo(info.getClient_id(), auth_code);
         codeInfo.setScopes(SCOPES);
 
     }
 
+
     @Test
-    public void testDeleteAccessCodesByUserDeleteCascade() {
+    public void testDeleteAccessCodesByUserDeleteCascade () {
 
     }
 
+
     @Test
-    public void testAccessTokenbyUserDeleteCascade() {
+    public void testAccessTokenbyUserDeleteCascade () {
 
     }
 
+
     @Test
-    public void testRefreshToken() {
+    public void testRefreshToken () {
 
     }
 
+
     // fixme: exception thrown?!
     @Test
-    public void testAccessTokenExpired() {
+    public void testAccessTokenExpired () {
 
     }
 
+
     @Override
-    public void initMethod() throws KustvaktException {
+    public void initMethod () throws KustvaktException {
         helper().setupAccount();
 
         EncryptionIface crypto = helper().getContext().getEncryption();
diff --git a/src/test/java/de/ids_mannheim/korap/web/service/full/AuthServiceTest.java b/src/test/java/de/ids_mannheim/korap/web/service/full/AuthServiceTest.java
index 9a3f782..b394d68 100644
--- a/src/test/java/de/ids_mannheim/korap/web/service/full/AuthServiceTest.java
+++ b/src/test/java/de/ids_mannheim/korap/web/service/full/AuthServiceTest.java
@@ -14,7 +14,7 @@
 public class AuthServiceTest extends FastJerseyTest {
 
     @BeforeClass
-    public static void configure() throws Exception {
+    public static void configure () throws Exception {
         FastJerseyTest.setPackages("de.ids_mannheim.korap.web.service",
                 "de.ids_mannheim.korap.web.filter",
                 "de.ids_mannheim.korap.web.utils");
@@ -22,28 +22,32 @@
 
 
     @Override
-    public void initMethod() throws KustvaktException {
+    public void initMethod () throws KustvaktException {
         helper().setupAccount();
     }
 
+
     @Test
-    public void testBasicHttp() {
+    public void testBasicHttp () {
         User user = helper().getUser();
 
     }
 
+
     @Test
-    public void testBasicLogout(){
+    public void testBasicLogout () {
 
     }
 
+
     @Test
-    public void testSessionTokenLogin() {
+    public void testSessionTokenLogin () {
 
     }
 
+
     @Test
-    public void testSessionTokenLogout() {
+    public void testSessionTokenLogout () {
 
     }
 
diff --git a/src/test/java/de/ids_mannheim/korap/web/service/full/FilterTest.java b/src/test/java/de/ids_mannheim/korap/web/service/full/FilterTest.java
index ac05e24..5392eec 100644
--- a/src/test/java/de/ids_mannheim/korap/web/service/full/FilterTest.java
+++ b/src/test/java/de/ids_mannheim/korap/web/service/full/FilterTest.java
@@ -17,40 +17,49 @@
 public class FilterTest extends FastJerseyTest {
 
     @BeforeClass
-    public static void setup() throws Exception {
+    public static void setup () throws Exception {
         FastJerseyTest.setPackages("de.ids_mannheim.korap.web.service.full",
                 "de.ids_mannheim.korap.web.filter",
                 "de.ids_mannheim.korap.web.utils");
     }
 
+
     @Test
-    public void testTestUserAuth() {
-        ClientResponse resp = resource().path(getAPIVersion()).path("user/info")
-                .header(Attributes.AUTHORIZATION, BasicHttpAuth
-                        .encode(TestHelper.getUserCredentials()[0],
+    public void testTestUserAuth () {
+        ClientResponse resp = resource()
+                .path(getAPIVersion())
+                .path("user/info")
+                .header(Attributes.AUTHORIZATION,
+                        BasicHttpAuth.encode(
+                                TestHelper.getUserCredentials()[0],
                                 TestHelper.getUserCredentials()[1]))
                 .get(ClientResponse.class);
         assert resp.getStatus() == Response.SC_OK;
     }
 
+
     @Test
-    public void testDemoAuth() {
-        ClientResponse resp = resource().path(getAPIVersion()).path("user/info")
-                .get(ClientResponse.class);
+    public void testDemoAuth () {
+        ClientResponse resp = resource().path(getAPIVersion())
+                .path("user/info").get(ClientResponse.class);
         assert resp.getStatus() == Response.SC_OK;
     }
 
+
     @Test
-    public void testUnauthorizedAuth() {
-        ClientResponse resp = resource().path(getAPIVersion()).path("user/info")
+    public void testUnauthorizedAuth () {
+        ClientResponse resp = resource()
+                .path(getAPIVersion())
+                .path("user/info")
                 .header(Attributes.AUTHORIZATION,
                         BasicHttpAuth.encode("kustvakt", "kustvakt2015"))
                 .get(ClientResponse.class);
         assert resp.getStatus() == Response.SC_UNAUTHORIZED;
     }
 
+
     @Override
-    public void initMethod() throws KustvaktException {
+    public void initMethod () throws KustvaktException {
         helper().setupAccount();
     }
 }
diff --git a/src/test/java/de/ids_mannheim/korap/web/service/full/KustvaktCoreRestTest.java b/src/test/java/de/ids_mannheim/korap/web/service/full/KustvaktCoreRestTest.java
index f227ba3..ec25c17 100644
--- a/src/test/java/de/ids_mannheim/korap/web/service/full/KustvaktCoreRestTest.java
+++ b/src/test/java/de/ids_mannheim/korap/web/service/full/KustvaktCoreRestTest.java
@@ -20,22 +20,24 @@
 public class KustvaktCoreRestTest extends FastJerseyTest {
 
     @BeforeClass
-    public static void configure() {
+    public static void configure () {
         FastJerseyTest.setPackages("de.ids_mannheim.korap.web.service.light",
                 "de.ids_mannheim.korap.web.filter",
                 "de.ids_mannheim.korap.web.utils");
     }
 
+
     //    @Test
-    public void testFieldsInSearch() {
+    public void testFieldsInSearch () {
         ClientResponse response = resource().path(getAPIVersion())
                 .path("search").queryParam("q", "[base=Wort]")
                 .queryParam("ql", "poliqarp").get(ClientResponse.class);
         assert ClientResponse.Status.OK.getStatusCode() == response.getStatus();
     }
 
+
     @Test
-    public void testQuery() {
+    public void testQuery () {
         ClientResponse response = resource().path(getAPIVersion())
                 .path("search").queryParam("q", "[base=Wort]")
                 .queryParam("ql", "poliqarp").get(ClientResponse.class);
@@ -44,8 +46,9 @@
         assert ClientResponse.Status.OK.getStatusCode() == response.getStatus();
     }
 
+
     @Test
-    public void testQueryRaw() {
+    public void testQueryRaw () {
         QuerySerializer s = new QuerySerializer();
         s.setQuery("[base=Wort]", "poliqarp");
 
@@ -56,29 +59,34 @@
         assert ClientResponse.Status.OK.getStatusCode() == response.getStatus();
     }
 
+
     // in case no index is there, this will throw an error
     @Test
     @Ignore
-    public void testGetMatchInfoThrowsNoException() {
-        ClientResponse response = resource().path(getAPIVersion())
-                .get(ClientResponse.class);
+    public void testGetMatchInfoThrowsNoException () {
+        ClientResponse response = resource().path(getAPIVersion()).get(
+                ClientResponse.class);
     }
 
+
     //    @Test
-    public void testGetStatsThrowsNoException() {
+    public void testGetStatsThrowsNoException () {
         CollectionQueryProcessor pr = new CollectionQueryProcessor();
         pr.process("corpusID=WPD & textClass=Sport");
         Map map = new LinkedHashMap();
         map.put("collection", pr.getRequestMap());
-        ClientResponse response = resource().path(getAPIVersion()).path("stats")
+        ClientResponse response = resource().path(getAPIVersion())
+                .path("stats")
                 .post(ClientResponse.class, JsonUtils.toJSON(map));
         assert ClientResponse.Status.OK.getStatusCode() == response.getStatus();
     }
 
+
     @Test
     @Ignore
-    public void testGetStats2ThrowsNoException() {
-        ClientResponse response = resource().path(getAPIVersion()).path("stats")
+    public void testGetStats2ThrowsNoException () {
+        ClientResponse response = resource().path(getAPIVersion())
+                .path("stats")
                 .post(ClientResponse.class, "creationDate in 1787");
         String ent = response.getEntity(String.class);
         assert ClientResponse.Status.OK.getStatusCode() == response.getStatus();
@@ -87,8 +95,9 @@
         //        System.out.println("STATS ENTITY " + ent);
     }
 
+
     //    @Test
-    public void testBuildQueryThrowsNoException() {
+    public void testBuildQueryThrowsNoException () {
         ClientResponse response = resource().path(getAPIVersion())
                 .path("search").queryParam("q", "[base=Haus & surface=Hauses]")
                 .queryParam("ql", "poliqarp").queryParam("cutOff", "true")
@@ -96,8 +105,9 @@
         assert ClientResponse.Status.OK.getStatusCode() == response.getStatus();
     }
 
+
     //    @Test
-    public void testQueryByNameThrowsNoException() {
+    public void testQueryByNameThrowsNoException () {
         ClientResponse response = resource().path(getAPIVersion())
                 .path("corpus").path("WPD").path("search")
                 .queryParam("q", "[base=Haus & surface=Hauses]")
@@ -106,8 +116,9 @@
         System.out.println("RESPONSE " + response.getEntity(String.class));
     }
 
+
     @Override
-    public void initMethod() throws KustvaktException {
+    public void initMethod () throws KustvaktException {
         helper().setupAccount();
     }
 }
diff --git a/src/test/java/de/ids_mannheim/korap/web/service/full/OAuth2EndpointTest.java b/src/test/java/de/ids_mannheim/korap/web/service/full/OAuth2EndpointTest.java
index 9870cea..60b7267 100644
--- a/src/test/java/de/ids_mannheim/korap/web/service/full/OAuth2EndpointTest.java
+++ b/src/test/java/de/ids_mannheim/korap/web/service/full/OAuth2EndpointTest.java
@@ -20,25 +20,28 @@
 public class OAuth2EndpointTest extends FastJerseyTest {
 
     @BeforeClass
-    public static void configure() throws Exception {
+    public static void configure () throws Exception {
         FastJerseyTest.setPackages("de.ids_mannheim.korap.web.service",
                 "de.ids_mannheim.korap.web.filter",
                 "de.ids_mannheim.korap.web.utils");
     }
 
+
     @Test
-    public void init() {
+    public void init () {
 
     }
 
+
     @Override
-    public void initMethod() throws KustvaktException {
+    public void initMethod () throws KustvaktException {
         helper().setupAccount();
     }
 
+
     @Test
     @Ignore
-    public void testAuthorizeClient() {
+    public void testAuthorizeClient () {
         ClientResponse response = resource().path("v0.1").path("oauth2")
                 .path("register")
                 .queryParam("redirect_url", "korap.ids-mannheim.de/redirect")
@@ -47,9 +50,10 @@
         assert response.getStatus() == ClientResponse.Status.OK.getStatusCode();
     }
 
+
     @Test
     @Ignore
-    public void testRevokeClient() {
+    public void testRevokeClient () {
         ClientResponse response = resource().path("v0.1").path("oauth2")
                 .path("register")
                 .queryParam("redirect_url", "korap.ids-mannheim.de/redirect")
@@ -60,9 +64,10 @@
 
     }
 
+
     @Test
     @Ignore
-    public void authenticate() {
+    public void authenticate () {
         String[] cred = TestHelper.getUserCredentials();
         String enc = BasicHttpAuth.encode(cred[0], cred[1]);
         ClientResponse response = resource().path("v0.1").path("oauth2")
diff --git a/src/test/java/de/ids_mannheim/korap/web/service/full/ResourceRemoteApiTest.java b/src/test/java/de/ids_mannheim/korap/web/service/full/ResourceRemoteApiTest.java
index bcf5f9a..95d7470 100644
--- a/src/test/java/de/ids_mannheim/korap/web/service/full/ResourceRemoteApiTest.java
+++ b/src/test/java/de/ids_mannheim/korap/web/service/full/ResourceRemoteApiTest.java
@@ -11,7 +11,7 @@
 
 
     @Test
-    public void testResourceGetFromDemo() {
+    public void testResourceGetFromDemo () {
 
     }
 }
diff --git a/src/test/java/de/ids_mannheim/korap/web/service/full/ResourceServiceTest.java b/src/test/java/de/ids_mannheim/korap/web/service/full/ResourceServiceTest.java
index f3cf778..d9e761c 100644
--- a/src/test/java/de/ids_mannheim/korap/web/service/full/ResourceServiceTest.java
+++ b/src/test/java/de/ids_mannheim/korap/web/service/full/ResourceServiceTest.java
@@ -23,17 +23,19 @@
 public class ResourceServiceTest extends FastJerseyTest {
 
     @BeforeClass
-    public static void configure() throws Exception {
+    public static void configure () throws Exception {
         FastJerseyTest.setPackages("de.ids_mannheim.korap.web.service.full",
                 "de.ids_mannheim.korap.web.filter",
                 "de.ids_mannheim.korap.web.utils");
     }
 
+
     @Test
-    @Ignore
-    public void testSearchSimple() {
-        ClientResponse response = resource().path(getAPIVersion())
-                .path("search").queryParam("q", "[orth=das]")
+    public void testSearchSimple () {
+        ClientResponse response = resource()
+                .path(getAPIVersion())
+                .path("search")
+                .queryParam("q", "[orth=das]")
                 .queryParam("ql", "poliqarp")
                 //                .queryParam("cq", "corpusID=GOE")
                 .header(Attributes.AUTHORIZATION,
@@ -43,15 +45,17 @@
                 response.getStatus());
 
         JsonNode node = JsonUtils.readTree(response.getEntity(String.class));
-        Assert.assertNotNull(node);
+        assertNotNull(node);
         assertNotEquals(0, node.path("matches").size());
     }
 
+
     @Test
-    @Ignore
-    public void testCollectionGet() {
-        ClientResponse response = resource().path(getAPIVersion())
-                .path("collection").header(Attributes.AUTHORIZATION,
+    public void testCollectionGet () {
+        ClientResponse response = resource()
+                .path(getAPIVersion())
+                .path("collection")
+                .header(Attributes.AUTHORIZATION,
                         BasicHttpAuth.encode("kustvakt", "kustvakt2015"))
                 .get(ClientResponse.class);
         assertEquals(ClientResponse.Status.OK.getStatusCode(),
@@ -61,49 +65,58 @@
         assertNotEquals(0, node.size());
     }
 
+
     @Test
-    @Ignore
-    public void testStats() {
-        ClientResponse response = resource().path(getAPIVersion())
-                .path("collection").header(Attributes.AUTHORIZATION,
+    public void testStats () {
+        ClientResponse response = resource()
+                .path(getAPIVersion())
+                .path("collection")
+                .header(Attributes.AUTHORIZATION,
                         BasicHttpAuth.encode("kustvakt", "kustvakt2015"))
                 .get(ClientResponse.class);
         assertEquals(ClientResponse.Status.OK.getStatusCode(),
                 response.getStatus());
 
         JsonNode node = JsonUtils.readTree(response.getEntity(String.class));
-        Assert.assertNotNull(node);
+        assertNotNull(node);
+        assertNotEquals(0, node.size());
 
-        System.out.println("-------------------------------");
-        System.out.println("NODE COLLECTIONS" + node);
         String id = node.path(0).path("id").asText();
 
-        System.out.println("ID IS " + id);
-        System.out.println("FROM NODE " + node);
-        response = resource().path(getAPIVersion()).path("collection").path(id)
-                .path("stats").header(Attributes.AUTHORIZATION,
+        response = resource()
+                .path(getAPIVersion())
+                .path("collection")
+                .path(id)
+                .path("stats")
+                .header(Attributes.AUTHORIZATION,
                         BasicHttpAuth.encode("kustvakt", "kustvakt2015"))
                 .get(ClientResponse.class);
 
         assertEquals(ClientResponse.Status.OK.getStatusCode(),
                 response.getStatus());
         node = JsonUtils.readTree(response.getEntity(String.class));
-        Assert.assertNotNull(node);
+        assertNotNull(node);
         int docs = node.path("documents").asInt();
-        System.out.println("-------------------------------");
-        System.out.println("NODE " + node);
         assertNotEquals(0, docs);
         Assert.assertTrue(docs < 15);
     }
 
+
     @Test
-    public void testResourceStore() {
+    public void testResourceStore () {
 
     }
 
+
+    @Test
+    public void testResourceDelete () {
+
+    }
+
+
     @Test
     @Ignore
-    public void testSerializationQueryInCollection() {
+    public void testSerializationQueryInCollection () {
         ClientResponse response = resource().path(getAPIVersion())
                 .path("corpus/WPD/search").queryParam("q", "[base=Haus]")
                 .queryParam("ql", "poliqarp").queryParam("context", "base/s:s")
@@ -113,8 +126,9 @@
         System.out.println("Entity 1 " + ent);
     }
 
+
     @Test
-    public void testSerializationQueryPublic() {
+    public void testSerializationQueryPublic () {
         ClientResponse response = resource().path(getAPIVersion())
                 .path("search").queryParam("q", "[base=Haus]")
                 .queryParam("ql", "poliqarp").queryParam("context", "sentence")
@@ -125,8 +139,9 @@
         System.out.println(node);
     }
 
+
     @Test
-    public void testQuery() {
+    public void testQuery () {
         ClientResponse response = resource().path(getAPIVersion())
                 .path("search").queryParam("q", "[base=Haus]")
                 .queryParam("ql", "poliqarp").queryParam("context", "sentence")
@@ -138,24 +153,33 @@
         assertNotEquals("${project.version}", "/meta/version");
     }
 
+
     @Test
     @Ignore
-    public void testSerializationMeta() {
+    public void testSerializationMeta () {
         ClientResponse response = resource().path(getAPIVersion())
                 .path("search").queryParam("context", "sentence")
                 .queryParam("q", "[pos=ADJA]").queryParam("ql", "poliqarp")
                 .get(ClientResponse.class);
     }
 
+
     @Test
     @Ignore
-    public void testSerializationCollection() {
+    public void testSerializationCollection () {
         ClientResponse response = resource().path(getAPIVersion()).path("")
                 .get(ClientResponse.class);
     }
 
+
+    @Test
+    public void testMatchInfo () {
+
+    }
+
+
     @Override
-    public void initMethod() throws KustvaktException {
+    public void initMethod () throws KustvaktException {
         helper().runBootInterfaces();
     }
 }
