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/10/29 17:33:39 UTC

[3/7] syncope git commit: [SYNCOPE-141][SYNCOPE-142] Implementation completed

http://git-wip-us.apache.org/repos/asf/syncope/blob/1b81e33c/ext/camel/provisioning-camel/src/main/java/org/apache/syncope/core/provisioning/camel/processor/GroupCreateInSyncProcessor.java
----------------------------------------------------------------------
diff --git a/ext/camel/provisioning-camel/src/main/java/org/apache/syncope/core/provisioning/camel/processor/GroupCreateInSyncProcessor.java b/ext/camel/provisioning-camel/src/main/java/org/apache/syncope/core/provisioning/camel/processor/GroupCreateInSyncProcessor.java
index 474a3f2..fbe34d1 100644
--- a/ext/camel/provisioning-camel/src/main/java/org/apache/syncope/core/provisioning/camel/processor/GroupCreateInSyncProcessor.java
+++ b/ext/camel/provisioning-camel/src/main/java/org/apache/syncope/core/provisioning/camel/processor/GroupCreateInSyncProcessor.java
@@ -32,19 +32,14 @@ import org.apache.syncope.common.lib.types.AnyTypeKind;
 import org.apache.syncope.core.misc.spring.ApplicationContextProvider;
 import org.apache.syncope.core.persistence.api.entity.task.PropagationTask;
 import org.apache.syncope.core.provisioning.api.WorkflowResult;
