http://git-wip-us.apache.org/repos/asf/syncope/blob/b738d3e9/common/rest-api/src/main/java/org/apache/syncope/common/rest/api/service/RoleService.java
----------------------------------------------------------------------
diff --git 
a/common/rest-api/src/main/java/org/apache/syncope/common/rest/api/service/RoleService.java
 
b/common/rest-api/src/main/java/org/apache/syncope/common/rest/api/service/RoleService.java
index 45628c7..8a9082b 100644
--- 
a/common/rest-api/src/main/java/org/apache/syncope/common/rest/api/service/RoleService.java
+++ 
b/common/rest-api/src/main/java/org/apache/syncope/common/rest/api/service/RoleService.java
@@ -56,7 +56,7 @@ public interface RoleService extends JAXRSService {
     @GET
     @Path("{key}")
     @Produces({ MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON })
-    RoleTO read(@NotNull @PathParam("key") Long key);
+    RoleTO read(@NotNull @PathParam("key") String key);
 
     /**
      * Creates a new role.
@@ -85,5 +85,5 @@ public interface RoleService extends JAXRSService {
      */
     @DELETE
     @Path("{key}")
-    void delete(@NotNull @PathParam("key") Long key);
+    void delete(@NotNull @PathParam("key") String key);
 }

http://git-wip-us.apache.org/repos/asf/syncope/blob/b738d3e9/common/rest-api/src/main/java/org/apache/syncope/common/rest/api/service/SchemaService.java
----------------------------------------------------------------------
diff --git 
a/common/rest-api/src/main/java/org/apache/syncope/common/rest/api/service/SchemaService.java
 
b/common/rest-api/src/main/java/org/apache/syncope/common/rest/api/service/SchemaService.java
index e6ec502..9049f92 100644
--- 
a/common/rest-api/src/main/java/org/apache/syncope/common/rest/api/service/SchemaService.java
+++ 
b/common/rest-api/src/main/java/org/apache/syncope/common/rest/api/service/SchemaService.java
@@ -20,6 +20,7 @@ package org.apache.syncope.common.rest.api.service;
 
 import java.util.List;
 import javax.validation.constraints.NotNull;
+import javax.ws.rs.BeanParam;
 import javax.ws.rs.Consumes;
 import javax.ws.rs.DELETE;
 import javax.ws.rs.GET;
@@ -28,11 +29,11 @@ import javax.ws.rs.PUT;
 import javax.ws.rs.Path;
 import javax.ws.rs.PathParam;
 import javax.ws.rs.Produces;
-import javax.ws.rs.QueryParam;
 import javax.ws.rs.core.MediaType;
 import javax.ws.rs.core.Response;
 import org.apache.syncope.common.lib.to.AbstractSchemaTO;
 import org.apache.syncope.common.lib.types.SchemaType;
+import org.apache.syncope.common.rest.api.beans.SchemaQuery;
 
 /**
  * REST operations for attribute schemas.
@@ -55,17 +56,18 @@ public interface SchemaService extends JAXRSService {
             @NotNull @PathParam("type") SchemaType type, @NotNull 
@PathParam("key") String key);
 
     /**
-     * Returns a list of schemas with matching type, for the given 
anyTypeClass if provided.
+     * Returns a list of schemas matching type and the given query.
      *
      * @param <T> actual SchemaTO
      * @param type type for schemas to be listed
-     * @param anyTypeClass any type class name
+     * @param query query conditions
      * @return list of schemas with matching type, for the given anyTypeClass 
if provided
      */
     @GET
     @Produces({ MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON })
