You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@syncope.apache.org by il...@apache.org on 2015/06/11 16:16:57 UTC

[07/70] syncope git commit: [SYNCOPE-666] Initial commit, Travis CI builds disabled

http://git-wip-us.apache.org/repos/asf/syncope/blob/081d9a04/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/NotificationDataBinderImpl.java
----------------------------------------------------------------------
diff --git a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/NotificationDataBinderImpl.java b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/NotificationDataBinderImpl.java
index ae6d8a8..eec346e 100644
--- a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/NotificationDataBinderImpl.java
+++ b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/NotificationDataBinderImpl.java
@@ -18,18 +18,30 @@
  */
 package org.apache.syncope.core.provisioning.java.data;
 
+import java.util.Map;
+import org.apache.commons.lang3.StringUtils;
 import org.apache.syncope.core.provisioning.api.data.NotificationDataBinder;
 import org.apache.syncope.common.lib.to.NotificationTO;
 import org.apache.syncope.core.persistence.api.entity.EntityFactory;
 import org.apache.syncope.core.persistence.api.entity.Notification;
 import org.apache.syncope.core.misc.spring.BeanUtils;
+import org.apache.syncope.core.persistence.api.dao.AnyTypeDAO;
+import org.apache.syncope.core.persistence.api.entity.AnyAbout;
+import org.apache.syncope.core.persistence.api.entity.AnyType;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
 
 @Component
 public class NotificationDataBinderImpl implements NotificationDataBinder {
 
-    private static final String[] IGNORE_PROPERTIES = { "key", "about", "recipients" };
+    private static final Logger LOG = LoggerFactory.getLogger(NotificationDataBinder.class);
+
+    private static final String[] IGNORE_PROPERTIES = { "key", "abouts", "recipients" };
+
+    @Autowired
+    private AnyTypeDAO anyTypeDAO;
 
     @Autowired
     private EntityFactory entityFactory;
@@ -41,8 +53,10 @@ public class NotificationDataBinderImpl implements NotificationDataBinder {
         BeanUtils.copyProperties(notification, result, IGNORE_PROPERTIES);
 
         result.setKey(notification.getKey());
-        result.setUserAbout(notification.getUserAbout());
-        result.setGroupAbout(notification.getGroupAbout());
+        for (AnyAbout about : notification.getAbouts()) {
+            result.getAbouts().put(about.getAnyType().getKey(), about.get());
+        }
+
         result.setRecipients(notification.getRecipients());
 
         return result;
@@ -59,8 +73,22 @@ public class NotificationDataBinderImpl implements NotificationDataBinder {
     public void update(final Notification notification, final NotificationTO notificationTO) {
         BeanUtils.copyProperties(notificationTO, notification, IGNORE_PROPERTIES);
 
-        notification.setUserAbout(notificationTO.getUserAbout());
-        notification.setGroupAbout(notificationTO.getGroupAbout());
+        notification.getAbouts().clear();
+        for (Map.Entry<String, String> entry : notificationTO.getAbouts().entrySet()) {
+            if (StringUtils.isNotBlank(entry.getValue())) {
+                AnyType anyType = anyTypeDAO.find(entry.getKey());
+                if (anyType == null) {
+                    LOG.warn("Invalid AnyType {} specified, ignoring...", entry.getKey());
+                } else {
+                    AnyAbout about = entityFactory.newEntity(AnyAbout.class);
+                    about.setAnyType(anyType);
+                    about.setNotification(notification);
+
+                    notification.add(about);
+                }
+            }
+        }
+
         notification.setRecipients(notificationTO.getRecipients());
     }
 }

http://git-wip-us.apache.org/repos/asf/syncope/blob/081d9a04/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/PolicyDataBinderImpl.java
----------------------------------------------------------------------
diff --git a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/PolicyDataBinderImpl.java b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/PolicyDataBinderImpl.java
index 3fe382c..b29f9fa 100644
--- a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/PolicyDataBinderImpl.java
+++ b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/PolicyDataBinderImpl.java
@@ -32,7 +32,7 @@ import org.apache.syncope.core.persistence.api.dao.ExternalResourceDAO;
 import org.apache.syncope.core.persistence.api.dao.RealmDAO;
 import org.apache.syncope.core.persistence.api.entity.AccountPolicy;
 import org.apache.syncope.core.persistence.api.entity.EntityFactory;
-import org.apache.syncope.core.persistence.api.entity.ExternalResource;
+import org.apache.syncope.core.persistence.api.entity.resource.ExternalResource;
 import org.apache.syncope.core.persistence.api.entity.PasswordPolicy;
 import org.apache.syncope.core.persistence.api.entity.Policy;
 import org.apache.syncope.core.persistence.api.entity.Realm;

http://git-wip-us.apache.org/repos/asf/syncope/blob/081d9a04/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/ResourceDataBinderImpl.java
----------------------------------------------------------------------
diff --git a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/ResourceDataBinderImpl.java b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/ResourceDataBinderImpl.java
index cf1339e..fae0f9f 100644
--- a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/ResourceDataBinderImpl.java
+++ b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/ResourceDataBinderImpl.java
@@ -27,6 +27,7 @@ import org.apache.syncope.common.lib.SyncopeClientCompositeException;
 import org.apache.syncope.common.lib.SyncopeClientException;
 import org.apache.syncope.common.lib.to.MappingItemTO;
 import org.apache.syncope.common.lib.to.MappingTO;
+import org.apache.syncope.common.lib.to.ProvisionTO;
 import org.apache.syncope.common.lib.to.ResourceTO;
 import org.apache.syncope.common.lib.types.ClientExceptionType;
 import org.apache.syncope.common.lib.types.IntMappingType;
@@ -36,34 +37,34 @@ import org.apache.syncope.core.persistence.api.dao.PolicyDAO;
 import org.apache.syncope.core.persistence.api.entity.AccountPolicy;
 import org.apache.syncope.core.persistence.api.entity.ConnInstance;
 import org.apache.syncope.core.persistence.api.entity.EntityFactory;
-import org.apache.syncope.core.persistence.api.entity.ExternalResource;
-import org.apache.syncope.core.persistence.api.entity.Mapping;
-import org.apache.syncope.core.persistence.api.entity.MappingItem;
+import org.apache.syncope.core.persistence.api.entity.resource.ExternalResource;
+import org.apache.syncope.core.persistence.api.entity.resource.Mapping;
+import org.apache.syncope.core.persistence.api.entity.resource.MappingItem;
 import org.apache.syncope.core.persistence.api.entity.PasswordPolicy;
 import org.apache.syncope.core.persistence.api.entity.SyncPolicy;
-import org.apache.syncope.core.persistence.api.entity.group.GMapping;
-import org.apache.syncope.core.persistence.api.entity.group.GMappingItem;
-import org.apache.syncope.core.persistence.api.entity.user.UMapping;
-import org.apache.syncope.core.persistence.api.entity.user.UMappingItem;
 import org.apache.syncope.core.provisioning.api.ConnectorRegistry;
 import org.apache.syncope.core.misc.jexl.JexlUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.apache.syncope.core.misc.spring.BeanUtils;
+import org.apache.syncope.core.persistence.api.dao.AnyTypeDAO;
+import org.apache.syncope.core.persistence.api.entity.AnyType;
+import org.apache.syncope.core.persistence.api.entity.resource.Provision;
+import org.identityconnectors.framework.common.objects.ObjectClass;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
 
 @Component
 public class ResourceDataBinderImpl implements ResourceDataBinder {
 
-    /**
-     * Logger.
-     */
     private static final Logger LOG = LoggerFactory.getLogger(ResourceDataBinder.class);
 
     private static final String[] MAPPINGITEM_IGNORE_PROPERTIES = { "key", "mapping" };
 
     @Autowired
+    private AnyTypeDAO anyTypeDAO;
+
+    @Autowired
     private ConnectorRegistry connRegistry;
 
     @Autowired
@@ -107,21 +108,34 @@ public class ResourceDataBinderImpl implements ResourceDataBinder {
 
         resource.setPropagationMode(resourceTO.getPropagationMode());
 
-        if (resourceTO.getUmapping() == null || resourceTO.getUmapping().getItems().isEmpty()) {
-            resource.setUmapping(null);
-        } else {
-            UMapping mapping = entityFactory.newEntity(UMapping.class);
-            mapping.setResource(resource);
-            resource.setUmapping(mapping);
-            populateMapping(resourceTO.getUmapping(), mapping, entityFactory.newEntity(UMappingItem.class));
-        }
-        if (resourceTO.getGmapping() == null || resourceTO.getGmapping().getItems().isEmpty()) {
-            resource.setGmapping(null);
-        } else {
-            GMapping mapping = entityFactory.newEntity(GMapping.class);
-            mapping.setResource(resource);
-            resource.setGmapping(mapping);
-            populateMapping(resourceTO.getGmapping(), mapping, entityFactory.newEntity(GMappingItem.class));
+        for (ProvisionTO provisionTO : resourceTO.getProvisions()) {
+            AnyType anyType = anyTypeDAO.find(provisionTO.getAnyType());
+            if (anyType == null) {
+                LOG.warn("Invalid type specified {}, ignoring...", provisionTO.getAnyType());
+            }
+
+            Provision provision = resource.getProvision(anyType);
+            if (provision == null) {
+                provision = entityFactory.newEntity(Provision.class);
+                provision.setResource(resource);
+                resource.add(provision);
+                provision.setAnyType(anyType);
+            }
+
+            provision.setObjectClass(new ObjectClass(provisionTO.getObjectClass()));
+
+            if (provisionTO.getSyncToken() == null) {
+                provision.setSyncToken(null);
+            }
+
+            if (provisionTO.getMapping() == null) {
+                provision.setMapping(null);
+            } else {
+                Mapping mapping = entityFactory.newEntity(Mapping.class);
+                mapping.setProvision(provision);
+                provision.setMapping(mapping);
+                populateMapping(provisionTO.getMapping(), mapping, entityFactory.newEntity(MappingItem.class));
+            }
         }
 
         resource.setCreateTraceLevel(resourceTO.getCreateTraceLevel());
@@ -140,13 +154,6 @@ public class ResourceDataBinderImpl implements ResourceDataBinder {
 
         resource.setConnInstanceConfiguration(new HashSet<>(resourceTO.getConnConfProperties()));
 
-        if (resourceTO.getUsyncToken() == null) {
-            resource.setUsyncToken(null);
-        }
-        if (resourceTO.getRsyncToken() == null) {
-            resource.setRsyncToken(null);
-        }
-
         resource.getPropagationActionsClassNames().clear();
         resource.getPropagationActionsClassNames().addAll(resourceTO.getPropagationActionsClassNames());
 
@@ -155,16 +162,14 @@ public class ResourceDataBinderImpl implements ResourceDataBinder {
 
     @SuppressWarnings({ "unchecked", "rawtypes" })
     private void populateMapping(final MappingTO mappingTO, final Mapping mapping, final MappingItem prototype) {
-        mapping.setAccountLink(mappingTO.getAccountLink());
+        mapping.setConnObjectLink(mappingTO.getConnObjectLink());
 
         for (MappingItem item : getMappingItems(mappingTO.getItems(), prototype)) {
             item.setMapping(mapping);
-            if (item.isAccountid()) {
-                mapping.setAccountIdItem(item);
-            } else if (item.isPassword()) {
-                ((UMapping) mapping).setPasswordItem((UMappingItem) item);
+            if (item.isConnObjectKey()) {
+                mapping.setConnObjectKeyItem(item);
             } else {
-                mapping.addItem(item);
+                mapping.add(item);
             }
         }
     }
@@ -233,8 +238,8 @@ public class ResourceDataBinderImpl implements ResourceDataBinder {
         return connRegistry.getOverriddenConnInstance(connInstanceClone, resourceTO.getConnConfProperties());
     }
 
-    private void populateMappingTO(final Mapping<?> mapping, final MappingTO mappingTO) {
-        mappingTO.setAccountLink(mapping.getAccountLink());
+    private void populateMappingTO(final Mapping mapping, final MappingTO mappingTO) {
+        mappingTO.setConnObjectLink(mapping.getConnObjectLink());
 
         for (MappingItem item : mapping.getItems()) {
             MappingItemTO itemTO = new MappingItemTO();
@@ -242,11 +247,9 @@ public class ResourceDataBinderImpl implements ResourceDataBinder {
             BeanUtils.copyProperties(item, itemTO, MAPPINGITEM_IGNORE_PROPERTIES);
 
             if (itemTO.isAccountid()) {
-                mappingTO.setAccountIdItem(itemTO);
-            } else if (itemTO.isPassword()) {
-                mappingTO.setPasswordItem(itemTO);
+                mappingTO.setConnObjectKeyItem(itemTO);
             } else {
-                mappingTO.addItem(itemTO);
+                mappingTO.add(itemTO);
             }
         }
     }
@@ -274,16 +277,19 @@ public class ResourceDataBinderImpl implements ResourceDataBinder {
         resourceTO.setConnectorId(connector == null ? null : connector.getKey());
         resourceTO.setConnectorDisplayName(connector == null ? null : connector.getDisplayName());
 
-        // set the mappings
-        if (resource.getUmapping() != null) {
-            MappingTO mappingTO = new MappingTO();
-            resourceTO.setUmapping(mappingTO);
-            populateMappingTO(resource.getUmapping(), mappingTO);
-        }
-        if (resource.getGmapping() != null) {
-            MappingTO mappingTO = new MappingTO();
-            resourceTO.setGmapping(mappingTO);
-            populateMappingTO(resource.getGmapping(), mappingTO);
+        // set the provision information
+        for (Provision provision : resource.getProvisions()) {
+            ProvisionTO provisionTO = new ProvisionTO();
+            provisionTO.setKey(provision.getKey());
+            provisionTO.setAnyType(provision.getAnyType().getKey());
+            provisionTO.setObjectClass(provision.getObjectClass().getObjectClassValue());
+            provisionTO.setSyncToken(provision.getSerializedSyncToken());
+
+            if (provision.getMapping() != null) {
+                MappingTO mappingTO = new MappingTO();
+                provisionTO.setMapping(mappingTO);
+                populateMappingTO(provision.getMapping(), mappingTO);
+            }
         }
 
         resourceTO.setEnforceMandatoryCondition(resource.isEnforceMandatoryCondition());
@@ -312,9 +318,6 @@ public class ResourceDataBinderImpl implements ResourceDataBinder {
 
         resourceTO.getConnConfProperties().addAll(resource.getConnInstanceConfiguration());
 
-        resourceTO.setUsyncToken(resource.getSerializedUSyncToken());
-        resourceTO.setRsyncToken(resource.getSerializedRSyncToken());
-
         resourceTO.getPropagationActionsClassNames().addAll(resource.getPropagationActionsClassNames());
 
         return resourceTO;

http://git-wip-us.apache.org/repos/asf/syncope/blob/081d9a04/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 2f4fd2d..b286043 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
@@ -26,10 +26,10 @@ import org.apache.syncope.common.lib.types.ClientExceptionType;
 import org.apache.syncope.core.misc.search.SearchCondConverter;
 import org.apache.syncope.core.persistence.api.dao.RealmDAO;
 import org.apache.syncope.core.persistence.api.dao.search.SearchCond;
-import org.apache.syncope.core.persistence.api.entity.DynRoleMembership;
 import org.apache.syncope.core.persistence.api.entity.EntityFactory;
 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.DynRoleMembership;
 import org.apache.syncope.core.provisioning.api.data.RoleDataBinder;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -101,7 +101,7 @@ public class RoleDataBinderImpl implements RoleDataBinder {
             } else if (role.getDynMembership() != null && roleTO.getDynMembershipCond() != null
                     && !role.getDynMembership().getFIQLCond().equals(roleTO.getDynMembershipCond())) {
 
-                role.getDynMembership().getUsers().clear();
+                role.getDynMembership().getMembers().clear();
                 setDynMembership(role, roleTO.getDynMembershipCond());
             }
         }

http://git-wip-us.apache.org/repos/asf/syncope/blob/081d9a04/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/SchemaDataBinderImpl.java
----------------------------------------------------------------------
diff --git a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/SchemaDataBinderImpl.java b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/SchemaDataBinderImpl.java
index 0a34e61..e44198b 100644
--- a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/SchemaDataBinderImpl.java
+++ b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/SchemaDataBinderImpl.java
@@ -19,22 +19,22 @@
 package org.apache.syncope.core.provisioning.java.data;
 
 import org.apache.syncope.core.provisioning.api.data.SchemaDataBinder;
-import java.util.List;
 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.to.DerSchemaTO;
 import org.apache.syncope.common.lib.to.PlainSchemaTO;
 import org.apache.syncope.common.lib.to.VirSchemaTO;
+import org.apache.syncope.common.lib.types.AnyTypeKind;
 import org.apache.syncope.common.lib.types.ClientExceptionType;
 import org.apache.syncope.core.persistence.api.dao.PlainSchemaDAO;
-import org.apache.syncope.core.persistence.api.entity.AttributableUtils;
 import org.apache.syncope.core.persistence.api.entity.DerSchema;
-import org.apache.syncope.core.persistence.api.entity.PlainAttr;
 import org.apache.syncope.core.persistence.api.entity.PlainSchema;
 import org.apache.syncope.core.persistence.api.entity.VirSchema;
 import org.apache.syncope.core.misc.spring.BeanUtils;
 import org.apache.syncope.core.misc.jexl.JexlUtils;
+import org.apache.syncope.core.persistence.api.entity.AnyUtils;
+import org.apache.syncope.core.persistence.api.entity.AnyUtilsFactory;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
 
@@ -44,6 +44,9 @@ public class SchemaDataBinderImpl implements SchemaDataBinder {
     @Autowired
     private PlainSchemaDAO schemaDAO;
 
+    @Autowired
+    private AnyUtilsFactory anyUtilsFactory;
+
     // --------------- PLAIN -----------------
     private <T extends PlainSchema> void fill(final T schema, final PlainSchemaTO schemaTO) {
         if (!JexlUtils.isExpressionValid(schemaTO.getMandatoryCondition())) {
@@ -61,13 +64,16 @@ public class SchemaDataBinderImpl implements SchemaDataBinder {
     }
 
     @Override
-    public <T extends PlainSchema> void update(final PlainSchemaTO schemaTO, final T schema,
-            final AttributableUtils attributableUtil) {
-
+    public <T extends PlainSchema> void update(final PlainSchemaTO schemaTO, final T schema) {
         SyncopeClientCompositeException scce = SyncopeClientException.buildComposite();
 
-        List<PlainAttr> attrs = schemaDAO.findAttrs(schema, attributableUtil.plainAttrClass());
-        if (!attrs.isEmpty()) {
+        boolean hasAttrs = false;
+        for (AnyTypeKind anyTypeKind : AnyTypeKind.values()) {
+            AnyUtils anyUtils = anyUtilsFactory.getInstance(anyTypeKind);
+            hasAttrs &= schemaDAO.findAttrs(schema, anyUtils.plainAttrClass()).isEmpty();
+        }
+
+        if (hasAttrs) {
             if (schema.getType() != schemaTO.getType()) {
                 SyncopeClientException e = SyncopeClientException.build(ClientExceptionType.InvalidPlainSchema);
                 e.getElements().add("Cannot change type since " + schema.getKey() + " has attributes");
@@ -90,9 +96,7 @@ public class SchemaDataBinderImpl implements SchemaDataBinder {
     }
 
     @Override
-    public <T extends PlainSchema> PlainSchemaTO getPlainSchemaTO(
-            final T schema, final AttributableUtils attributableUtil) {
-
+    public <T extends PlainSchema> PlainSchemaTO getPlainSchemaTO(final T schema) {
         PlainSchemaTO schemaTO = new PlainSchemaTO();
         BeanUtils.copyProperties(schema, schemaTO);
 

http://git-wip-us.apache.org/repos/asf/syncope/blob/081d9a04/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/TaskDataBinderImpl.java
----------------------------------------------------------------------
diff --git a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/TaskDataBinderImpl.java b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/TaskDataBinderImpl.java
index 9fe733e..c25b3ed 100644
--- a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/TaskDataBinderImpl.java
+++ b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/TaskDataBinderImpl.java
@@ -18,14 +18,14 @@
  */
 package org.apache.syncope.core.provisioning.java.data;
 
+import java.util.Map;
 import org.apache.syncope.core.provisioning.api.data.TaskDataBinder;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.syncope.common.lib.SyncopeClientException;
-import org.apache.syncope.common.lib.to.AbstractAttributableTO;
 import org.apache.syncope.common.lib.to.AbstractProvisioningTaskTO;
 import org.apache.syncope.common.lib.to.AbstractTaskTO;
+import org.apache.syncope.common.lib.to.AnyTO;
 import org.apache.syncope.common.lib.to.AttrTO;
-import org.apache.syncope.common.lib.to.MembershipTO;
 import org.apache.syncope.common.lib.to.PropagationTaskTO;
 import org.apache.syncope.common.lib.to.PushTaskTO;
 import org.apache.syncope.common.lib.to.GroupTO;
@@ -40,7 +40,6 @@ import org.apache.syncope.common.lib.types.UnmatchingRule;
 import org.apache.syncope.core.persistence.api.dao.ExternalResourceDAO;
 import org.apache.syncope.core.persistence.api.dao.NotFoundException;
 import org.apache.syncope.core.persistence.api.dao.TaskExecDAO;
-import org.apache.syncope.core.persistence.api.entity.ExternalResource;
 import org.apache.syncope.core.persistence.api.entity.task.NotificationTask;
 import org.apache.syncope.core.persistence.api.entity.task.PropagationTask;
 import org.apache.syncope.core.persistence.api.entity.task.ProvisioningTask;
@@ -53,7 +52,13 @@ import org.apache.syncope.core.persistence.api.entity.task.TaskUtils;
 import org.apache.syncope.core.provisioning.api.job.JobNamer;
 import org.apache.syncope.core.misc.spring.BeanUtils;
 import org.apache.syncope.core.misc.jexl.JexlUtils;
+import org.apache.syncope.core.persistence.api.dao.AnyTypeDAO;
 import org.apache.syncope.core.persistence.api.dao.RealmDAO;
+import org.apache.syncope.core.persistence.api.entity.AnyType;
+import org.apache.syncope.core.persistence.api.entity.EntityFactory;
+import org.apache.syncope.core.persistence.api.entity.resource.ExternalResource;
+import org.apache.syncope.core.persistence.api.entity.task.AnyFilter;
+import org.apache.syncope.core.persistence.api.entity.task.AnyTemplate;
 import org.quartz.Scheduler;
 import org.quartz.SchedulerException;
 import org.quartz.Trigger;
@@ -87,16 +92,22 @@ public class TaskDataBinderImpl implements TaskDataBinder {
     private TaskExecDAO taskExecDAO;
 
     @Autowired
+    private AnyTypeDAO anyTypeDAO;
+
+    @Autowired
+    private EntityFactory entityFactory;
+
+    @Autowired
     private SchedulerFactoryBean scheduler;
 
-    private void checkJexl(final AbstractAttributableTO attributableTO, final SyncopeClientException sce) {
-        for (AttrTO attrTO : attributableTO.getPlainAttrs()) {
+    private void checkJexl(final AnyTO anyTO, final SyncopeClientException sce) {
+        for (AttrTO attrTO : anyTO.getPlainAttrs()) {
             if (!attrTO.getValues().isEmpty() && !JexlUtils.isExpressionValid(attrTO.getValues().get(0))) {
                 sce.getElements().add("Invalid JEXL: " + attrTO.getValues().get(0));
             }
         }
 
-        for (AttrTO attrTO : attributableTO.getVirAttrs()) {
+        for (AttrTO attrTO : anyTO.getVirAttrs()) {
             if (!attrTO.getValues().isEmpty() && !JexlUtils.isExpressionValid(attrTO.getValues().get(0))) {
                 sce.getElements().add("Invalid JEXL: " + attrTO.getValues().get(0));
             }
@@ -105,11 +116,17 @@ public class TaskDataBinderImpl implements TaskDataBinder {
 
     private void fill(final ProvisioningTask task, final AbstractProvisioningTaskTO taskTO) {
         if (task instanceof PushTask && taskTO instanceof PushTaskTO) {
-            final PushTask pushTask = (PushTask) task;
-            final PushTaskTO pushTaskTO = (PushTaskTO) taskTO;
+            PushTask pushTask = (PushTask) task;
+            PushTaskTO pushTaskTO = (PushTaskTO) taskTO;
+
+            for (Map.Entry<String, String> entry : pushTaskTO.getFilters().entrySet()) {
+                AnyFilter filter = entityFactory.newEntity(AnyFilter.class);
+                filter.setAnyType(anyTypeDAO.find(entry.getKey()));
+                filter.set(entry.getValue());
 
-            pushTask.setUserFilter(pushTaskTO.getUserFilter());
-            pushTask.setGroupFilter(pushTaskTO.getGroupFilter());
+                filter.setPushTask(pushTask);
+                pushTask.add(filter);
+            }
 
             pushTask.setMatchingRule(pushTaskTO.getMatchingRule() == null
                     ? MatchingRule.LINK : pushTaskTO.getMatchingRule());
@@ -131,42 +148,46 @@ public class TaskDataBinderImpl implements TaskDataBinder {
 
             SyncopeClientException sce = SyncopeClientException.build(ClientExceptionType.InvalidSyncTask);
             // 1. validate JEXL expressions in user and group templates
-            if (syncTaskTO.getUserTemplate() != null) {
-                UserTO template = syncTaskTO.getUserTemplate();
-
-                if (StringUtils.isNotBlank(template.getUsername())
-                        && !JexlUtils.isExpressionValid(template.getUsername())) {
-
-                    sce.getElements().add("Invalid JEXL: " + template.getUsername());
-                }
-                if (StringUtils.isNotBlank(template.getPassword())
-                        && !JexlUtils.isExpressionValid(template.getPassword())) {
-
-                    sce.getElements().add("Invalid JEXL: " + template.getPassword());
-                }
-
-                checkJexl(template, sce);
-
-                for (MembershipTO memb : template.getMemberships()) {
-                    checkJexl(memb, sce);
+            for (Map.Entry<String, AnyTO> entry : syncTaskTO.getTemplates().entrySet()) {
+                checkJexl(entry.getValue(), sce);
+
+                if (entry.getValue() instanceof UserTO) {
+                    UserTO template = (UserTO) entry.getValue();
+                    if (StringUtils.isNotBlank(template.getUsername())
+                            && !JexlUtils.isExpressionValid(template.getUsername())) {
+
+                        sce.getElements().add("Invalid JEXL: " + template.getUsername());
+                    }
+                    if (StringUtils.isNotBlank(template.getPassword())
+                            && !JexlUtils.isExpressionValid(template.getPassword())) {
+
+                        sce.getElements().add("Invalid JEXL: " + template.getPassword());
+                    }
+                } else if (entry.getValue() instanceof GroupTO) {
+                    GroupTO template = (GroupTO) entry.getValue();
+                    if (StringUtils.isNotBlank(template.getName())
+                            && !JexlUtils.isExpressionValid(template.getName())) {
+
+                        sce.getElements().add("Invalid JEXL: " + template.getName());
+                    }
                 }
             }
-            if (syncTaskTO.getGroupTemplate() != null) {
-                GroupTO template = syncTaskTO.getGroupTemplate();
-
-                if (StringUtils.isNotBlank(template.getName()) && !JexlUtils.isExpressionValid(template.getName())) {
-                    sce.getElements().add("Invalid JEXL: " + template.getName());
-                }
-
-                checkJexl(template, sce);
-            }
             if (!sce.isEmpty()) {
                 throw sce;
             }
 
             // 2. all JEXL expressions are valid: accept user and group templates
-            syncTask.setUserTemplate(syncTaskTO.getUserTemplate());
-            syncTask.setGroupTemplate(syncTaskTO.getGroupTemplate());
+            for (Map.Entry<String, AnyTO> entry : syncTaskTO.getTemplates().entrySet()) {
+                AnyType type = anyTypeDAO.find(entry.getKey());
+                if (type != null) {
+                    AnyTemplate anyTemplate = entityFactory.newEntity(AnyTemplate.class);
+                    anyTemplate.setAnyType(type);
+                    anyTemplate.set(entry.getValue());
+                    anyTemplate.setSyncTask(syncTask);
+
+                    syncTask.add(anyTemplate);
+                }
+            }
 
             syncTask.setFullReconciliation(syncTaskTO.isFullReconciliation());
         }
@@ -176,12 +197,16 @@ public class TaskDataBinderImpl implements TaskDataBinder {
         task.setPerformUpdate(taskTO.isPerformUpdate());
         task.setPerformDelete(taskTO.isPerformDelete());
         task.setSyncStatus(taskTO.isSyncStatus());
-        task.getActionsClassNames().clear();
-        task.getActionsClassNames().addAll(taskTO.getActionsClassNames());
+        task.getActionsClassNames()
+                .clear();
+        task.getActionsClassNames()
+                .addAll(taskTO.getActionsClassNames());
     }
 
     @Override
-    public SchedTask createSchedTask(final SchedTaskTO taskTO, final TaskUtils taskUtils) {
+    public SchedTask createSchedTask(final SchedTaskTO taskTO,
+            final TaskUtils taskUtils
+    ) {
         final Class<? extends AbstractTaskTO> taskTOClass = taskUtils.taskTOClass();
 
         if (taskTOClass == null || !taskTOClass.equals(taskTO.getClass())) {
@@ -212,7 +237,10 @@ public class TaskDataBinderImpl implements TaskDataBinder {
     }
 
     @Override
-    public void updateSchedTask(final SchedTask task, final SchedTaskTO taskTO, final TaskUtils taskUtils) {
+    public void updateSchedTask(final SchedTask task,
+            final SchedTaskTO taskTO,
+            final TaskUtils taskUtils
+    ) {
         Class<? extends Task> taskClass = taskUtils.taskClass();
         Class<? extends AbstractTaskTO> taskTOClass = taskUtils.taskTOClass();
 
@@ -240,7 +268,8 @@ public class TaskDataBinderImpl implements TaskDataBinder {
     }
 
     @Override
-    public TaskExecTO getTaskExecTO(final TaskExec execution) {
+    public TaskExecTO getTaskExecTO(final TaskExec execution
+    ) {
         TaskExecTO executionTO = new TaskExecTO();
         BeanUtils.copyProperties(execution, executionTO, IGNORE_TASK_EXECUTION_PROPERTIES);
 

http://git-wip-us.apache.org/repos/asf/syncope/blob/081d9a04/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 317fce2..e7ec3cd 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
@@ -19,7 +19,6 @@
 package org.apache.syncope.core.provisioning.java.data;
 
 import java.util.Collection;
-import java.util.Collections;
 import java.util.Date;
 import java.util.HashSet;
 import java.util.Map;
@@ -31,24 +30,15 @@ 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.mod.MembershipMod;
 import org.apache.syncope.common.lib.mod.UserMod;
 import org.apache.syncope.common.lib.to.MembershipTO;
 import org.apache.syncope.common.lib.to.UserTO;
-import org.apache.syncope.common.lib.types.AttributableType;
+import org.apache.syncope.common.lib.types.AnyTypeKind;
 import org.apache.syncope.common.lib.types.CipherAlgorithm;
 import org.apache.syncope.common.lib.types.ClientExceptionType;
 import org.apache.syncope.common.lib.types.ResourceOperation;
 import org.apache.syncope.core.persistence.api.dao.ConfDAO;
 import org.apache.syncope.core.persistence.api.dao.SecurityQuestionDAO;
-import org.apache.syncope.core.persistence.api.entity.DerAttr;
-import org.apache.syncope.core.persistence.api.entity.ExternalResource;
-import org.apache.syncope.core.persistence.api.entity.PlainAttr;
-import org.apache.syncope.core.persistence.api.entity.VirAttr;
-import org.apache.syncope.core.persistence.api.entity.membership.MDerAttr;
-import org.apache.syncope.core.persistence.api.entity.membership.MPlainAttr;
-import org.apache.syncope.core.persistence.api.entity.membership.MVirAttr;
-import org.apache.syncope.core.persistence.api.entity.membership.Membership;
 import org.apache.syncope.core.persistence.api.entity.group.Group;
 import org.apache.syncope.core.persistence.api.entity.user.SecurityQuestion;
 import org.apache.syncope.core.persistence.api.entity.user.User;
@@ -60,13 +50,14 @@ import org.apache.syncope.core.misc.spring.BeanUtils;
 import org.apache.syncope.core.misc.ConnObjectUtils;
 import org.apache.syncope.core.persistence.api.dao.RoleDAO;
 import org.apache.syncope.core.persistence.api.entity.Role;
+import org.apache.syncope.core.persistence.api.entity.user.UMembership;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
 import org.springframework.transaction.annotation.Transactional;
 
 @Component
 @Transactional(rollbackFor = { Throwable.class })
-public class UserDataBinderImpl extends AbstractAttributableDataBinder implements UserDataBinder {
+public class UserDataBinderImpl extends AbstractAnyDataBinder implements UserDataBinder {
 
     private static final String[] IGNORE_USER_PROPERTIES = {
         "realm", "roles", "memberships", "plainAttrs", "derAttrs", "virAttrs", "resources",
@@ -118,7 +109,7 @@ public class UserDataBinderImpl extends AbstractAttributableDataBinder implement
     @Transactional(readOnly = true)
     @Override
     public boolean verifyPassword(final String username, final String password) {
-        return verifyPassword(userDAO.authFetch(username), password);
+        return verifyPassword(userDAO.authFind(username), password);
     }
 
     @Transactional(readOnly = true)
@@ -153,40 +144,35 @@ public class UserDataBinderImpl extends AbstractAttributableDataBinder implement
             if (role == null) {
                 LOG.warn("Ignoring unknown role with id {}", roleKey);
             } else {
-                user.addRole(role);
+                user.add(role);
             }
         }
 
         // memberships
-        Group group;
         for (MembershipTO membershipTO : userTO.getMemberships()) {
-            group = groupDAO.find(membershipTO.getGroupKey());
+            Group group = groupDAO.find(membershipTO.getRightKey());
 
             if (group == null) {
                 if (LOG.isDebugEnabled()) {
                     LOG.debug("Ignoring invalid group " + membershipTO.getGroupName());
                 }
             } else {
-                Membership membership = null;
+                UMembership membership = null;
                 if (user.getKey() != null) {
-                    membership = user.getMembership(group.getKey()) == null
-                            ? membershipDAO.find(user, group)
-                            : user.getMembership(group.getKey());
+                    membership = user.getMembership(group.getKey());
                 }
                 if (membership == null) {
-                    membership = entityFactory.newEntity(Membership.class);
-                    membership.setGroup(group);
-                    membership.setUser(user);
+                    membership = entityFactory.newEntity(UMembership.class);
+                    membership.setRightEnd(group);
+                    membership.setLeftEnd(user);
 
-                    user.addMembership(membership);
+                    user.add(membership);
                 }
-
-                fill(membership, membershipTO, attrUtilsFactory.getInstance(AttributableType.MEMBERSHIP), scce);
             }
         }
 
         // realm, attributes, derived attributes, virtual attributes and resources
-        fill(user, userTO, attrUtilsFactory.getInstance(AttributableType.USER), scce);
+        fill(user, userTO, anyUtilsFactory.getInstance(AnyTypeKind.USER), scce);
 
         // set password
         if (StringUtils.isBlank(userTO.getPassword()) || !storePassword) {
@@ -228,7 +214,7 @@ public class UserDataBinderImpl extends AbstractAttributableDataBinder implement
         Collection<String> currentResources = userDAO.findAllResourceNames(user);
 
         // fetch account ids before update
-        Map<String, String> oldAccountIds = getAccountIds(user, AttributableType.USER);
+        Map<String, String> oldConnObjectKeys = getConnObjectKeys(user);
 
         // realm
         setRealm(user, userMod);
@@ -272,7 +258,7 @@ public class UserDataBinderImpl extends AbstractAttributableDataBinder implement
                 if (role == null) {
                     LOG.warn("Ignoring unknown role with id {}", roleKey);
                 } else {
-                    user.removeRole(role);
+                    user.remove(role);
                 }
             }
         });
@@ -284,100 +270,57 @@ public class UserDataBinderImpl extends AbstractAttributableDataBinder implement
                 if (role == null) {
                     LOG.warn("Ignoring unknown role with id {}", roleKey);
                 } else {
-                    user.addRole(role);
+                    user.add(role);
                 }
             }
         });
 
         // attributes, derived attributes, virtual attributes and resources
-        propByRes.merge(fill(user, userMod, attrUtilsFactory.getInstance(AttributableType.USER), scce));
+        propByRes.merge(fill(user, userMod, anyUtilsFactory.getInstance(AnyTypeKind.USER), scce));
 
         // store the group ids of membership required to be added
-        Set<Long> membershipToBeAddedGroupKeys = CollectionUtils.collect(userMod.getMembershipsToAdd(),
-                new Transformer<MembershipMod, Long>() {
-
-                    @Override
-                    public Long transform(final MembershipMod membToBeAdded) {
-                        return membToBeAdded.getGroup();
-                    }
-                }, new HashSet<Long>());
+        Set<Long> membershipToBeAddedGroupKeys = new HashSet<>(userMod.getMembershipsToAdd());
 
         final Set<String> toBeDeprovisioned = new HashSet<>();
         final Set<String> toBeProvisioned = new HashSet<>();
 
         // memberships to be removed
-        for (Long membKey : userMod.getMembershipsToRemove()) {
-            LOG.debug("Membership to be removed: {}", membKey);
+        for (Long groupKey : userMod.getMembershipsToRemove()) {
+            LOG.debug("Membership to be removed for group {}", groupKey);
 
-            Membership membership = membershipDAO.find(membKey);
+            UMembership membership = user.getMembership(groupKey);
             if (membership == null) {
-                LOG.warn("Invalid membership id specified to be removed: {}", membKey);
+                LOG.warn("Invalid group key specified for membership to be removed: {}", groupKey);
             } else {
-                if (!membershipToBeAddedGroupKeys.contains(membership.getGroup().getKey())) {
-                    toBeDeprovisioned.addAll(membership.getGroup().getResourceNames());
+                if (!membershipToBeAddedGroupKeys.contains(membership.getRightEnd().getKey())) {
+                    toBeDeprovisioned.addAll(membership.getRightEnd().getResourceNames());
                 }
 
-                // In order to make the removeMembership() below to work,
-                // we need to be sure to take exactly the same membership
-                // of the user object currently in memory (which has potentially
-                // some modifications compared to the one stored in the DB
-                membership = user.getMembership(membership.getGroup().getKey());
-                if (membershipToBeAddedGroupKeys.contains(membership.getGroup().getKey())) {
-                    Set<Long> attrKeys = new HashSet<>(membership.getPlainAttrs().size());
-                    for (PlainAttr plainAttr : membership.getPlainAttrs()) {
-                        attrKeys.add(plainAttr.getKey());
-                    }
-                    for (Long attrKey : attrKeys) {
-                        plainAttrDAO.delete(attrKey, MPlainAttr.class);
-                    }
-                    attrKeys.clear();
-
-                    // remove derived attributes
-                    for (DerAttr derAttr : membership.getDerAttrs()) {
-                        attrKeys.add(derAttr.getKey());
-                    }
-                    for (Long derAttrId : attrKeys) {
-                        derAttrDAO.delete(derAttrId, MDerAttr.class);
-                    }
-                    attrKeys.clear();
-
-                    // remove virtual attributes
-                    for (VirAttr virAttr : membership.getVirAttrs()) {
-                        attrKeys.add(virAttr.getKey());
-                    }
-                    for (Long virAttrId : attrKeys) {
-                        virAttrDAO.delete(virAttrId, MVirAttr.class);
-                    }
-                    attrKeys.clear();
+                if (!membershipToBeAddedGroupKeys.contains(membership.getRightEnd().getKey())) {
                 } else {
-                    user.removeMembership(membership);
-
-                    membershipDAO.delete(membKey);
+                    user.remove(membership);
                 }
             }
         }
 
         // memberships to be added
-        for (MembershipMod membershipMod : userMod.getMembershipsToAdd()) {
-            LOG.debug("Membership to be added: group({})", membershipMod.getGroup());
+        for (Long groupKey : userMod.getMembershipsToAdd()) {
+            LOG.debug("Membership to be added for group {}", groupKey);
 
-            Group group = groupDAO.find(membershipMod.getGroup());
+            Group group = groupDAO.find(groupKey);
             if (group == null) {
-                LOG.debug("Ignoring invalid group {}", membershipMod.getGroup());
+                LOG.debug("Ignoring invalid group {}", groupKey);
             } else {
-                Membership membership = user.getMembership(group.getKey());
+                UMembership membership = user.getMembership(group.getKey());
                 if (membership == null) {
-                    membership = entityFactory.newEntity(Membership.class);
-                    membership.setGroup(group);
-                    membership.setUser(user);
+                    membership = entityFactory.newEntity(UMembership.class);
+                    membership.setRightEnd(group);
+                    membership.setLeftEnd(user);
 
-                    user.addMembership(membership);
+                    user.add(membership);
 
                     toBeProvisioned.addAll(group.getResourceNames());
                 }
-
-                propByRes.merge(fill(membership, membershipMod,
-                        attrUtilsFactory.getInstance(AttributableType.MEMBERSHIP), scce));
             }
         }
 
@@ -394,8 +337,8 @@ public class UserDataBinderImpl extends AbstractAttributableDataBinder implement
         }
 
         // check if some account id was changed by the update above
-        Map<String, String> newAccountIds = getAccountIds(user, AttributableType.USER);
-        for (Map.Entry<String, String> entry : oldAccountIds.entrySet()) {
+        Map<String, String> newAccountIds = getConnObjectKeys(user);
+        for (Map.Entry<String, String> entry : oldConnObjectKeys.entrySet()) {
             if (newAccountIds.containsKey(entry.getKey())
                     && !entry.getValue().equals(newAccountIds.get(entry.getKey()))) {
 
@@ -418,29 +361,16 @@ public class UserDataBinderImpl extends AbstractAttributableDataBinder implement
             userTO.setSecurityQuestion(user.getSecurityQuestion().getKey());
         }
 
-        connObjectUtils.retrieveVirAttrValues(user, attrUtilsFactory.getInstance(AttributableType.USER));
+        connObjectUtils.retrieveVirAttrValues(user);
         fillTO(userTO, user.getRealm().getFullPath(),
                 user.getPlainAttrs(), user.getDerAttrs(), user.getVirAttrs(), userDAO.findAllResources(user));
 
-        for (Membership membership : user.getMemberships()) {
+        for (UMembership membership : user.getMemberships()) {
             MembershipTO membershipTO = new MembershipTO();
 
-            // set sys info
-            membershipTO.setCreator(membership.getCreator());
-            membershipTO.setCreationDate(membership.getCreationDate());
-            membershipTO.setLastModifier(membership.getLastModifier());
-            membershipTO.setLastChangeDate(membership.getLastChangeDate());
-
             membershipTO.setKey(membership.getKey());
-            membershipTO.setGroupKey(membership.getGroup().getKey());
-            membershipTO.setGroupName(membership.getGroup().getName());
-
-            // SYNCOPE-458 retrieve also membership virtual attributes
-            connObjectUtils.retrieveVirAttrValues(
-                    membership, attrUtilsFactory.getInstance(AttributableType.MEMBERSHIP));
-            fillTO(membershipTO, null,
-                    membership.getPlainAttrs(), membership.getDerAttrs(), membership.getVirAttrs(),
-                    Collections.<ExternalResource>emptyList());
+            membershipTO.setRightKey(membership.getRightEnd().getKey());
+            membershipTO.setGroupName(membership.getRightEnd().getName());
 
             userTO.getMemberships().add(membershipTO);
         }
@@ -467,13 +397,13 @@ public class UserDataBinderImpl extends AbstractAttributableDataBinder implement
     @Transactional(readOnly = true)
     @Override
     public UserTO getUserTO(final String username) {
-        return getUserTO(userDAO.authFetch(username));
+        return getUserTO(userDAO.authFind(username));
     }
 
     @Transactional(readOnly = true)
     @Override
     public UserTO getUserTO(final Long key) {
-        return getUserTO(userDAO.authFetch(key));
+        return getUserTO(userDAO.authFind(key));
     }
 
 }

http://git-wip-us.apache.org/repos/asf/syncope/blob/081d9a04/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/notification/NotificationManagerImpl.java
----------------------------------------------------------------------
diff --git a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/notification/NotificationManagerImpl.java b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/notification/NotificationManagerImpl.java
index 7153529..776b8db 100644
--- a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/notification/NotificationManagerImpl.java
+++ b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/notification/NotificationManagerImpl.java
@@ -30,26 +30,21 @@ import java.util.Set;
 import org.apache.syncope.common.lib.SyncopeConstants;
 import org.apache.syncope.common.lib.to.GroupTO;
 import org.apache.syncope.common.lib.to.UserTO;
-import org.apache.syncope.common.lib.types.AttributableType;
 import org.apache.syncope.common.lib.types.AuditElements;
 import org.apache.syncope.common.lib.types.AuditElements.Result;
 import org.apache.syncope.common.lib.types.AuditLoggerName;
 import org.apache.syncope.common.lib.types.IntMappingType;
-import org.apache.syncope.common.lib.types.SubjectType;
-import org.apache.syncope.common.lib.CollectionUtils2;
+import org.apache.syncope.common.lib.to.AnyObjectTO;
+import org.apache.syncope.common.lib.types.AnyTypeKind;
 import org.apache.syncope.core.persistence.api.dao.ConfDAO;
 import org.apache.syncope.core.persistence.api.dao.NotificationDAO;
 import org.apache.syncope.core.persistence.api.dao.GroupDAO;
-import org.apache.syncope.core.persistence.api.dao.SubjectSearchDAO;
 import org.apache.syncope.core.persistence.api.dao.TaskDAO;
 import org.apache.syncope.core.persistence.api.dao.UserDAO;
 import org.apache.syncope.core.persistence.api.dao.search.OrderByClause;
-import org.apache.syncope.core.persistence.api.entity.Attributable;
-import org.apache.syncope.core.persistence.api.entity.AttributableUtilsFactory;
 import org.apache.syncope.core.persistence.api.entity.EntityFactory;
 import org.apache.syncope.core.persistence.api.entity.Notification;
 import org.apache.syncope.core.persistence.api.entity.PlainAttr;
-import org.apache.syncope.core.persistence.api.entity.Subject;
 import org.apache.syncope.core.persistence.api.entity.group.Group;
 import org.apache.syncope.core.persistence.api.entity.task.NotificationTask;
 import org.apache.syncope.core.persistence.api.entity.task.TaskExec;
@@ -61,6 +56,12 @@ import org.apache.syncope.core.provisioning.api.data.GroupDataBinder;
 import org.apache.syncope.core.provisioning.api.data.UserDataBinder;
 import org.apache.syncope.core.misc.ConnObjectUtils;
 import org.apache.syncope.core.misc.search.SearchCondConverter;
+import org.apache.syncope.core.persistence.api.dao.AnyObjectDAO;
+import org.apache.syncope.core.persistence.api.dao.AnySearchDAO;
+import org.apache.syncope.core.persistence.api.entity.Any;
+import org.apache.syncope.core.persistence.api.entity.AnyAbout;
+import org.apache.syncope.core.persistence.api.entity.AnyType;
+import org.apache.syncope.core.persistence.api.entity.AnyUtilsFactory;
 import org.apache.velocity.VelocityContext;
 import org.apache.velocity.app.VelocityEngine;
 import org.apache.velocity.context.Context;
@@ -100,6 +101,12 @@ public class NotificationManagerImpl implements NotificationManager {
     private ConfDAO confDAO;
 
     /**
+     * AnyObject DAO.
+     */
+    @Autowired
+    private AnyObjectDAO anyObjectDAO;
+
+    /**
      * User DAO.
      */
     @Autowired
@@ -112,10 +119,10 @@ public class NotificationManagerImpl implements NotificationManager {
     private GroupDAO groupDAO;
 
     /**
-     * User Search DAO.
+     * Search DAO.
      */
     @Autowired
-    private SubjectSearchDAO searchDAO;
+    private AnySearchDAO searchDAO;
 
     /**
      * Task DAO.
@@ -148,7 +155,7 @@ public class NotificationManagerImpl implements NotificationManager {
     private EntityFactory entityFactory;
 
     @Autowired
-    private AttributableUtilsFactory attrUtilsFactory;
+    private AnyUtilsFactory anyUtilsFactory;
 
     @Transactional(readOnly = true)
     @Override
@@ -160,19 +167,17 @@ public class NotificationManagerImpl implements NotificationManager {
      * Create a notification task.
      *
      * @param notification notification to take as model
-     * @param attributable the user this task is about
+     * @param any the any object this task is about
      * @param model Velocity model
      * @return notification task, fully populated
      */
     private NotificationTask getNotificationTask(
             final Notification notification,
-            final Attributable<?, ?, ?> attributable,
+            final Any<?, ?, ?> any,
             final Map<String, Object> model) {
 
-        if (attributable != null) {
-            connObjectUtils.retrieveVirAttrValues(attributable,
-                    attrUtilsFactory.getInstance(
-                            attributable instanceof User ? AttributableType.USER : AttributableType.GROUP));
+        if (any != null) {
+            connObjectUtils.retrieveVirAttrValues(any);
         }
 
         final List<User> recipients = new ArrayList<>();
@@ -180,17 +185,17 @@ public class NotificationManagerImpl implements NotificationManager {
         if (notification.getRecipients() != null) {
             recipients.addAll(searchDAO.<User>search(SyncopeConstants.FULL_ADMIN_REALMS,
                     SearchCondConverter.convert(notification.getRecipients()),
-                    Collections.<OrderByClause>emptyList(), SubjectType.USER));
+                    Collections.<OrderByClause>emptyList(), AnyTypeKind.USER));
         }
 
-        if (notification.isSelfAsRecipient() && attributable instanceof User) {
-            recipients.add((User) attributable);
+        if (notification.isSelfAsRecipient() && any instanceof User) {
+            recipients.add((User) any);
         }
 
         final Set<String> recipientEmails = new HashSet<>();
         final List<UserTO> recipientTOs = new ArrayList<>(recipients.size());
         for (User recipient : recipients) {
-            connObjectUtils.retrieveVirAttrValues(recipient, attrUtilsFactory.getInstance(AttributableType.USER));
+            connObjectUtils.retrieveVirAttrValues(recipient);
 
             String email = getRecipientEmail(notification.getRecipientAttrType(),
                     notification.getRecipientAttrName(), recipient);
@@ -266,42 +271,42 @@ public class NotificationManagerImpl implements NotificationManager {
             final Object output,
             final Object... input) {
 
-        SubjectType subjectType = null;
-        Subject<?, ?, ?> subject = null;
+        Any<?, ?, ?> any = null;
 
         if (before instanceof UserTO) {
-            subjectType = SubjectType.USER;
-            subject = userDAO.find(((UserTO) before).getKey());
+            any = userDAO.find(((UserTO) before).getKey());
         } else if (output instanceof UserTO) {
-            subjectType = SubjectType.USER;
-            subject = userDAO.find(((UserTO) output).getKey());
+            any = userDAO.find(((UserTO) output).getKey());
+        } else if (before instanceof AnyObjectTO) {
+            any = anyObjectDAO.find(((AnyObjectTO) before).getKey());
+        } else if (output instanceof AnyObjectTO) {
+            any = anyObjectDAO.find(((AnyObjectTO) output).getKey());
         } else if (before instanceof GroupTO) {
-            subjectType = SubjectType.GROUP;
-            subject = groupDAO.find(((GroupTO) before).getKey());
+            any = groupDAO.find(((GroupTO) before).getKey());
         } else if (output instanceof GroupTO) {
-            subjectType = SubjectType.GROUP;
-            subject = groupDAO.find(((GroupTO) output).getKey());
+            any = groupDAO.find(((GroupTO) output).getKey());
         }
 
-        LOG.debug("Search notification for [{}]{}", subjectType, subject);
+        AnyType anyType = any == null ? null : any.getType();
+        LOG.debug("Search notification for [{}]{}", anyType, any);
 
         for (Notification notification : notificationDAO.findAll()) {
-            LOG.debug("Notification available user about {}", notification.getUserAbout());
-            LOG.debug("Notification available group about {}", notification.getGroupAbout());
+            if (LOG.isDebugEnabled()) {
+                for (AnyAbout about : notification.getAbouts()) {
+                    LOG.debug("Notification about {} defined: {}", about.getAnyType(), about.get());
+                }
+            }
 
             if (notification.isActive()) {
                 String currentEvent = AuditLoggerName.buildEvent(type, category, subcategory, event, condition);
                 if (!notification.getEvents().contains(currentEvent)) {
-                    LOG.debug("No events found about {}", subject);
-                } else if (subjectType == null || subject == null
-                        || (subjectType == SubjectType.USER && (notification.getUserAbout() == null
-                        || searchDAO.matches(subject,
-                                SearchCondConverter.convert(notification.getUserAbout()), subjectType)))
-                        || subjectType == SubjectType.GROUP && (notification.getGroupAbout() == null
-                        || searchDAO.matches(subject,
-                                SearchCondConverter.convert(notification.getGroupAbout()), subjectType))) {
+                    LOG.debug("No events found about {}", any);
+                } else if (anyType == null || any == null
+                        || notification.getAbout(anyType) == null
+                        || searchDAO.matches(any,
+                                SearchCondConverter.convert(notification.getAbout(anyType).get()), anyType.getKind())) {
 
-                    LOG.debug("Creating notification task for event {} about {}", currentEvent, subject);
+                    LOG.debug("Creating notification task for event {} about {}", currentEvent, any);
 
                     final Map<String, Object> model = new HashMap<>();
                     model.put("type", type);
@@ -313,18 +318,16 @@ public class NotificationManagerImpl implements NotificationManager {
                     model.put("output", output);
                     model.put("input", input);
 
-                    if (subject instanceof User) {
-                        model.put("user", userDataBinder.getUserTO((User) subject));
-                    } else if (subject instanceof Group) {
-                        model.put("group", groupDataBinder.getGroupTO((Group) subject));
+                    if (any instanceof User) {
+                        model.put("user", userDataBinder.getUserTO((User) any));
+                    } else if (any instanceof Group) {
+                        model.put("group", groupDataBinder.getGroupTO((Group) any));
                     }
 
-                    taskDAO.save(getNotificationTask(notification, subject, model));
+                    taskDAO.save(getNotificationTask(notification, any, model));
                 }
             } else {
-                LOG.debug("Notification {}, userAbout {}, groupAbout {} is deactivated, "
-                        + "notification task will not be created", notification.getKey(),
-                        notification.getUserAbout(), notification.getGroupAbout());
+                LOG.debug("Notification {} is not active, task will not be created", notification.getKey());
             }
         }
     }
@@ -342,7 +345,7 @@ public class NotificationManagerImpl implements NotificationManager {
             case UserPlainSchema:
                 UPlainAttr attr = user.getPlainAttr(recipientAttrName);
                 if (attr != null) {
-                    email = CollectionUtils2.getFirstOrNull(attr.getValuesAsStrings());
+                    email = attr.getValuesAsStrings().isEmpty() ? null : attr.getValuesAsStrings().get(0);
                 }
                 break;
 
@@ -356,7 +359,7 @@ public class NotificationManagerImpl implements NotificationManager {
             case UserVirtualSchema:
                 UVirAttr virAttr = user.getVirAttr(recipientAttrName);
                 if (virAttr != null) {
-                    email = CollectionUtils2.getFirstOrNull(virAttr.getValues());
+                    email = virAttr.getValues().isEmpty() ? null : virAttr.getValues().get(0);
                 }
                 break;
 
@@ -402,7 +405,7 @@ public class NotificationManagerImpl implements NotificationManager {
 
     protected Map<String, String> findAllSyncopeConfs() {
         Map<String, String> syncopeConfMap = new HashMap<>();
-        for (PlainAttr attr : confDAO.get().getPlainAttrs()) {
+        for (PlainAttr<?> attr : confDAO.get().getPlainAttrs()) {
             syncopeConfMap.put(attr.getSchema().getKey(), attr.getValuesAsStrings().get(0));
         }
         return syncopeConfMap;

http://git-wip-us.apache.org/repos/asf/syncope/blob/081d9a04/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/propagation/AbstractPropagationTaskExecutor.java
----------------------------------------------------------------------
diff --git a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/propagation/AbstractPropagationTaskExecutor.java b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/propagation/AbstractPropagationTaskExecutor.java
index 6408987..5c89dbb 100644
--- a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/propagation/AbstractPropagationTaskExecutor.java
+++ b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/propagation/AbstractPropagationTaskExecutor.java
@@ -35,10 +35,7 @@ import org.apache.syncope.common.lib.types.TraceLevel;
 import org.apache.syncope.core.persistence.api.dao.GroupDAO;
 import org.apache.syncope.core.persistence.api.dao.TaskDAO;
 import org.apache.syncope.core.persistence.api.dao.UserDAO;
-import org.apache.syncope.core.persistence.api.entity.AttributableUtilsFactory;
 import org.apache.syncope.core.persistence.api.entity.EntityFactory;
-import org.apache.syncope.core.persistence.api.entity.ExternalResource;
-import org.apache.syncope.core.persistence.api.entity.Subject;
 import org.apache.syncope.core.persistence.api.entity.task.PropagationTask;
 import org.apache.syncope.core.persistence.api.entity.task.TaskExec;
 import org.apache.syncope.core.provisioning.api.Connector;
@@ -51,7 +48,12 @@ import org.apache.syncope.core.misc.AuditManager;
 import org.apache.syncope.core.misc.spring.ApplicationContextProvider;
 import org.apache.syncope.core.misc.ConnObjectUtils;
 import org.apache.syncope.core.misc.ExceptionUtils2;
+import org.apache.syncope.core.persistence.api.dao.AnyObjectDAO;
+import org.apache.syncope.core.persistence.api.entity.Any;
+import org.apache.syncope.core.persistence.api.entity.AnyUtilsFactory;
 import org.apache.syncope.core.persistence.api.entity.group.Group;
+import org.apache.syncope.core.persistence.api.entity.resource.ExternalResource;
+import org.apache.syncope.core.persistence.api.entity.resource.Provision;
 import org.apache.syncope.core.persistence.api.entity.user.User;
 import org.apache.syncope.core.provisioning.api.notification.NotificationManager;
 import org.identityconnectors.framework.common.exceptions.ConnectorException;
@@ -88,6 +90,12 @@ public abstract class AbstractPropagationTaskExecutor implements PropagationTask
     protected ConnObjectUtils connObjectUtils;
 
     /**
+     * Any object DAO.
+     */
+    @Autowired
+    protected AnyObjectDAO anyObjectDAO;
+
+    /**
      * User DAO.
      */
     @Autowired
@@ -118,7 +126,7 @@ public abstract class AbstractPropagationTaskExecutor implements PropagationTask
     protected AuditManager auditManager;
 
     @Autowired
-    protected AttributableUtilsFactory attrUtilsFactory;
+    protected AnyUtilsFactory anyUtilsFactory;
 
     @Autowired
     protected EntityFactory entityFactory;
@@ -232,40 +240,46 @@ public abstract class AbstractPropagationTaskExecutor implements PropagationTask
         }
     }
 
-    protected Subject<?, ?, ?> getSubject(final PropagationTask task) {
-        Subject<?, ?, ?> subject = null;
+    protected Any<?, ?, ?> getAny(final PropagationTask task) {
+        Any<?, ?, ?> any = null;
 
-        if (task.getSubjectKey() != null) {
-            switch (task.getSubjectType()) {
+        if (task.getAnyKey() != null) {
+            switch (task.getAnyTypeKind()) {
                 case USER:
                     try {
-                        subject = userDAO.authFetch(task.getSubjectKey());
+                        any = userDAO.authFind(task.getAnyKey());
                     } catch (Exception e) {
-                        LOG.error("Could not read user {}", task.getSubjectKey(), e);
+                        LOG.error("Could not read user {}", task.getAnyKey(), e);
                     }
                     break;
 
                 case GROUP:
                     try {
-                        subject = groupDAO.authFetch(task.getSubjectKey());
+                        any = groupDAO.authFind(task.getAnyKey());
                     } catch (Exception e) {
-                        LOG.error("Could not read group {}", task.getSubjectKey(), e);
+                        LOG.error("Could not read group {}", task.getAnyKey(), e);
                     }
                     break;
 
-                case MEMBERSHIP:
+                case ANY_OBJECT:
                 default:
+                    try {
+                        any = anyObjectDAO.authFind(task.getAnyKey());
+                    } catch (Exception e) {
+                        LOG.error("Could not read any object {}", task.getAnyKey(), e);
+                    }
+                    break;
             }
         }
 
-        return subject;
+        return any;
     }
 
     protected void delete(final PropagationTask task, final ConnectorObject beforeObj,
             final Connector connector, final Set<String> propagationAttempted) {
 
         if (beforeObj == null) {
-            LOG.debug("{} not found on external resource: ignoring delete", task.getAccountId());
+            LOG.debug("{} not found on external resource: ignoring delete", task.getConnObjectKey());
         } else {
             /*
              * We must choose here whether to
@@ -282,7 +296,7 @@ public abstract class AbstractPropagationTaskExecutor implements PropagationTask
              * update, this user / group used to have the current resource assigned by more than one mean (for example,
              * two different memberships with the same resource).
              */
-            Subject<?, ?, ?> subject = getSubject(task);
+            Any<?, ?, ?> subject = getAny(task);
             Collection<String> resources = subject instanceof User
                     ? userDAO.findAllResourceNames((User) subject)
                     : subject instanceof Group
@@ -305,11 +319,11 @@ public abstract class AbstractPropagationTaskExecutor implements PropagationTask
 
     @Override
     public TaskExec execute(final PropagationTask task, final PropagationReporter reporter) {
-        final List<PropagationActions> actions = getPropagationActions(task.getResource());
+        List<PropagationActions> actions = getPropagationActions(task.getResource());
 
-        final Date startDate = new Date();
+        Date startDate = new Date();
 
-        final TaskExec execution = entityFactory.newEntity(TaskExec.class);
+        TaskExec execution = entityFactory.newEntity(TaskExec.class);
         execution.setStatus(PropagationTaskExecStatus.CREATED.name());
 
         String taskExecutionMessage = null;
@@ -321,13 +335,21 @@ public abstract class AbstractPropagationTaskExecutor implements PropagationTask
         ConnectorObject beforeObj = null;
         ConnectorObject afterObj = null;
 
+        Provision provision = null;
         Connector connector = null;
         Result result;
         try {
+            Any<?, ?, ?> any = getAny(task);
+            provision = task.getResource().getProvision(any.getType());
+            if (provision == null) {
+                throw new IllegalArgumentException("No provision found for " + any.getType() + " on " + task.
+                        getResource());
+            }
+
             connector = connFactory.getConnector(task.getResource());
 
-            // Try to read remote object (user / group) BEFORE any actual operation
-            beforeObj = getRemoteObject(task, connector, false);
+            // Try to read remote object BEFORE any actual operation
+            beforeObj = getRemoteObject(task, connector, provision, false);
 
             for (PropagationActions action : actions) {
                 action.before(task, beforeObj);
@@ -390,10 +412,10 @@ public abstract class AbstractPropagationTaskExecutor implements PropagationTask
                 action.onError(task, execution, e);
             }
         } finally {
-            // Try to read remote object (user / group) AFTER any actual operation
+            // Try to read remote object AFTER any actual operation
             if (connector != null) {
                 try {
-                    afterObj = getRemoteObject(task, connector, true);
+                    afterObj = getRemoteObject(task, connector, provision, true);
                 } catch (Exception ignore) {
                     // ignore exception
                     LOG.error("Error retrieving after object", ignore);
@@ -434,7 +456,7 @@ public abstract class AbstractPropagationTaskExecutor implements PropagationTask
 
         notificationManager.createTasks(
                 AuditElements.EventCategoryType.PROPAGATION,
-                task.getSubjectType().name().toLowerCase(),
+                task.getAnyTypeKind().name().toLowerCase(),
                 task.getResource().getKey(),
                 task.getPropagationOperation().name().toLowerCase(),
                 result,
@@ -444,7 +466,7 @@ public abstract class AbstractPropagationTaskExecutor implements PropagationTask
 
         auditManager.audit(
                 AuditElements.EventCategoryType.PROPAGATION,
-                task.getSubjectType().name().toLowerCase(),
+                task.getAnyTypeKind().name().toLowerCase(),
                 task.getResource().getKey(),
                 task.getPropagationOperation().name().toLowerCase(),
                 result,
@@ -504,29 +526,30 @@ public abstract class AbstractPropagationTaskExecutor implements PropagationTask
      *
      * @param connector connector facade proxy.
      * @param task current propagation task.
+     * @param provision provision
      * @param latest 'FALSE' to retrieve object using old accountId if not null.
      * @return remote connector object.
      */
     protected ConnectorObject getRemoteObject(final PropagationTask task, final Connector connector,
-            final boolean latest) {
+            final Provision provision, final boolean latest) {
 
-        String accountId = latest || task.getOldAccountId() == null
-                ? task.getAccountId()
-                : task.getOldAccountId();
+        String connObjectKey = latest || task.getOldConnObjectKey() == null
+                ? task.getConnObjectKey()
+                : task.getOldConnObjectKey();
 
         ConnectorObject obj = null;
         try {
             obj = connector.getObject(task.getPropagationMode(),
                     task.getPropagationOperation(),
                     new ObjectClass(task.getObjectClassName()),
-                    new Uid(accountId),
-                    connector.getOperationOptions(attrUtilsFactory.getInstance(task.getSubjectType()).
-                            getMappingItems(task.getResource(), MappingPurpose.PROPAGATION)));
+                    new Uid(connObjectKey),
+                    connector.getOperationOptions(anyUtilsFactory.getInstance(task.getAnyTypeKind()).
+                            getMappingItems(provision, MappingPurpose.PROPAGATION)));
         } catch (TimeoutException toe) {
             LOG.debug("Request timeout", toe);
             throw toe;
         } catch (RuntimeException ignore) {
-            LOG.debug("While resolving {}", accountId, ignore);
+            LOG.debug("While resolving {}", connObjectKey, ignore);
         }
 
         return obj;

http://git-wip-us.apache.org/repos/asf/syncope/blob/081d9a04/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/propagation/DBPasswordPropagationActions.java
----------------------------------------------------------------------
diff --git a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/propagation/DBPasswordPropagationActions.java b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/propagation/DBPasswordPropagationActions.java
index 1e75acb..6b4760b 100644
--- a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/propagation/DBPasswordPropagationActions.java
+++ b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/propagation/DBPasswordPropagationActions.java
@@ -22,7 +22,7 @@ import java.util.HashSet;
 import java.util.Set;
 import org.apache.commons.collections4.CollectionUtils;
 import org.apache.commons.collections4.Predicate;
-import org.apache.syncope.common.lib.types.AttributableType;
+import org.apache.syncope.common.lib.types.AnyTypeKind;
 import org.apache.syncope.common.lib.types.CipherAlgorithm;
 import org.apache.syncope.common.lib.types.ConnConfProperty;
 import org.apache.syncope.core.persistence.api.dao.UserDAO;
@@ -56,8 +56,8 @@ public class DBPasswordPropagationActions extends DefaultPropagationActions {
     public void before(final PropagationTask task, final ConnectorObject beforeObj) {
         super.before(task, beforeObj);
 
-        if (AttributableType.USER == task.getSubjectType()) {
-            User user = userDAO.find(task.getSubjectKey());
+        if (AnyTypeKind.USER == task.getAnyTypeKind()) {
+            User user = userDAO.find(task.getAnyKey());
 
             if (user != null && user.getPassword() != null) {
                 Attribute missing = AttributeUtil.find(
@@ -72,7 +72,7 @@ public class DBPasswordPropagationActions extends DefaultPropagationActions {
                     Attribute passwordAttribute = AttributeBuilder.buildPassword(
                             new GuardedString(user.getPassword().toCharArray()));
 
-                    Set<Attribute> attributes = new HashSet<Attribute>(task.getAttributes());
+                    Set<Attribute> attributes = new HashSet<>(task.getAttributes());
                     attributes.add(passwordAttribute);
                     attributes.remove(missing);
 

http://git-wip-us.apache.org/repos/asf/syncope/blob/081d9a04/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/propagation/LDAPMembershipPropagationActions.java
----------------------------------------------------------------------
diff --git a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/propagation/LDAPMembershipPropagationActions.java b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/propagation/LDAPMembershipPropagationActions.java
index c246d8f..d01b5c5 100644
--- a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/propagation/LDAPMembershipPropagationActions.java
+++ b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/propagation/LDAPMembershipPropagationActions.java
@@ -25,12 +25,14 @@ import java.util.Set;
 import org.apache.commons.jexl2.JexlContext;
 import org.apache.commons.jexl2.MapContext;
 import org.apache.commons.lang3.StringUtils;
-import org.apache.syncope.common.lib.types.AttributableType;
+import org.apache.syncope.common.lib.types.AnyTypeKind;
 import org.apache.syncope.core.persistence.api.dao.UserDAO;
 import org.apache.syncope.core.persistence.api.entity.group.Group;
 import org.apache.syncope.core.persistence.api.entity.task.PropagationTask;
 import org.apache.syncope.core.persistence.api.entity.user.User;
 import org.apache.syncope.core.misc.jexl.JexlUtils;
+import org.apache.syncope.core.persistence.api.dao.AnyTypeDAO;
+import org.apache.syncope.core.persistence.api.entity.resource.Provision;
 import org.identityconnectors.framework.common.objects.Attribute;
 import org.identityconnectors.framework.common.objects.AttributeBuilder;
 import org.identityconnectors.framework.common.objects.AttributeUtil;
@@ -51,6 +53,9 @@ public class LDAPMembershipPropagationActions extends DefaultPropagationActions
     protected static final Logger LOG = LoggerFactory.getLogger(LDAPMembershipPropagationActions.class);
 
     @Autowired
+    protected AnyTypeDAO anyTypeDAO;
+
+    @Autowired
     protected UserDAO userDAO;
 
     /**
@@ -67,23 +72,24 @@ public class LDAPMembershipPropagationActions extends DefaultPropagationActions
     public void before(final PropagationTask task, final ConnectorObject beforeObj) {
         super.before(task, beforeObj);
 
-        if (AttributableType.USER == task.getSubjectType() && task.getResource().getGmapping() != null) {
-            User user = userDAO.find(task.getSubjectKey());
+        Provision provision = task.getResource().getProvision(anyTypeDAO.findGroup());
+        if (AnyTypeKind.USER == task.getAnyTypeKind() && provision.getMapping() != null) {
+            User user = userDAO.find(task.getAnyKey());
             if (user != null) {
                 List<String> groupAccountLinks = new ArrayList<>();
                 for (Group group : userDAO.findAllGroups(user)) {
                     if (group.getResourceNames().contains(task.getResource().getKey())
-                            && StringUtils.isNotBlank(task.getResource().getGmapping().getAccountLink())) {
+                            && StringUtils.isNotBlank(provision.getMapping().getConnObjectLink())) {
 
                         LOG.debug("Evaluating accountLink for {}", group);
 
-                        final JexlContext jexlContext = new MapContext();
+                        JexlContext jexlContext = new MapContext();
                         JexlUtils.addFieldsToContext(group, jexlContext);
                         JexlUtils.addAttrsToContext(group.getPlainAttrs(), jexlContext);
                         JexlUtils.addDerAttrsToContext(group.getDerAttrs(), group.getPlainAttrs(), jexlContext);
 
-                        final String groupAccountLink =
-                                JexlUtils.evaluate(task.getResource().getGmapping().getAccountLink(), jexlContext);
+                        String groupAccountLink =
+                                JexlUtils.evaluate(provision.getMapping().getConnObjectLink(), jexlContext);
                         LOG.debug("AccountLink for {} is '{}'", group, groupAccountLink);
                         if (StringUtils.isNotBlank(groupAccountLink)) {
                             groupAccountLinks.add(groupAccountLink);

http://git-wip-us.apache.org/repos/asf/syncope/blob/081d9a04/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/propagation/LDAPPasswordPropagationActions.java
----------------------------------------------------------------------
diff --git a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/propagation/LDAPPasswordPropagationActions.java b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/propagation/LDAPPasswordPropagationActions.java
index 35358af..dca9084 100644
--- a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/propagation/LDAPPasswordPropagationActions.java
+++ b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/propagation/LDAPPasswordPropagationActions.java
@@ -22,7 +22,7 @@ import java.util.HashSet;
 import java.util.Set;
 import org.apache.commons.collections4.CollectionUtils;
 import org.apache.commons.collections4.Predicate;
-import org.apache.syncope.common.lib.types.AttributableType;
+import org.apache.syncope.common.lib.types.AnyTypeKind;
 import org.apache.syncope.common.lib.types.CipherAlgorithm;
 import org.apache.syncope.common.lib.types.ConnConfProperty;
 import org.apache.syncope.core.persistence.api.dao.UserDAO;
@@ -58,8 +58,8 @@ public class LDAPPasswordPropagationActions extends DefaultPropagationActions {
     public void before(final PropagationTask task, final ConnectorObject beforeObj) {
         super.before(task, beforeObj);
 
-        if (AttributableType.USER == task.getSubjectType()) {
-            User user = userDAO.find(task.getSubjectKey());
+        if (AnyTypeKind.USER == task.getAnyTypeKind()) {
+            User user = userDAO.find(task.getAnyKey());
 
             if (user != null && user.getPassword() != null) {
                 Attribute missing = AttributeUtil.find(