-import org.apache.syncope.core.provisioning.api.propagation.PropagationException;
 import org.apache.syncope.core.provisioning.api.propagation.PropagationManager;
 import org.apache.syncope.core.provisioning.api.propagation.PropagationReporter;
 import org.apache.syncope.core.provisioning.api.propagation.PropagationTaskExecutor;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 import org.springframework.stereotype.Component;
 
 @Component
 public class GroupCreateInSyncProcessor implements Processor {
 
-    private static final Logger LOG = LoggerFactory.getLogger(GroupCreateInSyncProcessor.class);
-
     @Autowired
     protected PropagationManager propagationManager;
 
@@ -59,6 +54,7 @@ public class GroupCreateInSyncProcessor implements Processor {
         GroupTO groupTO = exchange.getProperty("any", GroupTO.class);
         Map<Long, String> groupOwnerMap = exchange.getProperty("groupOwnerMap", Map.class);
         Set<String> excludedResources = exchange.getProperty("excludedResources", Set.class);
+        Boolean nullPriorityAsync = exchange.getProperty("nullPriorityAsync", Boolean.class);
 
         AttrTO groupOwner = groupTO.getPlainAttrMap().get(StringUtils.EMPTY);
         if (groupOwner != null) {
@@ -73,12 +69,7 @@ public class GroupCreateInSyncProcessor implements Processor {
                 excludedResources);
         PropagationReporter propagationReporter =
                 ApplicationContextProvider.getBeanFactory().getBean(PropagationReporter.class);
-        try {
-            taskExecutor.execute(tasks, propagationReporter);
-        } catch (PropagationException e) {
-            LOG.error("Error propagation primary resource", e);
-            propagationReporter.onPrimaryResourceFailure(tasks);
-        }
+        taskExecutor.execute(tasks, propagationReporter, nullPriorityAsync);
 
         exchange.getOut().setBody(new ImmutablePair<>(created.getResult(), null));
     }

http://git-wip-us.apache.org/repos/asf/syncope/blob/1b81e33c/ext/camel/provisioning-camel/src/main/java/org/apache/syncope/core/provisioning/camel/processor/GroupCreateProcessor.java
----------------------------------------------------------------------
diff --git a/ext/camel/provisioning-camel/src/main/java/org/apache/syncope/core/provisioning/camel/processor/GroupCreateProcessor.java b/ext/camel/provisioning-camel/src/main/java/org/apache/syncope/core/provisioning/camel/processor/GroupCreateProcessor.java
index b0bddef..1c08e8a 100644
--- a/ext/camel/provisioning-camel/src/main/java/org/apache/syncope/core/provisioning/camel/processor/GroupCreateProcessor.java
+++ b/ext/camel/provisioning-camel/src/main/java/org/apache/syncope/core/provisioning/camel/processor/GroupCreateProcessor.java
@@ -28,20 +28,15 @@ import org.apache.syncope.common.lib.types.AnyTypeKind;
 import org.apache.syncope.core.misc.spring.ApplicationContextProvider;
 import org.apache.syncope.core.persistence.api.entity.task.PropagationTask;
 import org.apache.syncope.core.provisioning.api.WorkflowResult;
-import org.apache.syncope.core.provisioning.api.propagation.PropagationException;
 import org.apache.syncope.core.provisioning.api.propagation.PropagationManager;
 import org.apache.syncope.core.provisioning.api.propagation.PropagationReporter;
 import org.apache.syncope.core.provisioning.api.propagation.PropagationTaskExecutor;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
 
 @Component
 public class GroupCreateProcessor implements Processor {
 
-    private static final Logger LOG = LoggerFactory.getLogger(GroupCreateProcessor.class);
-
     @Autowired
     protected PropagationManager propagationManager;
 
@@ -54,6 +49,7 @@ public class GroupCreateProcessor implements Processor {
         WorkflowResult<Long> created = (WorkflowResult) exchange.getIn().getBody();
         GroupTO any = exchange.getProperty("any", GroupTO.class);
         Set<String> excludedResources = exchange.getProperty("excludedResources", Set.class);
+        Boolean nullPriorityAsync = exchange.getProperty("nullPriorityAsync", Boolean.class);
 
         List<PropagationTask> tasks = propagationManager.getCreateTasks(
                 AnyTypeKind.GROUP,
@@ -63,12 +59,7 @@ public class GroupCreateProcessor implements Processor {
                 excludedResources);
         PropagationReporter propagationReporter =
                 ApplicationContextProvider.getBeanFactory().getBean(PropagationReporter.class);
-        try {
-            taskExecutor.execute(tasks, propagationReporter);
-        } catch (PropagationException e) {
-            LOG.error("Error propagation primary resource", e);
-            propagationReporter.onPrimaryResourceFailure(tasks);
-        }
+        taskExecutor.execute(tasks, propagationReporter, nullPriorityAsync);
 
         exchange.getOut().setBody(new ImmutablePair<>(
                 created.getResult(), propagationReporter.getStatuses()));

http://git-wip-us.apache.org/repos/asf/syncope/blob/1b81e33c/ext/camel/provisioning-camel/src/main/java/org/apache/syncope/core/provisioning/camel/processor/GroupDeleteProcessor.java
----------------------------------------------------------------------
diff --git a/ext/camel/provisioning-camel/src/main/java/org/apache/syncope/core/provisioning/camel/processor/GroupDeleteProcessor.java b/ext/camel/provisioning-camel/src/main/java/org/apache/syncope/core/provisioning/camel/processor/GroupDeleteProcessor.java
index 96b328e..8603af2 100644
--- a/ext/camel/provisioning-camel/src/main/java/org/apache/syncope/core/provisioning/camel/processor/GroupDeleteProcessor.java
+++ b/ext/camel/provisioning-camel/src/main/java/org/apache/syncope/core/provisioning/camel/processor/GroupDeleteProcessor.java
@@ -29,21 +29,16 @@ import org.apache.syncope.common.lib.types.PropagationByResource;
 import org.apache.syncope.core.misc.spring.ApplicationContextProvider;
 import org.apache.syncope.core.persistence.api.dao.GroupDAO;
 import org.apache.syncope.core.persistence.api.entity.task.PropagationTask;
-import org.apache.syncope.core.provisioning.api.propagation.PropagationException;
 import org.apache.syncope.core.provisioning.api.propagation.PropagationManager;
 import org.apache.syncope.core.provisioning.api.propagation.PropagationReporter;
 import org.apache.syncope.core.provisioning.api.propagation.PropagationTaskExecutor;
 import org.apache.syncope.core.workflow.api.GroupWorkflowAdapter;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
 
 @Component
 public class GroupDeleteProcessor implements Processor {
 
-    private static final Logger LOG = LoggerFactory.getLogger(GroupDeleteProcessor.class);
-
     @Autowired
     protected GroupWorkflowAdapter gwfAdapter;
 
@@ -61,6 +56,7 @@ public class GroupDeleteProcessor implements Processor {
         Long key = exchange.getIn().getBody(Long.class);
         @SuppressWarnings("unchecked")
         Set<String> excludedResources = exchange.getProperty("excludedResources", Set.class);
+        Boolean nullPriorityAsync = exchange.getProperty("nullPriorityAsync", Boolean.class);
 
         List<PropagationTask> tasks = new ArrayList<>();
 
@@ -94,12 +90,7 @@ public class GroupDeleteProcessor implements Processor {
 
         PropagationReporter propagationReporter =
                 ApplicationContextProvider.getBeanFactory().getBean(PropagationReporter.class);
-        try {
-            taskExecutor.execute(tasks, propagationReporter);
-        } catch (PropagationException e) {
-            LOG.error("Error propagation primary resource", e);
-            propagationReporter.onPrimaryResourceFailure(tasks);
-        }
+        taskExecutor.execute(tasks, propagationReporter, nullPriorityAsync);
 
         exchange.setProperty("statuses", propagationReporter.getStatuses());
     }

http://git-wip-us.apache.org/repos/asf/syncope/blob/1b81e33c/ext/camel/provisioning-camel/src/main/java/org/apache/syncope/core/provisioning/camel/processor/GroupDeprovisionProcessor.java
----------------------------------------------------------------------
diff --git a/ext/camel/provisioning-camel/src/main/java/org/apache/syncope/core/provisioning/camel/processor/GroupDeprovisionProcessor.java b/ext/camel/provisioning-camel/src/main/java/org/apache/syncope/core/provisioning/camel/processor/GroupDeprovisionProcessor.java
index a5c0875..dd50c45 100644
--- a/ext/camel/provisioning-camel/src/main/java/org/apache/syncope/core/provisioning/camel/processor/GroupDeprovisionProcessor.java
+++ b/ext/camel/provisioning-camel/src/main/java/org/apache/syncope/core/provisioning/camel/processor/GroupDeprovisionProcessor.java
@@ -28,20 +28,15 @@ import org.apache.syncope.common.lib.types.ResourceOperation;
 import org.apache.syncope.core.misc.spring.ApplicationContextProvider;
 import org.apache.syncope.core.persistence.api.dao.GroupDAO;
 import org.apache.syncope.core.persistence.api.entity.task.PropagationTask;
-import org.apache.syncope.core.provisioning.api.propagation.PropagationException;
 import org.apache.syncope.core.provisioning.api.propagation.PropagationManager;
 import org.apache.syncope.core.provisioning.api.propagation.PropagationReporter;
 import org.apache.syncope.core.provisioning.api.propagation.PropagationTaskExecutor;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
 
 @Component
 public class GroupDeprovisionProcessor implements Processor {
 
-    private static final Logger LOG = LoggerFactory.getLogger(GroupDeprovisionProcessor.class);
-
     @Autowired
     protected PropagationManager propagationManager;
 
@@ -56,6 +51,7 @@ public class GroupDeprovisionProcessor implements Processor {
     public void process(final Exchange exchange) {
         Long key = exchange.getIn().getBody(Long.class);
         List<String> resources = exchange.getProperty("resources", List.class);
+        Boolean nullPriorityAsync = exchange.getProperty("nullPriorityAsync", Boolean.class);
 
         PropagationByResource propByRes = new PropagationByResource();
         propByRes.addAll(ResourceOperation.DELETE, resources);
@@ -67,12 +63,7 @@ public class GroupDeprovisionProcessor implements Processor {
                 CollectionUtils.removeAll(groupDAO.authFind(key).getResourceNames(), resources));
         PropagationReporter propagationReporter =
                 ApplicationContextProvider.getBeanFactory().getBean(PropagationReporter.class);
-        try {
-            taskExecutor.execute(tasks, propagationReporter);
-        } catch (PropagationException e) {
-            LOG.error("Error propagation primary resource", e);
-            propagationReporter.onPrimaryResourceFailure(tasks);
-        }
+        taskExecutor.execute(tasks, propagationReporter, nullPriorityAsync);
 
         exchange.getOut().setBody(propagationReporter.getStatuses());
     }

http://git-wip-us.apache.org/repos/asf/syncope/blob/1b81e33c/ext/camel/provisioning-camel/src/main/java/org/apache/syncope/core/provisioning/camel/processor/GroupProvisionProcessor.java
----------------------------------------------------------------------
diff --git a/ext/camel/provisioning-camel/src/main/java/org/apache/syncope/core/provisioning/camel/processor/GroupProvisionProcessor.java b/ext/camel/provisioning-camel/src/main/java/org/apache/syncope/core/provisioning/camel/processor/GroupProvisionProcessor.java
index b7ecc6f..def3ca3 100644
--- a/ext/camel/provisioning-camel/src/main/java/org/apache/syncope/core/provisioning/camel/processor/GroupProvisionProcessor.java
+++ b/ext/camel/provisioning-camel/src/main/java/org/apache/syncope/core/provisioning/camel/processor/GroupProvisionProcessor.java
@@ -26,20 +26,15 @@ import org.apache.syncope.common.lib.types.PropagationByResource;
 import org.apache.syncope.common.lib.types.ResourceOperation;
 import org.apache.syncope.core.misc.spring.ApplicationContextProvider;
 import org.apache.syncope.core.persistence.api.entity.task.PropagationTask;
-import org.apache.syncope.core.provisioning.api.propagation.PropagationException;
 import org.apache.syncope.core.provisioning.api.propagation.PropagationManager;
 import org.apache.syncope.core.provisioning.api.propagation.PropagationReporter;
 import org.apache.syncope.core.provisioning.api.propagation.PropagationTaskExecutor;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
 
 @Component
 public class GroupProvisionProcessor implements Processor {
 
-    private static final Logger LOG = LoggerFactory.getLogger(GroupProvisionProcessor.class);
-
     @Autowired
     protected PropagationManager propagationManager;
 
@@ -51,6 +46,7 @@ public class GroupProvisionProcessor implements Processor {
     public void process(final Exchange exchange) {
         Long key = exchange.getIn().getBody(Long.class);
         List<String> resources = exchange.getProperty("resources", List.class);
+        Boolean nullPriorityAsync = exchange.getProperty("nullPriorityAsync", Boolean.class);
 
         PropagationByResource propByRes = new PropagationByResource();
         propByRes.addAll(ResourceOperation.UPDATE, resources);
@@ -65,12 +61,7 @@ public class GroupProvisionProcessor implements Processor {
                 null);
         PropagationReporter propagationReporter =
                 ApplicationContextProvider.getBeanFactory().getBean(PropagationReporter.class);
-        try {
-            taskExecutor.execute(tasks, propagationReporter);
-        } catch (PropagationException e) {
-            LOG.error("Error propagation primary resource", e);
-            propagationReporter.onPrimaryResourceFailure(tasks);
-        }
+        taskExecutor.execute(tasks, propagationReporter, nullPriorityAsync);
 
         exchange.getOut().setBody(propagationReporter.getStatuses());
     }

http://git-wip-us.apache.org/repos/asf/syncope/blob/1b81e33c/ext/camel/provisioning-camel/src/main/java/org/apache/syncope/core/provisioning/camel/processor/GroupUpdateProcessor.java
----------------------------------------------------------------------
diff --git a/ext/camel/provisioning-camel/src/main/java/org/apache/syncope/core/provisioning/camel/processor/GroupUpdateProcessor.java b/ext/camel/provisioning-camel/src/main/java/org/apache/syncope/core/provisioning/camel/processor/GroupUpdateProcessor.java
index 599f54b..18aeac2 100644
--- a/ext/camel/provisioning-camel/src/main/java/org/apache/syncope/core/provisioning/camel/processor/GroupUpdateProcessor.java
+++ b/ext/camel/provisioning-camel/src/main/java/org/apache/syncope/core/provisioning/camel/processor/GroupUpdateProcessor.java
@@ -29,7 +29,6 @@ import org.apache.syncope.core.misc.spring.ApplicationContextProvider;
 import org.apache.syncope.core.persistence.api.entity.task.PropagationTask;
 import org.apache.syncope.core.provisioning.api.VirAttrHandler;
 import org.apache.syncope.core.provisioning.api.WorkflowResult;
-import org.apache.syncope.core.provisioning.api.propagation.PropagationException;
 import org.apache.syncope.core.provisioning.api.propagation.PropagationManager;
 import org.apache.syncope.core.provisioning.api.propagation.PropagationReporter;
 import org.apache.syncope.core.provisioning.api.propagation.PropagationTaskExecutor;
@@ -58,6 +57,7 @@ public class GroupUpdateProcessor implements Processor {
         WorkflowResult<Long> updated = (WorkflowResult) exchange.getIn().getBody();
         GroupPatch groupPatch = exchange.getProperty("anyPatch", GroupPatch.class);
         Set<String> excludedResources = exchange.getProperty("excludedResources", Set.class);
+        Boolean nullPriorityAsync = exchange.getProperty("nullPriorityAsync", Boolean.class);
 
         List<PropagationTask> tasks = propagationManager.getUpdateTasks(
                 AnyTypeKind.GROUP,
@@ -69,12 +69,7 @@ public class GroupUpdateProcessor implements Processor {
                 excludedResources);
         PropagationReporter propagationReporter =
                 ApplicationContextProvider.getBeanFactory().getBean(PropagationReporter.class);
-        try {
-            taskExecutor.execute(tasks, propagationReporter);
-        } catch (PropagationException e) {
-            LOG.error("Error propagation primary resource", e);
-            propagationReporter.onPrimaryResourceFailure(tasks);
-        }
+        taskExecutor.execute(tasks, propagationReporter, nullPriorityAsync);
 
         exchange.getOut().setBody(new ImmutablePair<>(updated.getResult(), propagationReporter.getStatuses()));
     }

http://git-wip-us.apache.org/repos/asf/syncope/blob/1b81e33c/ext/camel/provisioning-camel/src/main/java/org/apache/syncope/core/provisioning/camel/processor/UserConfirmPwdResetProcessor.java
----------------------------------------------------------------------
diff --git a/ext/camel/provisioning-camel/src/main/java/org/apache/syncope/core/provisioning/camel/processor/UserConfirmPwdResetProcessor.java b/ext/camel/provisioning-camel/src/main/java/org/apache/syncope/core/provisioning/camel/processor/UserConfirmPwdResetProcessor.java
index 8a19609..05b2e75 100644
--- a/ext/camel/provisioning-camel/src/main/java/org/apache/syncope/core/provisioning/camel/processor/UserConfirmPwdResetProcessor.java
+++ b/ext/camel/provisioning-camel/src/main/java/org/apache/syncope/core/provisioning/camel/processor/UserConfirmPwdResetProcessor.java
@@ -26,20 +26,15 @@ import org.apache.syncope.common.lib.patch.UserPatch;
 import org.apache.syncope.core.misc.spring.ApplicationContextProvider;
 import org.apache.syncope.core.persistence.api.entity.task.PropagationTask;
 import org.apache.syncope.core.provisioning.api.WorkflowResult;
-import org.apache.syncope.core.provisioning.api.propagation.PropagationException;
 import org.apache.syncope.core.provisioning.api.propagation.PropagationManager;
 import org.apache.syncope.core.provisioning.api.propagation.PropagationReporter;
 import org.apache.syncope.core.provisioning.api.propagation.PropagationTaskExecutor;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
 
 @Component
 public class UserConfirmPwdResetProcessor implements Processor {
 
-    private static final Logger LOG = LoggerFactory.getLogger(UserConfirmPwdResetProcessor.class);
-
     @Autowired
     protected PropagationManager propagationManager;
 
@@ -55,11 +50,6 @@ public class UserConfirmPwdResetProcessor implements Processor {
 
         PropagationReporter propReporter =
                 ApplicationContextProvider.getBeanFactory().getBean(PropagationReporter.class);
-        try {
-            taskExecutor.execute(tasks, propReporter);
-        } catch (PropagationException e) {
-            LOG.error("Error propagation primary resource", e);
-            propReporter.onPrimaryResourceFailure(tasks);
-        }
+        taskExecutor.execute(tasks, propReporter, false);
     }
 }

http://git-wip-us.apache.org/repos/asf/syncope/blob/1b81e33c/ext/camel/provisioning-camel/src/main/java/org/apache/syncope/core/provisioning/camel/processor/UserCreateProcessor.java
----------------------------------------------------------------------
diff --git a/ext/camel/provisioning-camel/src/main/java/org/apache/syncope/core/provisioning/camel/processor/UserCreateProcessor.java b/ext/camel/provisioning-camel/src/main/java/org/apache/syncope/core/provisioning/camel/processor/UserCreateProcessor.java
index 1a9dd72..51b8e83 100644
--- a/ext/camel/provisioning-camel/src/main/java/org/apache/syncope/core/provisioning/camel/processor/UserCreateProcessor.java
+++ b/ext/camel/provisioning-camel/src/main/java/org/apache/syncope/core/provisioning/camel/processor/UserCreateProcessor.java
@@ -28,7 +28,6 @@ import org.apache.syncope.common.lib.to.UserTO;
 import org.apache.syncope.core.misc.spring.ApplicationContextProvider;
 import org.apache.syncope.core.persistence.api.entity.task.PropagationTask;
 import org.apache.syncope.core.provisioning.api.WorkflowResult;
-import org.apache.syncope.core.provisioning.api.propagation.PropagationException;
 import org.apache.syncope.core.provisioning.api.propagation.PropagationManager;
 import org.apache.syncope.core.provisioning.api.propagation.PropagationReporter;
 import org.apache.syncope.core.provisioning.api.propagation.PropagationTaskExecutor;
@@ -55,6 +54,7 @@ public class UserCreateProcessor implements Processor {
             WorkflowResult<Pair<Long, Boolean>> created = (WorkflowResult) exchange.getIn().getBody();
             UserTO actual = exchange.getProperty("actual", UserTO.class);
             Set<String> excludedResources = exchange.getProperty("excludedResources", Set.class);
+            Boolean nullPriorityAsync = exchange.getProperty("nullPriorityAsync", Boolean.class);
 
             List<PropagationTask> tasks = propagationManager.getUserCreateTasks(
                     created.getResult().getKey(),
@@ -65,12 +65,7 @@ public class UserCreateProcessor implements Processor {
                     excludedResources);
             PropagationReporter propagationReporter =
                     ApplicationContextProvider.getBeanFactory().getBean(PropagationReporter.class);
-            try {
-                taskExecutor.execute(tasks, propagationReporter);
-            } catch (PropagationException e) {
-                LOG.error("Error propagation primary resource {}", e);
-                propagationReporter.onPrimaryResourceFailure(tasks);
-            }
+            taskExecutor.execute(tasks, propagationReporter, nullPriorityAsync);
 
             exchange.getOut().setBody(
                     new ImmutablePair<>(created.getResult().getKey(), propagationReporter.getStatuses()));

http://git-wip-us.apache.org/repos/asf/syncope/blob/1b81e33c/ext/camel/provisioning-camel/src/main/java/org/apache/syncope/core/provisioning/camel/processor/UserDeleteProcessor.java
----------------------------------------------------------------------
diff --git a/ext/camel/provisioning-camel/src/main/java/org/apache/syncope/core/provisioning/camel/processor/UserDeleteProcessor.java b/ext/camel/provisioning-camel/src/main/java/org/apache/syncope/core/provisioning/camel/processor/UserDeleteProcessor.java
index 5838e01..328b091 100644
--- a/ext/camel/provisioning-camel/src/main/java/org/apache/syncope/core/provisioning/camel/processor/UserDeleteProcessor.java
+++ b/ext/camel/provisioning-camel/src/main/java/org/apache/syncope/core/provisioning/camel/processor/UserDeleteProcessor.java
@@ -28,20 +28,15 @@ import org.apache.syncope.common.lib.types.ResourceOperation;
 import org.apache.syncope.core.misc.spring.ApplicationContextProvider;
 import org.apache.syncope.core.persistence.api.dao.UserDAO;
 import org.apache.syncope.core.persistence.api.entity.task.PropagationTask;
-import org.apache.syncope.core.provisioning.api.propagation.PropagationException;
 import org.apache.syncope.core.provisioning.api.propagation.PropagationManager;
 import org.apache.syncope.core.provisioning.api.propagation.PropagationReporter;
 import org.apache.syncope.core.provisioning.api.propagation.PropagationTaskExecutor;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
 
 @Component
 public class UserDeleteProcessor implements Processor {
 
-    private static final Logger LOG = LoggerFactory.getLogger(UserDeleteProcessor.class);
-
     @Autowired
     protected UserDAO userDAO;
 
@@ -56,6 +51,7 @@ public class UserDeleteProcessor implements Processor {
     public void process(final Exchange exchange) throws Exception {
         Long key = (Long) exchange.getIn().getBody();
         Set<String> excludedResources = exchange.getProperty("excludedResources", Set.class);
+        Boolean nullPriorityAsync = exchange.getProperty("nullPriorityAsync", Boolean.class);
 
         PropagationByResource propByRes = new PropagationByResource();
         propByRes.set(ResourceOperation.DELETE, userDAO.findAllResourceNames(userDAO.authFind(key)));
@@ -73,12 +69,7 @@ public class UserDeleteProcessor implements Processor {
 
         PropagationReporter propagationReporter =
                 ApplicationContextProvider.getBeanFactory().getBean(PropagationReporter.class);
-        try {
-            taskExecutor.execute(tasks, propagationReporter);
-        } catch (PropagationException e) {
-            LOG.error("Error propagation primary resource", e);
-            propagationReporter.onPrimaryResourceFailure(tasks);
-        }
+        taskExecutor.execute(tasks, propagationReporter, nullPriorityAsync);
 
         exchange.setProperty("statuses", propagationReporter.getStatuses());
     }

http://git-wip-us.apache.org/repos/asf/syncope/blob/1b81e33c/ext/camel/provisioning-camel/src/main/java/org/apache/syncope/core/provisioning/camel/processor/UserDeprovisionProcessor.java
----------------------------------------------------------------------
diff --git a/ext/camel/provisioning-camel/src/main/java/org/apache/syncope/core/provisioning/camel/processor/UserDeprovisionProcessor.java b/ext/camel/provisioning-camel/src/main/java/org/apache/syncope/core/provisioning/camel/processor/UserDeprovisionProcessor.java
index 522af51..2438f17 100644
--- a/ext/camel/provisioning-camel/src/main/java/org/apache/syncope/core/provisioning/camel/processor/UserDeprovisionProcessor.java
+++ b/ext/camel/provisioning-camel/src/main/java/org/apache/syncope/core/provisioning/camel/processor/UserDeprovisionProcessor.java
@@ -28,20 +28,15 @@ import org.apache.syncope.common.lib.types.ResourceOperation;
 import org.apache.syncope.core.misc.spring.ApplicationContextProvider;
 import org.apache.syncope.core.persistence.api.dao.UserDAO;
 import org.apache.syncope.core.persistence.api.entity.task.PropagationTask;
-import org.apache.syncope.core.provisioning.api.propagation.PropagationException;
 import org.apache.syncope.core.provisioning.api.propagation.PropagationManager;
 import org.apache.syncope.core.provisioning.api.propagation.PropagationReporter;
 import org.apache.syncope.core.provisioning.api.propagation.PropagationTaskExecutor;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
 
 @Component
 public class UserDeprovisionProcessor implements Processor {
 
-    private static final Logger LOG = LoggerFactory.getLogger(UserDeprovisionProcessor.class);
-
     @Autowired
     protected PropagationManager propagationManager;
 
@@ -56,6 +51,7 @@ public class UserDeprovisionProcessor implements Processor {
         Long key = exchange.getIn().getBody(Long.class);
         @SuppressWarnings("unchecked")
         List<String> resources = exchange.getProperty("resources", List.class);
+        Boolean nullPriorityAsync = exchange.getProperty("nullPriorityAsync", Boolean.class);
 
         PropagationByResource propByRes = new PropagationByResource();
         propByRes.set(ResourceOperation.DELETE, resources);
@@ -67,12 +63,7 @@ public class UserDeprovisionProcessor implements Processor {
                 CollectionUtils.removeAll(userDAO.findAllResourceNames(userDAO.authFind(key)), resources));
         PropagationReporter propagationReporter =
                 ApplicationContextProvider.getBeanFactory().getBean(PropagationReporter.class);
-        try {
-            taskExecutor.execute(tasks, propagationReporter);
-        } catch (PropagationException e) {
-            LOG.error("Error propagation primary resource", e);
-            propagationReporter.onPrimaryResourceFailure(tasks);
-        }
+        taskExecutor.execute(tasks, propagationReporter, nullPriorityAsync);
 
         exchange.getOut().setBody(propagationReporter.getStatuses());
     }

http://git-wip-us.apache.org/repos/asf/syncope/blob/1b81e33c/ext/camel/provisioning-camel/src/main/java/org/apache/syncope/core/provisioning/camel/processor/UserProvisionProcessor.java
----------------------------------------------------------------------
diff --git a/ext/camel/provisioning-camel/src/main/java/org/apache/syncope/core/provisioning/camel/processor/UserProvisionProcessor.java b/ext/camel/provisioning-camel/src/main/java/org/apache/syncope/core/provisioning/camel/processor/UserProvisionProcessor.java
index 04c9ac9..324d54c 100644
--- a/ext/camel/provisioning-camel/src/main/java/org/apache/syncope/core/provisioning/camel/processor/UserProvisionProcessor.java
+++ b/ext/camel/provisioning-camel/src/main/java/org/apache/syncope/core/provisioning/camel/processor/UserProvisionProcessor.java
@@ -35,20 +35,15 @@ import org.apache.syncope.core.misc.spring.ApplicationContextProvider;
 import org.apache.syncope.core.persistence.api.dao.UserDAO;
 import org.apache.syncope.core.persistence.api.entity.task.PropagationTask;
 import org.apache.syncope.core.provisioning.api.WorkflowResult;
-import org.apache.syncope.core.provisioning.api.propagation.PropagationException;
 import org.apache.syncope.core.provisioning.api.propagation.PropagationManager;
 import org.apache.syncope.core.provisioning.api.propagation.PropagationReporter;
 import org.apache.syncope.core.provisioning.api.propagation.PropagationTaskExecutor;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
 
 @Component
 public class UserProvisionProcessor implements Processor {
 
-    private static final Logger LOG = LoggerFactory.getLogger(UserProvisionProcessor.class);
-
     @Autowired
     protected PropagationManager propagationManager;
 
@@ -65,6 +60,7 @@ public class UserProvisionProcessor implements Processor {
         String password = exchange.getProperty("password", String.class);
         @SuppressWarnings("unchecked")
         List<String> resources = exchange.getProperty("resources", List.class);
+        Boolean nullPriorityAsync = exchange.getProperty("nullPriorityAsync", Boolean.class);
 
         UserPatch userPatch = new UserPatch();
         userPatch.setKey(key);
@@ -92,12 +88,7 @@ public class UserProvisionProcessor implements Processor {
         List<PropagationTask> tasks = propagationManager.getUserUpdateTasks(wfResult, changePwd, null);
         PropagationReporter propagationReporter =
                 ApplicationContextProvider.getBeanFactory().getBean(PropagationReporter.class);
-        try {
-            taskExecutor.execute(tasks, propagationReporter);
-        } catch (PropagationException e) {
-            LOG.error("Error propagation primary resource", e);
-            propagationReporter.onPrimaryResourceFailure(tasks);
-        }
+        taskExecutor.execute(tasks, propagationReporter, nullPriorityAsync);
 
         exchange.getOut().setBody(propagationReporter.getStatuses());
     }

http://git-wip-us.apache.org/repos/asf/syncope/blob/1b81e33c/ext/camel/provisioning-camel/src/main/java/org/apache/syncope/core/provisioning/camel/processor/UserSetStatusInSyncProcessor.java
----------------------------------------------------------------------
diff --git a/ext/camel/provisioning-camel/src/main/java/org/apache/syncope/core/provisioning/camel/processor/UserSetStatusInSyncProcessor.java b/ext/camel/provisioning-camel/src/main/java/org/apache/syncope/core/provisioning/camel/processor/UserSetStatusInSyncProcessor.java
index fbe4c20..ead8d4f 100644
--- a/ext/camel/provisioning-camel/src/main/java/org/apache/syncope/core/provisioning/camel/processor/UserSetStatusInSyncProcessor.java
+++ b/ext/camel/provisioning-camel/src/main/java/org/apache/syncope/core/provisioning/camel/processor/UserSetStatusInSyncProcessor.java
@@ -44,7 +44,7 @@ public class UserSetStatusInSyncProcessor implements Processor {
         WorkflowResult<Map.Entry<UserPatch, Boolean>> updated = (WorkflowResult) exchange.getIn().getBody();
 
         Boolean enabled = exchange.getProperty("enabled", Boolean.class);
-        Long key = exchange.getProperty("userKey", Long.class);
+        Long key = exchange.getProperty("key", Long.class);
 
         if (enabled != null) {
             User user = userDAO.find(key);

http://git-wip-us.apache.org/repos/asf/syncope/blob/1b81e33c/ext/camel/provisioning-camel/src/main/java/org/apache/syncope/core/provisioning/camel/processor/UserStatusPropagationProcessor.java
----------------------------------------------------------------------
diff --git a/ext/camel/provisioning-camel/src/main/java/org/apache/syncope/core/provisioning/camel/processor/UserStatusPropagationProcessor.java b/ext/camel/provisioning-camel/src/main/java/org/apache/syncope/core/provisioning/camel/processor/UserStatusPropagationProcessor.java
index 068f003..4877140 100644
--- a/ext/camel/provisioning-camel/src/main/java/org/apache/syncope/core/provisioning/camel/processor/UserStatusPropagationProcessor.java
+++ b/ext/camel/provisioning-camel/src/main/java/org/apache/syncope/core/provisioning/camel/processor/UserStatusPropagationProcessor.java
@@ -31,20 +31,15 @@ import org.apache.syncope.core.misc.spring.ApplicationContextProvider;
 import org.apache.syncope.core.persistence.api.dao.UserDAO;
 import org.apache.syncope.core.persistence.api.entity.task.PropagationTask;
 import org.apache.syncope.core.provisioning.api.WorkflowResult;
-import org.apache.syncope.core.provisioning.api.propagation.PropagationException;
 import org.apache.syncope.core.provisioning.api.propagation.PropagationManager;
 import org.apache.syncope.core.provisioning.api.propagation.PropagationReporter;
 import org.apache.syncope.core.provisioning.api.propagation.PropagationTaskExecutor;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
 
 @Component
 public class UserStatusPropagationProcessor implements Processor {
 
-    private static final Logger LOG = LoggerFactory.getLogger(UserStatusPropagationProcessor.class);
-
     @Autowired
     protected PropagationManager propagationManager;
 
@@ -58,8 +53,8 @@ public class UserStatusPropagationProcessor implements Processor {
     @Override
     public void process(final Exchange exchange) {
         WorkflowResult<Long> updated = (WorkflowResult) exchange.getIn().getBody();
-
         StatusPatch statusPatch = exchange.getProperty("statusPatch", StatusPatch.class);
+        Boolean nullPriorityAsync = exchange.getProperty("nullPriorityAsync", Boolean.class);
 
         PropagationByResource propByRes = new PropagationByResource();
         propByRes.addAll(ResourceOperation.UPDATE, statusPatch.getResources());
@@ -74,12 +69,7 @@ public class UserStatusPropagationProcessor implements Processor {
 
         PropagationReporter propReporter =
                 ApplicationContextProvider.getBeanFactory().getBean(PropagationReporter.class);
-        try {
-            taskExecutor.execute(tasks, propReporter);
-        } catch (PropagationException e) {
-            LOG.error("Error propagation primary resource", e);
-            propReporter.onPrimaryResourceFailure(tasks);
-        }
+        taskExecutor.execute(tasks, propReporter, nullPriorityAsync);
 
         exchange.getOut().setBody(new ImmutablePair<>(updated.getResult(), propReporter.getStatuses()));
     }

http://git-wip-us.apache.org/repos/asf/syncope/blob/1b81e33c/ext/camel/provisioning-camel/src/main/java/org/apache/syncope/core/provisioning/camel/processor/UserUpdateInSyncProcessor.java
----------------------------------------------------------------------
diff --git a/ext/camel/provisioning-camel/src/main/java/org/apache/syncope/core/provisioning/camel/processor/UserUpdateInSyncProcessor.java b/ext/camel/provisioning-camel/src/main/java/org/apache/syncope/core/provisioning/camel/processor/UserUpdateInSyncProcessor.java
index 8b49a5d..6c1d3a3 100644
--- a/ext/camel/provisioning-camel/src/main/java/org/apache/syncope/core/provisioning/camel/processor/UserUpdateInSyncProcessor.java
+++ b/ext/camel/provisioning-camel/src/main/java/org/apache/syncope/core/provisioning/camel/processor/UserUpdateInSyncProcessor.java
@@ -28,7 +28,6 @@ import org.apache.syncope.common.lib.patch.UserPatch;
 import org.apache.syncope.core.misc.spring.ApplicationContextProvider;
 import org.apache.syncope.core.persistence.api.entity.task.PropagationTask;
 import org.apache.syncope.core.provisioning.api.WorkflowResult;
-import org.apache.syncope.core.provisioning.api.propagation.PropagationException;
 import org.apache.syncope.core.provisioning.api.propagation.PropagationManager;
 import org.apache.syncope.core.provisioning.api.propagation.PropagationReporter;
 import org.apache.syncope.core.provisioning.api.propagation.PropagationTaskExecutor;
@@ -53,17 +52,13 @@ public class UserUpdateInSyncProcessor implements Processor {
     public void process(final Exchange exchange) {
         WorkflowResult<Pair<UserPatch, Boolean>> updated = (WorkflowResult) exchange.getIn().getBody();
         Set<String> excludedResources = exchange.getProperty("excludedResources", Set.class);
+        Boolean nullPriorityAsync = exchange.getProperty("nullPriorityAsync", Boolean.class);
 
         List<PropagationTask> tasks = propagationManager.getUserUpdateTasks(
                 updated, updated.getResult().getKey().getPassword() != null, excludedResources);
         PropagationReporter propagationReporter =
                 ApplicationContextProvider.getBeanFactory().getBean(PropagationReporter.class);
-        try {
-            taskExecutor.execute(tasks, propagationReporter);
-        } catch (PropagationException e) {
-            LOG.error("Error propagation primary resource", e);
-            propagationReporter.onPrimaryResourceFailure(tasks);
-        }
+        taskExecutor.execute(tasks, propagationReporter, nullPriorityAsync);
 
         exchange.getOut().setBody(new ImmutablePair<>(
                 updated.getResult().getKey().getKey(), propagationReporter.getStatuses()));

http://git-wip-us.apache.org/repos/asf/syncope/blob/1b81e33c/ext/camel/provisioning-camel/src/main/java/org/apache/syncope/core/provisioning/camel/processor/UserUpdateProcessor.java
----------------------------------------------------------------------
diff --git a/ext/camel/provisioning-camel/src/main/java/org/apache/syncope/core/provisioning/camel/processor/UserUpdateProcessor.java b/ext/camel/provisioning-camel/src/main/java/org/apache/syncope/core/provisioning/camel/processor/UserUpdateProcessor.java
index 8f175dd..57233a6 100644
--- a/ext/camel/provisioning-camel/src/main/java/org/apache/syncope/core/provisioning/camel/processor/UserUpdateProcessor.java
+++ b/ext/camel/provisioning-camel/src/main/java/org/apache/syncope/core/provisioning/camel/processor/UserUpdateProcessor.java
@@ -28,20 +28,15 @@ import org.apache.syncope.core.misc.spring.ApplicationContextProvider;
 import org.apache.syncope.core.persistence.api.entity.task.PropagationTask;
 import org.apache.syncope.core.provisioning.api.VirAttrHandler;
 import org.apache.syncope.core.provisioning.api.WorkflowResult;
-import org.apache.syncope.core.provisioning.api.propagation.PropagationException;
 import org.apache.syncope.core.provisioning.api.propagation.PropagationManager;
 import org.apache.syncope.core.provisioning.api.propagation.PropagationReporter;
 import org.apache.syncope.core.provisioning.api.propagation.PropagationTaskExecutor;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
 
 @Component
 public class UserUpdateProcessor implements Processor {
 
-    private static final Logger LOG = LoggerFactory.getLogger(UserUpdateProcessor.class);
-
     @Autowired
     protected PropagationManager propagationManager;
 
@@ -55,16 +50,12 @@ public class UserUpdateProcessor implements Processor {
     @SuppressWarnings("unchecked")
     public void process(final Exchange exchange) {
         WorkflowResult<Pair<UserPatch, Boolean>> updated = (WorkflowResult) exchange.getIn().getBody();
+        Boolean nullPriorityAsync = exchange.getProperty("nullPriorityAsync", Boolean.class);
 
         List<PropagationTask> tasks = propagationManager.getUserUpdateTasks(updated);
         PropagationReporter propagationReporter =
                 ApplicationContextProvider.getBeanFactory().getBean(PropagationReporter.class);
-        try {
-            taskExecutor.execute(tasks, propagationReporter);
-        } catch (PropagationException e) {
-            LOG.error("Error propagation primary resource", e);
-            propagationReporter.onPrimaryResourceFailure(tasks);
-        }
+        taskExecutor.execute(tasks, propagationReporter, nullPriorityAsync);
 
         exchange.getOut().setBody(new ImmutablePair<>(
                 updated.getResult().getKey().getKey(), propagationReporter.getStatuses()));

http://git-wip-us.apache.org/repos/asf/syncope/blob/1b81e33c/ext/camel/provisioning-camel/src/main/resources/provisioning.properties
----------------------------------------------------------------------
diff --git a/ext/camel/provisioning-camel/src/main/resources/provisioning.properties b/ext/camel/provisioning-camel/src/main/resources/provisioning.properties
index ab3b256..41f21ad 100644
--- a/ext/camel/provisioning-camel/src/main/resources/provisioning.properties
+++ b/ext/camel/provisioning-camel/src/main/resources/provisioning.properties
@@ -17,6 +17,10 @@
 camel.directory=${conf.directory}
 
 asyncConnectorFacadeExecutor.poolSize=10
+
+# see http://docs.spring.io/spring/docs/current/spring-framework-reference/html/scheduling.html#scheduling-task-namespace-executor
+propagationTaskExecutorAsyncExecutor.poolSize=5-25
+propagationTaskExecutorAsyncExecutor.queueCapacity=100
 propagationTaskExecutor=org.apache.syncope.core.provisioning.java.propagation.PriorityPropagationTaskExecutor
 
 userProvisioningManager=org.apache.syncope.core.provisioning.camel.CamelUserProvisioningManager

http://git-wip-us.apache.org/repos/asf/syncope/blob/1b81e33c/ext/camel/provisioning-camel/src/main/resources/userRoutes.xml
----------------------------------------------------------------------
diff --git a/ext/camel/provisioning-camel/src/main/resources/userRoutes.xml b/ext/camel/provisioning-camel/src/main/resources/userRoutes.xml
index 38e48f3..cbf2902 100644
--- a/ext/camel/provisioning-camel/src/main/resources/userRoutes.xml
+++ b/ext/camel/provisioning-camel/src/main/resources/userRoutes.xml
@@ -232,7 +232,7 @@ under the License.
   <route id="confirmPwdReset">
     <from uri="direct:confirmPwdReset"/>
     <doTry>
-      <bean ref="uwfAdapter" method="confirmPasswordReset(${property.userKey},${property.token},${property.password})"/>
+      <bean ref="uwfAdapter" method="confirmPasswordReset(${property.key},${property.token},${property.password})"/>
       <process ref="userConfirmPwdResetProcessor"/>
       <to uri="direct:confirmPwdResetPort"/>
       <doCatch>        

http://git-wip-us.apache.org/repos/asf/syncope/blob/1b81e33c/fit/core-reference/src/main/resources/all/provisioning.properties
----------------------------------------------------------------------
diff --git a/fit/core-reference/src/main/resources/all/provisioning.properties b/fit/core-reference/src/main/resources/all/provisioning.properties
index 9c979a2..8147828 100644
--- a/fit/core-reference/src/main/resources/all/provisioning.properties
+++ b/fit/core-reference/src/main/resources/all/provisioning.properties
@@ -17,6 +17,10 @@
 camel.directory=${conf.directory}
 
 asyncConnectorFacadeExecutor.poolSize=10
+
+# see http://docs.spring.io/spring/docs/current/spring-framework-reference/html/scheduling.html#scheduling-task-namespace-executor
+propagationTaskExecutorAsyncExecutor.poolSize=5-25
+propagationTaskExecutorAsyncExecutor.queueCapacity=100
 propagationTaskExecutor=org.apache.syncope.core.provisioning.java.propagation.PriorityPropagationTaskExecutor
 
 userProvisioningManager=org.apache.syncope.core.provisioning.camel.CamelUserProvisioningManager

http://git-wip-us.apache.org/repos/asf/syncope/blob/1b81e33c/fit/core-reference/src/main/resources/mariadb/provisioning.properties
----------------------------------------------------------------------
diff --git a/fit/core-reference/src/main/resources/mariadb/provisioning.properties b/fit/core-reference/src/main/resources/mariadb/provisioning.properties
index ca365dc..5b6539d 100644
--- a/fit/core-reference/src/main/resources/mariadb/provisioning.properties
+++ b/fit/core-reference/src/main/resources/mariadb/provisioning.properties
@@ -15,6 +15,10 @@
 # specific language governing permissions and limitations
 # under the License.
 asyncConnectorFacadeExecutor.poolSize=10
+
+# see http://docs.spring.io/spring/docs/current/spring-framework-reference/html/scheduling.html#scheduling-task-namespace-executor
+propagationTaskExecutorAsyncExecutor.poolSize=5-25
+propagationTaskExecutorAsyncExecutor.queueCapacity=100
 propagationTaskExecutor=org.apache.syncope.core.provisioning.java.propagation.PriorityPropagationTaskExecutor
 
 userProvisioningManager=org.apache.syncope.core.provisioning.java.DefaultUserProvisioningManager

http://git-wip-us.apache.org/repos/asf/syncope/blob/1b81e33c/fit/core-reference/src/main/resources/mysql/provisioning.properties
----------------------------------------------------------------------
diff --git a/fit/core-reference/src/main/resources/mysql/provisioning.properties b/fit/core-reference/src/main/resources/mysql/provisioning.properties
index 428be67..acb8a8a 100644
--- a/fit/core-reference/src/main/resources/mysql/provisioning.properties
+++ b/fit/core-reference/src/main/resources/mysql/provisioning.properties
@@ -15,6 +15,10 @@
 # specific language governing permissions and limitations
 # under the License.
 asyncConnectorFacadeExecutor.poolSize=10
+
+# see http://docs.spring.io/spring/docs/current/spring-framework-reference/html/scheduling.html#scheduling-task-namespace-executor
+propagationTaskExecutorAsyncExecutor.poolSize=5-25
+propagationTaskExecutorAsyncExecutor.queueCapacity=100
 propagationTaskExecutor=org.apache.syncope.core.provisioning.java.propagation.PriorityPropagationTaskExecutor
 
 userProvisioningManager=org.apache.syncope.core.provisioning.java.DefaultUserProvisioningManager

http://git-wip-us.apache.org/repos/asf/syncope/blob/1b81e33c/fit/core-reference/src/main/resources/oracle/provisioning.properties
----------------------------------------------------------------------
diff --git a/fit/core-reference/src/main/resources/oracle/provisioning.properties b/fit/core-reference/src/main/resources/oracle/provisioning.properties
index a507de0..a71d41e 100644
--- a/fit/core-reference/src/main/resources/oracle/provisioning.properties
+++ b/fit/core-reference/src/main/resources/oracle/provisioning.properties
@@ -15,6 +15,10 @@
 # specific language governing permissions and limitations
 # under the License.
 asyncConnectorFacadeExecutor.poolSize=10
+
+# see http://docs.spring.io/spring/docs/current/spring-framework-reference/html/scheduling.html#scheduling-task-namespace-executor
+propagationTaskExecutorAsyncExecutor.poolSize=5-25
+propagationTaskExecutorAsyncExecutor.queueCapacity=100
 propagationTaskExecutor=org.apache.syncope.core.provisioning.java.propagation.PriorityPropagationTaskExecutor
 
 userProvisioningManager=org.apache.syncope.core.provisioning.java.DefaultUserProvisioningManager

http://git-wip-us.apache.org/repos/asf/syncope/blob/1b81e33c/fit/core-reference/src/main/resources/postgres/provisioning.properties
----------------------------------------------------------------------
diff --git a/fit/core-reference/src/main/resources/postgres/provisioning.properties b/fit/core-reference/src/main/resources/postgres/provisioning.properties
index 1be02bf..4b578ba 100644
--- a/fit/core-reference/src/main/resources/postgres/provisioning.properties
+++ b/fit/core-reference/src/main/resources/postgres/provisioning.properties
@@ -15,6 +15,10 @@
 # specific language governing permissions and limitations
 # under the License.
 asyncConnectorFacadeExecutor.poolSize=10
+
+# see http://docs.spring.io/spring/docs/current/spring-framework-reference/html/scheduling.html#scheduling-task-namespace-executor
+propagationTaskExecutorAsyncExecutor.poolSize=5-25
+propagationTaskExecutorAsyncExecutor.queueCapacity=100
 propagationTaskExecutor=org.apache.syncope.core.provisioning.java.propagation.PriorityPropagationTaskExecutor
 
 userProvisioningManager=org.apache.syncope.core.provisioning.java.DefaultUserProvisioningManager

http://git-wip-us.apache.org/repos/asf/syncope/blob/1b81e33c/fit/core-reference/src/main/resources/provisioning.properties
----------------------------------------------------------------------
diff --git a/fit/core-reference/src/main/resources/provisioning.properties b/fit/core-reference/src/main/resources/provisioning.properties
index a14ae19..dae8ca8 100644
--- a/fit/core-reference/src/main/resources/provisioning.properties
+++ b/fit/core-reference/src/main/resources/provisioning.properties
@@ -15,6 +15,10 @@
 # specific language governing permissions and limitations
 # under the License.
 asyncConnectorFacadeExecutor.poolSize=10
+
+# see http://docs.spring.io/spring/docs/current/spring-framework-reference/html/scheduling.html#scheduling-task-namespace-executor
+propagationTaskExecutorAsyncExecutor.poolSize=5-25
+propagationTaskExecutorAsyncExecutor.queueCapacity=100
 propagationTaskExecutor=org.apache.syncope.core.provisioning.java.propagation.PriorityPropagationTaskExecutor
 
 userProvisioningManager=org.apache.syncope.core.provisioning.java.DefaultUserProvisioningManager

http://git-wip-us.apache.org/repos/asf/syncope/blob/1b81e33c/fit/core-reference/src/main/resources/sqlserver/provisioning.properties
----------------------------------------------------------------------
diff --git a/fit/core-reference/src/main/resources/sqlserver/provisioning.properties b/fit/core-reference/src/main/resources/sqlserver/provisioning.properties
index 4cb4b80..510eae0 100644
--- a/fit/core-reference/src/main/resources/sqlserver/provisioning.properties
+++ b/fit/core-reference/src/main/resources/sqlserver/provisioning.properties
@@ -15,6 +15,10 @@
 # specific language governing permissions and limitations
 # under the License.
 asyncConnectorFacadeExecutor.poolSize=10
+
+# see http://docs.spring.io/spring/docs/current/spring-framework-reference/html/scheduling.html#scheduling-task-namespace-executor
+propagationTaskExecutorAsyncExecutor.poolSize=5-25
+propagationTaskExecutorAsyncExecutor.queueCapacity=100
 propagationTaskExecutor=org.apache.syncope.core.provisioning.java.propagation.PriorityPropagationTaskExecutor
 
 userProvisioningManager=org.apache.syncope.core.provisioning.java.DefaultUserProvisioningManager

http://git-wip-us.apache.org/repos/asf/syncope/blob/1b81e33c/fit/core-reference/src/test/java/org/apache/syncope/fit/core/reference/AbstractITCase.java
----------------------------------------------------------------------
diff --git a/fit/core-reference/src/test/java/org/apache/syncope/fit/core/reference/AbstractITCase.java b/fit/core-reference/src/test/java/org/apache/syncope/fit/core/reference/AbstractITCase.java
index 3e4381d..9aaf034 100644
--- a/fit/core-reference/src/test/java/org/apache/syncope/fit/core/reference/AbstractITCase.java
+++ b/fit/core-reference/src/test/java/org/apache/syncope/fit/core/reference/AbstractITCase.java
@@ -30,6 +30,7 @@ import javax.naming.Context;
 import javax.naming.NamingException;
 import javax.naming.directory.InitialDirContext;
 import javax.sql.DataSource;
+import javax.ws.rs.core.GenericType;
 import javax.ws.rs.core.Response;
 import org.apache.commons.io.IOUtils;
 import org.apache.commons.lang3.StringUtils;
@@ -46,6 +47,7 @@ import org.apache.syncope.common.lib.to.AnyObjectTO;
 import org.apache.syncope.common.lib.to.AttrTO;
 import org.apache.syncope.common.lib.to.ResourceTO;
 import org.apache.syncope.common.lib.to.GroupTO;
+import org.apache.syncope.common.lib.to.ProvisioningResult;
 import org.apache.syncope.common.lib.to.RoleTO;
 import org.apache.syncope.common.lib.to.UserTO;
 import org.apache.syncope.common.lib.types.ConnConfProperty;
@@ -274,34 +276,6 @@ public abstract class AbstractITCase {
         return new AttrPatch.Builder().operation(PatchOperation.ADD_REPLACE).attrTO(attrTO(schema, value)).build();
     }
 
-    protected UserTO createUser(final UserTO userTO) {
-        return createUser(userTO, true);
-    }
-
-    protected UserTO createUser(final UserTO userTO, final boolean storePassword) {
-        Response response = userService.create(userTO, storePassword);
-        if (response.getStatusInfo().getStatusCode() != Response.Status.CREATED.getStatusCode()) {
-            Exception ex = clientFactory.getExceptionMapper().fromResponse(response);
-            if (ex != null) {
-                throw (RuntimeException) ex;
-            }
-        }
-        return response.readEntity(UserTO.class);
-    }
-
-    protected UserTO readUser(final String username) {
-        return userService.read(Long.valueOf(
-                userService.getUserKey(username).getHeaderString(RESTHeaders.USER_KEY)));
-    }
-
-    protected UserTO updateUser(final UserPatch userPatch) {
-        return userService.update(userPatch).readEntity(UserTO.class);
-    }
-
-    protected UserTO deleteUser(final Long key) {
-        return userService.delete(key).readEntity(UserTO.class);
-    }
-
     public <T> T getObject(final URI location, final Class<?> serviceClass, final Class<T> resultClass) {
         WebClient webClient = WebClient.fromClient(WebClient.client(adminClient.getService(serviceClass)));
         webClient.accept(clientFactory.getContentType().getMediaType()).to(location.toASCIIString(), false);
@@ -333,7 +307,39 @@ public abstract class AbstractITCase {
         return getObject(response.getLocation(), RoleService.class, RoleTO.class);
     }
 
-    protected AnyObjectTO createAnyObject(final AnyObjectTO anyObjectTO) {
+    protected UserTO readUser(final String username) {
+        return userService.read(Long.valueOf(userService.getUserKey(username).getHeaderString(RESTHeaders.USER_KEY)));
+    }
+
+    protected ProvisioningResult<UserTO> createUser(final UserTO userTO) {
+        return createUser(userTO, true);
+    }
+
+    protected ProvisioningResult<UserTO> createUser(final UserTO userTO, final boolean storePassword) {
+        Response response = userService.create(userTO, storePassword);
+        if (response.getStatusInfo().getStatusCode() != Response.Status.CREATED.getStatusCode()) {
+            Exception ex = clientFactory.getExceptionMapper().fromResponse(response);
+            if (ex != null) {
+                throw (RuntimeException) ex;
+            }
+        }
+        return response.readEntity(new GenericType<ProvisioningResult<UserTO>>() {
+        });
+    }
+
+    protected ProvisioningResult<UserTO> updateUser(final UserPatch userPatch) {
+        return userService.update(userPatch).
+                readEntity(new GenericType<ProvisioningResult<UserTO>>() {
+                });
+    }
+
+    protected ProvisioningResult<UserTO> deleteUser(final Long key) {
+        return userService.delete(key).
+                readEntity(new GenericType<ProvisioningResult<UserTO>>() {
+                });
+    }
+
+    protected ProvisioningResult<AnyObjectTO> createAnyObject(final AnyObjectTO anyObjectTO) {
         Response response = anyObjectService.create(anyObjectTO);
         if (response.getStatusInfo().getStatusCode() != Response.Status.CREATED.getStatusCode()) {
             Exception ex = clientFactory.getExceptionMapper().fromResponse(response);
@@ -341,18 +347,23 @@ public abstract class AbstractITCase {
                 throw (RuntimeException) ex;
             }
         }
-        return response.readEntity(AnyObjectTO.class);
+        return response.readEntity(new GenericType<ProvisioningResult<AnyObjectTO>>() {
+        });
     }
 
-    protected AnyObjectTO updateAnyObject(final AnyObjectPatch anyObjectPatch) {
-        return anyObjectService.update(anyObjectPatch).readEntity(AnyObjectTO.class);
+    protected ProvisioningResult<AnyObjectTO> updateAnyObject(final AnyObjectPatch anyObjectPatch) {
+        return anyObjectService.update(anyObjectPatch).
+                readEntity(new GenericType<ProvisioningResult<AnyObjectTO>>() {
+                });
     }
 
-    protected AnyObjectTO deleteAnyObject(final Long key) {
-        return anyObjectService.delete(key).readEntity(AnyObjectTO.class);
+    protected ProvisioningResult<AnyObjectTO> deleteAnyObject(final Long key) {
+        return anyObjectService.delete(key).
+                readEntity(new GenericType<ProvisioningResult<AnyObjectTO>>() {
+                });
     }
 
-    protected GroupTO createGroup(final GroupTO groupTO) {
+    protected ProvisioningResult<GroupTO> createGroup(final GroupTO groupTO) {
         Response response = groupService.create(groupTO);
         if (response.getStatusInfo().getStatusCode() != Response.Status.CREATED.getStatusCode()) {
             Exception ex = clientFactory.getExceptionMapper().fromResponse(response);
@@ -360,15 +371,20 @@ public abstract class AbstractITCase {
                 throw (RuntimeException) ex;
             }
         }
-        return response.readEntity(GroupTO.class);
+        return response.readEntity(new GenericType<ProvisioningResult<GroupTO>>() {
+        });
     }
 
-    protected GroupTO updateGroup(final GroupPatch groupPatch) {
-        return groupService.update(groupPatch).readEntity(GroupTO.class);
+    protected ProvisioningResult<GroupTO> updateGroup(final GroupPatch groupPatch) {
+        return groupService.update(groupPatch).
+                readEntity(new GenericType<ProvisioningResult<GroupTO>>() {
+                });
     }
 
-    protected GroupTO deleteGroup(final Long key) {
-        return groupService.delete(key).readEntity(GroupTO.class);
+    protected ProvisioningResult<GroupTO> deleteGroup(final Long key) {
+        return groupService.delete(key).
+                readEntity(new GenericType<ProvisioningResult<GroupTO>>() {
+                });
     }
 
     @SuppressWarnings("unchecked")

http://git-wip-us.apache.org/repos/asf/syncope/blob/1b81e33c/fit/core-reference/src/test/java/org/apache/syncope/fit/core/reference/AnyObjectITCase.java
----------------------------------------------------------------------
diff --git a/fit/core-reference/src/test/java/org/apache/syncope/fit/core/reference/AnyObjectITCase.java b/fit/core-reference/src/test/java/org/apache/syncope/fit/core/reference/AnyObjectITCase.java
index 5474744..78bb011 100644
--- a/fit/core-reference/src/test/java/org/apache/syncope/fit/core/reference/AnyObjectITCase.java
+++ b/fit/core-reference/src/test/java/org/apache/syncope/fit/core/reference/AnyObjectITCase.java
@@ -57,7 +57,7 @@ public class AnyObjectITCase extends AbstractITCase {
     public void create() {
         AnyObjectTO anyObjectTO = getSampleTO("create");
 
-        anyObjectTO = createAnyObject(anyObjectTO);
+        anyObjectTO = createAnyObject(anyObjectTO).getAny();
         assertNotNull(anyObjectTO);
 
         ConnObjectTO connObjectTO =
@@ -78,10 +78,10 @@ public class AnyObjectITCase extends AbstractITCase {
         AnyObjectTO anyObjectTO = getSampleTO("deletable");
         anyObjectTO.setRealm("/even");
 
-        anyObjectTO = createAnyObject(anyObjectTO);
+        anyObjectTO = createAnyObject(anyObjectTO).getAny();
         assertNotNull(anyObjectTO);
 
-        AnyObjectTO deletedAnyObject = deleteAnyObject(anyObjectTO.getKey());
+        AnyObjectTO deletedAnyObject = deleteAnyObject(anyObjectTO.getKey()).getAny();
         assertNotNull(deletedAnyObject);
 
         try {
@@ -113,7 +113,7 @@ public class AnyObjectITCase extends AbstractITCase {
     @Test
     public void update() {
         AnyObjectTO anyObjectTO = getSampleTO("update");
-        anyObjectTO = createAnyObject(anyObjectTO);
+        anyObjectTO = createAnyObject(anyObjectTO).getAny();
 
         assertEquals(1, anyObjectTO.getPlainAttrs().size());
 
@@ -122,7 +122,7 @@ public class AnyObjectITCase extends AbstractITCase {
         String newLocation = "new" + getUUIDString();
         anyObjectPatch.getPlainAttrs().add(attrAddReplacePatch("location", newLocation));
 
-        anyObjectTO = updateAnyObject(anyObjectPatch);
+        anyObjectTO = updateAnyObject(anyObjectPatch).getAny();
 
         assertEquals(newLocation, anyObjectTO.getPlainAttrMap().get("location").getValues().get(0));
     }
@@ -130,7 +130,7 @@ public class AnyObjectITCase extends AbstractITCase {
     @Test
     public void readAttrs() {
         AnyObjectTO anyObjectTO = getSampleTO("readAttrs");
-        anyObjectTO = createAnyObject(anyObjectTO);
+        anyObjectTO = createAnyObject(anyObjectTO).getAny();
         assertNotNull(anyObjectTO);
 
         Set<AttrTO> attrs = anyObjectService.read(anyObjectTO.getKey(), SchemaType.PLAIN);
@@ -143,7 +143,7 @@ public class AnyObjectITCase extends AbstractITCase {
     @Test
     public void updateAttr() {
         AnyObjectTO anyObjectTO = getSampleTO("updateAttr");
-        anyObjectTO = createAnyObject(anyObjectTO);
+        anyObjectTO = createAnyObject(anyObjectTO).getAny();
         assertNotNull(anyObjectTO);
 
         AttrTO updated = attrTO("location", "newlocation");
@@ -156,7 +156,7 @@ public class AnyObjectITCase extends AbstractITCase {
     @Test
     public void deleteAttr() {
         AnyObjectTO anyObjectTO = getSampleTO("deleteAttr");
-        anyObjectTO = createAnyObject(anyObjectTO);
+        anyObjectTO = createAnyObject(anyObjectTO).getAny();
         assertNotNull(anyObjectTO);
         assertNotNull(anyObjectTO.getPlainAttrMap().get("location"));
 

http://git-wip-us.apache.org/repos/asf/syncope/blob/1b81e33c/fit/core-reference/src/test/java/org/apache/syncope/fit/core/reference/AuthenticationITCase.java
----------------------------------------------------------------------
diff --git a/fit/core-reference/src/test/java/org/apache/syncope/fit/core/reference/AuthenticationITCase.java b/fit/core-reference/src/test/java/org/apache/syncope/fit/core/reference/AuthenticationITCase.java
index 262d34e..e5cf78b 100644
--- a/fit/core-reference/src/test/java/org/apache/syncope/fit/core/reference/AuthenticationITCase.java
+++ b/fit/core-reference/src/test/java/org/apache/syncope/fit/core/reference/AuthenticationITCase.java
@@ -28,6 +28,7 @@ import java.security.AccessControlException;
 import java.util.HashSet;
 import java.util.Map;
 import java.util.Set;
+import javax.ws.rs.core.GenericType;
 import javax.ws.rs.core.Response;
 import org.apache.commons.collections4.CollectionUtils;
 import org.apache.commons.collections4.Predicate;
@@ -45,6 +46,7 @@ import org.apache.syncope.common.lib.to.BulkActionResult;
 import org.apache.syncope.common.lib.to.MembershipTO;
 import org.apache.syncope.common.lib.to.PagedResult;
 import org.apache.syncope.common.lib.to.PlainSchemaTO;
+import org.apache.syncope.common.lib.to.ProvisioningResult;
 import org.apache.syncope.common.lib.to.RoleTO;
 import org.apache.syncope.common.lib.to.UserTO;
 import org.apache.syncope.common.lib.to.WorkflowFormPropertyTO;
@@ -140,7 +142,7 @@ public class AuthenticationITCase extends AbstractITCase {
         UserTO userTO = UserITCase.getUniqueSampleTO("auth@test.org");
         userTO.getRoles().add(roleTO.getKey());
 
-        userTO = createUser(userTO);
+        userTO = createUser(userTO).getAny();
         assertNotNull(userTO);
 
         // 3. read the schema created above (as admin) - success
@@ -170,7 +172,7 @@ public class AuthenticationITCase extends AbstractITCase {
         UserTO userTO = UserITCase.getUniqueSampleTO("testuserread@test.org");
         userTO.getRoles().add(2L);
 
-        userTO = createUser(userTO);
+        userTO = createUser(userTO).getAny();
         assertNotNull(userTO);
 
         UserService userService2 = clientFactory.create(userTO.getUsername(), "password123").
@@ -195,7 +197,7 @@ public class AuthenticationITCase extends AbstractITCase {
         UserTO userTO = UserITCase.getUniqueSampleTO("testusersearch@test.org");
         userTO.getRoles().add(1L);
 
-        userTO = createUser(userTO);
+        userTO = createUser(userTO).getAny();
         assertNotNull(userTO);
 
         // 1. user assigned to role 1, with search entitlement on realms /odd and /even: won't find anything with 
@@ -257,7 +259,7 @@ public class AuthenticationITCase extends AbstractITCase {
             // 2. as admin, create delegated admin user, and assign the role just created
             UserTO delegatedAdmin = UserITCase.getUniqueSampleTO("admin@syncope.apache.org");
             delegatedAdmin.getRoles().add(roleKey);
-            delegatedAdmin = createUser(delegatedAdmin);
+            delegatedAdmin = createUser(delegatedAdmin).getAny();
             delegatedAdminKey = delegatedAdmin.getKey();
 
             // 3. instantiate a delegate user service client, for further operatins
@@ -279,7 +281,8 @@ public class AuthenticationITCase extends AbstractITCase {
             Response response = delegatedUserService.create(user);
             assertEquals(Response.Status.CREATED.getStatusCode(), response.getStatus());
 
-            user = response.readEntity(UserTO.class);
+            user = response.readEntity(new GenericType<ProvisioningResult<UserTO>>() {
+            }).getAny();
             assertEquals("surname", user.getPlainAttrMap().get("surname").getValues().get(0));
 
             // 5. as delegated, update user attempting to move under realm / -> fail
@@ -301,7 +304,8 @@ public class AuthenticationITCase extends AbstractITCase {
             response = delegatedUserService.update(userPatch);
             assertEquals(Response.Status.OK.getStatusCode(), response.getStatus());
 
-            user = response.readEntity(UserTO.class);
+            user = response.readEntity(new GenericType<ProvisioningResult<UserTO>>() {
+            }).getAny();
             assertEquals("surname2", user.getPlainAttrMap().get("surname").getValues().get(0));
 
             // 7. as delegated, delete user
@@ -328,7 +332,7 @@ public class AuthenticationITCase extends AbstractITCase {
         UserTO userTO = UserITCase.getUniqueSampleTO("checkFailedLogin@syncope.apache.org");
         userTO.getRoles().add(2L);
 
-        userTO = createUser(userTO);
+        userTO = createUser(userTO).getAny();
         assertNotNull(userTO);
         long userId = userTO.getKey();
 
@@ -354,7 +358,7 @@ public class AuthenticationITCase extends AbstractITCase {
         userTO.setRealm("/odd");
         userTO.getRoles().add(2L);
 
-        userTO = createUser(userTO);
+        userTO = createUser(userTO).getAny();
         long userKey = userTO.getKey();
         assertNotNull(userTO);
 
@@ -384,7 +388,8 @@ public class AuthenticationITCase extends AbstractITCase {
         StatusPatch reactivate = new StatusPatch();
         reactivate.setKey(userTO.getKey());
         reactivate.setType(StatusPatchType.REACTIVATE);
-        userTO = userService.status(reactivate).readEntity(UserTO.class);
+        userTO = userService.status(reactivate).readEntity(new GenericType<ProvisioningResult<UserTO>>() {
+        }).getAny();
         assertNotNull(userTO);
         assertEquals("active", userTO.getStatus());
 
@@ -399,7 +404,7 @@ public class AuthenticationITCase extends AbstractITCase {
         UserTO userTO = UserITCase.getUniqueSampleTO("createWithReject@syncope.apache.org");
         userTO.getMemberships().add(new MembershipTO.Builder().group(9L).build());
 
-        userTO = createUser(userTO);
+        userTO = createUser(userTO).getAny();
         assertNotNull(userTO);
         assertEquals("createApproval", userTO.getStatus());
 
@@ -437,7 +442,7 @@ public class AuthenticationITCase extends AbstractITCase {
         user.setRealm("/even/two");
         user.setPassword("password123");
         user.getResources().add(RESOURCE_NAME_TESTDB);
-        user = createUser(user);
+        user = createUser(user).getAny();
         assertNotNull(user);
 
         // 2. unlink the resource from the created user
@@ -451,7 +456,7 @@ public class AuthenticationITCase extends AbstractITCase {
         UserPatch userPatch = new UserPatch();
         userPatch.setKey(user.getKey());
         userPatch.setPassword(new PasswordPatch.Builder().value("password234").build());
-        user = updateUser(userPatch);
+        user = updateUser(userPatch).getAny();
         assertNotNull(user);
 
         // 4. check that the db resource has still the initial password value

http://git-wip-us.apache.org/repos/asf/syncope/blob/1b81e33c/fit/core-reference/src/test/java/org/apache/syncope/fit/core/reference/CamelRouteITCase.java
----------------------------------------------------------------------
diff --git a/fit/core-reference/src/test/java/org/apache/syncope/fit/core/reference/CamelRouteITCase.java b/fit/core-reference/src/test/java/org/apache/syncope/fit/core/reference/CamelRouteITCase.java
index 4ddcaa3..7b18109 100644
--- a/fit/core-reference/src/test/java/org/apache/syncope/fit/core/reference/CamelRouteITCase.java
+++ b/fit/core-reference/src/test/java/org/apache/syncope/fit/core/reference/CamelRouteITCase.java
@@ -164,7 +164,7 @@ public class CamelRouteITCase extends AbstractITCase {
             userTO.getPlainAttrs().add(attrTO("surname", userId));
             userTO.getPlainAttrs().add(attrTO("camelAttribute", "false"));
 
-            userTO = createUser(userTO);
+            userTO = createUser(userTO).getAny();
             assertNotNull(userTO);
             assertEquals("true", CollectionUtils.get(userTO.getPlainAttrs(), 3).getValues().get(0));
         } finally {

http://git-wip-us.apache.org/repos/asf/syncope/blob/1b81e33c/fit/core-reference/src/test/java/org/apache/syncope/fit/core/reference/GroupITCase.java
----------------------------------------------------------------------
diff --git a/fit/core-reference/src/test/java/org/apache/syncope/fit/core/reference/GroupITCase.java b/fit/core-reference/src/test/java/org/apache/syncope/fit/core/reference/GroupITCase.java
index 17ba8c8..3ddb2c8 100644
--- a/fit/core-reference/src/test/java/org/apache/syncope/fit/core/reference/GroupITCase.java
+++ b/fit/core-reference/src/test/java/org/apache/syncope/fit/core/reference/GroupITCase.java
@@ -34,6 +34,7 @@ import javax.naming.NamingException;
 import javax.naming.directory.DirContext;
 import javax.naming.directory.SearchControls;
 import javax.naming.directory.SearchResult;
+import javax.ws.rs.core.GenericType;
 import javax.ws.rs.core.Response;
 import org.apache.commons.collections4.CollectionUtils;
 import org.apache.commons.collections4.Predicate;
@@ -61,6 +62,7 @@ import org.apache.syncope.common.lib.to.ResourceTO;
 import org.apache.syncope.common.lib.to.GroupTO;
 import org.apache.syncope.common.lib.to.MappingTO;
 import org.apache.syncope.common.lib.to.ProvisionTO;
+import org.apache.syncope.common.lib.to.ProvisioningResult;
 import org.apache.syncope.common.lib.to.UserTO;
 import org.apache.syncope.common.lib.types.AnyTypeKind;
 import org.apache.syncope.common.lib.types.AttrSchemaType;
@@ -85,7 +87,7 @@ public class GroupITCase extends AbstractITCase {
 
     public static GroupTO getBasicSampleTO(final String name) {
         GroupTO groupTO = new GroupTO();
-        groupTO.setRealm("/");
+        groupTO.setRealm(SyncopeConstants.ROOT_REALM);
         groupTO.setName(name + getUUIDString());
         return groupTO;
     }
@@ -105,7 +107,7 @@ public class GroupITCase extends AbstractITCase {
         groupTO.getVirAttrs().add(attrTO("rvirtualdata", "rvirtualvalue"));
         groupTO.setGroupOwner(8L);
 
-        groupTO = createGroup(groupTO);
+        groupTO = createGroup(groupTO).getAny();
         assertNotNull(groupTO);
 
         assertNotNull(groupTO.getVirAttrMap());
@@ -125,7 +127,7 @@ public class GroupITCase extends AbstractITCase {
         groupPatch.setKey(groupTO.getKey());
         groupPatch.setGroupOwner(new LongReplacePatchItem());
 
-        assertNull(updateGroup(groupPatch).getGroupOwner());
+        assertNull(updateGroup(groupPatch).getAny().getGroupOwner());
     }
 
     @Test
@@ -142,10 +144,10 @@ public class GroupITCase extends AbstractITCase {
 
         groupTO.getResources().add(RESOURCE_NAME_LDAP);
 
-        groupTO = createGroup(groupTO);
+        groupTO = createGroup(groupTO).getAny();
         assertNotNull(groupTO);
 
-        GroupTO deletedGroup = deleteGroup(groupTO.getKey());
+        GroupTO deletedGroup = deleteGroup(groupTO.getKey()).getAny();
         assertNotNull(deletedGroup);
 
         try {
@@ -206,7 +208,7 @@ public class GroupITCase extends AbstractITCase {
     @Test
     public void update() {
         GroupTO groupTO = getSampleTO("latestGroup" + getUUIDString());
-        groupTO = createGroup(groupTO);
+        groupTO = createGroup(groupTO).getAny();
 
         assertEquals(1, groupTO.getPlainAttrs().size());
 
@@ -216,7 +218,7 @@ public class GroupITCase extends AbstractITCase {
         groupPatch.setName(new StringReplacePatchItem.Builder().value(modName).build());
         groupPatch.getPlainAttrs().add(attrAddReplacePatch("show", "FALSE"));
 
-        groupTO = updateGroup(groupPatch);
+        groupTO = updateGroup(groupPatch).getAny();
 
         assertEquals(modName, groupTO.getName());
         assertEquals(2, groupTO.getPlainAttrs().size());
@@ -227,7 +229,7 @@ public class GroupITCase extends AbstractITCase {
         GroupTO groupTO = getBasicSampleTO("withderived" + getUUIDString());
         groupTO.getDerAttrs().add(attrTO("rderivedschema", null));
 
-        groupTO = createGroup(groupTO);
+        groupTO = createGroup(groupTO).getAny();
 
         assertNotNull(groupTO);
         assertEquals(1, groupTO.getDerAttrs().size());
@@ -238,7 +240,7 @@ public class GroupITCase extends AbstractITCase {
                 attrTO(new AttrTO.Builder().schema("rderivedschema").build()).
                 build());
 
-        groupTO = updateGroup(groupPatch);
+        groupTO = updateGroup(groupPatch).getAny();
         assertNotNull(groupTO);
         assertTrue(groupTO.getDerAttrs().isEmpty());
     }
@@ -274,7 +276,8 @@ public class GroupITCase extends AbstractITCase {
         // 4. update as puccini, owner of group 6 - success
         GroupService groupService3 = clientFactory.create("puccini", ADMIN_PWD).getService(GroupService.class);
 
-        groupTO = groupService3.update(groupPatch).readEntity(GroupTO.class);
+        groupTO = groupService3.update(groupPatch).readEntity(new GenericType<ProvisioningResult<GroupTO>>() {
+        }).getAny();
         assertEquals("Director", groupTO.getName());
 
         // issue SYNCOPE-15
@@ -292,7 +295,7 @@ public class GroupITCase extends AbstractITCase {
         groupTO.setName(groupName);
         groupTO.setRealm("/");
 
-        GroupTO actual = createGroup(groupTO);
+        GroupTO actual = createGroup(groupTO).getAny();
 
         assertNotNull(actual);
         assertEquals(groupName, actual.getName());
@@ -302,14 +305,14 @@ public class GroupITCase extends AbstractITCase {
         String renamedGroup = "renamed" + getUUIDString();
         groupPatch.setName(new StringReplacePatchItem.Builder().value(renamedGroup).build());
 
-        actual = updateGroup(groupPatch);
+        actual = updateGroup(groupPatch).getAny();
         assertNotNull(actual);
         assertEquals(renamedGroup, actual.getName());
     }
 
     @Test
     public void unlink() {
-        GroupTO actual = createGroup(getSampleTO("unlink"));
+        GroupTO actual = createGroup(getSampleTO("unlink")).getAny();
         assertNotNull(actual);
 
         assertNotNull(resourceService.readConnObject(RESOURCE_NAME_LDAP, AnyTypeKind.GROUP.name(), actual.getKey()));
@@ -333,7 +336,7 @@ public class GroupITCase extends AbstractITCase {
         GroupTO groupTO = getSampleTO("link");
         groupTO.getResources().clear();
 
-        GroupTO actual = createGroup(groupTO);
+        GroupTO actual = createGroup(groupTO).getAny();
         assertNotNull(actual);
 
         try {
@@ -363,7 +366,7 @@ public class GroupITCase extends AbstractITCase {
 
     @Test
     public void unassign() {
-        GroupTO actual = createGroup(getSampleTO("unassign"));
+        GroupTO actual = createGroup(getSampleTO("unassign")).getAny();
         assertNotNull(actual);
 
         assertNotNull(resourceService.readConnObject(RESOURCE_NAME_LDAP, AnyTypeKind.GROUP.name(), actual.getKey()));
@@ -392,7 +395,7 @@ public class GroupITCase extends AbstractITCase {
         GroupTO groupTO = getSampleTO("assign");
         groupTO.getResources().clear();
 
-        GroupTO actual = createGroup(groupTO);
+        GroupTO actual = createGroup(groupTO).getAny();
         assertNotNull(actual);
 
         try {
@@ -416,7 +419,7 @@ public class GroupITCase extends AbstractITCase {
 
     @Test
     public void deprovision() {
-        GroupTO actual = createGroup(getSampleTO("deprovision"));
+        GroupTO actual = createGroup(getSampleTO("deprovision")).getAny();
         assertNotNull(actual);
         assertNotNull(actual.getKey());
 
@@ -446,7 +449,7 @@ public class GroupITCase extends AbstractITCase {
         GroupTO groupTO = getSampleTO("assign" + getUUIDString());
         groupTO.getResources().clear();
 
-        GroupTO actual = createGroup(groupTO);
+        GroupTO actual = createGroup(groupTO).getAny();
         assertNotNull(actual);
 
         try {
@@ -474,7 +477,7 @@ public class GroupITCase extends AbstractITCase {
         GroupTO groupTO = getSampleTO("assign" + getUUIDString());
         groupTO.getResources().clear();
 
-        GroupTO actual = createGroup(groupTO);
+        GroupTO actual = createGroup(groupTO).getAny();
         assertNotNull(actual);
 
         try {
@@ -526,7 +529,7 @@ public class GroupITCase extends AbstractITCase {
         // 2. create a group *without* an attribute for that schema: it works
         GroupTO groupTO = getSampleTO("lastGroup");
         assertFalse(groupTO.getPlainAttrMap().containsKey(badge.getKey()));
-        groupTO = createGroup(groupTO);
+        groupTO = createGroup(groupTO).getAny();
         assertNotNull(groupTO);
         assertFalse(groupTO.getPlainAttrMap().containsKey(badge.getKey()));
 
@@ -554,7 +557,7 @@ public class GroupITCase extends AbstractITCase {
             // 5. also add an actual attribute for badge - it will work        
             groupPatch.getPlainAttrs().add(attrAddReplacePatch(badge.getKey(), "xxxxxxxxxx"));
 
-            groupTO = updateGroup(groupPatch);
+            groupTO = updateGroup(groupPatch).getAny();
             assertNotNull(groupTO);
             assertTrue(groupTO.getPlainAttrMap().containsKey(badge.getKey()));
         } finally {
@@ -619,7 +622,7 @@ public class GroupITCase extends AbstractITCase {
 
         GroupTO group = getBasicSampleTO("dynMembership");
         group.setUDynMembershipCond("cool==true");
-        group = createGroup(group);
+        group = createGroup(group).getAny();
         assertNotNull(group);
 
         assertTrue(userService.read(4L).getDynGroups().contains(group.getKey()));
@@ -652,11 +655,12 @@ public class GroupITCase extends AbstractITCase {
             group.getPlainAttrs().add(attrTO("title", "first"));
             group.getResources().add(RESOURCE_NAME_LDAP);
 
-            group = createGroup(group);
-            assertNotNull(group);
-            assertEquals(1, group.getPropagationStatusTOs().size());
-            assertEquals(RESOURCE_NAME_LDAP, group.getPropagationStatusTOs().get(0).getResource());
-            assertEquals(PropagationTaskExecStatus.SUCCESS, group.getPropagationStatusTOs().get(0).getStatus());
+            ProvisioningResult<GroupTO> result = createGroup(group);
+            assertNotNull(result);
+            assertEquals(1, result.getPropagationStatuses().size());
+            assertEquals(RESOURCE_NAME_LDAP, result.getPropagationStatuses().get(0).getResource());
+            assertEquals(PropagationTaskExecStatus.SUCCESS, result.getPropagationStatuses().get(0).getStatus());
+            group = result.getAny();
 
             // 2. update succeeds
             GroupPatch patch = new GroupPatch();
@@ -664,11 +668,12 @@ public class GroupITCase extends AbstractITCase {
             patch.getPlainAttrs().add(new AttrPatch.Builder().
                     operation(PatchOperation.ADD_REPLACE).attrTO(attrTO("title", "second")).build());
 
-            group = groupService.update(patch).readEntity(GroupTO.class);
-            assertNotNull(group);
-            assertEquals(1, group.getPropagationStatusTOs().size());
-            assertEquals(RESOURCE_NAME_LDAP, group.getPropagationStatusTOs().get(0).getResource());
-            assertEquals(PropagationTaskExecStatus.SUCCESS, group.getPropagationStatusTOs().get(0).getStatus());
+            result = updateGroup(patch);
+            assertNotNull(result);
+            assertEquals(1, result.getPropagationStatuses().size());
+            assertEquals(RESOURCE_NAME_LDAP, result.getPropagationStatuses().get(0).getResource());
+            assertEquals(PropagationTaskExecStatus.SUCCESS, result.getPropagationStatuses().get(0).getStatus());
+            group = result.getAny();
 
             // 3. set capability override with only search allowed, but not enable
             ldap.getCapabilitiesOverride().add(ConnectorCapability.SEARCH);
@@ -685,11 +690,12 @@ public class GroupITCase extends AbstractITCase {
             patch.getPlainAttrs().add(new AttrPatch.Builder().
                     operation(PatchOperation.ADD_REPLACE).attrTO(attrTO("title", "third")).build());
 
-            group = groupService.update(patch).readEntity(GroupTO.class);
-            assertNotNull(group);
-            assertEquals(1, group.getPropagationStatusTOs().size());
-            assertEquals(RESOURCE_NAME_LDAP, group.getPropagationStatusTOs().get(0).getResource());
-            assertEquals(PropagationTaskExecStatus.SUCCESS, group.getPropagationStatusTOs().get(0).getStatus());
+            result = updateGroup(patch);
+            assertNotNull(result);
+            assertEquals(1, result.getPropagationStatuses().size());
+            assertEquals(RESOURCE_NAME_LDAP, result.getPropagationStatuses().get(0).getResource());
+            assertEquals(PropagationTaskExecStatus.SUCCESS, result.getPropagationStatuses().get(0).getStatus());
+            group = result.getAny();
 
             // 5. enable capability override
             ldap.setOverrideCapabilities(true);
@@ -706,11 +712,11 @@ public class GroupITCase extends AbstractITCase {
             patch.getPlainAttrs().add(new AttrPatch.Builder().
                     operation(PatchOperation.ADD_REPLACE).attrTO(attrTO("title", "fourth")).build());
 
-            group = groupService.update(patch).readEntity(GroupTO.class);
-            assertNotNull(group);
-            assertEquals(1, group.getPropagationStatusTOs().size());
-            assertEquals(RESOURCE_NAME_LDAP, group.getPropagationStatusTOs().get(0).getResource());
-            assertEquals(PropagationTaskExecStatus.NOT_ATTEMPTED, group.getPropagationStatusTOs().get(0).getStatus());
+            result = updateGroup(patch);
+            assertNotNull(result);
+            assertEquals(1, result.getPropagationStatuses().size());
+            assertEquals(RESOURCE_NAME_LDAP, result.getPropagationStatuses().get(0).getResource());
+            assertEquals(PropagationTaskExecStatus.NOT_ATTEMPTED, result.getPropagationStatuses().get(0).getStatus());
         } finally {
             ldap.getCapabilitiesOverride().clear();
             ldap.setOverrideCapabilities(false);
@@ -725,7 +731,7 @@ public class GroupITCase extends AbstractITCase {
             // 1. create new LDAP resource having ConnObjectKey mapped to a derived attribute
             ResourceTO newLDAP = resourceService.read(RESOURCE_NAME_LDAP);
             newLDAP.setKey("new-ldap");
-            newLDAP.setPropagationPrimary(true);
+            newLDAP.setPropagationPriority(0);
 
             for (ProvisionTO provision : newLDAP.getProvisions()) {
                 provision.getVirSchemas().clear();
@@ -756,7 +762,7 @@ public class GroupITCase extends AbstractITCase {
             groupTO.getResources().clear();
             groupTO.getResources().add("new-ldap");
 
-            groupTO = createGroup(groupTO);
+            groupTO = createGroup(groupTO).getAny();
             assertNotNull(groupTO);
 
             // 3. update the group
@@ -764,7 +770,7 @@ public class GroupITCase extends AbstractITCase {
             groupPatch.setKey(groupTO.getKey());
             groupPatch.getPlainAttrs().add(attrAddReplacePatch("icon", "anotherIcon"));
 
-            groupTO = updateGroup(groupPatch);
+            groupTO = updateGroup(groupPatch).getAny();
             assertNotNull(groupTO);
 
             // 4. check that a single group exists in LDAP for the group created and updated above
@@ -826,7 +832,7 @@ public class GroupITCase extends AbstractITCase {
         GroupTO groupTO = getBasicSampleTO("syncope717");
         groupTO.getPlainAttrs().add(attrTO(doubleSchemaName, "11.23"));
 
-        groupTO = createGroup(groupTO);
+        groupTO = createGroup(groupTO).getAny();
         assertNotNull(groupTO);
         assertEquals("11.23", groupTO.getPlainAttrMap().get(doubleSchemaName).getValues().get(0));
 
@@ -844,7 +850,7 @@ public class GroupITCase extends AbstractITCase {
         patch.setKey(groupTO.getKey());
         patch.getPlainAttrs().add(new AttrPatch.Builder().attrTO(attrTO(doubleSchemaName, "11.257")).build());
 
-        groupTO = updateGroup(patch);
+        groupTO = updateGroup(patch).getAny();
         assertNotNull(groupTO);
         assertEquals("11.257", groupTO.getPlainAttrMap().get(doubleSchemaName).getValues().get(0));
 
@@ -857,7 +863,7 @@ public class GroupITCase extends AbstractITCase {
         patch.setKey(groupTO.getKey());
         patch.getPlainAttrs().add(new AttrPatch.Builder().attrTO(attrTO(doubleSchemaName, "11.23")).build());
 
-        groupTO = updateGroup(patch);
+        groupTO = updateGroup(patch).getAny();
         assertNotNull(groupTO);
         assertEquals("11.23", groupTO.getPlainAttrMap().get(doubleSchemaName).getValues().get(0));
     }