-    <T extends AbstractSchemaTO> List<T> list(@NotNull @PathParam("type") 
SchemaType type, 
-            @QueryParam("anyType") String anyTypeClass);
+    <T extends AbstractSchemaTO> List<T> list(
+            @NotNull @PathParam("type") SchemaType type,
+            @BeanParam SchemaQuery query);
 
     /**
      * Creates a new schema.

http://git-wip-us.apache.org/repos/asf/syncope/blob/b738d3e9/core/logic/src/main/java/org/apache/syncope/core/logic/AnyTypeClassLogic.java
----------------------------------------------------------------------
diff --git 
a/core/logic/src/main/java/org/apache/syncope/core/logic/AnyTypeClassLogic.java 
b/core/logic/src/main/java/org/apache/syncope/core/logic/AnyTypeClassLogic.java
index 6d090dd..daaaf56 100644
--- 
a/core/logic/src/main/java/org/apache/syncope/core/logic/AnyTypeClassLogic.java
+++ 
b/core/logic/src/main/java/org/apache/syncope/core/logic/AnyTypeClassLogic.java
@@ -50,7 +50,7 @@ public class AnyTypeClassLogic extends 
AbstractTransactionalLogic<AnyTypeClassTO
         if (anyType == null) {
             LOG.error("Could not find anyType '" + key + "'");
 
-            throw new NotFoundException(String.valueOf(key));
+            throw new NotFoundException(key);
         }
 
         return binder.getAnyTypeClassTO(anyType);
@@ -77,7 +77,7 @@ public class AnyTypeClassLogic extends 
AbstractTransactionalLogic<AnyTypeClassTO
         AnyTypeClass anyType = anyTypeClassDAO.find(anyTypeClassTO.getKey());
         if (anyType == null) {
             LOG.error("Could not find anyTypeClass '" + 
anyTypeClassTO.getKey() + "'");
-            throw new 
NotFoundException(String.valueOf(anyTypeClassTO.getKey()));
+            throw new NotFoundException(anyTypeClassTO.getKey());
         }
 
         binder.update(anyType, anyTypeClassTO);
@@ -92,7 +92,7 @@ public class AnyTypeClassLogic extends 
AbstractTransactionalLogic<AnyTypeClassTO
         if (anyTypeClass == null) {
             LOG.error("Could not find anyTypeClass '" + key + "'");
 
-            throw new NotFoundException(String.valueOf(key));
+            throw new NotFoundException(key);
         }
 
         AnyTypeClassTO deleted = binder.getAnyTypeClassTO(anyTypeClass);

http://git-wip-us.apache.org/repos/asf/syncope/blob/b738d3e9/core/logic/src/main/java/org/apache/syncope/core/logic/AnyTypeLogic.java
----------------------------------------------------------------------
diff --git 
a/core/logic/src/main/java/org/apache/syncope/core/logic/AnyTypeLogic.java 
b/core/logic/src/main/java/org/apache/syncope/core/logic/AnyTypeLogic.java
index 6e76e60..3116ae8 100644
--- a/core/logic/src/main/java/org/apache/syncope/core/logic/AnyTypeLogic.java
+++ b/core/logic/src/main/java/org/apache/syncope/core/logic/AnyTypeLogic.java
@@ -53,7 +53,7 @@ public class AnyTypeLogic extends 
AbstractTransactionalLogic<AnyTypeTO> {
         if (anyType == null) {
             LOG.error("Could not find anyType '" + key + "'");
 
-            throw new NotFoundException(String.valueOf(key));
+            throw new NotFoundException(key);
         }
 
         return binder.getAnyTypeTO(anyType);
@@ -82,7 +82,7 @@ public class AnyTypeLogic extends 
AbstractTransactionalLogic<AnyTypeTO> {
         AnyType anyType = anyTypeDAO.find(anyTypeTO.getKey());
         if (anyType == null) {
             LOG.error("Could not find anyType '" + anyTypeTO.getKey() + "'");
-            throw new NotFoundException(String.valueOf(anyTypeTO.getKey()));
+            throw new NotFoundException(anyTypeTO.getKey());
         }
 
         EntitlementsHolder.getInstance().removeFor(anyTypeTO.getKey());
@@ -101,7 +101,7 @@ public class AnyTypeLogic extends 
AbstractTransactionalLogic<AnyTypeTO> {
         if (anyType == null) {
             LOG.error("Could not find anyType '" + key + "'");
 
-            throw new NotFoundException(String.valueOf(key));
+            throw new NotFoundException(key);
         }
 
         AnyTypeTO deleted = binder.getAnyTypeTO(anyType);

http://git-wip-us.apache.org/repos/asf/syncope/blob/b738d3e9/core/logic/src/main/java/org/apache/syncope/core/logic/DomainLogic.java
----------------------------------------------------------------------
diff --git 
a/core/logic/src/main/java/org/apache/syncope/core/logic/DomainLogic.java 
b/core/logic/src/main/java/org/apache/syncope/core/logic/DomainLogic.java
index a1dbfab..cfefdd0 100644
--- a/core/logic/src/main/java/org/apache/syncope/core/logic/DomainLogic.java
+++ b/core/logic/src/main/java/org/apache/syncope/core/logic/DomainLogic.java
@@ -55,7 +55,7 @@ public class DomainLogic extends 
AbstractTransactionalLogic<DomainTO> {
         if (domain == null) {
             LOG.error("Could not find domain '" + key + "'");
 
-            throw new NotFoundException(String.valueOf(key));
+            throw new NotFoundException(key);
         }
 
         return binder.getDomainTO(domain);
@@ -88,7 +88,7 @@ public class DomainLogic extends 
AbstractTransactionalLogic<DomainTO> {
         Domain domain = domainDAO.find(domainTO.getKey());
         if (domain == null) {
             LOG.error("Could not find domain '" + domainTO.getKey() + "'");
-            throw new NotFoundException(String.valueOf(domainTO.getKey()));
+            throw new NotFoundException(domainTO.getKey());
         }
 
         binder.update(domain, domainTO);
@@ -104,7 +104,7 @@ public class DomainLogic extends 
AbstractTransactionalLogic<DomainTO> {
         if (domain == null) {
             LOG.error("Could not find domain '" + key + "'");
 
-            throw new NotFoundException(String.valueOf(key));
+            throw new NotFoundException(key);
         }
 
         DomainTO deleted = binder.getDomainTO(domain);

http://git-wip-us.apache.org/repos/asf/syncope/blob/b738d3e9/core/logic/src/main/java/org/apache/syncope/core/logic/NotificationLogic.java
----------------------------------------------------------------------
diff --git 
a/core/logic/src/main/java/org/apache/syncope/core/logic/NotificationLogic.java 
b/core/logic/src/main/java/org/apache/syncope/core/logic/NotificationLogic.java
index fc4c8ac..da2c13e 100644
--- 
a/core/logic/src/main/java/org/apache/syncope/core/logic/NotificationLogic.java
+++ 
b/core/logic/src/main/java/org/apache/syncope/core/logic/NotificationLogic.java
@@ -44,12 +44,12 @@ public class NotificationLogic extends 
AbstractTransactionalLogic<NotificationTO
     private NotificationDataBinder binder;
 
     @PreAuthorize("hasRole('" + StandardEntitlement.NOTIFICATION_READ + "')")
-    public NotificationTO read(final Long notificationKey) {
-        Notification notification = notificationDAO.find(notificationKey);
+    public NotificationTO read(final Long key) {
+        Notification notification = notificationDAO.find(key);
         if (notification == null) {
-            LOG.error("Could not find notification '" + notificationKey + "'");
+            LOG.error("Could not find notification '" + key + "'");
 
-            throw new NotFoundException(String.valueOf(notificationKey));
+            throw new NotFoundException(String.valueOf(key));
         }
 
         return binder.getNotificationTO(notification);
@@ -86,16 +86,16 @@ public class NotificationLogic extends 
AbstractTransactionalLogic<NotificationTO
     }
 
     @PreAuthorize("hasRole('" + StandardEntitlement.NOTIFICATION_DELETE + "')")
-    public NotificationTO delete(final Long notificationKey) {
-        Notification notification = notificationDAO.find(notificationKey);
+    public NotificationTO delete(final Long key) {
+        Notification notification = notificationDAO.find(key);
         if (notification == null) {
-            LOG.error("Could not find notification '" + notificationKey + "'");
+            LOG.error("Could not find notification '" + key + "'");
 
-            throw new NotFoundException(String.valueOf(notificationKey));
+            throw new NotFoundException(String.valueOf(key));
         }
 
         NotificationTO deleted = binder.getNotificationTO(notification);
-        notificationDAO.delete(notificationKey);
+        notificationDAO.delete(key);
         return deleted;
     }
 

http://git-wip-us.apache.org/repos/asf/syncope/blob/b738d3e9/core/logic/src/main/java/org/apache/syncope/core/logic/RelationshipTypeLogic.java
----------------------------------------------------------------------
diff --git 
a/core/logic/src/main/java/org/apache/syncope/core/logic/RelationshipTypeLogic.java
 
b/core/logic/src/main/java/org/apache/syncope/core/logic/RelationshipTypeLogic.java
index 3c6bfa6..6d96e8b 100644
--- 
a/core/logic/src/main/java/org/apache/syncope/core/logic/RelationshipTypeLogic.java
+++ 
b/core/logic/src/main/java/org/apache/syncope/core/logic/RelationshipTypeLogic.java
@@ -50,7 +50,7 @@ public class RelationshipTypeLogic extends 
AbstractTransactionalLogic<Relationsh
         if (relationshipType == null) {
             LOG.error("Could not find relationshipType '" + key + "'");
 
-            throw new NotFoundException(String.valueOf(key));
+            throw new NotFoundException(key);
         }
 
         return binder.getRelationshipTypeTO(relationshipType);
@@ -78,7 +78,7 @@ public class RelationshipTypeLogic extends 
AbstractTransactionalLogic<Relationsh
         RelationshipType relationshipType = 
relationshipTypeDAO.find(relationshipTypeTO.getKey());
         if (relationshipType == null) {
             LOG.error("Could not find relationshipType '" + 
relationshipTypeTO.getKey() + "'");
-            throw new 
NotFoundException(String.valueOf(relationshipTypeTO.getKey()));
+            throw new NotFoundException(relationshipTypeTO.getKey());
         }
 
         binder.update(relationshipType, relationshipTypeTO);
@@ -93,7 +93,7 @@ public class RelationshipTypeLogic extends 
AbstractTransactionalLogic<Relationsh
         if (relationshipType == null) {
             LOG.error("Could not find relationshipType '" + key + "'");
 
-            throw new NotFoundException(String.valueOf(key));
+            throw new NotFoundException(key);
         }
 
         RelationshipTypeTO deleted = 
binder.getRelationshipTypeTO(relationshipType);

http://git-wip-us.apache.org/repos/asf/syncope/blob/b738d3e9/core/logic/src/main/java/org/apache/syncope/core/logic/RoleLogic.java
----------------------------------------------------------------------
diff --git 
a/core/logic/src/main/java/org/apache/syncope/core/logic/RoleLogic.java 
b/core/logic/src/main/java/org/apache/syncope/core/logic/RoleLogic.java
index 60f65a0..92cb880 100644
--- a/core/logic/src/main/java/org/apache/syncope/core/logic/RoleLogic.java
+++ b/core/logic/src/main/java/org/apache/syncope/core/logic/RoleLogic.java
@@ -44,12 +44,12 @@ public class RoleLogic extends 
AbstractTransactionalLogic<RoleTO> {
     private RoleDAO roleDAO;
 
     @PreAuthorize("hasRole('" + StandardEntitlement.ROLE_READ + "')")
-    public RoleTO read(final Long roleKey) {
-        Role role = roleDAO.find(roleKey);
+    public RoleTO read(final String key) {
+        Role role = roleDAO.find(key);
         if (role == null) {
-            LOG.error("Could not find role '" + roleKey + "'");
+            LOG.error("Could not find role '" + key + "'");
 
-            throw new NotFoundException(String.valueOf(roleKey));
+            throw new NotFoundException(key);
         }
 
         return binder.getRoleTO(role);
@@ -76,7 +76,7 @@ public class RoleLogic extends 
AbstractTransactionalLogic<RoleTO> {
         Role role = roleDAO.find(roleTO.getKey());
         if (role == null) {
             LOG.error("Could not find role '" + roleTO.getKey() + "'");
-            throw new NotFoundException(String.valueOf(roleTO.getKey()));
+            throw new NotFoundException(roleTO.getKey());
         }
 
         binder.update(role, roleTO);
@@ -86,16 +86,16 @@ public class RoleLogic extends 
AbstractTransactionalLogic<RoleTO> {
     }
 
     @PreAuthorize("hasRole('" + StandardEntitlement.ROLE_DELETE + "')")
-    public RoleTO delete(final Long roleKey) {
-        Role role = roleDAO.find(roleKey);
+    public RoleTO delete(final String key) {
+        Role role = roleDAO.find(key);
         if (role == null) {
-            LOG.error("Could not find role '" + roleKey + "'");
+            LOG.error("Could not find role '" + key + "'");
 
-            throw new NotFoundException(String.valueOf(roleKey));
+            throw new NotFoundException(key);
         }
 
         RoleTO deleted = binder.getRoleTO(role);
-        roleDAO.delete(roleKey);
+        roleDAO.delete(key);
         return deleted;
     }
 
@@ -103,12 +103,12 @@ public class RoleLogic extends 
AbstractTransactionalLogic<RoleTO> {
     protected RoleTO resolveReference(final Method method, final Object... 
args)
             throws UnresolvedReferenceException {
 
-        Long key = null;
+        String key = null;
 
         if (ArrayUtils.isNotEmpty(args)) {
             for (int i = 0; key == null && i < args.length; i++) {
-                if (args[i] instanceof Long) {
-                    key = (Long) args[i];
+                if (args[i] instanceof String) {
+                    key = (String) args[i];
                 } else if (args[i] instanceof RoleTO) {
                     key = ((RoleTO) args[i]).getKey();
                 }

http://git-wip-us.apache.org/repos/asf/syncope/blob/b738d3e9/core/logic/src/main/java/org/apache/syncope/core/logic/SchemaLogic.java
----------------------------------------------------------------------
diff --git 
a/core/logic/src/main/java/org/apache/syncope/core/logic/SchemaLogic.java 
b/core/logic/src/main/java/org/apache/syncope/core/logic/SchemaLogic.java
index a57f2e1..1e94c96 100644
--- a/core/logic/src/main/java/org/apache/syncope/core/logic/SchemaLogic.java
+++ b/core/logic/src/main/java/org/apache/syncope/core/logic/SchemaLogic.java
@@ -145,13 +145,26 @@ public class SchemaLogic extends 
AbstractTransactionalLogic<AbstractSchemaTO> {
 
     @PreAuthorize("isAuthenticated()")
     @SuppressWarnings("unchecked")
-    public <T extends AbstractSchemaTO> List<T> list(final SchemaType 
schemaType, final String anyTypeClass) {
-        AnyTypeClass clazz = anyTypeClass == null ? null : 
anyTypeClassDAO.find(anyTypeClass);
+    public <T extends AbstractSchemaTO> List<T> list(
+            final SchemaType schemaType, final List<String> anyTypeClasses) {
+
+        List<AnyTypeClass> classes = new ArrayList<>(anyTypeClasses == null ? 
0 : anyTypeClasses.size());
+        if (anyTypeClasses != null) {
+            for (String anyTypeClass : anyTypeClasses) {
+                AnyTypeClass clazz = anyTypeClassDAO.find(anyTypeClass);
+                if (clazz == null) {
+                    LOG.warn("Ignoring invalid {}: {}", 
AnyTypeClass.class.getSimpleName(), anyTypeClass);
+                } else {
+                    classes.add(clazz);
+                }
+            }
+        }
+
         List<T> result;
         switch (schemaType) {
             case VIRTUAL:
                 result = CollectionUtils.collect(
-                        clazz == null ? virSchemaDAO.findAll() : 
virSchemaDAO.findByAnyTypeClass(clazz),
+                        classes.isEmpty() ? virSchemaDAO.findAll() : 
virSchemaDAO.findByAnyTypeClasses(classes),
                         new Transformer<VirSchema, T>() {
 
                     @Override
@@ -163,7 +176,7 @@ public class SchemaLogic extends 
AbstractTransactionalLogic<AbstractSchemaTO> {
 
             case DERIVED:
                 result = CollectionUtils.collect(
-                        clazz == null ? derSchemaDAO.findAll() : 
derSchemaDAO.findByAnyTypeClass(clazz),
+                        classes.isEmpty() ? derSchemaDAO.findAll() : 
derSchemaDAO.findByAnyTypeClasses(classes),
                         new Transformer<DerSchema, T>() {
 
                     @Override
@@ -176,7 +189,7 @@ public class SchemaLogic extends 
AbstractTransactionalLogic<AbstractSchemaTO> {
             case PLAIN:
             default:
                 result = CollectionUtils.collect(
-                        clazz == null ? plainSchemaDAO.findAll() : 
plainSchemaDAO.findByAnyTypeClass(clazz),
+                        classes.isEmpty() ? plainSchemaDAO.findAll() : 
plainSchemaDAO.findByAnyTypeClasses(classes),
                         new Transformer<PlainSchema, T>() {
 
                     @Override

http://git-wip-us.apache.org/repos/asf/syncope/blob/b738d3e9/core/misc/src/main/java/org/apache/syncope/core/misc/search/SearchCondVisitor.java
----------------------------------------------------------------------
diff --git 
a/core/misc/src/main/java/org/apache/syncope/core/misc/search/SearchCondVisitor.java
 
b/core/misc/src/main/java/org/apache/syncope/core/misc/search/SearchCondVisitor.java
index c7efa8a..6b067ca 100644
--- 
a/core/misc/src/main/java/org/apache/syncope/core/misc/search/SearchCondVisitor.java
+++ 
b/core/misc/src/main/java/org/apache/syncope/core/misc/search/SearchCondVisitor.java
@@ -113,7 +113,7 @@ public class SearchCondVisitor extends 
AbstractSearchConditionVisitor<SearchBean
 
                         case ROLES:
                             RoleCond roleCond = new RoleCond();
-                            roleCond.setRoleKey(Long.valueOf(value));
+                            roleCond.setRoleKey(value);
                             leaf = SearchCond.getLeafCond(roleCond);
                             break;
 

http://git-wip-us.apache.org/repos/asf/syncope/blob/b738d3e9/core/misc/src/main/java/org/apache/syncope/core/misc/security/AuthDataAccessor.java
----------------------------------------------------------------------
diff --git 
a/core/misc/src/main/java/org/apache/syncope/core/misc/security/AuthDataAccessor.java
 
b/core/misc/src/main/java/org/apache/syncope/core/misc/security/AuthDataAccessor.java
index 1332404..afca81a 100644
--- 
a/core/misc/src/main/java/org/apache/syncope/core/misc/security/AuthDataAccessor.java
+++ 
b/core/misc/src/main/java/org/apache/syncope/core/misc/security/AuthDataAccessor.java
@@ -18,12 +18,12 @@
  */
 package org.apache.syncope.core.misc.security;
 
