diff --git a/full/src/main/java/de/ids_mannheim/korap/dao/AnnotationDao.java b/full/src/main/java/de/ids_mannheim/korap/dao/AnnotationDao.java
index b8cf357..afc360f 100644
--- a/full/src/main/java/de/ids_mannheim/korap/dao/AnnotationDao.java
+++ b/full/src/main/java/de/ids_mannheim/korap/dao/AnnotationDao.java
@@ -10,9 +10,11 @@
 import javax.persistence.criteria.Predicate;
 import javax.persistence.criteria.Root;
 
-import org.springframework.stereotype.Component;
+import org.springframework.stereotype.Repository;
 
 import de.ids_mannheim.korap.entity.AnnotationPair;
+import de.ids_mannheim.korap.entity.AnnotationPair_;
+import de.ids_mannheim.korap.entity.Annotation_;
 
 
 /**
@@ -22,7 +24,7 @@
  * @author margaretha
  *
  */
-@Component
+@Repository
 public class AnnotationDao {
 
     @PersistenceContext
@@ -39,8 +41,8 @@
         CriteriaQuery<AnnotationPair> query =
                 criteriaBuilder.createQuery(AnnotationPair.class);
         Root<AnnotationPair> annotationPair = query.from(AnnotationPair.class);
-        annotationPair.fetch("annotation1");
-        annotationPair.fetch("annotation2");
+        annotationPair.fetch(AnnotationPair_.annotation1);
+        annotationPair.fetch(AnnotationPair_.annotation2);
         query.select(annotationPair);
         Query q = entityManager.createQuery(query);
         return q.getResultList();
@@ -65,9 +67,9 @@
         CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder();
         CriteriaQuery<Object> query = criteriaBuilder.createQuery();
         Root<AnnotationPair> annotationPair = query.from(AnnotationPair.class);
-        annotationPair.fetch("annotation1");
-        annotationPair.fetch("annotation2");
-        annotationPair.fetch("values");
+        annotationPair.fetch(AnnotationPair_.annotation1);
+        annotationPair.fetch(AnnotationPair_.annotation2);
+        annotationPair.fetch(AnnotationPair_.values);
 
         // EM: Hibernate bug in join n:m (see AnnotationPair.values). 
         // There should not be any redundant AnnotationPair. 
@@ -77,14 +79,16 @@
         query = query.select(annotationPair);
 
         if (!foundry.isEmpty()) {
-            Predicate foundryPredicate = criteriaBuilder.equal(
-                    annotationPair.get("annotation1").get("code"), foundry);
+            Predicate foundryPredicate = criteriaBuilder.equal(annotationPair
+                    .get(AnnotationPair_.annotation1).get(Annotation_.code),
+                    foundry);
             if (layer.isEmpty() || layer.equals("*")) {
                 query.where(foundryPredicate);
             }
             else {
-                Predicate layerPredicate = criteriaBuilder.equal(
-                        annotationPair.get("annotation2").get("code"), layer);
+                Predicate layerPredicate = criteriaBuilder.equal(annotationPair
+                        .get(AnnotationPair_.annotation2).get(Annotation_.code),
+                        layer);
                 Predicate andPredicate =
                         criteriaBuilder.and(foundryPredicate, layerPredicate);
                 query.where(andPredicate);
diff --git a/full/src/main/java/de/ids_mannheim/korap/dao/ResourceDao.java b/full/src/main/java/de/ids_mannheim/korap/dao/ResourceDao.java
index 0a14a3c..16913bd 100644
--- a/full/src/main/java/de/ids_mannheim/korap/dao/ResourceDao.java
+++ b/full/src/main/java/de/ids_mannheim/korap/dao/ResourceDao.java
@@ -9,9 +9,10 @@
 import javax.persistence.criteria.CriteriaQuery;
 import javax.persistence.criteria.Root;
 
-import org.springframework.stereotype.Component;
+import org.springframework.stereotype.Repository;
 
 import de.ids_mannheim.korap.entity.Resource;
+import de.ids_mannheim.korap.entity.Resource_;
 
 /**
  * ResourceDao manages SQL queries regarding resource info and layers.
@@ -19,21 +20,22 @@
  * @author margaretha
  *
  */
-@Component
+@Repository
 public class ResourceDao {
 
     @PersistenceContext
     private EntityManager entityManager;
-    
+
     /** Select all from the resource table  
      *  
      * @return a list of resources
      */
     public List<Resource> getAllResources () {
         CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder();
-        CriteriaQuery<Resource> query = criteriaBuilder.createQuery(Resource.class);
+        CriteriaQuery<Resource> query =
+                criteriaBuilder.createQuery(Resource.class);
         Root<Resource> resource = query.from(Resource.class);
-        resource.fetch("layers");
+        resource.fetch(Resource_.layers);
         query.select(resource);
         Query q = entityManager.createQuery(query);
         return q.getResultList();
diff --git a/full/src/main/java/de/ids_mannheim/korap/dao/UserGroupDao.java b/full/src/main/java/de/ids_mannheim/korap/dao/UserGroupDao.java
index 900e062..324aeb8 100644
--- a/full/src/main/java/de/ids_mannheim/korap/dao/UserGroupDao.java
+++ b/full/src/main/java/de/ids_mannheim/korap/dao/UserGroupDao.java
@@ -1,6 +1,5 @@
 package de.ids_mannheim.korap.dao;
 
-import java.util.ArrayList;
 import java.util.List;
 
 import javax.persistence.EntityManager;
@@ -8,22 +7,29 @@
 import javax.persistence.Query;
 import javax.persistence.criteria.CriteriaBuilder;
 import javax.persistence.criteria.CriteriaQuery;
+import javax.persistence.criteria.ListJoin;
+import javax.persistence.criteria.Predicate;
 import javax.persistence.criteria.Root;
 
-import org.springframework.stereotype.Component;
+import org.springframework.stereotype.Repository;
 import org.springframework.transaction.annotation.Transactional;
 
+import de.ids_mannheim.korap.constants.GroupMemberStatus;
 import de.ids_mannheim.korap.constants.UserGroupStatus;
 import de.ids_mannheim.korap.constants.VirtualCorpusAccessStatus;
 import de.ids_mannheim.korap.entity.UserGroup;
 import de.ids_mannheim.korap.entity.UserGroupMember;
+import de.ids_mannheim.korap.entity.UserGroupMember_;
+import de.ids_mannheim.korap.entity.UserGroup_;
 import de.ids_mannheim.korap.entity.VirtualCorpus;
 import de.ids_mannheim.korap.entity.VirtualCorpusAccessGroup;
 
 @Transactional
-@Component
+@Repository
 public class UserGroupDao {
 
+    public static final String USER_GROUP_ALL = "all";
+
     @PersistenceContext
     private EntityManager entityManager;
 
@@ -57,23 +63,57 @@
 
         Root<UserGroup> root = query.from(UserGroup.class);
         query.select(root);
-        query.where(criteriaBuilder.equal(root.get("id"), groupId));
+        query.where(criteriaBuilder.equal(root.get(UserGroup_.id), groupId));
         Query q = entityManager.createQuery(query);
         return (UserGroup) q.getSingleResult();
     }
 
+    public List<UserGroup> retrieveGroupByUserId (String userId) {
+        CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder();
+        CriteriaQuery<UserGroup> query =
+                criteriaBuilder.createQuery(UserGroup.class);
+
+        Root<UserGroup> root = query.from(UserGroup.class);
+
+        Predicate allUserGroup = criteriaBuilder.and(
+                criteriaBuilder.equal(root.get(UserGroup_.name),
+                        USER_GROUP_ALL),
+                criteriaBuilder.notEqual(root.get(UserGroup_.status),
+                        UserGroupStatus.DELETED));
+
+
+        ListJoin<UserGroup, UserGroupMember> members =
+                root.join(UserGroup_.members);
+        Predicate memberships = criteriaBuilder.and(
+                criteriaBuilder.equal(members.get(UserGroupMember_.userId),
+                        userId),
+                criteriaBuilder.equal(members.get(UserGroupMember_.status),
+                        GroupMemberStatus.ACTIVE));
+
+
+        query.select(root);
+        query.where(criteriaBuilder.and(allUserGroup, memberships));
+        Query q = entityManager.createQuery(query);
+        return q.getResultList();
+    }
+
+    public void addVCToGroup (VirtualCorpus virtualCorpus, String createdBy,
+            VirtualCorpusAccessStatus status, UserGroup group) {
+        VirtualCorpusAccessGroup accessGroup = new VirtualCorpusAccessGroup();
+        accessGroup.setCreatedBy(createdBy);
+        accessGroup.setStatus(status);
+        accessGroup.setUserGroup(group);
+        accessGroup.setVirtualCorpus(virtualCorpus);
+        entityManager.persist(accessGroup);
+    }
+
     public void addVCToGroup (List<VirtualCorpus> virtualCorpora,
-            String createdBy, UserGroup group) {
-        // check role
-        
-        VirtualCorpusAccessGroup accessGroup;
+            String createdBy, UserGroup group,
+            VirtualCorpusAccessStatus status) {
+
         for (VirtualCorpus vc : virtualCorpora) {
-            accessGroup = new VirtualCorpusAccessGroup();
-            accessGroup.setCreatedBy(createdBy);
-            accessGroup.setStatus(VirtualCorpusAccessStatus.ACTIVE);
-            accessGroup.setUserGroup(group);
-            accessGroup.setVirtualCorpus(vc);
-            entityManager.persist(accessGroup);
+            addVCToGroup(vc, createdBy, status, group);
         }
     }
+
 }
diff --git a/full/src/main/java/de/ids_mannheim/korap/dao/UserGroupMemberDao.java b/full/src/main/java/de/ids_mannheim/korap/dao/UserGroupMemberDao.java
index 5404c02..301de3b 100644
--- a/full/src/main/java/de/ids_mannheim/korap/dao/UserGroupMemberDao.java
+++ b/full/src/main/java/de/ids_mannheim/korap/dao/UserGroupMemberDao.java
@@ -7,43 +7,40 @@
 import javax.persistence.Query;
 import javax.persistence.criteria.CriteriaBuilder;
 import javax.persistence.criteria.CriteriaQuery;
+import javax.persistence.criteria.Join;
 import javax.persistence.criteria.Predicate;
 import javax.persistence.criteria.Root;
 
-import org.springframework.stereotype.Component;
+import org.springframework.stereotype.Repository;
 import org.springframework.transaction.annotation.Transactional;
 
 import de.ids_mannheim.korap.constants.GroupMemberStatus;
-import de.ids_mannheim.korap.entity.UserGroup;
+import de.ids_mannheim.korap.entity.Role;
 import de.ids_mannheim.korap.entity.UserGroupMember;
+import de.ids_mannheim.korap.entity.UserGroupMember_;
 import de.ids_mannheim.korap.exceptions.KustvaktException;
 import de.ids_mannheim.korap.utils.ParameterChecker;
 
 @Transactional
-@Component
-public class UserGroupMemberDao {
+@Repository
+public class UserGroupMemberDao<X> {
 
     @PersistenceContext
     private EntityManager entityManager;
 
-    public void addMember (UserGroupMember member, UserGroup userGroup)
+    public void addMember (UserGroupMember member)
             throws KustvaktException {
         ParameterChecker.checkObjectValue(member, "userGroupMember");
-        ParameterChecker.checkObjectValue(userGroup, "userGroup");
-
-        List<UserGroupMember> members = userGroup.getMembers();
-        members.add(member);
-        entityManager.persist(userGroup);
+        entityManager.persist(member);
     }
     
-    public void addMembers (List<UserGroupMember> newMembers, UserGroup userGroup)
+    public void addMembers (List<UserGroupMember> members)
             throws KustvaktException {
-        ParameterChecker.checkObjectValue(newMembers, "List<UserGroupMember>");
-        ParameterChecker.checkObjectValue(userGroup, "userGroup");
+        ParameterChecker.checkObjectValue(members, "List<UserGroupMember>");
 
-        List<UserGroupMember> members = userGroup.getMembers();
-        members.addAll(newMembers);
-        entityManager.persist(userGroup);
+        for (UserGroupMember member: members){
+            addMember(member);
+        }
     }
     
     public void approveMember (String userId, int groupId)
@@ -83,8 +80,8 @@
         Root<UserGroupMember> root = query.from(UserGroupMember.class);
 
         Predicate predicate = criteriaBuilder.and(
-                criteriaBuilder.equal(root.get("groupId"), groupId),
-                criteriaBuilder.equal(root.get("userId"), userId));
+                criteriaBuilder.equal(root.get(UserGroupMember_.group), groupId),
+                criteriaBuilder.equal(root.get(UserGroupMember_.userId), userId));
 
         query.select(root);
         query.where(predicate);
@@ -92,4 +89,21 @@
         return (UserGroupMember) q.getSingleResult();
     }
 
+    public List<UserGroupMember> retrieveMemberByRole (int groupId, int roleId) {
+        CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder();
+        CriteriaQuery<UserGroupMember> query =
+                criteriaBuilder.createQuery(UserGroupMember.class);
+
+        Root<UserGroupMember> root = query.from(UserGroupMember.class);
+        Join<UserGroupMember, Role> memberRole = root.join("roles");
+        
+        Predicate predicate = criteriaBuilder.and(
+                criteriaBuilder.equal(root.get(UserGroupMember_.group), groupId),
+                criteriaBuilder.equal(memberRole.get("role_id"), roleId));
+
+        query.select(root);
+        query.where(predicate);
+        Query q = entityManager.createQuery(query);
+        return q.getResultList();
+    }
 }
diff --git a/full/src/main/java/de/ids_mannheim/korap/dao/VirtualCorpusDao.java b/full/src/main/java/de/ids_mannheim/korap/dao/VirtualCorpusDao.java
index 22042a7..6085309 100644
--- a/full/src/main/java/de/ids_mannheim/korap/dao/VirtualCorpusDao.java
+++ b/full/src/main/java/de/ids_mannheim/korap/dao/VirtualCorpusDao.java
@@ -14,7 +14,7 @@
 import javax.persistence.criteria.Predicate;
 import javax.persistence.criteria.Root;
 
-import org.springframework.stereotype.Component;
+import org.springframework.stereotype.Repository;
 import org.springframework.transaction.annotation.Transactional;
 
 import de.ids_mannheim.korap.constants.GroupMemberStatus;
@@ -34,7 +34,7 @@
  *
  */
 @Transactional
-@Component
+@Repository
 public class VirtualCorpusDao {
 
     @PersistenceContext
diff --git a/full/src/main/java/de/ids_mannheim/korap/dto/converter/AnnotationConverter.java b/full/src/main/java/de/ids_mannheim/korap/dto/converter/AnnotationConverter.java
index c049c2a..0e6cf13 100644
--- a/full/src/main/java/de/ids_mannheim/korap/dto/converter/AnnotationConverter.java
+++ b/full/src/main/java/de/ids_mannheim/korap/dto/converter/AnnotationConverter.java
@@ -5,7 +5,7 @@
 import java.util.List;
 import java.util.Map;
 
-import org.springframework.stereotype.Component;
+import org.springframework.stereotype.Service;
 
 import de.ids_mannheim.korap.dto.FoundryDto;
 import de.ids_mannheim.korap.dto.FoundryDto.Layer;
@@ -21,7 +21,7 @@
  * @author margaretha
  *
  */
-@Component
+@Service
 public class AnnotationConverter {
 
     /**
diff --git a/full/src/main/java/de/ids_mannheim/korap/dto/converter/ResourceConverter.java b/full/src/main/java/de/ids_mannheim/korap/dto/converter/ResourceConverter.java
index 03f00b3..8e22249 100644
--- a/full/src/main/java/de/ids_mannheim/korap/dto/converter/ResourceConverter.java
+++ b/full/src/main/java/de/ids_mannheim/korap/dto/converter/ResourceConverter.java
@@ -5,13 +5,13 @@
 import java.util.List;
 import java.util.Map;
 
-import org.springframework.stereotype.Component;
+import org.springframework.stereotype.Service;
 
 import de.ids_mannheim.korap.dto.ResourceDto;
 import de.ids_mannheim.korap.entity.AnnotationPair;
 import de.ids_mannheim.korap.entity.Resource;
 
-@Component
+@Service
 public class ResourceConverter {
 
     public List<ResourceDto> convertToResourcesDto (List<Resource> resources) {
diff --git a/full/src/main/java/de/ids_mannheim/korap/service/AnnotationService.java b/full/src/main/java/de/ids_mannheim/korap/service/AnnotationService.java
new file mode 100644
index 0000000..164887b
--- /dev/null
+++ b/full/src/main/java/de/ids_mannheim/korap/service/AnnotationService.java
@@ -0,0 +1,84 @@
+package de.ids_mannheim.korap.service;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import de.ids_mannheim.korap.dao.AnnotationDao;
+import de.ids_mannheim.korap.dto.FoundryDto;
+import de.ids_mannheim.korap.dto.LayerDto;
+import de.ids_mannheim.korap.dto.converter.AnnotationConverter;
+import de.ids_mannheim.korap.entity.AnnotationPair;
+import de.ids_mannheim.korap.exceptions.KustvaktException;
+import de.ids_mannheim.korap.exceptions.StatusCodes;
+import de.ids_mannheim.korap.web.utils.KustvaktResponseHandler;
+
+@Service
+public class AnnotationService {
+
+    private static Logger jlog =
+            LoggerFactory.getLogger(AnnotationService.class);
+
+    @Autowired
+    private AnnotationDao annotationDao;
+
+    @Autowired
+    private AnnotationConverter annotationConverter;
+
+    public List<LayerDto> getLayerDtos () {
+        List<AnnotationPair> layers = annotationDao.getAllFoundryLayerPairs();
+        jlog.debug("/layers " + layers.toString());
+        List<LayerDto> layerDto = annotationConverter.convertToLayerDto(layers);
+        return layerDto;
+    }
+
+    public List<FoundryDto> getFoundryDtos (List<String> codes, String language)
+            throws KustvaktException {
+        List<AnnotationPair> annotationPairs = null;
+        String foundry = "", layer = "";
+        if (codes.contains("*")) {
+            annotationPairs =
+                    annotationDao.getAnnotationDescriptions(foundry, layer);
+        }
+        else {
+            String[] annotationCode;
+            annotationPairs = new ArrayList<AnnotationPair>();
+            for (String code : codes) {
+                jlog.debug("code " + code);
+                annotationCode = code.split("/");
+                if (annotationCode.length == 1) {
+                    foundry = annotationCode[0];
+                }
+                else if (annotationCode.length == 2) {
+                    foundry = annotationCode[0];
+                    layer = annotationCode[1];
+                }
+                else {
+                    jlog.error("Annotation code is wrong: " + annotationCode);
+                    throw KustvaktResponseHandler.throwit(
+                            new KustvaktException(StatusCodes.INVALID_ATTRIBUTE,
+                                    "Bad attribute:", code));
+                }
+
+                annotationPairs.addAll(annotationDao
+                        .getAnnotationDescriptions(foundry, layer));
+            }
+        }
+
+        if (annotationPairs != null && !annotationPairs.isEmpty()) {
+            List<FoundryDto> foundryDtos = annotationConverter
+                    .convertToFoundryDto(annotationPairs, language);
+            jlog.debug("/description " + annotationPairs.toString());
+            return foundryDtos;
+        }
+        else {
+            throw new KustvaktException(StatusCodes.NO_RESULT_FOUND,
+                    "No result found.", "");
+        }
+
+    }
+}
diff --git a/full/src/main/java/de/ids_mannheim/korap/service/ResourceService.java b/full/src/main/java/de/ids_mannheim/korap/service/ResourceService.java
new file mode 100644
index 0000000..937f337
--- /dev/null
+++ b/full/src/main/java/de/ids_mannheim/korap/service/ResourceService.java
@@ -0,0 +1,33 @@
+package de.ids_mannheim.korap.service;
+
+import java.util.List;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import de.ids_mannheim.korap.dao.ResourceDao;
+import de.ids_mannheim.korap.dto.ResourceDto;
+import de.ids_mannheim.korap.dto.converter.ResourceConverter;
+import de.ids_mannheim.korap.entity.Resource;
+
+@Service
+public class ResourceService {
+
+    private static Logger jlog = LoggerFactory.getLogger(ResourceService.class);
+
+    @Autowired
+    private ResourceDao resourceDao;
+    @Autowired
+    private ResourceConverter resourceConverter;
+
+    public List<ResourceDto> getResourceDtos () {
+        List<Resource> resources = resourceDao.getAllResources();
+        List<ResourceDto> resourceDtos =
+                resourceConverter.convertToResourcesDto(resources);
+        jlog.debug("/info " + resourceDtos.toString());
+        return resourceDtos;
+    }
+
+}
diff --git a/full/src/main/java/de/ids_mannheim/korap/web/controller/AdminController.java b/full/src/main/java/de/ids_mannheim/korap/web/controller/AdminController.java
index 67be146..c9e8a4b 100644
--- a/full/src/main/java/de/ids_mannheim/korap/web/controller/AdminController.java
+++ b/full/src/main/java/de/ids_mannheim/korap/web/controller/AdminController.java
@@ -1,4 +1,4 @@
-package de.ids_mannheim.korap.web.service.full;
+package de.ids_mannheim.korap.web.controller;
 
 import java.util.List;
 import java.util.Locale;
@@ -48,15 +48,15 @@
 @Path(KustvaktServer.API_VERSION + "/admin")
 @ResourceFilters({ AdminFilter.class, PiwikFilter.class })
 @Produces(MediaType.APPLICATION_JSON + ";charset=utf-8")
-public class AdminService {
+public class AdminController {
 
-    private static Logger jlog = LoggerFactory.getLogger(AdminService.class);
+    private static Logger jlog = LoggerFactory.getLogger(AdminController.class);
 
     private AuditingIface auditingController;
     private DocumentDao documentDao;
 
 
-    public AdminService () {
+    public AdminController () {
         this.auditingController = BeansFactory.getKustvaktContext()
                 .getAuditingProvider();
         this.documentDao = new DocumentDao(
diff --git a/full/src/main/java/de/ids_mannheim/korap/web/controller/AnnotationController.java b/full/src/main/java/de/ids_mannheim/korap/web/controller/AnnotationController.java
index 101bba1..331ed6f 100644
--- a/full/src/main/java/de/ids_mannheim/korap/web/controller/AnnotationController.java
+++ b/full/src/main/java/de/ids_mannheim/korap/web/controller/AnnotationController.java
@@ -1,7 +1,6 @@
-package de.ids_mannheim.korap.web.service.full;
+package de.ids_mannheim.korap.web.controller;
 
 import java.io.IOException;
-import java.util.ArrayList;
 import java.util.List;
 
 import javax.ws.rs.Consumes;
@@ -20,14 +19,10 @@
 import com.fasterxml.jackson.databind.JsonNode;
 import com.sun.jersey.spi.container.ResourceFilters;
 
-import de.ids_mannheim.korap.dao.AnnotationDao;
-import de.ids_mannheim.korap.dto.FoundryDto;
-import de.ids_mannheim.korap.dto.LayerDto;
-import de.ids_mannheim.korap.dto.converter.AnnotationConverter;
-import de.ids_mannheim.korap.entity.AnnotationPair;
 import de.ids_mannheim.korap.exceptions.KustvaktException;
 import de.ids_mannheim.korap.exceptions.StatusCodes;
 import de.ids_mannheim.korap.filter.AuthFilter;
+import de.ids_mannheim.korap.service.AnnotationService;
 import de.ids_mannheim.korap.utils.JsonUtils;
 import de.ids_mannheim.korap.web.filter.DemoUserFilter;
 import de.ids_mannheim.korap.web.filter.PiwikFilter;
@@ -43,17 +38,13 @@
 @Path("annotation/")
 @ResourceFilters({ AuthFilter.class, DemoUserFilter.class, PiwikFilter.class })
 @Produces(MediaType.APPLICATION_JSON + ";charset=utf-8")
-public class AnnotationService {
+public class AnnotationController {
 
     private static Logger jlog =
-            LoggerFactory.getLogger(AnnotationService.class);
+            LoggerFactory.getLogger(AnnotationController.class);
 
     @Autowired
-    private AnnotationDao annotationDao;
-
-    @Autowired
-    private AnnotationConverter annotationConverter;
-
+    private AnnotationService annotationService;
 
     /**
      * Returns information about all supported layers
@@ -63,10 +54,7 @@
     @GET
     @Path("layers")
     public Response getLayers () {
-        List<AnnotationPair> layers = annotationDao.getAllFoundryLayerPairs();
-        jlog.debug("/layers " + layers.toString());
-        List<LayerDto> layerDto = annotationConverter.convertToLayerDto(layers);
-        String result = JsonUtils.toJSON(layerDto);
+        String result = JsonUtils.toJSON(annotationService.getLayerDtos());
         return Response.ok(result).build();
     }
 
@@ -80,14 +68,16 @@
      *            2-letter language code (description language)
      * @return a list of foundry, layer, value information in json
      */
+    @SuppressWarnings("unchecked")
     @POST
     @Path("description")
     @Consumes(MediaType.APPLICATION_JSON)
     public Response getFoundryDescriptions (String json) {
         JsonNode node = JsonUtils.readTree(json);
         if (node == null) {
-            throw KustvaktResponseHandler.throwit(new KustvaktException(
-                    StatusCodes.MISSING_ARGUMENT, "Missing a json string.", ""));
+            throw KustvaktResponseHandler
+                    .throwit(new KustvaktException(StatusCodes.MISSING_ARGUMENT,
+                            "Missing a json string.", ""));
         }
 
         String language;
@@ -120,52 +110,20 @@
                             "Missing attribute:", "codes"));
         }
         else if (codes.isEmpty()) {
-            throw KustvaktResponseHandler.throwit(new KustvaktException(
-                    StatusCodes.NO_RESULT_FOUND, "No result found.","codes:[]"));
-        }
-        
-        List<AnnotationPair> annotationPairs = null;
-        String foundry = "", layer = "";
-        if (codes.contains("*")) {
-            annotationPairs =
-                    annotationDao.getAnnotationDescriptions(foundry, layer);
-        }
-        else {
-            String[] annotationCode;
-            annotationPairs = new ArrayList<AnnotationPair>();
-            for (String code : codes) {
-                jlog.debug("code " + code);
-                annotationCode = code.split("/");
-                if (annotationCode.length == 1) {
-                    foundry = annotationCode[0];
-                }
-                else if (annotationCode.length == 2) {
-                    foundry = annotationCode[0];
-                    layer = annotationCode[1];
-                }
-                else {
-                    jlog.error("Annotation code is wrong: " + annotationCode);
-                    throw KustvaktResponseHandler.throwit(
-                            new KustvaktException(StatusCodes.INVALID_ATTRIBUTE,
-                                    "Bad attribute:", code));
-                }
-
-                annotationPairs.addAll(annotationDao
-                        .getAnnotationDescriptions(foundry, layer));
-            }
+            throw KustvaktResponseHandler
+                    .throwit(new KustvaktException(StatusCodes.NO_RESULT_FOUND,
+                            "No result found.", "codes:[]"));
         }
 
-        if (annotationPairs != null && !annotationPairs.isEmpty()) {
-            List<FoundryDto> dtos = annotationConverter
-                    .convertToFoundryDto(annotationPairs, language);
-            jlog.debug("/description " + annotationPairs.toString());
-            String result = JsonUtils.toJSON(dtos);
-            return Response.ok(result).build();
+        String result;
+        try {
+            result = JsonUtils
+                    .toJSON(annotationService.getFoundryDtos(codes, language));
         }
-        else {
-            throw KustvaktResponseHandler.throwit(new KustvaktException(
-                    StatusCodes.NO_RESULT_FOUND, "No result found.",""));
+        catch (KustvaktException e) {
+            throw KustvaktResponseHandler.throwit(e);
         }
+        return Response.ok(result).build();
     }
 
 }
diff --git a/full/src/main/java/de/ids_mannheim/korap/web/controller/AuthenticationController.java b/full/src/main/java/de/ids_mannheim/korap/web/controller/AuthenticationController.java
index 96f345c..b475c9c 100644
--- a/full/src/main/java/de/ids_mannheim/korap/web/controller/AuthenticationController.java
+++ b/full/src/main/java/de/ids_mannheim/korap/web/controller/AuthenticationController.java
@@ -1,4 +1,4 @@
-package de.ids_mannheim.korap.web.service.full;
+package de.ids_mannheim.korap.web.controller;
 
 import com.sun.jersey.spi.container.ContainerRequest;
 import com.sun.jersey.spi.container.ResourceFilters;
@@ -45,20 +45,20 @@
 @Path("/auth")
 @ResourceFilters({ PiwikFilter.class })
 @Produces(MediaType.TEXT_HTML + ";charset=utf-8")
-public class AuthService {
+public class AuthenticationController {
 
     private static Boolean DEBUG_LOG = true;
 
     //todo: bootstrap function to transmit certain default configuration settings and examples (example user queries,
     // default usersettings, etc.)
-    private static Logger jlog = KustvaktLogger.getLogger(AuthService.class);
+    private static Logger jlog = KustvaktLogger.getLogger(AuthenticationController.class);
 
     private AuthenticationManagerIface controller;
 
 
     //    private SendMail mail;
 
-    public AuthService () {
+    public AuthenticationController () {
         this.controller =
                 BeansFactory.getKustvaktContext().getAuthenticationManager();
         //todo: replace with real property values
diff --git a/full/src/main/java/de/ids_mannheim/korap/web/controller/DocumentController.java b/full/src/main/java/de/ids_mannheim/korap/web/controller/DocumentController.java
index df23da8..c23db52 100644
--- a/full/src/main/java/de/ids_mannheim/korap/web/controller/DocumentController.java
+++ b/full/src/main/java/de/ids_mannheim/korap/web/controller/DocumentController.java
@@ -1,4 +1,4 @@
-package de.ids_mannheim.korap.web.service.full;
+package de.ids_mannheim.korap.web.controller;
 
 import com.sun.jersey.spi.container.ResourceFilters;
 import de.ids_mannheim.korap.config.BeansFactory;
@@ -19,22 +19,25 @@
 import java.util.List;
 
 /**
+ * EM: To Do: restructure codes regarding service and controller layers
+ * 
  * @author hanl
  * @date 19/11/2014
  */
 @Path(KustvaktServer.API_VERSION + "/doc")
 @ResourceFilters({ AdminFilter.class })
 @Produces(MediaType.APPLICATION_JSON + ";charset=utf-8")
-public class DocumentService {
+public class DocumentController {
 
-    private static Logger jlog = LoggerFactory.getLogger(DocumentService.class);
+    private static Logger jlog =
+            LoggerFactory.getLogger(DocumentController.class);
     private DocumentDao documentDao;
 
 
     // todo: error handling
-    public DocumentService () {
-        this.documentDao = new DocumentDao(BeansFactory.getKustvaktContext()
-                .getPersistenceClient());
+    public DocumentController () {
+        this.documentDao = new DocumentDao(
+                BeansFactory.getKustvaktContext().getPersistenceClient());
     }
 
 
@@ -61,10 +64,8 @@
     public Response get (@PathParam("corpus") String corpus,
             @QueryParam("index") Integer index,
             @QueryParam("offset") Integer length) {
-        if (index == null)
-            index = 1;
-        if (length == null)
-            length = 25;
+        if (index == null) index = 1;
+        if (length == null) length = 25;
         try {
             List docs = this.documentDao.findbyCorpus(corpus, length, index);
             //todo: serialize to document json
diff --git a/full/src/main/java/de/ids_mannheim/korap/web/controller/KustvaktController.java b/full/src/main/java/de/ids_mannheim/korap/web/controller/KustvaktController.java
index 7c7b647..f581f37 100644
--- a/full/src/main/java/de/ids_mannheim/korap/web/controller/KustvaktController.java
+++ b/full/src/main/java/de/ids_mannheim/korap/web/controller/KustvaktController.java
@@ -1,4 +1,4 @@
-package de.ids_mannheim.korap.web.service.full;
+package de.ids_mannheim.korap.web.controller;
 
 import de.ids_mannheim.korap.server.KustvaktServer;
 import de.ids_mannheim.korap.utils.JsonUtils;
@@ -19,9 +19,9 @@
  */
 @Path("kustvakt")
 @Produces(MediaType.APPLICATION_JSON + ";charset=utf-8")
-public class KustvaktService {
+public class KustvaktController {
 
-    private static Logger jlog = LoggerFactory.getLogger(UserService.class);
+    private static Logger jlog = LoggerFactory.getLogger(UserController.class);
 
 
     @Path("info")
diff --git a/full/src/main/java/de/ids_mannheim/korap/web/controller/OAuthController.java b/full/src/main/java/de/ids_mannheim/korap/web/controller/OAuthController.java
index 778ac27..7192e3e 100644
--- a/full/src/main/java/de/ids_mannheim/korap/web/controller/OAuthController.java
+++ b/full/src/main/java/de/ids_mannheim/korap/web/controller/OAuthController.java
@@ -1,4 +1,4 @@
-package de.ids_mannheim.korap.web.service.full;
+package de.ids_mannheim.korap.web.controller;
 
 import com.sun.jersey.spi.container.ContainerRequest;
 import com.sun.jersey.spi.container.ResourceFilters;
@@ -52,7 +52,7 @@
 //todo: only allow oauth2 access_token requests GET methods?
 //todo: allow refresh tokens
 @Path(KustvaktServer.API_VERSION + "/oauth2")
-public class OAuthService {
+public class OAuthController {
 
     private OAuth2Handler handler;
     private AuthenticationManagerIface controller;
@@ -60,7 +60,7 @@
     private KustvaktConfiguration config;
 
 
-    public OAuthService () {
+    public OAuthController () {
         this.handler = new OAuth2Handler(BeansFactory.getKustvaktContext()
                 .getPersistenceClient());
         this.controller = BeansFactory.getKustvaktContext()
diff --git a/full/src/main/java/de/ids_mannheim/korap/web/controller/ResourceController.java b/full/src/main/java/de/ids_mannheim/korap/web/controller/ResourceController.java
index 5319c51..103072e 100644
--- a/full/src/main/java/de/ids_mannheim/korap/web/controller/ResourceController.java
+++ b/full/src/main/java/de/ids_mannheim/korap/web/controller/ResourceController.java
@@ -1,6 +1,4 @@
-package de.ids_mannheim.korap.web.service.full;
-
-import java.util.List;
+package de.ids_mannheim.korap.web.controller;
 
 import javax.ws.rs.GET;
 import javax.ws.rs.Path;
@@ -8,17 +6,12 @@
 import javax.ws.rs.core.MediaType;
 import javax.ws.rs.core.Response;
 
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Controller;
 
 import com.sun.jersey.spi.container.ResourceFilters;
 
-import de.ids_mannheim.korap.dao.ResourceDao;
-import de.ids_mannheim.korap.dto.ResourceDto;
-import de.ids_mannheim.korap.dto.converter.ResourceConverter;
-import de.ids_mannheim.korap.entity.Resource;
+import de.ids_mannheim.korap.service.ResourceService;
 import de.ids_mannheim.korap.utils.JsonUtils;
 import de.ids_mannheim.korap.web.filter.PiwikFilter;
 
@@ -30,16 +23,12 @@
  */
 @Controller
 @Path("resource/")
-@ResourceFilters({PiwikFilter.class})
+@ResourceFilters({ PiwikFilter.class })
 @Produces(MediaType.APPLICATION_JSON + ";charset=utf-8")
-public class ResourceService {
-
-    private static Logger jlog = LoggerFactory.getLogger(ResourceService.class);
+public class ResourceController {
 
     @Autowired
-    private ResourceDao resourceDao;
-    @Autowired
-    private ResourceConverter resourceConverter;
+    private ResourceService resourceService;
 
 
     /** Returns descriptions of all free resources stored in 
@@ -51,11 +40,7 @@
     @GET
     @Path("info")
     public Response getAllResourceInfo () {
-        List<Resource> resources = resourceDao.getAllResources();
-        List<ResourceDto> resourceDtos = resourceConverter
-                .convertToResourcesDto(resources);
-        String result = JsonUtils.toJSON(resourceDtos);
-        jlog.debug("/info " + resourceDtos.toString());
+        String result = JsonUtils.toJSON(resourceService.getResourceDtos());
         return Response.ok(result).build();
     }
 }
diff --git a/full/src/main/java/de/ids_mannheim/korap/web/controller/SearchController.java b/full/src/main/java/de/ids_mannheim/korap/web/controller/SearchController.java
index b6e23e3..363477a 100644
--- a/full/src/main/java/de/ids_mannheim/korap/web/controller/SearchController.java
+++ b/full/src/main/java/de/ids_mannheim/korap/web/controller/SearchController.java
@@ -1,4 +1,5 @@
-package de.ids_mannheim.korap.web.service.full;//package de.ids_mannheim.korap.ext.web;
+package de.ids_mannheim.korap.web.controller;// package
+                                             // de.ids_mannheim.korap.ext.web;
 
 import java.util.ArrayList;
 import java.util.HashMap;
@@ -65,18 +66,20 @@
 import de.ids_mannheim.korap.web.utils.KustvaktResponseHandler;
 
 /**
+ * EM: To Do: restructure codes regarding service and controller layers
  * @author hanl, margaretha
  * @date 29/01/2014
  * @lastUpdate 06/2017
  */
 @Controller
 @Path("/")
-@RequestMapping ( "/" )
+@RequestMapping("/")
 @ResourceFilters({ AuthFilter.class, DemoUserFilter.class, PiwikFilter.class })
 @Produces(MediaType.APPLICATION_JSON + ";charset=utf-8")
-public class SearchService {
+public class SearchController {
 
-    private static Logger jlog = LoggerFactory.getLogger(SearchService.class);
+    private static Logger jlog =
+            LoggerFactory.getLogger(SearchController.class);
 
     @Autowired
     private SearchKrill searchKrill;
@@ -90,12 +93,12 @@
     private RewriteHandler processor;
 
 
-    public SearchService () {
+    public SearchController () {
         this.resourceHandler = new ResourceHandler();
         UriBuilder builder = UriBuilder.fromUri("http://10.0.10.13").port(9997);
         this.graphDBhandler = new ClientsHandler(builder.build());
     }
-    
+
     @PostConstruct
     private void doPostConstruct () {
         this.processor.defaultRewriteConstraints();
@@ -123,10 +126,9 @@
 
         try {
             Class cl_type = ResourceFactory.getResourceClass(type);
-            if (cl_type == null)
-                throw KustvaktResponseHandler.throwit(
-                        StatusCodes.MISSING_ARGUMENT,
-                        "Resource type not available!", "");
+            if (cl_type == null) throw KustvaktResponseHandler.throwit(
+                    StatusCodes.MISSING_ARGUMENT,
+                    "Resource type not available!", "");
 
             User user = controller.getUser(ctx.getUsername());
 
@@ -349,23 +351,19 @@
             @QueryParam("cq") String cq) {
         TokenContext ctx = (TokenContext) securityContext.getUserPrincipal();
         QuerySerializer ss = new QuerySerializer().setQuery(q, ql, v);
-        if (cq != null)
-            ss.setCollection(cq);
+        if (cq != null) ss.setCollection(cq);
 
         MetaQueryBuilder meta = new MetaQueryBuilder();
-        if (pageIndex != null)
-            meta.addEntry("startIndex", pageIndex);
+        if (pageIndex != null) meta.addEntry("startIndex", pageIndex);
         if (pageIndex == null && startPage != null)
             meta.addEntry("startPage", startPage);
-        if (pageLength != null)
-            meta.addEntry("count", pageLength);
-        if (context != null)
-            meta.setSpanContext(context);
+        if (pageLength != null) meta.addEntry("count", pageLength);
+        if (context != null) meta.setSpanContext(context);
         meta.addEntry("cutOff", cutoff);
 
         ss.setMeta(meta.raw());
         String result = ss.toJSON();
-        jlog.debug("Query: "+result);
+        jlog.debug("Query: " + result);
         return Response.ok(result).build();
     }
 
@@ -386,8 +384,8 @@
 
     // todo: does cq have any sensible worth here? --> would say no! --> is
     // useful in non type/id scenarios
-    
-    /* EM: potentially an unused service! */    
+
+    /* EM: potentially an unused service! */
     // EM: build query using the given virtual collection id
     // EM: change the HTTP method to from TRACE to GET
     // EM: change path from search to query
@@ -410,16 +408,12 @@
         QuerySerializer ss = new QuerySerializer().setQuery(q, ql, v);
 
         MetaQueryBuilder meta = new MetaQueryBuilder();
-        if (pageIndex != null)
-            meta.addEntry("startIndex", pageIndex);
+        if (pageIndex != null) meta.addEntry("startIndex", pageIndex);
         if (pageIndex == null && startPage != null)
             meta.addEntry("startPage", startPage);
-        if (pageLength != null)
-            meta.addEntry("count", pageLength);
-        if (context != null)
-            meta.setSpanContext(context);
-        if (cutoff != null)
-            meta.addEntry("cutOff", cutoff);
+        if (pageLength != null) meta.addEntry("count", pageLength);
+        if (context != null) meta.setSpanContext(context);
+        if (cutoff != null) meta.addEntry("cutOff", cutoff);
 
         ss.setMeta(meta.raw());
 
@@ -429,7 +423,7 @@
         String query = "";
         // EM: is this necessary at all?
         KustvaktResource resource = isCollectionIdValid(ctx.getName(), id);
-        if (resource!=null){
+        if (resource != null) {
             if (resource instanceof VirtualCollection) {
                 JsonNode node = cquery.and().mergeWith(resource.getData());
                 query = JsonUtils.toJSON(node);
@@ -441,42 +435,43 @@
             }
         }
 
-        jlog.debug("Query: "+query);
+        jlog.debug("Query: " + query);
         return Response.ok(query).build();
     }
 
     // EM: prototype
-    private KustvaktResource isCollectionIdValid (String username, String collectionId) {
-        
-//        try {
-//            if (ctx.isDemo()) {
-//                // EM: FIX ME: Is there public VCs? set default username 
-                  // for nonlogin user, change demo? 
-//                Set set = ResourceFinder.searchPublicFiltered(
-//                        ResourceFactory.getResourceClass(type), id);
-//                resource = (KustvaktResource) set.toArray()[0];
-//            }
-//            else {
-//                // EM: FIX ME: search in user VC
-//                User user = controller.getUser(ctx.getUsername());
-//                if (StringUtils.isInteger(id))
-//                    resource = this.resourceHandler
-//                            .findbyIntId(Integer.valueOf(id), user);
-//                else
-//                    resource = this.resourceHandler.findbyStrId(id, user,
-//                            ResourceFactory.getResourceClass(type));
-//            }
-//        }
-//        // todo: instead of throwing exception, build notification and rewrites
-//        // into result query
-//        catch (KustvaktException e) {
-//            jlog.error("Exception encountered: {}", e.string());
-//            throw KustvaktResponseHandler.throwit(e);
-//        }
-        
+    private KustvaktResource isCollectionIdValid (String username,
+            String collectionId) {
+
+        //        try {
+        //            if (ctx.isDemo()) {
+        //                // EM: FIX ME: Is there public VCs? set default username 
+        // for nonlogin user, change demo? 
+        //                Set set = ResourceFinder.searchPublicFiltered(
+        //                        ResourceFactory.getResourceClass(type), id);
+        //                resource = (KustvaktResource) set.toArray()[0];
+        //            }
+        //            else {
+        //                // EM: FIX ME: search in user VC
+        //                User user = controller.getUser(ctx.getUsername());
+        //                if (StringUtils.isInteger(id))
+        //                    resource = this.resourceHandler
+        //                            .findbyIntId(Integer.valueOf(id), user);
+        //                else
+        //                    resource = this.resourceHandler.findbyStrId(id, user,
+        //                            ResourceFactory.getResourceClass(type));
+        //            }
+        //        }
+        //        // todo: instead of throwing exception, build notification and rewrites
+        //        // into result query
+        //        catch (KustvaktException e) {
+        //            jlog.error("Exception encountered: {}", e.string());
+        //            throw KustvaktResponseHandler.throwit(e);
+        //        }
+
         return null;
     }
-    
+
 
     @POST
     @Path("search")
@@ -505,27 +500,25 @@
 
     @GET
     @Path("search")
-    public Response search (
-    		@Context SecurityContext securityContext,
-    		@Context HttpHeaders headers,
-    		@Context Locale locale, @QueryParam("q") String q,
-            @QueryParam("ql") String ql, @QueryParam("v") String v,
-            @QueryParam("context") String ctx,
+    public Response search (@Context SecurityContext securityContext,
+            @Context HttpHeaders headers, @Context Locale locale,
+            @QueryParam("q") String q, @QueryParam("ql") String ql,
+            @QueryParam("v") String v, @QueryParam("context") String ctx,
             @QueryParam("cutoff") Boolean cutoff,
             @QueryParam("count") Integer pageLength,
             @QueryParam("offset") Integer pageIndex,
             @QueryParam("page") Integer pageInteger,
             @QueryParam("cq") String cq, @QueryParam("engine") String engine) {
 
-    	TokenContext context = (TokenContext) securityContext
-                .getUserPrincipal();
+        TokenContext context =
+                (TokenContext) securityContext.getUserPrincipal();
         KustvaktConfiguration.BACKENDS eng = this.config.chooseBackend(engine);
         User user;
         try {
             user = controller.getUser(context.getUsername());
             controller.setAccessAndLocation(user, headers);
-//            System.out.printf("Debug: /search/: location=%s, access='%s'.\n", user.locationtoString(), user.accesstoString());
-        	}
+            //            System.out.printf("Debug: /search/: location=%s, access='%s'.\n", user.locationtoString(), user.accesstoString());
+        }
         catch (KustvaktException e) {
             jlog.error("Failed retrieving user in the search service: {}",
                     e.string());
@@ -534,8 +527,7 @@
 
         QuerySerializer serializer = new QuerySerializer();
         serializer.setQuery(q, ql, v);
-        if (cq != null)
-            serializer.setCollection(cq);
+        if (cq != null) serializer.setCollection(cq);
 
         MetaQueryBuilder meta = createMetaQuery(pageIndex, pageInteger, ctx,
                 pageLength, cutoff);
@@ -551,7 +543,7 @@
         }
 
         String result = doSearch(eng, query, pageLength, meta);
-        jlog.debug("Query result: "+result);
+        jlog.debug("Query result: " + result);
         return Response.ok(result).build();
     }
 
@@ -823,32 +815,33 @@
                 // todo: throw exception response for no resource to save!
                 return null;
 
-            KoralCollectionQueryBuilder cquery = new KoralCollectionQueryBuilder();
+            KoralCollectionQueryBuilder cquery =
+                    new KoralCollectionQueryBuilder();
             cquery.setBaseQuery(base);
 
             try {
                 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());
                     cachetmp.setStats(JsonUtils.readSimple(stats, Map.class));
                 }
-            
+
                 if (!cache) {
-                    collection = ResourceFactory.getPermanentCollection(cachetmp,
-                            name, description);
+                    collection = ResourceFactory.getPermanentCollection(
+                            cachetmp, name, description);
                     vals = collection.toMap();
-                        resourceHandler.storeResources(user, collection);
+                    resourceHandler.storeResources(user, collection);
                 }
                 else {
                     resourceHandler.cache(cachetmp);
                     vals = cachetmp.toMap();
                 }
-            
+
             }
             catch (KustvaktException e) {
                 throw KustvaktResponseHandler.throwit(e);
@@ -902,7 +895,8 @@
         if (VirtualCollection.class.equals(ctype)) {
             VirtualCollection cachetmp, collection;
 
-            KoralCollectionQueryBuilder cquery = new KoralCollectionQueryBuilder();
+            KoralCollectionQueryBuilder cquery =
+                    new KoralCollectionQueryBuilder();
             if (reference != null && !reference.equals("null")) {
                 try {
                     cquery.setBaseQuery(resourceHandler.findbyStrId(reference,
@@ -913,8 +907,7 @@
                     throw KustvaktResponseHandler.throwit(e);
                 }
             }
-            if (query != null && !query.isEmpty())
-                cquery.with(query);
+            if (query != null && !query.isEmpty()) cquery.with(query);
 
             cachetmp = ResourceFactory.getCachedCollection(cquery.toJSON());
 
@@ -992,10 +985,8 @@
 
     @GET
     @Path("/corpus/{corpusId}/{docId}/{textId}/{matchId}/matchInfo")
-    public Response getMatchInfo (
-    		@Context SecurityContext ctx,
-    		@Context HttpHeaders headers,
-            @Context Locale locale, 
+    public Response getMatchInfo (@Context SecurityContext ctx,
+            @Context HttpHeaders headers, @Context Locale locale,
             @PathParam("corpusId") String corpusId,
             @PathParam("docId") String docId,
             @PathParam("textId") String textId,
@@ -1007,9 +998,9 @@
         TokenContext tokenContext = (TokenContext) ctx.getUserPrincipal();
         spans = spans != null ? spans : false;
 
-        String matchid = searchKrill.getMatchId(corpusId, docId, textId, matchId);
-        if (layers == null || layers.isEmpty())
-            layers = new HashSet<>();
+        String matchid =
+                searchKrill.getMatchId(corpusId, docId, textId, matchId);
+        if (layers == null || layers.isEmpty()) layers = new HashSet<>();
 
         boolean match_only = foundries == null || foundries.isEmpty();
 
@@ -1017,50 +1008,51 @@
         try {
             user = controller.getUser(tokenContext.getUsername());
             controller.setAccessAndLocation(user, headers);
-            System.out.printf("Debug: /getMatchInfo/: location=%s, access='%s'.\n", user.locationtoString(), user.accesstoString());
-            }
+            System.out.printf(
+                    "Debug: /getMatchInfo/: location=%s, access='%s'.\n",
+                    user.locationtoString(), user.accesstoString());
+        }
         catch (KustvaktException e) {
             jlog.error("Failed getting user in the matchInfo service: {}",
                     e.string());
             throw KustvaktResponseHandler.throwit(e);
         }
-        
+
         CorpusAccess corpusAccess = user.getCorpusAccess();
         Pattern p;
         switch (corpusAccess) {
-		case PUB:
-			p = config.getPublicLicensePattern();
-			break;
-		case ALL:
-			p = config.getAllLicensePattern();
-			break;
-		default: // FREE
-			p = config.getFreeLicensePattern();
-			break;
-		}
-        
+            case PUB:
+                p = config.getPublicLicensePattern();
+                break;
+            case ALL:
+                p = config.getAllLicensePattern();
+                break;
+            default: // FREE
+                p = config.getFreeLicensePattern();
+                break;
+        }
+
         String results;
         try {
-            if (!match_only){
-            	
-            	ArrayList<String> foundryList = new ArrayList<String>();
+            if (!match_only) {
+
+                ArrayList<String> foundryList = new ArrayList<String>();
                 ArrayList<String> layerList = new ArrayList<String>();
-                
+
                 // EM: now without user, just list all foundries and layers
                 if (foundries.contains("*")) {
-                	foundryList = config.getFoundries();
-                	layerList = config.getLayers();
+                    foundryList = config.getFoundries();
+                    layerList = config.getLayers();
                 }
-                else{
-                	foundryList.addAll(foundries);
-                	layerList.addAll(layers);
+                else {
+                    foundryList.addAll(foundries);
+                    layerList.addAll(layers);
                 }
-                
-                results = searchKrill.getMatch(matchid,
-                        foundryList, layerList,
+
+                results = searchKrill.getMatch(matchid, foundryList, layerList,
                         spans, false, true, p);
             }
-            else{
+            else {
                 results = searchKrill.getMatch(matchid, p);
             }
         }
@@ -1069,7 +1061,7 @@
             throw KustvaktResponseHandler.throwit(StatusCodes.ILLEGAL_ARGUMENT,
                     e.getMessage(), "");
         }
-        jlog.debug("MatchInfo results: "+results);
+        jlog.debug("MatchInfo results: " + results);
         return Response.ok(results).build();
     }
 
diff --git a/full/src/main/java/de/ids_mannheim/korap/web/controller/StatisticController.java b/full/src/main/java/de/ids_mannheim/korap/web/controller/StatisticController.java
index ee30523..d9d0cd2 100644
--- a/full/src/main/java/de/ids_mannheim/korap/web/controller/StatisticController.java
+++ b/full/src/main/java/de/ids_mannheim/korap/web/controller/StatisticController.java
@@ -1,4 +1,4 @@
-package de.ids_mannheim.korap.web.service.full;
+package de.ids_mannheim.korap.web.controller;
 
 import java.util.Locale;
 
@@ -26,7 +26,7 @@
 import de.ids_mannheim.korap.web.utils.KustvaktResponseHandler;
 
 /**
- * Services related to statistics
+ * Web services related to statistics
  * 
  * @author hanl
  * @author margaretha
@@ -38,11 +38,11 @@
 @Path("statistics/")
 @ResourceFilters({ PiwikFilter.class })
 @Produces(MediaType.APPLICATION_JSON + ";charset=utf-8")
-public class StatisticService {
+public class StatisticController {
 
 
     private static Logger jlog =
-            LoggerFactory.getLogger(StatisticService.class);
+            LoggerFactory.getLogger(StatisticController.class);
 
     @Autowired
     private SearchKrill searchKrill;
diff --git a/full/src/main/java/de/ids_mannheim/korap/web/controller/UserController.java b/full/src/main/java/de/ids_mannheim/korap/web/controller/UserController.java
index f18d72f..1399c5c 100644
--- a/full/src/main/java/de/ids_mannheim/korap/web/controller/UserController.java
+++ b/full/src/main/java/de/ids_mannheim/korap/web/controller/UserController.java
@@ -1,4 +1,4 @@
-package de.ids_mannheim.korap.web.service.full;
+package de.ids_mannheim.korap.web.controller;
 
 import com.fasterxml.jackson.databind.JsonNode;
 import com.fasterxml.jackson.databind.node.ObjectNode;
@@ -35,15 +35,15 @@
 @Path("/user")
 @Produces(MediaType.APPLICATION_JSON + ";charset=utf-8")
 @ResourceFilters({ PiwikFilter.class })
-public class UserService {
+public class UserController {
 
-    private static Logger jlog = LoggerFactory.getLogger(UserService.class);
+    private static Logger jlog = LoggerFactory.getLogger(UserController.class);
     private AuthenticationManagerIface controller;
 
     private @Context UriInfo info;
 
 
-    public UserService () {
+    public UserController () {
         this.controller = BeansFactory.getKustvaktContext()
                 .getAuthenticationManager();
     }
diff --git a/full/src/main/resources/META-INF/persistence.xml b/full/src/main/resources/META-INF/persistence.xml
index ae76d18..35b8d66 100644
--- a/full/src/main/resources/META-INF/persistence.xml
+++ b/full/src/main/resources/META-INF/persistence.xml
@@ -1,5 +1,10 @@
-<persistence xmlns="http://java.sun.com/xml/ns/persistence" version="1.0">
-    <persistence-unit name="entityManagerUnit" transaction-type="RESOURCE_LOCAL">
-        <exclude-unlisted-classes/>
-    </persistence-unit>
+<persistence xmlns="http://java.sun.com/xml/ns/persistence"
+	version="1.0">
+	<persistence-unit name="entityManagerUnit"
+		transaction-type="RESOURCE_LOCAL">
+		<exclude-unlisted-classes />
+	</persistence-unit>
+	<persistence-unit-metadata>
+		<xml-mapping-metadata-complete />
+	</persistence-unit-metadata>
 </persistence>
\ No newline at end of file
diff --git a/full/src/main/resources/db/new-mysql/V1.1__create_virtual_corpus_tables.sql b/full/src/main/resources/db/new-mysql/V1.1__create_virtual_corpus_tables.sql
index a69ef64..3a0b5e8 100644
--- a/full/src/main/resources/db/new-mysql/V1.1__create_virtual_corpus_tables.sql
+++ b/full/src/main/resources/db/new-mysql/V1.1__create_virtual_corpus_tables.sql
@@ -1,3 +1,17 @@
+CREATE TABLE IF NOT EXISTS privilege (
+  id varchar(20) PRIMARY KEY NOT NULL
+);
+
+CREATE TABLE IF NOT EXISTS role (
+  id INTEGER PRIMARY KEY AUTO_INCREMENT,
+  name varchar(100) NOT NULL,
+  privilege varchar(20) NOT NULL,
+  UNIQUE INDEX unique_index (name,privilege),
+  FOREIGN KEY (privilege) 
+  	REFERENCES privilege (id)
+  	ON DELETE CASCADE
+);
+
 CREATE TABLE IF NOT EXISTS user_group (
   id INTEGER PRIMARY KEY AUTO_INCREMENT,
   name varchar(100) NOT NULL,
@@ -21,24 +35,10 @@
   	ON DELETE CASCADE
 ); 
 
-CREATE TABLE IF NOT EXISTS role (
-  id INTEGER PRIMARY KEY AUTO_INCREMENT,
-  name varchar(100) NOT NULL,
-  privilege varchar(20) NOT NULL,
-  UNIQUE INDEX unique_index (name,privilege),
-  FOREIGN KEY (privilege) 
-  	REFERENCES privilege (id)
-  	ON DELETE CASCADE
-);
-
-CREATE TABLE IF NOT EXISTS privilege (
-  id varchar(20) PRIMARY KEY NOT NULL
-);
-
 CREATE TABLE IF NOT EXISTS group_member_role (
   id INTEGER PRIMARY KEY AUTO_INCREMENT,
   group_member_id int(11) NOT NULL,
-  role_id varchar(100) NOT NULL,
+  role_id int NOT NULL,
   UNIQUE INDEX unique_index (group_member_id,role_id),
   FOREIGN KEY (group_member_id)
   	REFERENCES user_group_member (id)