-import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Date;
+import java.util.HashMap;
 import java.util.HashSet;
 import java.util.Iterator;
-import java.util.List;
+import java.util.Map;
 import java.util.Set;
 import javax.annotation.Resource;
 import org.apache.commons.collections4.Closure;
@@ -260,6 +260,8 @@ public class AuthDataAccessor {
             if (user.isMustChangePassword()) {
                 authorities.add(new 
SyncopeGrantedAuthority(StandardEntitlement.MUST_CHANGE_PASSWORD));
             } else {
+                final Map<String, Set<String>> entForRealms = new HashMap<>();
+
                 // Give entitlements as assigned by roles (with realms, where 
applicable) - assigned either
                 // statically and dynamically
                 for (final Role role : userDAO.findAllRoles(user)) {
@@ -267,18 +269,19 @@ public class AuthDataAccessor {
 
                         @Override
                         public void execute(final String entitlement) {
-                            SyncopeGrantedAuthority authority = new 
SyncopeGrantedAuthority(entitlement);
-                            authorities.add(authority);
+                            Set<String> realms = entForRealms.get(entitlement);
+                            if (realms == null) {
+                                realms = new HashSet<>();
+                                entForRealms.put(entitlement, realms);
+                            }
 
-                            List<String> realmFullPahs = new ArrayList<>();
                             CollectionUtils.collect(role.getRealms(), new 
Transformer<Realm, String>() {
 
                                 @Override
                                 public String transform(final Realm realm) {
                                     return realm.getFullPath();
                                 }
-                            }, realmFullPahs);
-                            authority.addRealms(realmFullPahs);
+                            }, realms);
                         }
                     });
                 }
@@ -290,12 +293,22 @@ public class AuthDataAccessor {
                             StandardEntitlement.GROUP_UPDATE,
                             StandardEntitlement.GROUP_DELETE)) {
 
-                        SyncopeGrantedAuthority authority = new 
SyncopeGrantedAuthority(entitlement);
-                        authority.addRealm(
-                                
RealmUtils.getGroupOwnerRealm(group.getRealm().getFullPath(), group.getKey()));
-                        authorities.add(authority);
+                        Set<String> realms = entForRealms.get(entitlement);
+                        if (realms == null) {
+                            realms = new HashSet<>();
+                            entForRealms.put(entitlement, realms);
+                        }
+
+                        
realms.add(RealmUtils.getGroupOwnerRealm(group.getRealm().getFullPath(), 
group.getKey()));
                     }
                 }
+
+                // Finally normalize realms for each given entitlement and 
generate authorities
+                for (Map.Entry<String, Set<String>> entry : 
entForRealms.entrySet()) {
+                    SyncopeGrantedAuthority authority = new 
SyncopeGrantedAuthority(entry.getKey());
+                    
authority.addRealms(RealmUtils.normalize(entry.getValue()));
+                    authorities.add(authority);
+                }
             }
         }
 

http://git-wip-us.apache.org/repos/asf/syncope/blob/b738d3e9/core/misc/src/main/java/org/apache/syncope/core/misc/security/SyncopeGrantedAuthority.java
----------------------------------------------------------------------
diff --git 
a/core/misc/src/main/java/org/apache/syncope/core/misc/security/SyncopeGrantedAuthority.java
 
b/core/misc/src/main/java/org/apache/syncope/core/misc/security/SyncopeGrantedAuthority.java
index 198b1e8..1cdae17 100644
--- 
a/core/misc/src/main/java/org/apache/syncope/core/misc/security/SyncopeGrantedAuthority.java
+++ 
b/core/misc/src/main/java/org/apache/syncope/core/misc/security/SyncopeGrantedAuthority.java
@@ -18,9 +18,9 @@
  */
 package org.apache.syncope.core.misc.security;
 
+import java.util.Collection;
 import java.util.Collections;
 import java.util.HashSet;
-import java.util.List;
 import java.util.Set;
 import org.apache.commons.collections4.Closure;
 import org.apache.commons.collections4.CollectionUtils;
@@ -53,7 +53,7 @@ public class SyncopeGrantedAuthority implements 
GrantedAuthority {
         return RealmUtils.normalizingAddTo(realms, newRealm);
     }
 
-    public void addRealms(final List<String> newRealms) {
+    public void addRealms(final Collection<String> newRealms) {
         CollectionUtils.forAllDo(newRealms, new Closure<String>() {
 
             @Override

http://git-wip-us.apache.org/repos/asf/syncope/blob/b738d3e9/core/misc/src/test/java/org/apache/syncope/core/misc/search/SearchCondConverterTest.java
----------------------------------------------------------------------
diff --git 
a/core/misc/src/test/java/org/apache/syncope/core/misc/search/SearchCondConverterTest.java
 
b/core/misc/src/test/java/org/apache/syncope/core/misc/search/SearchCondConverterTest.java
index caa9c54..29f3c64 100644
--- 
a/core/misc/src/test/java/org/apache/syncope/core/misc/search/SearchCondConverterTest.java
+++ 
b/core/misc/src/test/java/org/apache/syncope/core/misc/search/SearchCondConverterTest.java
@@ -98,11 +98,11 @@ public class SearchCondConverterTest {
 
     @Test
     public void roles() {
-        String fiqlExpression = new 
UserFiqlSearchConditionBuilder().inRoles(1L).query();
-        assertEquals(SpecialAttr.ROLES + "==1", fiqlExpression);
+        String fiqlExpression = new 
UserFiqlSearchConditionBuilder().inRoles("User reviewer").query();
+        assertEquals(SpecialAttr.ROLES + "==User reviewer", fiqlExpression);
 
         RoleCond roleCond = new RoleCond();
-        roleCond.setRoleKey(1L);
+        roleCond.setRoleKey("User reviewer");
         SearchCond simpleCond = SearchCond.getLeafCond(roleCond);
 
         assertEquals(simpleCond, SearchCondConverter.convert(fiqlExpression));

http://git-wip-us.apache.org/repos/asf/syncope/blob/b738d3e9/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/dao/RoleDAO.java
----------------------------------------------------------------------
diff --git 
a/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/dao/RoleDAO.java
 
b/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/dao/RoleDAO.java
index d1a3101..d838df7 100644
--- 
a/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/dao/RoleDAO.java
+++ 
b/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/dao/RoleDAO.java
@@ -23,11 +23,9 @@ import org.apache.syncope.core.persistence.api.entity.Realm;
 import org.apache.syncope.core.persistence.api.entity.Role;
 import org.apache.syncope.core.persistence.api.entity.user.User;
 
-public interface RoleDAO extends DAO<Role, Long> {
+public interface RoleDAO extends DAO<Role, String> {
 
-    Role find(Long key);
-
-    Role find(String name);
+    Role find(String key);
 
     List<Role> findByRealm(Realm realm);
 
@@ -37,7 +35,7 @@ public interface RoleDAO extends DAO<Role, Long> {
 
     void delete(Role role);
 
-    void delete(Long key);
+    void delete(String key);
 
     void refreshDynMemberships(User user);
 }

http://git-wip-us.apache.org/repos/asf/syncope/blob/b738d3e9/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/dao/SchemaDAO.java
----------------------------------------------------------------------
diff --git 
a/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/dao/SchemaDAO.java
 
b/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/dao/SchemaDAO.java
index 9e350fb..64a78fb 100644
--- 
a/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/dao/SchemaDAO.java
+++ 
b/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/dao/SchemaDAO.java
@@ -18,6 +18,7 @@
  */
 package org.apache.syncope.core.persistence.api.dao;
 
+import java.util.Collection;
 import java.util.List;
 import org.apache.syncope.core.persistence.api.entity.AnyTypeClass;
 import org.apache.syncope.core.persistence.api.entity.Schema;
@@ -26,7 +27,7 @@ public interface SchemaDAO<S extends Schema> extends DAO<S, 
String> {
 
     S find(String name);
 
-    List<S> findByAnyTypeClass(AnyTypeClass anyTypeClass);
+    List<S> findByAnyTypeClasses(Collection<AnyTypeClass> anyTypeClasses);
 
     List<S> findAll();
 

http://git-wip-us.apache.org/repos/asf/syncope/blob/b738d3e9/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/dao/search/RoleCond.java
----------------------------------------------------------------------
diff --git 
a/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/dao/search/RoleCond.java
 
b/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/dao/search/RoleCond.java
index be6688f..0ee7648 100644
--- 
a/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/dao/search/RoleCond.java
+++ 
b/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/dao/search/RoleCond.java
@@ -22,13 +22,13 @@ public class RoleCond extends AbstractSearchCond {
 
     private static final long serialVersionUID = 3581958527829522490L;
 
-    private Long roleKey;
+    private String roleKey;
 
-    public Long getRoleKey() {
+    public String getRoleKey() {
         return roleKey;
     }
 
-    public void setRoleKey(final Long roleKey) {
+    public void setRoleKey(final String roleKey) {
         this.roleKey = roleKey;
     }
 

http://git-wip-us.apache.org/repos/asf/syncope/blob/b738d3e9/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/entity/Role.java
----------------------------------------------------------------------
diff --git 
a/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/entity/Role.java
 
b/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/entity/Role.java
index dba65ae..c26c15b 100644
--- 
a/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/entity/Role.java
+++ 
b/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/entity/Role.java
@@ -22,11 +22,9 @@ import 
org.apache.syncope.core.persistence.api.entity.user.DynRoleMembership;
 import java.util.List;
 import java.util.Set;
 
-public interface Role extends Entity<Long> {
+public interface Role extends Entity<String> {
 
-    String getName();
-
-    void setName(String name);
+    void setKey(String name);
 
     Set<String> getEntitlements();
 

http://git-wip-us.apache.org/repos/asf/syncope/blob/b738d3e9/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAAnySearchDAO.java
----------------------------------------------------------------------
diff --git 
a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAAnySearchDAO.java
 
b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAAnySearchDAO.java
index 7b1df89..f5c3922 100644
--- 
a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAAnySearchDAO.java
+++ 
b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAAnySearchDAO.java
@@ -399,10 +399,8 @@ public class JPAAnySearchDAO extends AbstractDAO<Any<?>, 
Long> implements AnySea
             if (any == null) {
                 LOG.error("Could not find {} with id {}, even though returned 
by the native query",
                         typeKind, actualKey);
-            } else {
-                if (!result.contains(any)) {
-                    result.add(any);
-                }
+            } else if (!result.contains(any)) {
+                result.add(any);
             }
         }
 
@@ -554,7 +552,7 @@ public class JPAAnySearchDAO extends AbstractDAO<Any<?>, 
Long> implements AnySea
 
         query.append("SELECT DISTINCT any_id ").append("FROM ").
                 append(svs.role().name).append(" WHERE ").
-                append("role_id=?").append(setParameter(parameters, 
cond.getRoleKey())).
+                append("role_name=?").append(setParameter(parameters, 
cond.getRoleKey())).
                 append(')');
 
         if (not) {
@@ -565,7 +563,7 @@ public class JPAAnySearchDAO extends AbstractDAO<Any<?>, 
Long> implements AnySea
 
         query.append("SELECT DISTINCT any_id ").append("FROM ").
                 append(svs.dynrolemembership().name).append(" WHERE ").
-                append("role_id=?").append(setParameter(parameters, 
cond.getRoleKey())).
+                append("role_name=?").append(setParameter(parameters, 
cond.getRoleKey())).
                 append(')');
 
         return query.toString();
@@ -721,20 +719,18 @@ public class JPAAnySearchDAO extends AbstractDAO<Any<?>, 
Long> implements AnySea
                     append(" WHERE any_id NOT IN (SELECT any_id FROM ").
                     append(svs.nullAttr().name).
                     append(" WHERE 
schema_name='").append(schema.getKey()).append("')");
+        } else if (cond.getType() == AttributeCond.Type.ISNULL) {
+            query.append(svs.nullAttr().name).
+                    append(" WHERE 
schema_name='").append(schema.getKey()).append("'");
         } else {
-            if (cond.getType() == AttributeCond.Type.ISNULL) {
-                query.append(svs.nullAttr().name).
-                        append(" WHERE 
schema_name='").append(schema.getKey()).append("'");
+            if (schema.isUniqueConstraint()) {
+                query.append(svs.uniqueAttr().name);
             } else {
-                if (schema.isUniqueConstraint()) {
-                    query.append(svs.uniqueAttr().name);
-                } else {
-                    query.append(svs.attr().name);
-                }
-                query.append(" WHERE schema_name='").append(schema.getKey());
-
-                fillAttributeQuery(query, attrValue, schema, cond, not, 
parameters, svs);
+                query.append(svs.attr().name);
             }
+            query.append(" WHERE schema_name='").append(schema.getKey());
+
+            fillAttributeQuery(query, attrValue, schema, cond, not, 
parameters, svs);
         }
 
         return query.toString();

http://git-wip-us.apache.org/repos/asf/syncope/blob/b738d3e9/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAAnyTypeClassDAO.java
----------------------------------------------------------------------
diff --git 
a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAAnyTypeClassDAO.java
 
b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAAnyTypeClassDAO.java
index 9a01442..a999e14 100644
--- 
a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAAnyTypeClassDAO.java
+++ 
b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAAnyTypeClassDAO.java
@@ -18,6 +18,7 @@
  */
 package org.apache.syncope.core.persistence.jpa.dao;
 
+import java.util.Collections;
 import java.util.List;
 import javax.persistence.TypedQuery;
 import org.apache.syncope.core.persistence.api.dao.AnyTypeClassDAO;
@@ -85,13 +86,13 @@ public class JPAAnyTypeClassDAO extends 
AbstractDAO<AnyTypeClass, String> implem
             return;
         }
 
-        for (PlainSchema schema : 
plainSchemaDAO.findByAnyTypeClass(anyTypeClass)) {
+        for (PlainSchema schema : 
plainSchemaDAO.findByAnyTypeClasses(Collections.singletonList(anyTypeClass))) {
             schema.setAnyTypeClass(null);
         }
-        for (DerSchema schema : derSchemaDAO.findByAnyTypeClass(anyTypeClass)) 
{
+        for (DerSchema schema : 
derSchemaDAO.findByAnyTypeClasses(Collections.singletonList(anyTypeClass))) {
             schema.setAnyTypeClass(null);
         }
-        for (VirSchema schema : virSchemaDAO.findByAnyTypeClass(anyTypeClass)) 
{
+        for (VirSchema schema : 
virSchemaDAO.findByAnyTypeClasses(Collections.singletonList(anyTypeClass))) {
             schema.setAnyTypeClass(null);
         }
 

http://git-wip-us.apache.org/repos/asf/syncope/blob/b738d3e9/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPADerSchemaDAO.java
----------------------------------------------------------------------
diff --git 
a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPADerSchemaDAO.java
 
b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPADerSchemaDAO.java
index 8221493..5b342b2 100644
--- 
a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPADerSchemaDAO.java
+++ 
b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPADerSchemaDAO.java
@@ -18,6 +18,7 @@
  */
 package org.apache.syncope.core.persistence.jpa.dao;
 
+import java.util.Collection;
 import java.util.List;
 import javax.persistence.TypedQuery;
 import org.apache.syncope.common.lib.types.AnyTypeKind;
@@ -43,13 +44,16 @@ public class JPADerSchemaDAO extends AbstractDAO<DerSchema, 
String> implements D
     }
 
     @Override
-    public List<DerSchema> findByAnyTypeClass(final AnyTypeClass anyTypeClass) 
{
+    public List<DerSchema> findByAnyTypeClasses(final Collection<AnyTypeClass> 
anyTypeClasses) {
         StringBuilder queryString = new StringBuilder("SELECT e FROM ").
                 append(JPADerSchema.class.getSimpleName()).
-                append(" e WHERE e.anyTypeClass=:anyTypeClass");
+                append(" e WHERE ");
+        for (AnyTypeClass anyTypeClass : anyTypeClasses) {
+            
queryString.append("e.anyTypeClass.name='").append(anyTypeClass.getKey()).append("'
 OR");
+        }
 
-        TypedQuery<DerSchema> query = 
entityManager().createQuery(queryString.toString(), DerSchema.class);
-        query.setParameter("anyTypeClass", anyTypeClass);
+        TypedQuery<DerSchema> query = entityManager().createQuery(
+                queryString.substring(0, queryString.length() - 3), 
DerSchema.class);
 
         return query.getResultList();
     }

http://git-wip-us.apache.org/repos/asf/syncope/blob/b738d3e9/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAPlainSchemaDAO.java
----------------------------------------------------------------------
diff --git 
a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAPlainSchemaDAO.java
 
b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAPlainSchemaDAO.java
index 47e8fe3..d6e0315 100644
--- 
a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAPlainSchemaDAO.java
+++ 
b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAPlainSchemaDAO.java
@@ -18,6 +18,7 @@
  */
 package org.apache.syncope.core.persistence.jpa.dao;
 
+import java.util.Collection;
 import java.util.List;
 import javax.persistence.TypedQuery;
 import org.apache.syncope.common.lib.types.AnyTypeKind;
@@ -49,13 +50,16 @@ public class JPAPlainSchemaDAO extends 
AbstractDAO<PlainSchema, String> implemen
     }
 
     @Override
-    public List<PlainSchema> findByAnyTypeClass(final AnyTypeClass 
anyTypeClass) {
+    public List<PlainSchema> findByAnyTypeClasses(final 
Collection<AnyTypeClass> anyTypeClasses) {
         StringBuilder queryString = new StringBuilder("SELECT e FROM ").
                 append(JPAPlainSchema.class.getSimpleName()).
-                append(" e WHERE e.anyTypeClass=:anyTypeClass");
+                append(" e WHERE ");
+        for (AnyTypeClass anyTypeClass : anyTypeClasses) {
+            
queryString.append("e.anyTypeClass.name='").append(anyTypeClass.getKey()).append("'
 OR");
+        }
 
-        TypedQuery<PlainSchema> query = 
entityManager().createQuery(queryString.toString(), PlainSchema.class);
-        query.setParameter("anyTypeClass", anyTypeClass);
+        TypedQuery<PlainSchema> query = entityManager().createQuery(
+                queryString.substring(0, queryString.length() - 3), 
PlainSchema.class);
 
         return query.getResultList();
     }

http://git-wip-us.apache.org/repos/asf/syncope/blob/b738d3e9/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPARoleDAO.java
----------------------------------------------------------------------
diff --git 
a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPARoleDAO.java
 
b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPARoleDAO.java
index 168241f..4dc1688 100644
--- 
a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPARoleDAO.java
+++ 
b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPARoleDAO.java
@@ -19,7 +19,6 @@
 package org.apache.syncope.core.persistence.jpa.dao;
 
 import java.util.List;
-import javax.persistence.NoResultException;
 import javax.persistence.TypedQuery;
 import org.apache.syncope.common.lib.SyncopeConstants;
 import org.apache.syncope.common.lib.types.AnyTypeKind;
@@ -37,33 +36,17 @@ import 
org.springframework.transaction.annotation.Propagation;
 import org.springframework.transaction.annotation.Transactional;
 
 @Repository
-public class JPARoleDAO extends AbstractDAO<Role, Long> implements RoleDAO {
+public class JPARoleDAO extends AbstractDAO<Role, String> implements RoleDAO {
 
     @Autowired
     private AnySearchDAO searchDAO;
 
     @Override
-    public Role find(final Long key) {
+    public Role find(final String key) {
         return entityManager().find(JPARole.class, key);
     }
 
     @Override
-    public Role find(final String name) {
-        TypedQuery<Role> query = entityManager().createQuery(
-                "SELECT e FROM " + JPARole.class.getSimpleName() + " e WHERE 
e.name=:name", Role.class);
-        query.setParameter("name", name);
-
-        Role result = null;
-        try {
-            result = query.getSingleResult();
-        } catch (NoResultException e) {
-            LOG.debug("Found more than one match", e);
-        }
-
-        return result;
-    }
-
-    @Override
     public List<Role> findByRealm(final Realm realm) {
         TypedQuery<Role> query = entityManager().createQuery(
                 "SELECT e FROM " + JPARole.class.getSimpleName() + " e WHERE 
:realm MEMBER OF e.realms", Role.class);
@@ -108,7 +91,7 @@ public class JPARoleDAO extends AbstractDAO<Role, Long> 
implements RoleDAO {
     }
 
     @Override
-    public void delete(final Long key) {
+    public void delete(final String key) {
         Role role = find(key);
         if (role == null) {
             return;

http://git-wip-us.apache.org/repos/asf/syncope/blob/b738d3e9/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAVirSchemaDAO.java
----------------------------------------------------------------------
diff --git 
a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAVirSchemaDAO.java
 
b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAVirSchemaDAO.java
index aa38d77..854b065 100644
--- 
a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAVirSchemaDAO.java
+++ 
b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAVirSchemaDAO.java
@@ -18,6 +18,7 @@
  */
 package org.apache.syncope.core.persistence.jpa.dao;
 
+import java.util.Collection;
 import java.util.List;
 import javax.persistence.TypedQuery;
 import org.apache.syncope.common.lib.types.AnyTypeKind;
@@ -45,13 +46,16 @@ public class JPAVirSchemaDAO extends AbstractDAO<VirSchema, 
String> implements V
     }
 
     @Override
-    public List<VirSchema> findByAnyTypeClass(final AnyTypeClass anyTypeClass) 
{
+    public List<VirSchema> findByAnyTypeClasses(final Collection<AnyTypeClass> 
anyTypeClasses) {
         StringBuilder queryString = new StringBuilder("SELECT e FROM ").
                 append(JPAVirSchema.class.getSimpleName()).
-                append(" e WHERE e.anyTypeClass=:anyTypeClass");
+                append(" e WHERE ");
+        for (AnyTypeClass anyTypeClass : anyTypeClasses) {
+            
queryString.append("e.anyTypeClass.name='").append(anyTypeClass.getKey()).append("'
 OR");
+        }
 
-        TypedQuery<VirSchema> query = 
entityManager().createQuery(queryString.toString(), VirSchema.class);
-        query.setParameter("anyTypeClass", anyTypeClass);
+        TypedQuery<VirSchema> query = entityManager().createQuery(
+                queryString.substring(0, queryString.length() - 3), 
VirSchema.class);
 
         return query.getResultList();
     }

http://git-wip-us.apache.org/repos/asf/syncope/blob/b738d3e9/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/JPARole.java
----------------------------------------------------------------------
diff --git 
a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/JPARole.java
 
b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/JPARole.java
index 529a606..78d7380 100644
--- 
a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/JPARole.java
+++ 
b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/JPARole.java
@@ -37,37 +37,34 @@ import javax.persistence.ManyToMany;
 import javax.persistence.OneToOne;
 import javax.persistence.Table;
 import javax.validation.Valid;
-import javax.validation.constraints.NotNull;
 import org.apache.syncope.core.persistence.api.entity.user.DynRoleMembership;
 import org.apache.syncope.core.persistence.api.entity.Realm;
 import org.apache.syncope.core.persistence.api.entity.Role;
+import org.apache.syncope.core.persistence.jpa.validation.entity.RoleCheck;
 
 @Entity
 @Table(name = JPARole.TABLE)
 @Cacheable
-public class JPARole extends AbstractEntity<Long> implements Role {
+@RoleCheck
+public class JPARole extends AbstractEntity<String> implements Role {
 
     private static final long serialVersionUID = -7657701119422588832L;
 
     public static final String TABLE = "SyncopeRole";
 
     @Id
-    private Long id;
-
-    @Column(unique = true)
-    @NotNull
     private String name;
 
     @ElementCollection(fetch = FetchType.EAGER)
     @Column(name = "entitlement")
     @CollectionTable(name = "SyncopeRole_entitlements",
             joinColumns =
-            @JoinColumn(name = "role_id", referencedColumnName = "id"))
+            @JoinColumn(name = "role_name", referencedColumnName = "name"))
     private Set<String> entitlements = new HashSet<>();
 
     @ManyToMany(fetch = FetchType.EAGER)
     @JoinTable(joinColumns =
-            @JoinColumn(name = "role_id"),
+            @JoinColumn(name = "role_name"),
             inverseJoinColumns =
             @JoinColumn(name = "realm_id"))
     @Valid
@@ -78,17 +75,12 @@ public class JPARole extends AbstractEntity<Long> 
implements Role {
     private JPADynRoleMembership dynMembership;
 
     @Override
-    public Long getKey() {
-        return id;
-    }
-
-    @Override
-    public String getName() {
+    public String getKey() {
         return name;
     }
 
     @Override
-    public void setName(final String name) {
+    public void setKey(final String name) {
         this.name = name;
     }
 

http://git-wip-us.apache.org/repos/asf/syncope/blob/b738d3e9/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/user/JPAUser.java
----------------------------------------------------------------------
diff --git 
a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/user/JPAUser.java
 
b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/user/JPAUser.java
index 26fd229..3626804 100644
--- 
a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/user/JPAUser.java
+++ 
b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/user/JPAUser.java
@@ -92,7 +92,7 @@ public class JPAUser extends AbstractAny<UPlainAttr> 
implements User {
     @JoinTable(joinColumns =
             @JoinColumn(name = "user_id"),
             inverseJoinColumns =
-            @JoinColumn(name = "role_id"))
+            @JoinColumn(name = "role_name"))
     private List<JPARole> roles = new ArrayList<>();
 
     @OneToMany(cascade = CascadeType.ALL, mappedBy = "owner")
@@ -442,8 +442,8 @@ public class JPAUser extends AbstractAny<UPlainAttr> 
implements User {
                 res = passwordHistory.subList(size >= passwordHistory.size()
                         ? 0
                         : passwordHistory.size() - size, 
passwordHistory.size()).contains(cipherAlgorithm == null
-                                        ? password
-                                        : 
Encryptor.getInstance().encode(password, cipherAlgorithm));
+                                ? password
+                                : Encryptor.getInstance().encode(password, 
cipherAlgorithm));
             } catch (Exception e) {
                 LOG.error("Error evaluating password history", e);
             }

http://git-wip-us.apache.org/repos/asf/syncope/blob/b738d3e9/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/validation/entity/ExternalResourceValidator.java
----------------------------------------------------------------------
diff --git 
a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/validation/entity/ExternalResourceValidator.java
 
b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/validation/entity/ExternalResourceValidator.java
index d328eac..2f97699 100644
--- 
a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/validation/entity/ExternalResourceValidator.java
+++ 
b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/validation/entity/ExternalResourceValidator.java
@@ -189,7 +189,7 @@ public class ExternalResourceValidator extends 
AbstractValidator<ExternalResourc
     public boolean isValid(final ExternalResource resource, final 
ConstraintValidatorContext context) {
         context.disableDefaultConstraintViolation();
 
-        if (!NAME_PATTERN.matcher(resource.getKey()).matches()) {
+        if (resource.getKey() == null || 
!NAME_PATTERN.matcher(resource.getKey()).matches()) {
             context.buildConstraintViolationWithTemplate(
                     getTemplate(EntityViolationType.InvalidName, "Invalid 
Resource name")).
                     addPropertyNode("name").addConstraintViolation();

http://git-wip-us.apache.org/repos/asf/syncope/blob/b738d3e9/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/validation/entity/RoleCheck.java
----------------------------------------------------------------------
diff --git 
a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/validation/entity/RoleCheck.java
 
b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/validation/entity/RoleCheck.java
new file mode 100644
index 0000000..fbb5f0a
--- /dev/null
+++ 
b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/validation/entity/RoleCheck.java
@@ -0,0 +1,41 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.syncope.core.persistence.jpa.validation.entity;
+
+import java.lang.annotation.Documented;
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+import javax.validation.Constraint;
+import javax.validation.Payload;
+
+@Target({ ElementType.TYPE })
+@Retention(RetentionPolicy.RUNTIME)
+@Constraint(validatedBy = RoleValidator.class)
+@Documented
+public @interface RoleCheck {
+
+    String message() default 
"{org.apache.syncope.core.persistence.validation.role}";
+
+    Class<?>[] groups() default {};
+
+    Class<? extends Payload>[] payload() default {};
+}

http://git-wip-us.apache.org/repos/asf/syncope/blob/b738d3e9/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/validation/entity/RoleValidator.java
----------------------------------------------------------------------
diff --git 
a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/validation/entity/RoleValidator.java
 
b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/validation/entity/RoleValidator.java
new file mode 100644
index 0000000..29558a0
--- /dev/null
+++ 
b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/validation/entity/RoleValidator.java
@@ -0,0 +1,40 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.syncope.core.persistence.jpa.validation.entity;
+
+import javax.validation.ConstraintValidatorContext;
+import org.apache.syncope.common.lib.types.EntityViolationType;
+import org.apache.syncope.core.persistence.api.entity.Role;
+
+public class RoleValidator extends AbstractValidator<RoleCheck, Role> {
+
+    @Override
+    public boolean isValid(final Role role, final ConstraintValidatorContext 
context) {
+        context.disableDefaultConstraintViolation();
+
+        if (role.getKey() == null || 
!NAME_PATTERN.matcher(role.getKey()).matches()) {
+            context.buildConstraintViolationWithTemplate(
+                    getTemplate(EntityViolationType.InvalidName, "Invalid Role 
name")).
+                    addPropertyNode("name").addConstraintViolation();
+            return false;
+        }
+
+        return true;
+    }
+}

http://git-wip-us.apache.org/repos/asf/syncope/blob/b738d3e9/core/persistence-jpa/src/main/resources/META-INF/spring-orm-oracle.xml
----------------------------------------------------------------------
diff --git 
a/core/persistence-jpa/src/main/resources/META-INF/spring-orm-oracle.xml 
b/core/persistence-jpa/src/main/resources/META-INF/spring-orm-oracle.xml
index 15ff3aa..a2eb846 100644
--- a/core/persistence-jpa/src/main/resources/META-INF/spring-orm-oracle.xml
+++ b/core/persistence-jpa/src/main/resources/META-INF/spring-orm-oracle.xml
@@ -75,15 +75,6 @@ under the License.
     </attributes>
   </entity>
   
-  <entity class="org.apache.syncope.core.persistence.jpa.entity.JPARole">
-    <attributes>
-      <id name="id">
-        <generated-value generator="SEQ_Role" strategy="TABLE"/>
-        <table-generator name="SEQ_Role" pk-column-value="SEQ_Role" 
initial-value="100"/>
-      </id>
-    </attributes>
-  </entity>
-  
   <entity 
class="org.apache.syncope.core.persistence.jpa.entity.user.JPADynRoleMembership">
     <attributes>
       <id name="id">

http://git-wip-us.apache.org/repos/asf/syncope/blob/b738d3e9/core/persistence-jpa/src/main/resources/META-INF/spring-orm-sqlserver.xml
----------------------------------------------------------------------
diff --git 
a/core/persistence-jpa/src/main/resources/META-INF/spring-orm-sqlserver.xml 
b/core/persistence-jpa/src/main/resources/META-INF/spring-orm-sqlserver.xml
index 15ff3aa..a2eb846 100644
--- a/core/persistence-jpa/src/main/resources/META-INF/spring-orm-sqlserver.xml
+++ b/core/persistence-jpa/src/main/resources/META-INF/spring-orm-sqlserver.xml
@@ -75,15 +75,6 @@ under the License.
     </attributes>
   </entity>
   
-  <entity class="org.apache.syncope.core.persistence.jpa.entity.JPARole">
-    <attributes>
-      <id name="id">
-        <generated-value generator="SEQ_Role" strategy="TABLE"/>
-        <table-generator name="SEQ_Role" pk-column-value="SEQ_Role" 
initial-value="100"/>
-      </id>
-    </attributes>
-  </entity>
-  
   <entity 
class="org.apache.syncope.core.persistence.jpa.entity.user.JPADynRoleMembership">
     <attributes>
       <id name="id">

http://git-wip-us.apache.org/repos/asf/syncope/blob/b738d3e9/core/persistence-jpa/src/main/resources/META-INF/spring-orm.xml
----------------------------------------------------------------------
diff --git a/core/persistence-jpa/src/main/resources/META-INF/spring-orm.xml 
b/core/persistence-jpa/src/main/resources/META-INF/spring-orm.xml
index aeb24ee..5b820ff 100644
--- a/core/persistence-jpa/src/main/resources/META-INF/spring-orm.xml
+++ b/core/persistence-jpa/src/main/resources/META-INF/spring-orm.xml
@@ -75,15 +75,6 @@ under the License.
     </attributes>
   </entity>
   
-  <entity class="org.apache.syncope.core.persistence.jpa.entity.JPARole">
-    <attributes>
-      <id name="id">
-        <generated-value generator="SEQ_Role" strategy="TABLE"/>
-        <table-generator name="SEQ_Role" pk-column-value="SEQ_Role" 
initial-value="100"/>
-      </id>
-    </attributes>
-  </entity>
-  
   <entity 
class="org.apache.syncope.core.persistence.jpa.entity.user.JPADynRoleMembership">
     <attributes>
       <id name="id">

http://git-wip-us.apache.org/repos/asf/syncope/blob/b738d3e9/core/persistence-jpa/src/main/resources/views.xml
----------------------------------------------------------------------
diff --git a/core/persistence-jpa/src/main/resources/views.xml 
b/core/persistence-jpa/src/main/resources/views.xml
index 2e14834..fd0bf9c 100644
--- a/core/persistence-jpa/src/main/resources/views.xml
+++ b/core/persistence-jpa/src/main/resources/views.xml
@@ -90,13 +90,13 @@ under the License.
   <entry key="user_search_role">
     CREATE VIEW user_search_role AS
 
-    SELECT ss.user_id AS any_id, ss.role_id AS role_id
+    SELECT ss.user_id AS any_id, ss.role_name AS role_name
     FROM SyncopeUser_SyncopeRole ss
   </entry>
   <entry key="user_search_dynrmemb">
     CREATE VIEW user_search_dynrmemb AS
 
-    SELECT ds.user_id AS any_id, d.role_id AS role_id
+    SELECT ds.user_id AS any_id, d.role_name AS role_name
     FROM DynRoleMembership d, DynRoleMembership_User ds
     WHERE d.id = ds.dynRoleMembership_id
   </entry>

http://git-wip-us.apache.org/repos/asf/syncope/blob/b738d3e9/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/inner/AnySearchTest.java
----------------------------------------------------------------------
diff --git 
a/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/inner/AnySearchTest.java
 
b/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/inner/AnySearchTest.java
index b5f99ce..5c8dde9 100644
--- 
a/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/inner/AnySearchTest.java
+++ 
b/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/inner/AnySearchTest.java
@@ -91,7 +91,7 @@ public class AnySearchTest extends AbstractTest {
         assertTrue(searchDAO.matches(user, SearchCond.getLeafCond(groupCond), 
AnyTypeKind.USER));
 
         RoleCond roleCond = new RoleCond();
-        roleCond.setRoleKey(3L);
+        roleCond.setRoleKey("Other");
         assertTrue(searchDAO.matches(user, SearchCond.getLeafCond(roleCond), 
AnyTypeKind.USER));
     }
 
@@ -228,7 +228,7 @@ public class AnySearchTest extends AbstractTest {
     @Test
     public void searchByRole() {
         RoleCond roleCond = new RoleCond();
-        roleCond.setRoleKey(3L);
+        roleCond.setRoleKey("Other");
 
         List<User> users = searchDAO.search(SyncopeConstants.FULL_ADMIN_REALMS,
                 SearchCond.getLeafCond(roleCond), AnyTypeKind.USER);

http://git-wip-us.apache.org/repos/asf/syncope/blob/b738d3e9/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/inner/RoleTest.java
----------------------------------------------------------------------
diff --git 
a/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/inner/RoleTest.java
 
b/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/inner/RoleTest.java
index b57e713..ce2039a 100644
--- 
a/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/inner/RoleTest.java
+++ 
b/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/inner/RoleTest.java
@@ -45,15 +45,12 @@ public class RoleTest extends AbstractTest {
 
     @Test
     public void find() {
-        Role role1 = roleDAO.find(2L);
-        assertNotNull(role1);
-        assertNotNull(role1.getName());
-        assertFalse(role1.getRealms().isEmpty());
-        assertFalse(role1.getEntitlements().isEmpty());
-        
assertTrue(role1.getEntitlements().contains(StandardEntitlement.USER_LIST));
-
-        Role role2 = roleDAO.find(role1.getName());
-        assertEquals(role1, role2);
+        Role role = roleDAO.find("User manager");
+        assertNotNull(role);
+        assertNotNull(role.getKey());
+        assertFalse(role.getRealms().isEmpty());
+        assertFalse(role.getEntitlements().isEmpty());
+        
assertTrue(role.getEntitlements().contains(StandardEntitlement.USER_LIST));
     }
 
     @Test
@@ -69,7 +66,7 @@ public class RoleTest extends AbstractTest {
     @Test
     public void save() {
         Role role = entityFactory.newEntity(Role.class);
-        role.setName("new");
+        role.setKey("new");
         role.add(realmDAO.getRoot());
         role.add(realmDAO.find("/even/two"));
         role.getEntitlements().add(StandardEntitlement.LOG_LIST);
@@ -81,9 +78,9 @@ public class RoleTest extends AbstractTest {
 
     @Test
     public void delete() {
-        assertNotNull(roleDAO.find(3L));
+        assertNotNull(roleDAO.find("Other"));
 
-        roleDAO.delete(3L);
-        assertNull(roleDAO.find(3L));
+        roleDAO.delete("Other");
+        assertNull(roleDAO.find("Other"));
     }
 }

http://git-wip-us.apache.org/repos/asf/syncope/blob/b738d3e9/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/outer/AnySearchTest.java
----------------------------------------------------------------------
diff --git 
a/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/outer/AnySearchTest.java
 
b/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/outer/AnySearchTest.java
index 24a4e7e..001a984 100644
--- 
a/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/outer/AnySearchTest.java
+++ 
b/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/outer/AnySearchTest.java
@@ -85,7 +85,7 @@ public class AnySearchTest extends AbstractTest {
     public void searchByDynMembership() {
         // 1. create role with dynamic membership
         Role role = entityFactory.newEntity(Role.class);
-        role.setName("new");
+        role.setKey("new");
         role.add(realmDAO.getRoot());
         role.add(realmDAO.find("/even/two"));
         role.getEntitlements().add(StandardEntitlement.LOG_LIST);

http://git-wip-us.apache.org/repos/asf/syncope/blob/b738d3e9/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/outer/RealmTest.java
----------------------------------------------------------------------
diff --git 
a/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/outer/RealmTest.java
 
b/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/outer/RealmTest.java
index 5bf1b83..2b67e6a 100644
--- 
a/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/outer/RealmTest.java
+++ 
b/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/outer/RealmTest.java
@@ -45,7 +45,7 @@ public class RealmTest extends AbstractTest {
         Realm realm = realmDAO.find("/odd");
         assertNotNull(realm);
 
-        Role role = roleDAO.find(1L);
+        Role role = roleDAO.find("User reviewer");
         assertTrue(role.getRealms().contains(realm));
 
         int beforeSize = role.getRealms().size();
@@ -54,7 +54,7 @@ public class RealmTest extends AbstractTest {
 
         realmDAO.flush();
 
-        role = roleDAO.find(1L);
+        role = roleDAO.find("User reviewer");
         assertEquals(beforeSize - 1, role.getRealms().size());
     }
 }

http://git-wip-us.apache.org/repos/asf/syncope/blob/b738d3e9/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/outer/RoleTest.java
----------------------------------------------------------------------
diff --git 
a/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/outer/RoleTest.java
 
b/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/outer/RoleTest.java
index bff367e..a3a4ea6 100644
--- 
a/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/outer/RoleTest.java
+++ 
b/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/outer/RoleTest.java
@@ -98,7 +98,7 @@ public class RoleTest extends AbstractTest {
 
         // 1. create role with dynamic membership
         Role role = entityFactory.newEntity(Role.class);
-        role.setName("new");
+        role.setKey("new");
         role.add(realmDAO.getRoot());
         role.add(realmDAO.find("/even/two"));
         role.getEntitlements().add(StandardEntitlement.LOG_LIST);
@@ -165,7 +165,7 @@ public class RoleTest extends AbstractTest {
     public void delete() {
         // 0. create role
         Role role = entityFactory.newEntity(Role.class);
-        role.setName("new");
+        role.setKey("new");
         role.add(realmDAO.getRoot());
         role.add(realmDAO.find("/even/two"));
         role.getEntitlements().add(StandardEntitlement.LOG_LIST);

http://git-wip-us.apache.org/repos/asf/syncope/blob/b738d3e9/core/persistence-jpa/src/test/resources/domains/MasterContent.xml
----------------------------------------------------------------------
diff --git a/core/persistence-jpa/src/test/resources/domains/MasterContent.xml 
b/core/persistence-jpa/src/test/resources/domains/MasterContent.xml
index 73fee53..b0a1a1a 100644
--- a/core/persistence-jpa/src/test/resources/domains/MasterContent.xml
+++ b/core/persistence-jpa/src/test/resources/domains/MasterContent.xml
@@ -8,7 +8,7 @@ to you under the Apache License, Version 2.0 (the
 "License"); you may not use this file except in compliance
 with the License.  You may obtain a copy of the License at
 
-  http://www.apache.org/licenses/LICENSE-2.0
+     http://www.apache.org/licenses/LICENSE-2.0
 
 Unless required by applicable law or agreed to in writing,
 software distributed under the License is distributed on an
@@ -170,37 +170,37 @@ under the License.
   
   <ARelationship id="1" left_anyObject_id="1" right_anyObject_id="2" 
type_name="neighborhood"/>
   
-  <SyncopeRole id="1" name="User reviewer"/>
-  <SyncopeRole_entitlements entitlement="USER_READ" role_id="1"/>
-  <SyncopeRole_entitlements entitlement="USER_LIST" role_id="1"/>
-  <SyncopeRole_entitlements entitlement="USER_SEARCH" role_id="1"/>
-  <SyncopeRole_Realm role_id="1" realm_id="2"/>
-  <SyncopeRole_Realm role_id="1" realm_id="3"/>
+  <SyncopeRole name="User reviewer"/>
+  <SyncopeRole_entitlements entitlement="USER_READ" role_name="User reviewer"/>
+  <SyncopeRole_entitlements entitlement="USER_LIST" role_name="User reviewer"/>
+  <SyncopeRole_entitlements entitlement="USER_SEARCH" role_name="User 
reviewer"/>
+  <SyncopeRole_Realm role_name="User reviewer" realm_id="2"/>
+  <SyncopeRole_Realm role_name="User reviewer" realm_id="3"/>
   
-  <SyncopeRole id="2" name="User manager"/>
-  <SyncopeRole_entitlements entitlement="USER_READ" role_id="2"/>
-  <SyncopeRole_entitlements entitlement="USER_LIST" role_id="2"/>
-  <SyncopeRole_entitlements entitlement="USER_SEARCH" role_id="2"/>
-  <SyncopeRole_entitlements entitlement="WORKFLOW_FORM_CLAIM" role_id="2"/>
-  <SyncopeRole_entitlements entitlement="WORKFLOW_FORM_SUBMIT" role_id="2"/>
-  <SyncopeRole_Realm role_id="2" realm_id="1"/>
+  <SyncopeRole name="User manager"/>
+  <SyncopeRole_entitlements entitlement="USER_READ" role_name="User manager"/>
+  <SyncopeRole_entitlements entitlement="USER_LIST" role_name="User manager"/>
+  <SyncopeRole_entitlements entitlement="USER_SEARCH" role_name="User 
manager"/>
+  <SyncopeRole_entitlements entitlement="WORKFLOW_FORM_CLAIM" role_name="User 
manager"/>
+  <SyncopeRole_entitlements entitlement="WORKFLOW_FORM_SUBMIT" role_name="User 
manager"/>
+  <SyncopeRole_Realm role_name="User manager" realm_id="1"/>
 
-  <SyncopeRole id="3" name="Other"/>
-  <SyncopeRole_entitlements entitlement="SCHEMA_READ" role_id="3"/>
-  <SyncopeRole_entitlements entitlement="GROUP_READ" role_id="3"/>
-  <SyncopeRole_entitlements entitlement="WORKFLOW_FORM_CLAIM" role_id="3"/>
-  <SyncopeRole_Realm role_id="3" realm_id="2"/>
+  <SyncopeRole name="Other"/>
+  <SyncopeRole_entitlements entitlement="SCHEMA_READ" role_name="Other"/>
+  <SyncopeRole_entitlements entitlement="GROUP_READ" role_name="Other"/>
+  <SyncopeRole_entitlements entitlement="WORKFLOW_FORM_CLAIM" 
role_name="Other"/>
+  <SyncopeRole_Realm role_name="Other" realm_id="2"/>
   
-  <SyncopeRole id="4" name="Search for /even/two"/>
-  <SyncopeRole_entitlements entitlement="USER_READ" role_id="4"/>
-  <SyncopeRole_entitlements entitlement="USER_SEARCH" role_id="4"/>
-  <SyncopeRole_Realm role_id="4" realm_id="4"/>
+  <SyncopeRole name="Search for /even/two"/>
+  <SyncopeRole_entitlements entitlement="USER_READ" role_name="Search for 
/even/two"/>
+  <SyncopeRole_entitlements entitlement="USER_SEARCH" role_name="Search for 
/even/two"/>
+  <SyncopeRole_Realm role_name="Search for /even/two" realm_id="4"/>
 
   <SyncopeUser id="1" workflowId="4" status="active" 
password="5baa61e4c9b93f3f0682250b6cf8331b7ee68fd8" cipherAlgorithm="SHA1"
                realm_id="3"
                username="rossini" creator="admin" lastModifier="admin"
                creationDate="2010-10-20 11:00:00" lastChangeDate="2010-10-20 
11:00:00" suspended="0"/>
-  <SyncopeUser_SyncopeRole user_id="1" role_id="3"/>
+  <SyncopeUser_SyncopeRole user_id="1" role_name="Other"/>
   <SyncopeUser id="2" workflowId="6" status="active" 
password="5baa61e4c9b93f3f0682250b6cf8331b7ee68fd8" cipherAlgorithm="SHA1"
                realm_id="1"
                username="verdi" creator="admin" lastModifier="admin"
@@ -213,13 +213,13 @@ under the License.
                realm_id="1"
                username="bellini" creator="admin" lastModifier="admin"
                creationDate="2010-10-20 11:00:00" lastChangeDate="2010-10-20 
11:00:00" suspended="0"/>
-  <SyncopeUser_SyncopeRole user_id="4" role_id="1"/>
-  <SyncopeUser_SyncopeRole user_id="4" role_id="2"/>
+  <SyncopeUser_SyncopeRole user_id="4" role_name="User reviewer"/>
+  <SyncopeUser_SyncopeRole user_id="4" role_name="User manager"/>
   <SyncopeUser id="5" workflowId="12" status="active" 
password="5baa61e4c9b93f3f0682250b6cf8331b7ee68fd8" cipherAlgorithm="SHA1"
                realm_id="1"
                username="puccini" creator="admin" lastModifier="admin" 
                creationDate="2010-10-20 11:00:00" lastChangeDate="2010-10-20 
11:00:00" suspended="0"/>
-  <SyncopeUser_SyncopeRole user_id="5" role_id="4"/>
+  <SyncopeUser_SyncopeRole user_id="5" role_name="Search for /even/two"/>
   
   <SyncopeGroup id="1" name="root"
                 realm_id="1"
@@ -1110,4 +1110,4 @@ under the License.
   <SyncopeLogger 
logName="syncope.audit.[REST]:[EntitlementLogic]:[]:[getOwn]:[SUCCESS]" 
logLevel="DEBUG" logType="AUDIT"/>
   
   <SecurityQuestion id="1" content="What's your mother's maiden name?"/>
-</dataset>
+</dataset>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/syncope/blob/b738d3e9/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/AnyTypeClassDataBinderImpl.java
----------------------------------------------------------------------
diff --git 
a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/AnyTypeClassDataBinderImpl.java
 
b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/AnyTypeClassDataBinderImpl.java
index 8a33e12..047633d 100644
--- 
a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/AnyTypeClassDataBinderImpl.java
+++ 
b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/AnyTypeClassDataBinderImpl.java
@@ -18,6 +18,7 @@
  */
 package org.apache.syncope.core.provisioning.java.data;
 
+import java.util.Collections;
 import org.apache.syncope.common.lib.to.AnyTypeClassTO;
 import org.apache.syncope.core.persistence.api.dao.DerSchemaDAO;
 import org.apache.syncope.core.persistence.api.dao.PlainSchemaDAO;
@@ -63,7 +64,7 @@ public class AnyTypeClassDataBinderImpl implements 
AnyTypeClassDataBinder {
             anyTypeClass.setKey(anyTypeClassTO.getKey());
         }
 
-        for (PlainSchema schema : 
plainSchemaDAO.findByAnyTypeClass(anyTypeClass)) {
+        for (PlainSchema schema : 
plainSchemaDAO.findByAnyTypeClasses(Collections.singletonList(anyTypeClass))) {
             schema.setAnyTypeClass(null);
         }
 
@@ -78,7 +79,7 @@ public class AnyTypeClassDataBinderImpl implements 
AnyTypeClassDataBinder {
             }
         }
 
-        for (DerSchema schema : derSchemaDAO.findByAnyTypeClass(anyTypeClass)) 
{
+        for (DerSchema schema : 
derSchemaDAO.findByAnyTypeClasses(Collections.singletonList(anyTypeClass))) {
             schema.setAnyTypeClass(null);
         }
 
@@ -93,7 +94,7 @@ public class AnyTypeClassDataBinderImpl implements 
AnyTypeClassDataBinder {
             }
         }
 
-        for (VirSchema schema : virSchemaDAO.findByAnyTypeClass(anyTypeClass)) 
{
+        for (VirSchema schema : 
virSchemaDAO.findByAnyTypeClasses(Collections.singletonList(anyTypeClass))) {
             schema.setAnyTypeClass(null);
         }
 

http://git-wip-us.apache.org/repos/asf/syncope/blob/b738d3e9/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/RoleDataBinderImpl.java
----------------------------------------------------------------------
diff --git 
a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/RoleDataBinderImpl.java
 
b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/RoleDataBinderImpl.java
index 542b07c..1bef90e 100644
--- 
a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/RoleDataBinderImpl.java
+++ 
b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/RoleDataBinderImpl.java
@@ -75,7 +75,7 @@ public class RoleDataBinderImpl implements RoleDataBinder {
 
     @Override
     public void update(final Role role, final RoleTO roleTO) {
-        role.setName(roleTO.getName());
+        role.setKey(roleTO.getKey());
 
         role.getEntitlements().clear();
         role.getEntitlements().addAll(roleTO.getEntitlements());
@@ -93,17 +93,15 @@ public class RoleDataBinderImpl implements RoleDataBinder {
         // dynamic membership
         if (role.getKey() == null && roleTO.getDynMembershipCond() != null) {
             setDynMembership(role, roleTO.getDynMembershipCond());
-        } else {
-            if (role.getDynMembership() != null && 
roleTO.getDynMembershipCond() == null) {
-                role.setDynMembership(null);
-            } else if (role.getDynMembership() == null && 
roleTO.getDynMembershipCond() != null) {
-                setDynMembership(role, roleTO.getDynMembershipCond());
-            } else if (role.getDynMembership() != null && 
roleTO.getDynMembershipCond() != null
-                    && 
!role.getDynMembership().getFIQLCond().equals(roleTO.getDynMembershipCond())) {
-
-                role.getDynMembership().getMembers().clear();
-                setDynMembership(role, roleTO.getDynMembershipCond());
-            }
+        } else if (role.getDynMembership() != null && 
roleTO.getDynMembershipCond() == null) {
+            role.setDynMembership(null);
+        } else if (role.getDynMembership() == null && 
roleTO.getDynMembershipCond() != null) {
+            setDynMembership(role, roleTO.getDynMembershipCond());
+        } else if (role.getDynMembership() != null && 
roleTO.getDynMembershipCond() != null
+                && 
!role.getDynMembership().getFIQLCond().equals(roleTO.getDynMembershipCond())) {
+
+            role.getDynMembership().getMembers().clear();
+            setDynMembership(role, roleTO.getDynMembershipCond());
         }
     }
 
@@ -112,7 +110,6 @@ public class RoleDataBinderImpl implements RoleDataBinder {
         RoleTO roleTO = new RoleTO();
 
         roleTO.setKey(role.getKey());
-        roleTO.setName(role.getName());
         roleTO.getEntitlements().addAll(role.getEntitlements());
 
         CollectionUtils.collect(role.getRealms(), new Transformer<Realm, 
String>() {

http://git-wip-us.apache.org/repos/asf/syncope/blob/b738d3e9/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/UserDataBinderImpl.java
----------------------------------------------------------------------
diff --git 
a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/UserDataBinderImpl.java
 
b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/UserDataBinderImpl.java
index 5bf13c5..ca3448c 100644
--- 
a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/UserDataBinderImpl.java
+++ 
b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/UserDataBinderImpl.java
@@ -32,10 +32,10 @@ import org.apache.commons.collections4.Transformer;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.syncope.common.lib.SyncopeClientCompositeException;
 import org.apache.syncope.common.lib.SyncopeClientException;
-import org.apache.syncope.common.lib.patch.LongPatchItem;
 import org.apache.syncope.common.lib.patch.MembershipPatch;
 import org.apache.syncope.common.lib.patch.PasswordPatch;
 import org.apache.syncope.common.lib.patch.RelationshipPatch;
+import org.apache.syncope.common.lib.patch.StringPatchItem;
 import org.apache.syncope.common.lib.patch.UserPatch;
 import org.apache.syncope.common.lib.to.MembershipTO;
 import org.apache.syncope.common.lib.to.RelationshipTO;
@@ -164,7 +164,7 @@ public class UserDataBinderImpl extends 
AbstractAnyDataBinder implements UserDat
         SyncopeClientCompositeException scce = 
SyncopeClientException.buildComposite();
 
         // roles
-        for (Long roleKey : userTO.getRoles()) {
+        for (String roleKey : userTO.getRoles()) {
             Role role = roleDAO.find(roleKey);
             if (role == null) {
                 LOG.warn("Ignoring unknown role with id {}", roleKey);
@@ -317,7 +317,7 @@ public class UserDataBinderImpl extends 
AbstractAnyDataBinder implements UserDat
         }
 
         // roles
-        for (LongPatchItem patch : userPatch.getRoles()) {
+        for (StringPatchItem patch : userPatch.getRoles()) {
             Role role = roleDAO.find(patch.getValue());
             if (role == null) {
                 LOG.warn("Ignoring unknown role with key {}", 
patch.getValue());
@@ -452,10 +452,10 @@ public class UserDataBinderImpl extends 
AbstractAnyDataBinder implements UserDat
 
         if (details) {
             // roles
-            CollectionUtils.collect(user.getRoles(), new Transformer<Role, 
Long>() {
+            CollectionUtils.collect(user.getRoles(), new Transformer<Role, 
String>() {
 
                 @Override
-                public Long transform(final Role role) {
+                public String transform(final Role role) {
                     return role.getKey();
                 }
             }, userTO.getRoles());
@@ -480,10 +480,10 @@ public class UserDataBinderImpl extends 
AbstractAnyDataBinder implements UserDat
             }, userTO.getMemberships());
 
             // dynamic memberships
-            CollectionUtils.collect(userDAO.findDynRoleMemberships(user), new 
Transformer<Role, Long>() {
+            CollectionUtils.collect(userDAO.findDynRoleMemberships(user), new 
Transformer<Role, String>() {
 
                 @Override
-                public Long transform(final Role role) {
+                public String transform(final Role role) {
                     return role.getKey();
                 }
             }, userTO.getDynRoles());

http://git-wip-us.apache.org/repos/asf/syncope/blob/b738d3e9/core/rest-cxf/src/main/java/org/apache/syncope/core/rest/cxf/service/RoleServiceImpl.java
----------------------------------------------------------------------
diff --git 
a/core/rest-cxf/src/main/java/org/apache/syncope/core/rest/cxf/service/RoleServiceImpl.java
 
b/core/rest-cxf/src/main/java/org/apache/syncope/core/rest/cxf/service/RoleServiceImpl.java
index 006767c..1eec4a3 100644
--- 
a/core/rest-cxf/src/main/java/org/apache/syncope/core/rest/cxf/service/RoleServiceImpl.java
+++ 
b/core/rest-cxf/src/main/java/org/apache/syncope/core/rest/cxf/service/RoleServiceImpl.java
@@ -40,14 +40,14 @@ public class RoleServiceImpl extends AbstractServiceImpl 
implements RoleService
     }
 
     @Override
-    public RoleTO read(final Long roleKey) {
-        return logic.read(roleKey);
+    public RoleTO read(final String key) {
+        return logic.read(key);
     }
 
     @Override
     public Response create(final RoleTO roleTO) {
         RoleTO created = logic.create(roleTO);
-        URI location = 
uriInfo.getAbsolutePathBuilder().path(String.valueOf(created.getKey())).build();
+        URI location = 
uriInfo.getAbsolutePathBuilder().path(created.getKey()).build();
         return Response.created(location).
                 header(RESTHeaders.RESOURCE_KEY, created.getKey()).
                 build();
@@ -59,8 +59,8 @@ public class RoleServiceImpl extends AbstractServiceImpl 
implements RoleService
     }
 
     @Override
-    public void delete(final Long roleKey) {
-        logic.delete(roleKey);
+    public void delete(final String key) {
+        logic.delete(key);
     }
 
 }

http://git-wip-us.apache.org/repos/asf/syncope/blob/b738d3e9/core/rest-cxf/src/main/java/org/apache/syncope/core/rest/cxf/service/SchemaServiceImpl.java
----------------------------------------------------------------------
diff --git 
a/core/rest-cxf/src/main/java/org/apache/syncope/core/rest/cxf/service/SchemaServiceImpl.java
 
b/core/rest-cxf/src/main/java/org/apache/syncope/core/rest/cxf/service/SchemaServiceImpl.java
index 07d84fb..fc98926 100644
--- 
a/core/rest-cxf/src/main/java/org/apache/syncope/core/rest/cxf/service/SchemaServiceImpl.java
+++ 
b/core/rest-cxf/src/main/java/org/apache/syncope/core/rest/cxf/service/SchemaServiceImpl.java
@@ -24,6 +24,7 @@ import javax.ws.rs.core.Response;
 import org.apache.syncope.common.lib.to.AbstractSchemaTO;
 import org.apache.syncope.common.lib.types.SchemaType;
 import org.apache.syncope.common.rest.api.RESTHeaders;
+import org.apache.syncope.common.rest.api.beans.SchemaQuery;
 import org.apache.syncope.common.rest.api.service.SchemaService;
 import org.apache.syncope.core.logic.SchemaLogic;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -51,8 +52,8 @@ public class SchemaServiceImpl extends AbstractServiceImpl 
implements SchemaServ
     }
 
     @Override
-    public <T extends AbstractSchemaTO> List<T> list(final SchemaType 
schemaType, final String anyTypeClass) {
-        return logic.list(schemaType, anyTypeClass);
+    public <T extends AbstractSchemaTO> List<T> list(final SchemaType 
schemaType, final SchemaQuery query) {
+        return logic.list(schemaType, query.getAnyTypeClasses());
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/syncope/blob/b738d3e9/fit/core-reference/src/test/java/org/apache/syncope/fit/core/reference/AbstractTaskITCase.java
----------------------------------------------------------------------
diff --git 
a/fit/core-reference/src/test/java/org/apache/syncope/fit/core/reference/AbstractTaskITCase.java
 
b/fit/core-reference/src/test/java/org/apache/syncope/fit/core/reference/AbstractTaskITCase.java
index c118224..2d98fd8 100644
--- 
a/fit/core-reference/src/test/java/org/apache/syncope/fit/core/reference/AbstractTaskITCase.java
+++ 
b/fit/core-reference/src/test/java/org/apache/syncope/fit/core/reference/AbstractTaskITCase.java
@@ -35,13 +35,13 @@ import java.util.concurrent.Future;
 import java.util.concurrent.TimeUnit;
 import org.apache.commons.collections4.CollectionUtils;
 import org.apache.commons.collections4.Predicate;
-import org.apache.syncope.client.lib.SyncopeClient;
 import org.apache.syncope.common.lib.to.AbstractTaskTO;
 import org.apache.syncope.common.lib.to.NotificationTaskTO;
 import org.apache.syncope.common.lib.to.PagedResult;
 import org.apache.syncope.common.lib.to.TaskExecTO;
 import org.apache.syncope.common.lib.to.UserTO;
 import org.apache.syncope.common.lib.types.TaskType;
+import org.apache.syncope.common.rest.api.beans.TaskQuery;
 import org.apache.syncope.common.rest.api.service.TaskService;
 import org.apache.syncope.core.logic.notification.NotificationJob;
 
@@ -166,7 +166,7 @@ public abstract class AbstractTaskITCase extends 
AbstractITCase {
 
     protected NotificationTaskTO findNotificationTaskBySender(final String 
sender) {
         PagedResult<NotificationTaskTO> tasks =
-                taskService.list(TaskType.NOTIFICATION, 
SyncopeClient.getTaskQueryBuilder().build());
+                taskService.list(TaskType.NOTIFICATION, new 
TaskQuery.Builder().build());
         assertNotNull(tasks);
         assertFalse(tasks.getResult().isEmpty());
 

Reply via email to