http://git-wip-us.apache.org/repos/asf/syncope/blob/34a2fdbb/client/console/src/main/java/org/apache/syncope/client/console/panels/AjaxDataTablePanel.java
----------------------------------------------------------------------
diff --git 
a/client/console/src/main/java/org/apache/syncope/client/console/panels/AjaxDataTablePanel.java
 
b/client/console/src/main/java/org/apache/syncope/client/console/panels/AjaxDataTablePanel.java
index 885a3d5..0069c52 100644
--- 
a/client/console/src/main/java/org/apache/syncope/client/console/panels/AjaxDataTablePanel.java
+++ 
b/client/console/src/main/java/org/apache/syncope/client/console/panels/AjaxDataTablePanel.java
@@ -18,6 +18,7 @@
  */
 package org.apache.syncope.client.console.panels;
 
+import de.agilecoders.wicket.core.markup.html.bootstrap.dialog.Modal;
 import java.io.Serializable;
 import java.util.ArrayList;
 import java.util.Collection;
@@ -26,8 +27,8 @@ import java.util.List;
 import org.apache.syncope.client.console.rest.BaseRestClient;
 import org.apache.syncope.client.console.wicket.markup.html.form.ActionLink;
 import 
org.apache.syncope.client.console.wicket.ajax.form.IndicatorAjaxFormChoiceComponentUpdatingBehavior;
-import org.apache.syncope.client.console.bulk.BulkActionModal;
-import org.apache.syncope.client.console.bulk.BulkContent;
+import org.apache.syncope.client.console.batch.BatchModal;
+import org.apache.syncope.client.console.batch.BatchContent;
 import org.apache.syncope.client.console.pages.BasePage;
 import 
org.apache.syncope.client.console.panels.DirectoryPanel.EventDataWrapper;
 import org.apache.syncope.client.console.rest.RestClient;
@@ -68,9 +69,9 @@ public final class AjaxDataTablePanel<T extends Serializable, 
S> extends DataTab
 
         private int rowsPerPage = 10;
 
-        private final Collection<ActionLink.ActionType> bulkActions = new 
ArrayList<>();
+        private final Collection<ActionLink.ActionType> batches = new 
ArrayList<>();
 
-        private RestClient bulkActionExecutor;
+        private RestClient batchExecutor;
 
         private String itemKeyField;
 
@@ -96,13 +97,13 @@ public final class AjaxDataTablePanel<T extends 
Serializable, S> extends DataTab
             return this;
         }
 
-        public Builder<T, S> addBulkAction(final ActionLink.ActionType 
actionType) {
-            bulkActions.add(actionType);
+        public Builder<T, S> addBatch(final ActionLink.ActionType actionType) {
+            batches.add(actionType);
             return this;
         }
 
-        public Builder<T, S> setBulkActionExecutor(final BaseRestClient 
bulkActionExecutor) {
-            this.bulkActionExecutor = bulkActionExecutor;
+        public Builder<T, S> setBatchExecutor(final BaseRestClient 
batchExecutor) {
+            this.batchExecutor = batchExecutor;
             return this;
         }
 
@@ -111,15 +112,16 @@ public final class AjaxDataTablePanel<T extends 
Serializable, S> extends DataTab
             return this;
         }
 
-        public Builder<T, S> setBulkActions(
-                final Collection<ActionLink.ActionType> bulkActions,
-                final RestClient bulkActionExecutor,
+        public Builder<T, S> setBatches(
+                final Collection<ActionLink.ActionType> batches,
+                final RestClient batchExecutor,
                 final String itemKeyField) {
-            this.bulkActions.clear();
-            if (bulkActions != null) {
-                this.bulkActions.addAll(bulkActions);
+
+            this.batches.clear();
+            if (batches != null) {
+                this.batches.addAll(batches);
             }
-            this.bulkActionExecutor = bulkActionExecutor;
+            this.batchExecutor = batchExecutor;
             this.itemKeyField = itemKeyField;
             return this;
         }
@@ -147,8 +149,8 @@ public final class AjaxDataTablePanel<T extends 
Serializable, S> extends DataTab
             return this;
         }
 
-        private boolean isBulkEnabled() {
-            return checkBoxEnabled && bulkActionExecutor != null && 
!bulkActions.isEmpty();
+        private boolean isBatchEnabled() {
+            return checkBoxEnabled && batchExecutor != null && 
!batches.isEmpty();
         }
 
         public void setMultiLevelPanel(final BaseModal<?> baseModal, final 
MultilevelPanel multiLevelPanel) {
@@ -168,16 +170,17 @@ public final class AjaxDataTablePanel<T extends 
Serializable, S> extends DataTab
     private AjaxDataTablePanel(final String id, final Builder<T, S> builder) {
         super(id);
 
-        final BaseModal<T> bulkModal = new BaseModal<>("bulkModal");
-        add(bulkModal);
+        BaseModal<T> batchModal = new BaseModal<>("batchModal");
+        batchModal.size(Modal.Size.Large);
+        add(batchModal);
 
-        bulkModal.setWindowClosedCallback(new 
ModalWindow.WindowClosedCallback() {
+        batchModal.setWindowClosedCallback(new 
ModalWindow.WindowClosedCallback() {
 
             private static final long serialVersionUID = 8804221891699487149L;
 
             @Override
             public void onClose(final AjaxRequestTarget target) {
-                bulkModal.show(false);
+                batchModal.show(false);
 
                 EventDataWrapper data = new EventDataWrapper();
                 data.setTarget(target);
@@ -191,11 +194,11 @@ public final class AjaxDataTablePanel<T extends 
Serializable, S> extends DataTab
             }
         });
 
-        Fragment fragment = new Fragment("tablePanel", "bulkAvailable", this);
+        Fragment fragment = new Fragment("tablePanel", "batchAvailable", this);
         add(fragment);
 
-        Form<T> bulkActionForm = new Form<>("groupForm");
-        fragment.add(bulkActionForm);
+        Form<T> batchForm = new Form<>("groupForm");
+        fragment.add(batchForm);
 
         group = new CheckGroup<>("checkgroup", model);
         group.add(new IndicatorAjaxFormChoiceComponentUpdatingBehavior() {
@@ -210,7 +213,7 @@ public final class AjaxDataTablePanel<T extends 
Serializable, S> extends DataTab
                 });
             }
         });
-        bulkActionForm.add(group);
+        batchForm.add(group);
 
         if (builder.checkBoxEnabled) {
             builder.columns.add(0, new CheckGroupColumn<>(group));
@@ -237,7 +240,7 @@ public final class AjaxDataTablePanel<T extends 
Serializable, S> extends DataTab
 
         group.add(dataTable);
 
-        fragment.add(new IndicatingAjaxButton("bulkActionLink", 
bulkActionForm) {
+        fragment.add(new IndicatingAjaxButton("batchLink", batchForm) {
 
             private static final long serialVersionUID = 382302811235019988L;
 
@@ -249,40 +252,39 @@ public final class AjaxDataTablePanel<T extends 
Serializable, S> extends DataTab
                 }
 
                 if (builder.multiLevelPanel == null) {
-                    bulkModal.header(new ResourceModel("bulk.action"));
-                    bulkModal.changeCloseButtonLabel(getString("cancel", null, 
"Cancel"), target);
+                    batchModal.header(new ResourceModel("batch"));
+                    batchModal.changeCloseButtonLabel(getString("cancel", 
null, "Cancel"), target);
 
-                    target.add(bulkModal.setContent(new BulkActionModal<>(
-                            bulkModal,
+                    target.add(batchModal.setContent(new BatchModal<>(
+                            batchModal,
                             builder.pageRef,
                             new ArrayList<>(group.getModelObject()),
                             builder.columns.size() == 1
                             ? builder.columns
                             // serialization problem with sublist only
                             : new ArrayList<>(builder.columns.subList(1, 
builder.columns.size())),
-                            builder.bulkActions,
-                            builder.bulkActionExecutor,
+                            builder.batches,
+                            builder.batchExecutor,
                             builder.itemKeyField)));
 
-                    bulkModal.show(true);
+                    batchModal.show(true);
                 } else {
-                    builder.multiLevelPanel.next(
-                            getString("bulk.action"),
-                            new BulkContent<>(
+                    builder.multiLevelPanel.next(getString("batch"),
+                            new BatchContent<>(
                                     builder.baseModal,
                                     new ArrayList<>(group.getModelObject()),
                                     builder.columns.size() == 1
                                     ? builder.columns
                                     // serialization problem with sublist only
                                     : new 
ArrayList<>(builder.columns.subList(1, builder.columns.size())),
-                                    builder.bulkActions,
-                                    builder.bulkActionExecutor,
+                                    builder.batches,
+                                    builder.batchExecutor,
                                     builder.itemKeyField),
                             target);
                 }
                 group.setModelObject(Collections.<T>emptyList());
                 target.add(group);
             }
-        
}.setEnabled(builder.isBulkEnabled()).setVisible(builder.isBulkEnabled()));
+        
}.setEnabled(builder.isBatchEnabled()).setVisible(builder.isBatchEnabled()));
     }
 }

http://git-wip-us.apache.org/repos/asf/syncope/blob/34a2fdbb/client/console/src/main/java/org/apache/syncope/client/console/panels/AnyDirectoryPanel.java
----------------------------------------------------------------------
diff --git 
a/client/console/src/main/java/org/apache/syncope/client/console/panels/AnyDirectoryPanel.java
 
b/client/console/src/main/java/org/apache/syncope/client/console/panels/AnyDirectoryPanel.java
index bea77ae..8fdc994 100644
--- 
a/client/console/src/main/java/org/apache/syncope/client/console/panels/AnyDirectoryPanel.java
+++ 
b/client/console/src/main/java/org/apache/syncope/client/console/panels/AnyDirectoryPanel.java
@@ -221,12 +221,10 @@ public abstract class AnyDirectoryPanel<A extends AnyTO, 
E extends AbstractAnyRe
     }
 
     @Override
-    protected Collection<ActionLink.ActionType> getBulkActions() {
-        List<ActionLink.ActionType> bulkActions = new ArrayList<>();
-
-        bulkActions.add(ActionLink.ActionType.DELETE);
-
-        return bulkActions;
+    protected Collection<ActionLink.ActionType> getBatches() {
+        List<ActionLink.ActionType> batches = new ArrayList<>();
+        batches.add(ActionLink.ActionType.DELETE);
+        return batches;
     }
 
     public interface AnyDirectoryPanelBuilder extends Serializable {

http://git-wip-us.apache.org/repos/asf/syncope/blob/34a2fdbb/client/console/src/main/java/org/apache/syncope/client/console/panels/AnyTypeClassesPanel.java
----------------------------------------------------------------------
diff --git 
a/client/console/src/main/java/org/apache/syncope/client/console/panels/AnyTypeClassesPanel.java
 
b/client/console/src/main/java/org/apache/syncope/client/console/panels/AnyTypeClassesPanel.java
index 8754d01..280e90b 100644
--- 
a/client/console/src/main/java/org/apache/syncope/client/console/panels/AnyTypeClassesPanel.java
+++ 
b/client/console/src/main/java/org/apache/syncope/client/console/panels/AnyTypeClassesPanel.java
@@ -110,7 +110,7 @@ public class AnyTypeClassesPanel extends 
TypesDirectoryPanel<
     }
 
     @Override
-    protected Collection<ActionLink.ActionType> getBulkActions() {
+    protected Collection<ActionLink.ActionType> getBatches() {
         return Collections.<ActionLink.ActionType>emptyList();
     }
 

http://git-wip-us.apache.org/repos/asf/syncope/blob/34a2fdbb/client/console/src/main/java/org/apache/syncope/client/console/panels/AnyTypesPanel.java
----------------------------------------------------------------------
diff --git 
a/client/console/src/main/java/org/apache/syncope/client/console/panels/AnyTypesPanel.java
 
b/client/console/src/main/java/org/apache/syncope/client/console/panels/AnyTypesPanel.java
index 132a05a..97158e5 100644
--- 
a/client/console/src/main/java/org/apache/syncope/client/console/panels/AnyTypesPanel.java
+++ 
b/client/console/src/main/java/org/apache/syncope/client/console/panels/AnyTypesPanel.java
@@ -109,7 +109,7 @@ public class AnyTypesPanel extends 
TypesDirectoryPanel<AnyTypeTO, AnyTypesPanel.
     }
 
     @Override
-    protected Collection<ActionLink.ActionType> getBulkActions() {
+    protected Collection<ActionLink.ActionType> getBatches() {
         return Collections.<ActionLink.ActionType>emptyList();
     }
 

http://git-wip-us.apache.org/repos/asf/syncope/blob/34a2fdbb/client/console/src/main/java/org/apache/syncope/client/console/panels/ApplicationDirectoryPanel.java
----------------------------------------------------------------------
diff --git 
a/client/console/src/main/java/org/apache/syncope/client/console/panels/ApplicationDirectoryPanel.java
 
b/client/console/src/main/java/org/apache/syncope/client/console/panels/ApplicationDirectoryPanel.java
index ba9e033..5fe68f0 100644
--- 
a/client/console/src/main/java/org/apache/syncope/client/console/panels/ApplicationDirectoryPanel.java
+++ 
b/client/console/src/main/java/org/apache/syncope/client/console/panels/ApplicationDirectoryPanel.java
@@ -214,7 +214,7 @@ public class ApplicationDirectoryPanel extends
     }
 
     @Override
-    protected Collection<ActionLink.ActionType> getBulkActions() {
+    protected Collection<ActionLink.ActionType> getBatches() {
         return Collections.<ActionLink.ActionType>emptyList();
     }
 

http://git-wip-us.apache.org/repos/asf/syncope/blob/34a2fdbb/client/console/src/main/java/org/apache/syncope/client/console/panels/ConnInstanceHistoryConfDirectoryPanel.java
----------------------------------------------------------------------
diff --git 
a/client/console/src/main/java/org/apache/syncope/client/console/panels/ConnInstanceHistoryConfDirectoryPanel.java
 
b/client/console/src/main/java/org/apache/syncope/client/console/panels/ConnInstanceHistoryConfDirectoryPanel.java
index ab053bf..271d104 100644
--- 
a/client/console/src/main/java/org/apache/syncope/client/console/panels/ConnInstanceHistoryConfDirectoryPanel.java
+++ 
b/client/console/src/main/java/org/apache/syncope/client/console/panels/ConnInstanceHistoryConfDirectoryPanel.java
@@ -163,7 +163,7 @@ public abstract class ConnInstanceHistoryConfDirectoryPanel 
extends DirectoryPan
     }
 
     @Override
-    protected Collection<ActionType> getBulkActions() {
+    protected Collection<ActionType> getBatches() {
         return Collections.<ActionLink.ActionType>emptyList();
     }
 

http://git-wip-us.apache.org/repos/asf/syncope/blob/34a2fdbb/client/console/src/main/java/org/apache/syncope/client/console/panels/DirectoryPanel.java
----------------------------------------------------------------------
diff --git 
a/client/console/src/main/java/org/apache/syncope/client/console/panels/DirectoryPanel.java
 
b/client/console/src/main/java/org/apache/syncope/client/console/panels/DirectoryPanel.java
index 22c104e..c2ef5e5 100644
--- 
a/client/console/src/main/java/org/apache/syncope/client/console/panels/DirectoryPanel.java
+++ 
b/client/console/src/main/java/org/apache/syncope/client/console/panels/DirectoryPanel.java
@@ -297,8 +297,7 @@ public abstract class DirectoryPanel<
 
         }.
                 setColumns(getColumns()).
-                setRowsPerPage(rows).
-                setBulkActions(getBulkActions(), restClient, itemKeyFieldName).
+                setRowsPerPage(rows).setBatches(getBatches(), restClient, 
itemKeyFieldName).
                 setContainer(container);
 
         if (!checkBoxEnabled) {
@@ -397,7 +396,7 @@ public abstract class DirectoryPanel<
         }
     }
 
-    protected abstract Collection<ActionLink.ActionType> getBulkActions();
+    protected abstract Collection<ActionLink.ActionType> getBatches();
 
     public abstract static class Builder<T extends Serializable, W extends 
Serializable, E extends RestClient>
             extends WizardMgtPanel.Builder<W> {

http://git-wip-us.apache.org/repos/asf/syncope/blob/34a2fdbb/client/console/src/main/java/org/apache/syncope/client/console/panels/DynRealmDirectoryPanel.java
----------------------------------------------------------------------
diff --git 
a/client/console/src/main/java/org/apache/syncope/client/console/panels/DynRealmDirectoryPanel.java
 
b/client/console/src/main/java/org/apache/syncope/client/console/panels/DynRealmDirectoryPanel.java
index ebbacd4..6cc36c6 100644
--- 
a/client/console/src/main/java/org/apache/syncope/client/console/panels/DynRealmDirectoryPanel.java
+++ 
b/client/console/src/main/java/org/apache/syncope/client/console/panels/DynRealmDirectoryPanel.java
@@ -156,7 +156,7 @@ public class DynRealmDirectoryPanel extends
     }
 
     @Override
-    protected Collection<ActionLink.ActionType> getBulkActions() {
+    protected Collection<ActionLink.ActionType> getBatches() {
         return Collections.<ActionLink.ActionType>emptyList();
     }
 

http://git-wip-us.apache.org/repos/asf/syncope/blob/34a2fdbb/client/console/src/main/java/org/apache/syncope/client/console/panels/GroupDirectoryPanel.java
----------------------------------------------------------------------
diff --git 
a/client/console/src/main/java/org/apache/syncope/client/console/panels/GroupDirectoryPanel.java
 
b/client/console/src/main/java/org/apache/syncope/client/console/panels/GroupDirectoryPanel.java
index 59c4901..ac5663b 100644
--- 
a/client/console/src/main/java/org/apache/syncope/client/console/panels/GroupDirectoryPanel.java
+++ 
b/client/console/src/main/java/org/apache/syncope/client/console/panels/GroupDirectoryPanel.java
@@ -52,7 +52,7 @@ import org.apache.syncope.common.lib.to.GroupTO;
 import org.apache.syncope.common.lib.to.UserTO;
 import org.apache.syncope.common.lib.types.AnyEntitlement;
 import org.apache.syncope.common.lib.types.AnyTypeKind;
-import org.apache.syncope.common.lib.types.BulkMembersActionType;
+import org.apache.syncope.common.lib.types.ProvisionAction;
 import org.apache.syncope.common.lib.types.StandardEntitlement;
 import org.apache.wicket.PageReference;
 import org.apache.wicket.ajax.AjaxRequestTarget;
@@ -274,7 +274,7 @@ public class GroupDirectoryPanel extends 
AnyDirectoryPanel<GroupTO, GroupRestCli
             @Override
             public void onClick(final AjaxRequestTarget target, final GroupTO 
ignore) {
                 try {
-                    restClient.bulkMembersAction(model.getObject().getKey(), 
BulkMembersActionType.PROVISION);
+                    restClient.provisionMembers(model.getObject().getKey(), 
ProvisionAction.PROVISION);
                     
SyncopeConsoleSession.get().info(getString(Constants.OPERATION_SUCCEEDED));
                     target.add(container);
                 } catch (SyncopeClientException e) {
@@ -288,15 +288,14 @@ public class GroupDirectoryPanel extends 
AnyDirectoryPanel<GroupTO, GroupRestCli
                 String.format("%s,%s", StandardEntitlement.TASK_CREATE, 
StandardEntitlement.TASK_EXECUTE)).
                 setRealm(realm);
 
-        panel.add(
-                new ActionLink<GroupTO>() {
+        panel.add(new ActionLink<GroupTO>() {
 
             private static final long serialVersionUID = -7978723352517770644L;
 
             @Override
             public void onClick(final AjaxRequestTarget target, final GroupTO 
ignore) {
                 try {
-                    restClient.bulkMembersAction(model.getObject().getKey(), 
BulkMembersActionType.DEPROVISION);
+                    restClient.provisionMembers(model.getObject().getKey(), 
ProvisionAction.DEPROVISION);
                     
SyncopeConsoleSession.get().info(getString(Constants.OPERATION_SUCCEEDED));
                     target.add(container);
                 } catch (SyncopeClientException e) {

http://git-wip-us.apache.org/repos/asf/syncope/blob/34a2fdbb/client/console/src/main/java/org/apache/syncope/client/console/panels/ImplementationDirectoryPanel.java
----------------------------------------------------------------------
diff --git 
a/client/console/src/main/java/org/apache/syncope/client/console/panels/ImplementationDirectoryPanel.java
 
b/client/console/src/main/java/org/apache/syncope/client/console/panels/ImplementationDirectoryPanel.java
index 174526c..6d2e0be 100644
--- 
a/client/console/src/main/java/org/apache/syncope/client/console/panels/ImplementationDirectoryPanel.java
+++ 
b/client/console/src/main/java/org/apache/syncope/client/console/panels/ImplementationDirectoryPanel.java
@@ -185,7 +185,7 @@ public class ImplementationDirectoryPanel extends 
DirectoryPanel<
     }
 
     @Override
-    protected Collection<ActionLink.ActionType> getBulkActions() {
+    protected Collection<ActionLink.ActionType> getBatches() {
         return Collections.<ActionLink.ActionType>emptyList();
     }
 

http://git-wip-us.apache.org/repos/asf/syncope/blob/34a2fdbb/client/console/src/main/java/org/apache/syncope/client/console/panels/ParametersDirectoryPanel.java
----------------------------------------------------------------------
diff --git 
a/client/console/src/main/java/org/apache/syncope/client/console/panels/ParametersDirectoryPanel.java
 
b/client/console/src/main/java/org/apache/syncope/client/console/panels/ParametersDirectoryPanel.java
index dbf222c..e2ebb57 100644
--- 
a/client/console/src/main/java/org/apache/syncope/client/console/panels/ParametersDirectoryPanel.java
+++ 
b/client/console/src/main/java/org/apache/syncope/client/console/panels/ParametersDirectoryPanel.java
@@ -133,7 +133,7 @@ public class ParametersDirectoryPanel
     }
 
     @Override
-    protected Collection<ActionLink.ActionType> getBulkActions() {
+    protected Collection<ActionLink.ActionType> getBatches() {
         return 
Collections.<ActionLink.ActionType>singletonList(ActionLink.ActionType.DELETE);
     }
 

http://git-wip-us.apache.org/repos/asf/syncope/blob/34a2fdbb/client/console/src/main/java/org/apache/syncope/client/console/panels/PrivilegeDirectoryPanel.java
----------------------------------------------------------------------
diff --git 
a/client/console/src/main/java/org/apache/syncope/client/console/panels/PrivilegeDirectoryPanel.java
 
b/client/console/src/main/java/org/apache/syncope/client/console/panels/PrivilegeDirectoryPanel.java
index 2444812..47c972d 100644
--- 
a/client/console/src/main/java/org/apache/syncope/client/console/panels/PrivilegeDirectoryPanel.java
+++ 
b/client/console/src/main/java/org/apache/syncope/client/console/panels/PrivilegeDirectoryPanel.java
@@ -127,7 +127,7 @@ public class PrivilegeDirectoryPanel extends DirectoryPanel<
     }
 
     @Override
-    protected Collection<ActionType> getBulkActions() {
+    protected Collection<ActionType> getBatches() {
         return Collections.<ActionType>emptyList();
     }
 

http://git-wip-us.apache.org/repos/asf/syncope/blob/34a2fdbb/client/console/src/main/java/org/apache/syncope/client/console/panels/Realm.java
----------------------------------------------------------------------
diff --git 
a/client/console/src/main/java/org/apache/syncope/client/console/panels/Realm.java
 
b/client/console/src/main/java/org/apache/syncope/client/console/panels/Realm.java
index 95331ee..303ec8e 100644
--- 
a/client/console/src/main/java/org/apache/syncope/client/console/panels/Realm.java
+++ 
b/client/console/src/main/java/org/apache/syncope/client/console/panels/Realm.java
@@ -49,7 +49,7 @@ import org.apache.syncope.common.lib.to.EntityTO;
 import org.apache.syncope.common.lib.to.PropagationStatus;
 import org.apache.syncope.common.lib.to.ProvisioningResult;
 import org.apache.syncope.common.lib.to.RealmTO;
-import org.apache.syncope.common.lib.types.PropagationTaskExecStatus;
+import org.apache.syncope.common.lib.types.ExecStatus;
 import org.apache.syncope.common.lib.types.StandardEntitlement;
 import org.apache.wicket.Component;
 import org.apache.wicket.PageReference;
@@ -204,7 +204,7 @@ public abstract class Realm extends WizardMgtPanel<RealmTO> 
{
         add(mlp);
 
         final PropagationStatus syncope = new PropagationStatus();
-        syncope.setStatus(PropagationTaskExecStatus.SUCCESS);
+        syncope.setStatus(ExecStatus.SUCCESS);
         syncope.setResource(Constants.SYNCOPE);
 
         List<PropagationStatus> propagations = new ArrayList<>();
@@ -250,8 +250,8 @@ public abstract class Realm extends WizardMgtPanel<RealmTO> 
{
             @Override
             protected boolean statusCondition(final PropagationStatus bean) {
                 return !Constants.SYNCOPE.equals(bean.getResource())
-                        && (PropagationTaskExecStatus.CREATED == 
bean.getStatus()
-                        || PropagationTaskExecStatus.SUCCESS == 
bean.getStatus());
+                        && (ExecStatus.CREATED == bean.getStatus()
+                        || ExecStatus.SUCCESS == bean.getStatus());
             }
 
             @Override

http://git-wip-us.apache.org/repos/asf/syncope/blob/34a2fdbb/client/console/src/main/java/org/apache/syncope/client/console/panels/RelationshipTypesPanel.java
----------------------------------------------------------------------
diff --git 
a/client/console/src/main/java/org/apache/syncope/client/console/panels/RelationshipTypesPanel.java
 
b/client/console/src/main/java/org/apache/syncope/client/console/panels/RelationshipTypesPanel.java
index 939ac8c..2df032d 100644
--- 
a/client/console/src/main/java/org/apache/syncope/client/console/panels/RelationshipTypesPanel.java
+++ 
b/client/console/src/main/java/org/apache/syncope/client/console/panels/RelationshipTypesPanel.java
@@ -112,7 +112,7 @@ public class RelationshipTypesPanel extends 
TypesDirectoryPanel<
     }
 
     @Override
-    protected Collection<ActionLink.ActionType> getBulkActions() {
+    protected Collection<ActionLink.ActionType> getBatches() {
         return Collections.<ActionLink.ActionType>emptyList();
     }
 

http://git-wip-us.apache.org/repos/asf/syncope/blob/34a2fdbb/client/console/src/main/java/org/apache/syncope/client/console/panels/RemediationDirectoryPanel.java
----------------------------------------------------------------------
diff --git 
a/client/console/src/main/java/org/apache/syncope/client/console/panels/RemediationDirectoryPanel.java
 
b/client/console/src/main/java/org/apache/syncope/client/console/panels/RemediationDirectoryPanel.java
index 1e34454..4adb141 100644
--- 
a/client/console/src/main/java/org/apache/syncope/client/console/panels/RemediationDirectoryPanel.java
+++ 
b/client/console/src/main/java/org/apache/syncope/client/console/panels/RemediationDirectoryPanel.java
@@ -302,7 +302,7 @@ public class RemediationDirectoryPanel
     }
 
     @Override
-    protected Collection<ActionLink.ActionType> getBulkActions() {
+    protected Collection<ActionLink.ActionType> getBatches() {
         return Collections.<ActionLink.ActionType>emptyList();
     }
 

http://git-wip-us.apache.org/repos/asf/syncope/blob/34a2fdbb/client/console/src/main/java/org/apache/syncope/client/console/panels/ResourceHistoryConfDirectoryPanel.java
----------------------------------------------------------------------
diff --git 
a/client/console/src/main/java/org/apache/syncope/client/console/panels/ResourceHistoryConfDirectoryPanel.java
 
b/client/console/src/main/java/org/apache/syncope/client/console/panels/ResourceHistoryConfDirectoryPanel.java
index 09a1cf9..a9a0f06 100644
--- 
a/client/console/src/main/java/org/apache/syncope/client/console/panels/ResourceHistoryConfDirectoryPanel.java
+++ 
b/client/console/src/main/java/org/apache/syncope/client/console/panels/ResourceHistoryConfDirectoryPanel.java
@@ -164,7 +164,7 @@ public abstract class ResourceHistoryConfDirectoryPanel 
extends DirectoryPanel<
     }
 
     @Override
-    protected Collection<ActionType> getBulkActions() {
+    protected Collection<ActionType> getBatches() {
         return Collections.<ActionLink.ActionType>emptyList();
     }
 

http://git-wip-us.apache.org/repos/asf/syncope/blob/34a2fdbb/client/console/src/main/java/org/apache/syncope/client/console/panels/RoleDirectoryPanel.java
----------------------------------------------------------------------
diff --git 
a/client/console/src/main/java/org/apache/syncope/client/console/panels/RoleDirectoryPanel.java
 
b/client/console/src/main/java/org/apache/syncope/client/console/panels/RoleDirectoryPanel.java
index ed17bc3..c58c095 100644
--- 
a/client/console/src/main/java/org/apache/syncope/client/console/panels/RoleDirectoryPanel.java
+++ 
b/client/console/src/main/java/org/apache/syncope/client/console/panels/RoleDirectoryPanel.java
@@ -260,7 +260,7 @@ public class RoleDirectoryPanel extends 
DirectoryPanel<RoleTO, RoleWrapper, Role
     }
 
     @Override
-    protected Collection<ActionLink.ActionType> getBulkActions() {
+    protected Collection<ActionLink.ActionType> getBatches() {
         return 
Collections.<ActionLink.ActionType>singletonList(ActionLink.ActionType.DELETE);
     }
 

http://git-wip-us.apache.org/repos/asf/syncope/blob/34a2fdbb/client/console/src/main/java/org/apache/syncope/client/console/panels/SchemaTypePanel.java
----------------------------------------------------------------------
diff --git 
a/client/console/src/main/java/org/apache/syncope/client/console/panels/SchemaTypePanel.java
 
b/client/console/src/main/java/org/apache/syncope/client/console/panels/SchemaTypePanel.java
index 1ced1aa..e03aff7 100644
--- 
a/client/console/src/main/java/org/apache/syncope/client/console/panels/SchemaTypePanel.java
+++ 
b/client/console/src/main/java/org/apache/syncope/client/console/panels/SchemaTypePanel.java
@@ -120,7 +120,7 @@ public class SchemaTypePanel extends 
TypesDirectoryPanel<SchemaTO, SchemaProvide
     }
 
     @Override
-    protected Collection<ActionLink.ActionType> getBulkActions() {
+    protected Collection<ActionLink.ActionType> getBatches() {
         return Collections.<ActionLink.ActionType>emptyList();
     }
 

http://git-wip-us.apache.org/repos/asf/syncope/blob/34a2fdbb/client/console/src/main/java/org/apache/syncope/client/console/panels/SecurityQuestionsPanel.java
----------------------------------------------------------------------
diff --git 
a/client/console/src/main/java/org/apache/syncope/client/console/panels/SecurityQuestionsPanel.java
 
b/client/console/src/main/java/org/apache/syncope/client/console/panels/SecurityQuestionsPanel.java
index 7660153..2f05b43 100644
--- 
a/client/console/src/main/java/org/apache/syncope/client/console/panels/SecurityQuestionsPanel.java
+++ 
b/client/console/src/main/java/org/apache/syncope/client/console/panels/SecurityQuestionsPanel.java
@@ -119,7 +119,7 @@ public class SecurityQuestionsPanel extends DirectoryPanel<
     }
 
     @Override
-    protected Collection<ActionLink.ActionType> getBulkActions() {
+    protected Collection<ActionLink.ActionType> getBatches() {
         return Collections.<ActionLink.ActionType>emptyList();
     }
 

http://git-wip-us.apache.org/repos/asf/syncope/blob/34a2fdbb/client/console/src/main/java/org/apache/syncope/client/console/panels/TypeExtensionDirectoryPanel.java
----------------------------------------------------------------------
diff --git 
a/client/console/src/main/java/org/apache/syncope/client/console/panels/TypeExtensionDirectoryPanel.java
 
b/client/console/src/main/java/org/apache/syncope/client/console/panels/TypeExtensionDirectoryPanel.java
index 511fbfc..43ab301 100644
--- 
a/client/console/src/main/java/org/apache/syncope/client/console/panels/TypeExtensionDirectoryPanel.java
+++ 
b/client/console/src/main/java/org/apache/syncope/client/console/panels/TypeExtensionDirectoryPanel.java
@@ -163,7 +163,7 @@ public class TypeExtensionDirectoryPanel
     }
 
     @Override
-    protected Collection<ActionLink.ActionType> getBulkActions() {
+    protected Collection<ActionLink.ActionType> getBatches() {
         return Collections.emptyList();
     }
 

http://git-wip-us.apache.org/repos/asf/syncope/blob/34a2fdbb/client/console/src/main/java/org/apache/syncope/client/console/panels/UserDirectoryPanel.java
----------------------------------------------------------------------
diff --git 
a/client/console/src/main/java/org/apache/syncope/client/console/panels/UserDirectoryPanel.java
 
b/client/console/src/main/java/org/apache/syncope/client/console/panels/UserDirectoryPanel.java
index 5452853..b0edf68 100644
--- 
a/client/console/src/main/java/org/apache/syncope/client/console/panels/UserDirectoryPanel.java
+++ 
b/client/console/src/main/java/org/apache/syncope/client/console/panels/UserDirectoryPanel.java
@@ -89,15 +89,13 @@ public class UserDirectoryPanel extends 
AnyDirectoryPanel<UserTO, UserRestClient
     }
 
     @Override
-    protected Collection<ActionType> getBulkActions() {
-        List<ActionType> bulkActions = new ArrayList<>();
-
-        bulkActions.add(ActionType.MUSTCHANGEPASSWORD);
-        bulkActions.add(ActionType.DELETE);
-        bulkActions.add(ActionType.SUSPEND);
-        bulkActions.add(ActionType.REACTIVATE);
-
-        return bulkActions;
+    protected Collection<ActionType> getBatches() {
+        List<ActionType> batches = new ArrayList<>();
+        batches.add(ActionType.MUSTCHANGEPASSWORD);
+        batches.add(ActionType.DELETE);
+        batches.add(ActionType.SUSPEND);
+        batches.add(ActionType.REACTIVATE);
+        return batches;
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/syncope/blob/34a2fdbb/client/console/src/main/java/org/apache/syncope/client/console/panels/WorkflowDirectoryPanel.java
----------------------------------------------------------------------
diff --git 
a/client/console/src/main/java/org/apache/syncope/client/console/panels/WorkflowDirectoryPanel.java
 
b/client/console/src/main/java/org/apache/syncope/client/console/panels/WorkflowDirectoryPanel.java
index a830311..a640367 100644
--- 
a/client/console/src/main/java/org/apache/syncope/client/console/panels/WorkflowDirectoryPanel.java
+++ 
b/client/console/src/main/java/org/apache/syncope/client/console/panels/WorkflowDirectoryPanel.java
@@ -280,7 +280,7 @@ public class WorkflowDirectoryPanel extends DirectoryPanel<
     }
 
     @Override
-    protected Collection<ActionLink.ActionType> getBulkActions() {
+    protected Collection<ActionLink.ActionType> getBatches() {
         return Collections.emptyList();
     }
 

http://git-wip-us.apache.org/repos/asf/syncope/blob/34a2fdbb/client/console/src/main/java/org/apache/syncope/client/console/panels/search/AnySelectionDirectoryPanel.java
----------------------------------------------------------------------
diff --git 
a/client/console/src/main/java/org/apache/syncope/client/console/panels/search/AnySelectionDirectoryPanel.java
 
b/client/console/src/main/java/org/apache/syncope/client/console/panels/search/AnySelectionDirectoryPanel.java
index 3ce4143..3380469 100644
--- 
a/client/console/src/main/java/org/apache/syncope/client/console/panels/search/AnySelectionDirectoryPanel.java
+++ 
b/client/console/src/main/java/org/apache/syncope/client/console/panels/search/AnySelectionDirectoryPanel.java
@@ -67,7 +67,7 @@ public abstract class AnySelectionDirectoryPanel<A extends 
AnyTO, E extends Abst
     }
 
     @Override
-    protected Collection<ActionType> getBulkActions() {
+    protected Collection<ActionType> getBatches() {
         return Collections.<ActionType>emptyList();
     }
 

http://git-wip-us.apache.org/repos/asf/syncope/blob/34a2fdbb/client/console/src/main/java/org/apache/syncope/client/console/policies/PolicyDirectoryPanel.java
----------------------------------------------------------------------
diff --git 
a/client/console/src/main/java/org/apache/syncope/client/console/policies/PolicyDirectoryPanel.java
 
b/client/console/src/main/java/org/apache/syncope/client/console/policies/PolicyDirectoryPanel.java
index aae9114..5f09529 100644
--- 
a/client/console/src/main/java/org/apache/syncope/client/console/policies/PolicyDirectoryPanel.java
+++ 
b/client/console/src/main/java/org/apache/syncope/client/console/policies/PolicyDirectoryPanel.java
@@ -194,7 +194,7 @@ public abstract class PolicyDirectoryPanel<T extends 
PolicyTO>
     }
 
     @Override
-    protected Collection<ActionType> getBulkActions() {
+    protected Collection<ActionType> getBatches() {
         return Collections.<ActionType>emptyList();
     }
 

http://git-wip-us.apache.org/repos/asf/syncope/blob/34a2fdbb/client/console/src/main/java/org/apache/syncope/client/console/policies/PolicyRuleDirectoryPanel.java
----------------------------------------------------------------------
diff --git 
a/client/console/src/main/java/org/apache/syncope/client/console/policies/PolicyRuleDirectoryPanel.java
 
b/client/console/src/main/java/org/apache/syncope/client/console/policies/PolicyRuleDirectoryPanel.java
index 2b89ee4..3a14f41 100644
--- 
a/client/console/src/main/java/org/apache/syncope/client/console/policies/PolicyRuleDirectoryPanel.java
+++ 
b/client/console/src/main/java/org/apache/syncope/client/console/policies/PolicyRuleDirectoryPanel.java
@@ -205,10 +205,8 @@ public class PolicyRuleDirectoryPanel<T extends PolicyTO> 
extends DirectoryPanel
     }
 
     @Override
-    protected Collection<ActionType> getBulkActions() {
-        final List<ActionType> bulkActions = new ArrayList<>();
-        bulkActions.add(ActionType.DELETE);
-        return bulkActions;
+    protected Collection<ActionType> getBatches() {
+        return Collections.emptyList();
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/syncope/blob/34a2fdbb/client/console/src/main/java/org/apache/syncope/client/console/reports/ReportDirectoryPanel.java
----------------------------------------------------------------------
diff --git 
a/client/console/src/main/java/org/apache/syncope/client/console/reports/ReportDirectoryPanel.java
 
b/client/console/src/main/java/org/apache/syncope/client/console/reports/ReportDirectoryPanel.java
index 5109da3..537f5fd 100644
--- 
a/client/console/src/main/java/org/apache/syncope/client/console/reports/ReportDirectoryPanel.java
+++ 
b/client/console/src/main/java/org/apache/syncope/client/console/reports/ReportDirectoryPanel.java
@@ -47,6 +47,7 @@ import 
org.apache.syncope.common.lib.types.StandardEntitlement;
 import org.apache.syncope.common.lib.SyncopeClientException;
 import org.apache.syncope.common.lib.to.JobTO;
 import org.apache.syncope.common.lib.to.ReportTO;
+import org.apache.wicket.Component;
 import org.apache.wicket.PageReference;
 import org.apache.wicket.ajax.AjaxRequestTarget;
 import 
org.apache.wicket.authroles.authorization.strategies.role.metadata.MetaDataRoleAuthorizationStrategy;
@@ -58,6 +59,7 @@ import 
org.apache.wicket.extensions.markup.html.repeater.data.table.AbstractColu
 import org.apache.wicket.extensions.markup.html.repeater.data.table.IColumn;
 import 
org.apache.wicket.extensions.markup.html.repeater.data.table.PropertyColumn;
 import org.apache.wicket.markup.html.WebPage;
+import org.apache.wicket.markup.html.basic.Label;
 import org.apache.wicket.markup.repeater.Item;
 import org.apache.wicket.model.CompoundPropertyModel;
 import org.apache.wicket.model.IModel;
@@ -112,7 +114,7 @@ public abstract class ReportDirectoryPanel
 
         columns.add(new DatePropertyColumn<>(
                 new StringResourceModel("nextExec", this), null, "nextExec"));
-        
+
         columns.add(new DatePropertyColumn<>(
                 new StringResourceModel("start", this), "start", "start"));
 
@@ -135,13 +137,18 @@ public abstract class ReportDirectoryPanel
                     final String componentId,
                     final IModel<ReportTO> rowModel) {
 
-                JobTO jobTO = restClient.getJob(rowModel.getObject().getKey());
-                JobActionPanel panel = new JobActionPanel(
-                        componentId, jobTO, false, ReportDirectoryPanel.this, 
pageRef);
-                MetaDataRoleAuthorizationStrategy.authorize(panel, 
WebPage.ENABLE,
-                        String.format("%s,%s",
-                                StandardEntitlement.TASK_EXECUTE,
-                                StandardEntitlement.TASK_UPDATE));
+                Component panel;
+                try {
+                    JobTO jobTO = 
restClient.getJob(rowModel.getObject().getKey());
+                    panel = new JobActionPanel(componentId, jobTO, false, 
ReportDirectoryPanel.this, pageRef);
+                    MetaDataRoleAuthorizationStrategy.authorize(panel, 
WebPage.ENABLE,
+                            String.format("%s,%s",
+                                    StandardEntitlement.REPORT_EXECUTE,
+                                    StandardEntitlement.REPORT_UPDATE));
+                } catch (Exception e) {
+                    LOG.error("Could not get job for report {}", 
rowModel.getObject().getKey(), e);
+                    panel = new Label(componentId, Model.of());
+                }
                 cellItem.add(panel);
             }
 
@@ -218,7 +225,7 @@ public abstract class ReportDirectoryPanel
 
             @Override
             public void onClick(final AjaxRequestTarget target, final ReportTO 
ignore) {
-                viewTask(model.getObject(), target);
+                viewReport(model.getObject(), target);
             }
         }, ActionLink.ActionType.VIEW, StandardEntitlement.REPORT_READ);
 
@@ -257,11 +264,11 @@ public abstract class ReportDirectoryPanel
     }
 
     @Override
-    protected Collection<ActionType> getBulkActions() {
-        final List<ActionType> bulkActions = new ArrayList<>();
-        bulkActions.add(ActionType.EXECUTE);
-        bulkActions.add(ActionType.DELETE);
-        return bulkActions;
+    protected Collection<ActionType> getBatches() {
+        List<ActionType> batches = new ArrayList<>();
+        batches.add(ActionType.EXECUTE);
+        batches.add(ActionType.DELETE);
+        return batches;
     }
 
     @Override
@@ -274,7 +281,7 @@ public abstract class ReportDirectoryPanel
         return Constants.PREF_REPORT_TASKS_PAGINATOR_ROWS;
     }
 
-    protected abstract void viewTask(final ReportTO reportTO, final 
AjaxRequestTarget target);
+    protected abstract void viewReport(ReportTO reportTO, AjaxRequestTarget 
target);
 
     protected class ReportDataProvider extends DirectoryDataProvider<ReportTO> 
{
 

http://git-wip-us.apache.org/repos/asf/syncope/blob/34a2fdbb/client/console/src/main/java/org/apache/syncope/client/console/reports/ReportTemplateDirectoryPanel.java
----------------------------------------------------------------------
diff --git 
a/client/console/src/main/java/org/apache/syncope/client/console/reports/ReportTemplateDirectoryPanel.java
 
b/client/console/src/main/java/org/apache/syncope/client/console/reports/ReportTemplateDirectoryPanel.java
index 04a37a2..4cd32b7 100644
--- 
a/client/console/src/main/java/org/apache/syncope/client/console/reports/ReportTemplateDirectoryPanel.java
+++ 
b/client/console/src/main/java/org/apache/syncope/client/console/reports/ReportTemplateDirectoryPanel.java
@@ -205,7 +205,7 @@ public class ReportTemplateDirectoryPanel
     }
 
     @Override
-    protected Collection<ActionLink.ActionType> getBulkActions() {
+    protected Collection<ActionLink.ActionType> getBatches() {
         return Collections.<ActionLink.ActionType>emptyList();
 
     }

http://git-wip-us.apache.org/repos/asf/syncope/blob/34a2fdbb/client/console/src/main/java/org/apache/syncope/client/console/reports/ReportletDirectoryPanel.java
----------------------------------------------------------------------
diff --git 
a/client/console/src/main/java/org/apache/syncope/client/console/reports/ReportletDirectoryPanel.java
 
b/client/console/src/main/java/org/apache/syncope/client/console/reports/ReportletDirectoryPanel.java
index 6ac03e2..7b7edd1 100644
--- 
a/client/console/src/main/java/org/apache/syncope/client/console/reports/ReportletDirectoryPanel.java
+++ 
b/client/console/src/main/java/org/apache/syncope/client/console/reports/ReportletDirectoryPanel.java
@@ -191,10 +191,8 @@ public class ReportletDirectoryPanel extends 
DirectoryPanel<
     }
 
     @Override
-    protected Collection<ActionType> getBulkActions() {
-        final List<ActionType> bulkActions = new ArrayList<>();
-        bulkActions.add(ActionType.DELETE);
-        return bulkActions;
+    protected Collection<ActionType> getBatches() {
+        return Collections.emptyList();
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/syncope/blob/34a2fdbb/client/console/src/main/java/org/apache/syncope/client/console/rest/AbstractAnyRestClient.java
----------------------------------------------------------------------
diff --git 
a/client/console/src/main/java/org/apache/syncope/client/console/rest/AbstractAnyRestClient.java
 
b/client/console/src/main/java/org/apache/syncope/client/console/rest/AbstractAnyRestClient.java
index 639a4eb..0aa2a2f 100644
--- 
a/client/console/src/main/java/org/apache/syncope/client/console/rest/AbstractAnyRestClient.java
+++ 
b/client/console/src/main/java/org/apache/syncope/client/console/rest/AbstractAnyRestClient.java
@@ -18,19 +18,32 @@
  */
 package org.apache.syncope.client.console.rest;
 
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.ArrayList;
+import java.util.LinkedHashMap;
 import java.util.List;
+import java.util.Map;
 import javax.ws.rs.core.GenericType;
+import javax.ws.rs.core.HttpHeaders;
+import javax.ws.rs.core.Response;
+import org.apache.commons.lang3.StringUtils;
+import org.apache.cxf.jaxrs.client.Client;
+import org.apache.cxf.jaxrs.client.WebClient;
 import org.apache.syncope.client.console.commons.status.StatusBean;
 import org.apache.syncope.client.console.commons.status.StatusUtils;
+import org.apache.syncope.client.lib.batch.BatchRequest;
 import org.apache.syncope.common.lib.patch.AssociationPatch;
 import org.apache.syncope.common.lib.patch.DeassociationPatch;
 import org.apache.syncope.common.lib.patch.StatusPatch;
 import org.apache.syncope.common.lib.to.AnyTO;
-import org.apache.syncope.common.lib.to.BulkAction;
-import org.apache.syncope.common.lib.to.BulkActionResult;
 import org.apache.syncope.common.lib.to.ProvisioningResult;
 import org.apache.syncope.common.lib.types.ResourceAssociationAction;
 import org.apache.syncope.common.lib.types.ResourceDeassociationAction;
+import org.apache.syncope.common.rest.api.RESTHeaders;
+import org.apache.syncope.common.rest.api.batch.BatchPayloadParser;
+import org.apache.syncope.common.rest.api.batch.BatchRequestItem;
+import org.apache.syncope.common.rest.api.batch.BatchResponseItem;
 import org.apache.syncope.common.rest.api.service.AnyService;
 import org.apache.wicket.extensions.markup.html.repeater.util.SortParam;
 
@@ -59,112 +72,103 @@ public abstract class AbstractAnyRestClient<TO extends 
AnyTO> extends BaseRestCl
         return result;
     }
 
-    public BulkActionResult unlink(final String etag, final String key, final 
List<StatusBean> statuses) {
-        BulkActionResult result;
-        synchronized (this) {
-            AnyService<?> service = getService(etag, getAnyServiceClass());
-
-            DeassociationPatch deassociationPatch = new 
DeassociationPatch.Builder().key(key).
-                    action(ResourceDeassociationAction.UNLINK).
-                    
resources(StatusUtils.buildStatusPatch(statuses).getResources()).build();
-
-            result = 
service.deassociate(deassociationPatch).readEntity(BulkActionResult.class);
-
-            resetClient(getAnyServiceClass());
-        }
-        return result;
+    private List<BatchResponseItem> parseBatchResponse(final Response 
response) throws IOException {
+        return BatchPayloadParser.parse(
+                (InputStream) response.getEntity(), response.getMediaType(), 
new BatchResponseItem());
     }
 
-    public BulkActionResult link(final String etag, final String key, final 
List<StatusBean> statuses) {
-        BulkActionResult result;
-        synchronized (this) {
-            AnyService<?> service = getService(etag, getAnyServiceClass());
-
-            StatusPatch statusPatch = StatusUtils.buildStatusPatch(statuses);
+    public Map<String, String> associate(
+            final ResourceAssociationAction action,
+            final String etag,
+            final String key,
+            final List<StatusBean> statuses) {
 
-            AssociationPatch associationPatch = new 
AssociationPatch.Builder().key(key).
-                    action(ResourceAssociationAction.LINK).
-                    onSyncope(statusPatch.isOnSyncope()).
-                    resources(statusPatch.getResources()).build();
-
-            result = 
service.associate(associationPatch).readEntity(BulkActionResult.class);
-
-            resetClient(getAnyServiceClass());
-        }
-        return result;
-    }
-
-    public BulkActionResult deprovision(final String etag, final String key, 
final List<StatusBean> statuses) {
-        BulkActionResult result;
+        Map<String, String> result = new LinkedHashMap<>();
         synchronized (this) {
             AnyService<?> service = getService(etag, getAnyServiceClass());
+            Client client = WebClient.client(service);
+            List<String> accept = client.getHeaders().get(HttpHeaders.ACCEPT);
+            if (!accept.contains(RESTHeaders.MULTIPART_MIXED)) {
+                client.accept(RESTHeaders.MULTIPART_MIXED);
+            }
 
-            DeassociationPatch deassociationPatch = new 
DeassociationPatch.Builder().key(key).
-                    action(ResourceDeassociationAction.DEPROVISION).
-                    
resources(StatusUtils.buildStatusPatch(statuses).getResources()).build();
-
-            result = 
service.deassociate(deassociationPatch).readEntity(BulkActionResult.class);
-
-            resetClient(getAnyServiceClass());
-        }
-        return result;
-    }
-
-    public BulkActionResult provision(final String etag, final String key, 
final List<StatusBean> statuses) {
-        BulkActionResult result;
-        synchronized (this) {
-            AnyService<?> service = getService(etag, getAnyServiceClass());
-
-            StatusPatch statusPatch = StatusUtils.buildStatusPatch(statuses);
+            StatusPatch statusPatch = 
StatusUtils.statusPatch(statuses).build();
 
             AssociationPatch associationPatch = new 
AssociationPatch.Builder().key(key).
-                    action(ResourceAssociationAction.PROVISION).
+                    action(action).
                     onSyncope(statusPatch.isOnSyncope()).
                     resources(statusPatch.getResources()).build();
-
-            result = 
service.associate(associationPatch).readEntity(BulkActionResult.class);
+            try {
+                List<BatchResponseItem> items = 
parseBatchResponse(service.associate(associationPatch));
+                for (int i = 0; i < items.size(); i++) {
+                    result.put(
+                            associationPatch.getResources().get(i),
+                            getStatus(items.get(i).getStatus()));
+                }
+            } catch (IOException e) {
+                LOG.error("While processing Batch response", e);
+            }
 
             resetClient(getAnyServiceClass());
         }
         return result;
     }
 
-    public BulkActionResult unassign(final String etag, final String key, 
final List<StatusBean> statuses) {
-        BulkActionResult result;
+    public Map<String, String> deassociate(
+            final ResourceDeassociationAction action,
+            final String etag,
+            final String key,
+            final List<StatusBean> statuses) {
+
+        Map<String, String> result = new LinkedHashMap<>();
         synchronized (this) {
             AnyService<?> service = getService(etag, getAnyServiceClass());
+            Client client = WebClient.client(service);
+            List<String> accept = client.getHeaders().get(HttpHeaders.ACCEPT);
+            if (!accept.contains(RESTHeaders.MULTIPART_MIXED)) {
+                client.accept(RESTHeaders.MULTIPART_MIXED);
+            }
 
             DeassociationPatch deassociationPatch = new 
DeassociationPatch.Builder().key(key).
-                    action(ResourceDeassociationAction.UNASSIGN).
-                    
resources(StatusUtils.buildStatusPatch(statuses).getResources()).build();
-
-            result = 
service.deassociate(deassociationPatch).readEntity(BulkActionResult.class);
+                    action(action).
+                    
resources(StatusUtils.statusPatch(statuses).build().getResources()).build();
+            try {
+                List<BatchResponseItem> items = 
parseBatchResponse(service.deassociate(deassociationPatch));
+                for (int i = 0; i < items.size(); i++) {
+                    result.put(
+                            deassociationPatch.getResources().get(i),
+                            getStatus(items.get(i).getStatus()));
+                }
+            } catch (IOException e) {
+                LOG.error("While processing Batch response", e);
+            }
 
             resetClient(getAnyServiceClass());
         }
         return result;
     }
 
-    public BulkActionResult assign(final String etag, final String key, final 
List<StatusBean> statuses) {
-        BulkActionResult result;
-        synchronized (this) {
-            AnyService<?> service = getService(etag, getAnyServiceClass());
-
-            StatusPatch statusPatch = StatusUtils.buildStatusPatch(statuses);
-
-            AssociationPatch associationPatch = new 
AssociationPatch.Builder().key(key).
-                    action(ResourceAssociationAction.ASSIGN).
-                    onSyncope(statusPatch.isOnSyncope()).
-                    resources(statusPatch.getResources()).build();
-
-            result = 
service.associate(associationPatch).readEntity(BulkActionResult.class);
-
-            resetClient(getAnyServiceClass());
+    public Map<String, String> batch(final BatchRequest batchRequest) {
+        List<BatchRequestItem> batchRequestItems = new 
ArrayList<>(batchRequest.getItems());
+
+        Map<String, String> result = new LinkedHashMap<>();
+        try {
+            List<BatchResponseItem> batchResponseItems = 
batchRequest.commit().getItems();
+            for (int i = 0; i < batchResponseItems.size(); i++) {
+                String status = 
getStatus(batchResponseItems.get(i).getStatus());
+                if 
(batchRequestItems.get(i).getRequestURI().endsWith("/status")) {
+                    result.put(StringUtils.substringAfterLast(
+                            
StringUtils.substringBefore(batchRequestItems.get(i).getRequestURI(), 
"/status"), "/"),
+                            status);
+                } else {
+                    result.put(StringUtils.substringAfterLast(
+                            batchRequestItems.get(i).getRequestURI(), "/"), 
status);
+                }
+            }
+        } catch (IOException e) {
+            LOG.error("While processing Batch response", e);
         }
-        return result;
-    }
 
-    public BulkActionResult bulkAction(final BulkAction action) {
-        return 
getService(getAnyServiceClass()).bulk(action).readEntity(BulkActionResult.class);
+        return result;
     }
 }

http://git-wip-us.apache.org/repos/asf/syncope/blob/34a2fdbb/client/console/src/main/java/org/apache/syncope/client/console/rest/BaseRestClient.java
----------------------------------------------------------------------
diff --git 
a/client/console/src/main/java/org/apache/syncope/client/console/rest/BaseRestClient.java
 
b/client/console/src/main/java/org/apache/syncope/client/console/rest/BaseRestClient.java
index 4a780a6..ecea2ae 100644
--- 
a/client/console/src/main/java/org/apache/syncope/client/console/rest/BaseRestClient.java
+++ 
b/client/console/src/main/java/org/apache/syncope/client/console/rest/BaseRestClient.java
@@ -19,13 +19,13 @@
 package org.apache.syncope.client.console.rest;
 
 import java.net.URI;
-
 import javax.ws.rs.core.HttpHeaders;
-
 import org.apache.cxf.jaxrs.client.WebClient;
 import org.apache.syncope.client.console.SyncopeConsoleSession;
+import org.apache.syncope.client.console.commons.Constants;
 import org.apache.syncope.client.lib.SyncopeClient;
 import org.apache.syncope.common.lib.search.OrderByClauseBuilder;
+import org.apache.syncope.common.lib.types.ExecStatus;
 import org.apache.syncope.common.rest.api.RESTHeaders;
 import org.apache.syncope.common.rest.api.service.JAXRSService;
 import org.apache.syncope.common.rest.api.service.SyncopeService;
@@ -82,4 +82,11 @@ public abstract class BaseRestClient implements RestClient {
                 header(HttpHeaders.AUTHORIZATION, "Bearer " + 
SyncopeConsoleSession.get().getJWT()).
                 get(resultClass);
     }
+
+    protected static String getStatus(final int httpStatus) {
+        ExecStatus execStatus = ExecStatus.fromHttpStatus(httpStatus);
+        return execStatus == null
+                ? Constants.UNKNOWN
+                : execStatus.name();
+    }
 }

http://git-wip-us.apache.org/repos/asf/syncope/blob/34a2fdbb/client/console/src/main/java/org/apache/syncope/client/console/rest/ExecutionRestClient.java
----------------------------------------------------------------------
diff --git 
a/client/console/src/main/java/org/apache/syncope/client/console/rest/ExecutionRestClient.java
 
b/client/console/src/main/java/org/apache/syncope/client/console/rest/ExecutionRestClient.java
index 8cde692..d8c9ff9 100644
--- 
a/client/console/src/main/java/org/apache/syncope/client/console/rest/ExecutionRestClient.java
+++ 
b/client/console/src/main/java/org/apache/syncope/client/console/rest/ExecutionRestClient.java
@@ -20,6 +20,8 @@ package org.apache.syncope.client.console.rest;
 
 import java.util.Date;
 import java.util.List;
+import java.util.Map;
+import org.apache.syncope.client.lib.batch.BatchRequest;
 import org.apache.syncope.common.lib.to.ExecTO;
 import org.apache.wicket.extensions.markup.html.repeater.util.SortParam;
 
@@ -34,4 +36,6 @@ public interface ExecutionRestClient extends RestClient {
     List<ExecTO> listExecutions(String taskKey, int page, int size, 
SortParam<String> sort);
 
     int countExecutions(String taskKey);
+
+    Map<String, String> batch(BatchRequest batchRequest);
 }

http://git-wip-us.apache.org/repos/asf/syncope/blob/34a2fdbb/client/console/src/main/java/org/apache/syncope/client/console/rest/GroupRestClient.java
----------------------------------------------------------------------
diff --git 
a/client/console/src/main/java/org/apache/syncope/client/console/rest/GroupRestClient.java
 
b/client/console/src/main/java/org/apache/syncope/client/console/rest/GroupRestClient.java
index e5d642b..4669d4d 100644
--- 
a/client/console/src/main/java/org/apache/syncope/client/console/rest/GroupRestClient.java
+++ 
b/client/console/src/main/java/org/apache/syncope/client/console/rest/GroupRestClient.java
@@ -24,7 +24,7 @@ import javax.ws.rs.core.Response;
 import org.apache.syncope.common.lib.patch.GroupPatch;
 import org.apache.syncope.common.lib.to.GroupTO;
 import org.apache.syncope.common.lib.to.ProvisioningResult;
-import org.apache.syncope.common.lib.types.BulkMembersActionType;
+import org.apache.syncope.common.lib.types.ProvisionAction;
 import org.apache.syncope.common.rest.api.beans.AnyQuery;
 import org.apache.syncope.common.rest.api.service.AnyService;
 import org.apache.syncope.common.rest.api.service.GroupService;
@@ -80,7 +80,7 @@ public class GroupRestClient extends 
AbstractAnyRestClient<GroupTO> {
                         
orderBy(toOrderBy(sort)).details(false).build()).getResult();
     }
 
-    public void bulkMembersAction(final String key, final 
BulkMembersActionType actionType) {
-        getService(GroupService.class).bulkMembersAction(key, actionType);
+    public void provisionMembers(final String key, final ProvisionAction 
actionType) {
+        getService(GroupService.class).provisionMembers(key, actionType);
     }
 }

http://git-wip-us.apache.org/repos/asf/syncope/blob/34a2fdbb/client/console/src/main/java/org/apache/syncope/client/console/rest/ReportRestClient.java
----------------------------------------------------------------------
diff --git 
a/client/console/src/main/java/org/apache/syncope/client/console/rest/ReportRestClient.java
 
b/client/console/src/main/java/org/apache/syncope/client/console/rest/ReportRestClient.java
index e65ce7e..8b60941 100644
--- 
a/client/console/src/main/java/org/apache/syncope/client/console/rest/ReportRestClient.java
+++ 
b/client/console/src/main/java/org/apache/syncope/client/console/rest/ReportRestClient.java
@@ -18,16 +18,20 @@
  */
 package org.apache.syncope.client.console.rest;
 
+import static org.apache.syncope.client.console.rest.BaseRestClient.getStatus;
+
+import java.io.IOException;
 import java.io.InputStream;
 import java.nio.charset.StandardCharsets;
+import java.util.ArrayList;
 import java.util.Date;
+import java.util.LinkedHashMap;
 import java.util.List;
-import javax.ws.rs.NotSupportedException;
+import java.util.Map;
 import javax.ws.rs.core.Response;
 import org.apache.commons.io.IOUtils;
 import org.apache.commons.lang3.StringUtils;
-import org.apache.syncope.common.lib.to.BulkAction;
-import org.apache.syncope.common.lib.to.BulkActionResult;
+import org.apache.syncope.client.lib.batch.BatchRequest;
 import org.apache.syncope.common.lib.to.ExecTO;
 import org.apache.syncope.common.lib.to.JobTO;
 import org.apache.syncope.common.lib.to.ReportTO;
@@ -35,6 +39,8 @@ import org.apache.syncope.common.lib.to.ReportTemplateTO;
 import org.apache.syncope.common.lib.types.JobAction;
 import org.apache.syncope.common.lib.types.ReportExecExportFormat;
 import org.apache.syncope.common.lib.types.ReportTemplateFormat;
+import org.apache.syncope.common.rest.api.batch.BatchRequestItem;
+import org.apache.syncope.common.rest.api.batch.BatchResponseItem;
 import org.apache.syncope.common.rest.api.beans.ExecQuery;
 import org.apache.syncope.common.rest.api.beans.ExecuteQuery;
 import org.apache.syncope.common.rest.api.service.ReportService;
@@ -155,25 +161,29 @@ public class ReportRestClient extends BaseRestClient
                 key, format, IOUtils.toInputStream(content, 
StandardCharsets.UTF_8));
     }
 
-    public BulkActionResult bulkAction(final BulkAction action) {
-        BulkActionResult result = new BulkActionResult();
+    @Override
+    public Map<String, String> batch(final BatchRequest batchRequest) {
+        List<BatchRequestItem> batchRequestItems = new 
ArrayList<>(batchRequest.getItems());
 
-        switch (action.getType()) {
-            case DELETE:
-                for (String target : action.getTargets()) {
-                    delete(target);
-                    result.getResults().put(target, 
BulkActionResult.Status.SUCCESS);
-                }
-                break;
-            case EXECUTE:
-                for (String target : action.getTargets()) {
-                    startExecution(target, null);
-                    result.getResults().put(target, 
BulkActionResult.Status.SUCCESS);
+        Map<String, String> result = new LinkedHashMap<>();
+        try {
+            List<BatchResponseItem> batchResponseItems = 
batchRequest.commit().getItems();
+            for (int i = 0; i < batchResponseItems.size(); i++) {
+                String status = 
getStatus(batchResponseItems.get(i).getStatus());
+
+                if 
(batchRequestItems.get(i).getRequestURI().contains("/execute")) {
+                    result.put(StringUtils.substringAfterLast(
+                            
StringUtils.substringBefore(batchRequestItems.get(i).getRequestURI(), 
"/execute"), "/"),
+                            status);
+                } else {
+                    result.put(StringUtils.substringAfterLast(
+                            batchRequestItems.get(i).getRequestURI(), "/"), 
status);
                 }
-                break;
-            default:
-                throw new NotSupportedException(action.getType().name());
+            }
+        } catch (IOException e) {
+            LOG.error("While processing Batch response", e);
         }
+
         return result;
     }
 }

http://git-wip-us.apache.org/repos/asf/syncope/blob/34a2fdbb/client/console/src/main/java/org/apache/syncope/client/console/rest/ResourceRestClient.java
----------------------------------------------------------------------
diff --git 
a/client/console/src/main/java/org/apache/syncope/client/console/rest/ResourceRestClient.java
 
b/client/console/src/main/java/org/apache/syncope/client/console/rest/ResourceRestClient.java
index e1f8f78..c8e135b 100644
--- 
a/client/console/src/main/java/org/apache/syncope/client/console/rest/ResourceRestClient.java
+++ 
b/client/console/src/main/java/org/apache/syncope/client/console/rest/ResourceRestClient.java
@@ -24,12 +24,9 @@ import java.util.List;
 import javax.ws.rs.core.Response;
 import org.apache.commons.lang3.ObjectUtils;
 import org.apache.commons.lang3.tuple.Pair;
-import org.apache.syncope.common.lib.patch.ResourceDeassociationPatch;
-import org.apache.syncope.common.lib.to.BulkActionResult;
 import org.apache.syncope.common.lib.to.ConnObjectTO;
 import org.apache.syncope.common.lib.to.PagedConnObjectTOResult;
 import org.apache.syncope.common.lib.to.ResourceTO;
-import org.apache.syncope.common.lib.types.ResourceDeassociationAction;
 import org.apache.syncope.common.rest.api.beans.ConnObjectTOListQuery;
 import org.apache.syncope.common.rest.api.service.ResourceService;
 import org.apache.wicket.extensions.markup.html.repeater.util.SortParam;
@@ -116,19 +113,6 @@ public class ResourceRestClient extends BaseRestClient {
         getService(ResourceService.class).delete(name);
     }
 
-    public BulkActionResult bulkAssociationAction(
-            final String resourceName, final String anyTypeName,
-            final ResourceDeassociationAction action, final List<String> 
anyKeys) {
-
-        ResourceDeassociationPatch patch = new ResourceDeassociationPatch();
-        patch.setKey(resourceName);
-        patch.setAnyTypeKey(anyTypeName);
-        patch.setAction(action);
-        patch.getAnyKyes().addAll(anyKeys);
-
-        return getService(ResourceService.class).bulkDeassociation(patch);
-    }
-
     public void setLatestSyncToken(final String key, final String anyType) {
         getService(ResourceService.class).setLatestSyncToken(key, anyType);
     }

http://git-wip-us.apache.org/repos/asf/syncope/blob/34a2fdbb/client/console/src/main/java/org/apache/syncope/client/console/rest/TaskRestClient.java
----------------------------------------------------------------------
diff --git 
a/client/console/src/main/java/org/apache/syncope/client/console/rest/TaskRestClient.java
 
b/client/console/src/main/java/org/apache/syncope/client/console/rest/TaskRestClient.java
index 516ef7c..2e6692e 100644
--- 
a/client/console/src/main/java/org/apache/syncope/client/console/rest/TaskRestClient.java
+++ 
b/client/console/src/main/java/org/apache/syncope/client/console/rest/TaskRestClient.java
@@ -18,11 +18,15 @@
  */
 package org.apache.syncope.client.console.rest;
 
+import java.io.IOException;
+import java.util.ArrayList;
 import java.util.Date;
+import java.util.LinkedHashMap;
 import java.util.List;
+import java.util.Map;
+import org.apache.commons.lang3.StringUtils;
+import org.apache.syncope.client.lib.batch.BatchRequest;
 import org.apache.syncope.common.lib.to.TaskTO;
-import org.apache.syncope.common.lib.to.BulkAction;
-import org.apache.syncope.common.lib.to.BulkActionResult;
 import org.apache.syncope.common.lib.to.NotificationTaskTO;
 import org.apache.syncope.common.lib.to.PropagationTaskTO;
 import org.apache.syncope.common.lib.to.PushTaskTO;
@@ -34,6 +38,8 @@ import org.apache.syncope.common.lib.to.PagedResult;
 import org.apache.syncope.common.lib.types.AnyTypeKind;
 import org.apache.syncope.common.lib.types.JobAction;
 import org.apache.syncope.common.lib.types.TaskType;
+import org.apache.syncope.common.rest.api.batch.BatchRequestItem;
+import org.apache.syncope.common.rest.api.batch.BatchResponseItem;
 import org.apache.syncope.common.rest.api.beans.ExecuteQuery;
 import org.apache.syncope.common.rest.api.beans.ExecQuery;
 import org.apache.syncope.common.rest.api.beans.TaskQuery;
@@ -228,7 +234,29 @@ public class TaskRestClient extends BaseRestClient 
implements ExecutionRestClien
         getService(TaskService.class).update(type, taskTO);
     }
 
-    public BulkActionResult bulkAction(final BulkAction action) {
-        return getService(TaskService.class).bulk(action);
+    @Override
+    public Map<String, String> batch(final BatchRequest batchRequest) {
+        List<BatchRequestItem> batchRequestItems = new 
ArrayList<>(batchRequest.getItems());
+
+        Map<String, String> result = new LinkedHashMap<>();
+        try {
+            List<BatchResponseItem> batchResponseItems = 
batchRequest.commit().getItems();
+            for (int i = 0; i < batchResponseItems.size(); i++) {
+                String status = 
getStatus(batchResponseItems.get(i).getStatus());
+
+                if 
(batchRequestItems.get(i).getRequestURI().contains("/execute")) {
+                    result.put(StringUtils.substringAfterLast(
+                            
StringUtils.substringBefore(batchRequestItems.get(i).getRequestURI(), 
"/execute"), "/"),
+                            status);
+                } else {
+                    result.put(StringUtils.substringAfterLast(
+                            batchRequestItems.get(i).getRequestURI(), "/"), 
status);
+                }
+            }
+        } catch (IOException e) {
+            LOG.error("While processing Batch response", e);
+        }
+
+        return result;
     }
 }

http://git-wip-us.apache.org/repos/asf/syncope/blob/34a2fdbb/client/console/src/main/java/org/apache/syncope/client/console/rest/UserRestClient.java
----------------------------------------------------------------------
diff --git 
a/client/console/src/main/java/org/apache/syncope/client/console/rest/UserRestClient.java
 
b/client/console/src/main/java/org/apache/syncope/client/console/rest/UserRestClient.java
index 514d970..11eb0fa 100644
--- 
a/client/console/src/main/java/org/apache/syncope/client/console/rest/UserRestClient.java
+++ 
b/client/console/src/main/java/org/apache/syncope/client/console/rest/UserRestClient.java
@@ -18,20 +18,21 @@
  */
 package org.apache.syncope.client.console.rest;
 
+import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 import javax.ws.rs.core.GenericType;
 import javax.ws.rs.core.Response;
 import org.apache.syncope.client.console.commons.Constants;
+import org.apache.syncope.client.console.commons.status.Status;
 import org.apache.syncope.client.console.commons.status.StatusBean;
 import org.apache.syncope.client.console.commons.status.StatusUtils;
 import org.apache.syncope.common.lib.patch.BooleanReplacePatchItem;
 import org.apache.syncope.common.lib.patch.StatusPatch;
 import org.apache.syncope.common.lib.patch.UserPatch;
-import org.apache.syncope.common.lib.to.BulkActionResult;
-import org.apache.syncope.common.lib.to.PropagationStatus;
 import org.apache.syncope.common.lib.to.ProvisioningResult;
 import org.apache.syncope.common.lib.to.UserTO;
+import org.apache.syncope.common.lib.types.ExecStatus;
 import org.apache.syncope.common.lib.types.StatusPatchType;
 import org.apache.syncope.common.rest.api.beans.AnyQuery;
 import org.apache.syncope.common.rest.api.service.AnyService;
@@ -85,69 +86,70 @@ public class UserRestClient extends 
AbstractAnyRestClient<UserTO> {
     }
 
     public ProvisioningResult<UserTO> mustChangePassword(final String etag, 
final boolean value, final String key) {
-        final UserPatch userPatch = new UserPatch();
+        UserPatch userPatch = new UserPatch();
         userPatch.setKey(key);
         userPatch.setMustChangePassword(new 
BooleanReplacePatchItem.Builder().value(value).build());
         return update(etag, userPatch);
     }
 
-    public BulkActionResult suspend(final String etag, final String userKey, 
final List<StatusBean> statuses) {
-        StatusPatch statusPatch = StatusUtils.buildStatusPatch(statuses, 
false);
-        statusPatch.setKey(userKey);
-        statusPatch.setType(StatusPatchType.SUSPEND);
+    private Map<String, String> status(
+            final StatusPatchType type, final String etag, final String 
userKey, final List<StatusBean> statuses) {
 
-        BulkActionResult bulkActionResult;
+        StatusPatch statusPatch = 
StatusUtils.statusPatch(statuses).key(userKey).type(type).build();
+
+        Map<String, String> results;
         synchronized (this) {
-            bulkActionResult = new BulkActionResult();
-            Map<String, BulkActionResult.Status> results = 
bulkActionResult.getResults();
-            UserService service = getService(etag, UserService.class);
+            ProvisioningResult<UserTO> provisioningResult = getService(etag, 
UserService.class).status(statusPatch).
+                    readEntity(new GenericType<ProvisioningResult<UserTO>>() {
+                    });
 
-            ProvisioningResult<UserTO> provisioningResult = 
service.status(statusPatch).readEntity(
-                    new GenericType<ProvisioningResult<UserTO>>() {
+            statuses.forEach(statusBean -> 
statusBean.setStatus(Status.UNDEFINED));
+
+            results = new HashMap<>();
+            
provisioningResult.getPropagationStatuses().forEach(propagationStatus -> {
+                results.put(propagationStatus.getResource(), 
propagationStatus.getStatus().name());
+
+                if (propagationStatus.getAfterObj() != null) {
+                    Boolean enabled = 
StatusUtils.isEnabled(propagationStatus.getAfterObj());
+                    if (enabled != null) {
+                        statuses.stream().
+                                filter(statusBean -> 
propagationStatus.getResource().equals(statusBean.getResource())).
+                                findFirst().
+                                ifPresent(statusBean -> statusBean.setStatus(
+                                enabled ? Status.ACTIVE : Status.SUSPENDED));
+                    }
+                }
             });
-
+            statuses.stream().
+                    filter(statusBean -> 
Constants.SYNCOPE.equals(statusBean.getResource())).
+                    findFirst().
+                    ifPresent(statusBean -> statusBean.setStatus(
+                    
"suspended".equalsIgnoreCase(provisioningResult.getEntity().getStatus())
+                    ? Status.SUSPENDED : Status.ACTIVE));
             if (statusPatch.isOnSyncope()) {
                 results.put(Constants.SYNCOPE,
-                        
"suspended".equalsIgnoreCase(provisioningResult.getEntity().getStatus())
-                        ? BulkActionResult.Status.SUCCESS
-                        : BulkActionResult.Status.FAILURE);
+                        
("suspended".equalsIgnoreCase(provisioningResult.getEntity().getStatus())
+                        && type == StatusPatchType.SUSPEND)
+                        || 
("active".equalsIgnoreCase(provisioningResult.getEntity().getStatus())
+                        && type == StatusPatchType.REACTIVATE)
+                                ? ExecStatus.SUCCESS.name()
+                                : ExecStatus.FAILURE.name());
             }
 
-            for (PropagationStatus status : 
provisioningResult.getPropagationStatuses()) {
-                results.put(status.getResource(), 
BulkActionResult.Status.valueOf(status.getStatus().name()));
-            }
             resetClient(UserService.class);
         }
-        return bulkActionResult;
+        return results;
     }
 
-    public BulkActionResult reactivate(final String etag, final String 
userKey, final List<StatusBean> statuses) {
-        StatusPatch statusPatch = StatusUtils.buildStatusPatch(statuses, true);
-        statusPatch.setKey(userKey);
-        statusPatch.setType(StatusPatchType.REACTIVATE);
-
-        BulkActionResult bulkActionResult;
-        synchronized (this) {
-            bulkActionResult = new BulkActionResult();
-            Map<String, BulkActionResult.Status> results = 
bulkActionResult.getResults();
-            UserService service = getService(etag, UserService.class);
+    public Map<String, String> suspend(
+            final String etag, final String userKey, final List<StatusBean> 
statuses) {
 
-            ProvisioningResult<UserTO> provisioningResult = 
service.status(statusPatch).readEntity(
-                    new GenericType<ProvisioningResult<UserTO>>() {
-            });
+        return status(StatusPatchType.SUSPEND, etag, userKey, statuses);
+    }
 
-            if (statusPatch.isOnSyncope()) {
-                results.put(Constants.SYNCOPE,
-                        
"active".equalsIgnoreCase(provisioningResult.getEntity().getStatus())
-                        ? BulkActionResult.Status.SUCCESS
-                        : BulkActionResult.Status.FAILURE);
-            }
+    public Map<String, String> reactivate(
+            final String etag, final String userKey, final List<StatusBean> 
statuses) {
 
-            for (PropagationStatus status : 
provisioningResult.getPropagationStatuses()) {
-                results.put(status.getResource(), 
BulkActionResult.Status.valueOf(status.getStatus().name()));
-            }
-            resetClient(UserService.class);
-        }
-        return bulkActionResult;
+        return status(StatusPatchType.REACTIVATE, etag, userKey, statuses);
     }
 }

http://git-wip-us.apache.org/repos/asf/syncope/blob/34a2fdbb/client/console/src/main/java/org/apache/syncope/client/console/status/AnyStatusDirectoryPanel.java
----------------------------------------------------------------------
diff --git 
a/client/console/src/main/java/org/apache/syncope/client/console/status/AnyStatusDirectoryPanel.java
 
b/client/console/src/main/java/org/apache/syncope/client/console/status/AnyStatusDirectoryPanel.java
index bd54f00..fe67ff6 100644
--- 
a/client/console/src/main/java/org/apache/syncope/client/console/status/AnyStatusDirectoryPanel.java
+++ 
b/client/console/src/main/java/org/apache/syncope/client/console/status/AnyStatusDirectoryPanel.java
@@ -247,20 +247,20 @@ public class AnyStatusDirectoryPanel
     }
 
     @Override
-    protected Collection<ActionLink.ActionType> getBulkActions() {
-        List<ActionLink.ActionType> bulkActions = new ArrayList<>();
+    protected Collection<ActionLink.ActionType> getBatches() {
+        List<ActionLink.ActionType> batches = new ArrayList<>();
         if (statusOnly) {
-            bulkActions.add(ActionLink.ActionType.SUSPEND);
-            bulkActions.add(ActionLink.ActionType.REACTIVATE);
+            batches.add(ActionLink.ActionType.SUSPEND);
+            batches.add(ActionLink.ActionType.REACTIVATE);
         } else {
-            bulkActions.add(ActionLink.ActionType.UNLINK);
-            bulkActions.add(ActionLink.ActionType.LINK);
-            bulkActions.add(ActionLink.ActionType.DEPROVISION);
-            bulkActions.add(ActionLink.ActionType.PROVISION);
-            bulkActions.add(ActionLink.ActionType.ASSIGN);
-            bulkActions.add(ActionLink.ActionType.UNASSIGN);
+            batches.add(ActionLink.ActionType.UNLINK);
+            batches.add(ActionLink.ActionType.LINK);
+            batches.add(ActionLink.ActionType.DEPROVISION);
+            batches.add(ActionLink.ActionType.PROVISION);
+            batches.add(ActionLink.ActionType.ASSIGN);
+            batches.add(ActionLink.ActionType.UNASSIGN);
         }
-        return bulkActions;
+        return batches;
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/syncope/blob/34a2fdbb/client/console/src/main/java/org/apache/syncope/client/console/status/ResourceStatusDirectoryPanel.java
----------------------------------------------------------------------
diff --git 
a/client/console/src/main/java/org/apache/syncope/client/console/status/ResourceStatusDirectoryPanel.java
 
b/client/console/src/main/java/org/apache/syncope/client/console/status/ResourceStatusDirectoryPanel.java
index 8b621bc..bba8d2f 100644
--- 
a/client/console/src/main/java/org/apache/syncope/client/console/status/ResourceStatusDirectoryPanel.java
+++ 
b/client/console/src/main/java/org/apache/syncope/client/console/status/ResourceStatusDirectoryPanel.java
@@ -215,15 +215,15 @@ public class ResourceStatusDirectoryPanel
     }
 
     @Override
-    protected Collection<ActionLink.ActionType> getBulkActions() {
-        List<ActionLink.ActionType> bulkActions = new ArrayList<>();
-        bulkActions.add(ActionLink.ActionType.UNLINK);
-        bulkActions.add(ActionLink.ActionType.LINK);
-        bulkActions.add(ActionLink.ActionType.DEPROVISION);
-        bulkActions.add(ActionLink.ActionType.PROVISION);
-        bulkActions.add(ActionLink.ActionType.ASSIGN);
-        bulkActions.add(ActionLink.ActionType.UNASSIGN);
-        return bulkActions;
+    protected Collection<ActionLink.ActionType> getBatches() {
+        List<ActionLink.ActionType> batches = new ArrayList<>();
+        batches.add(ActionLink.ActionType.UNLINK);
+        batches.add(ActionLink.ActionType.LINK);
+        batches.add(ActionLink.ActionType.DEPROVISION);
+        batches.add(ActionLink.ActionType.PROVISION);
+        batches.add(ActionLink.ActionType.ASSIGN);
+        batches.add(ActionLink.ActionType.UNASSIGN);
+        return batches;
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/syncope/blob/34a2fdbb/client/console/src/main/java/org/apache/syncope/client/console/tasks/ExecutionsDirectoryPanel.java
----------------------------------------------------------------------
diff --git 
a/client/console/src/main/java/org/apache/syncope/client/console/tasks/ExecutionsDirectoryPanel.java
 
b/client/console/src/main/java/org/apache/syncope/client/console/tasks/ExecutionsDirectoryPanel.java
index 1494e34..267987f 100644
--- 
a/client/console/src/main/java/org/apache/syncope/client/console/tasks/ExecutionsDirectoryPanel.java
+++ 
b/client/console/src/main/java/org/apache/syncope/client/console/tasks/ExecutionsDirectoryPanel.java
@@ -157,10 +157,10 @@ public abstract class ExecutionsDirectoryPanel
     }
 
     @Override
-    protected Collection<ActionLink.ActionType> getBulkActions() {
-        final List<ActionLink.ActionType> bulkActions = new ArrayList<>();
-        bulkActions.add(ActionLink.ActionType.DELETE);
-        return bulkActions;
+    protected Collection<ActionLink.ActionType> getBatches() {
+        List<ActionLink.ActionType> batches = new ArrayList<>();
+        batches.add(ActionLink.ActionType.DELETE);
+        return batches;
     }
 
     protected class ExecProvider extends DirectoryDataProvider<ExecTO> {

http://git-wip-us.apache.org/repos/asf/syncope/blob/34a2fdbb/client/console/src/main/java/org/apache/syncope/client/console/tasks/NotificationTaskDirectoryPanel.java
----------------------------------------------------------------------
diff --git 
a/client/console/src/main/java/org/apache/syncope/client/console/tasks/NotificationTaskDirectoryPanel.java
 
b/client/console/src/main/java/org/apache/syncope/client/console/tasks/NotificationTaskDirectoryPanel.java
index 656b707..3a584ca 100644
--- 
a/client/console/src/main/java/org/apache/syncope/client/console/tasks/NotificationTaskDirectoryPanel.java
+++ 
b/client/console/src/main/java/org/apache/syncope/client/console/tasks/NotificationTaskDirectoryPanel.java
@@ -176,11 +176,11 @@ public abstract class NotificationTaskDirectoryPanel
     }
 
     @Override
-    protected Collection<ActionType> getBulkActions() {
-        final List<ActionType> bulkActions = new ArrayList<>();
-        bulkActions.add(ActionType.DELETE);
-        bulkActions.add(ActionType.EXECUTE);
-        return bulkActions;
+    protected Collection<ActionType> getBatches() {
+        List<ActionType> batches = new ArrayList<>();
+        batches.add(ActionType.DELETE);
+        batches.add(ActionType.EXECUTE);
+        return batches;
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/syncope/blob/34a2fdbb/client/console/src/main/java/org/apache/syncope/client/console/tasks/PropagationTaskDirectoryPanel.java
----------------------------------------------------------------------
diff --git 
a/client/console/src/main/java/org/apache/syncope/client/console/tasks/PropagationTaskDirectoryPanel.java
 
b/client/console/src/main/java/org/apache/syncope/client/console/tasks/PropagationTaskDirectoryPanel.java
index 5298b22..67be4c8 100644
--- 
a/client/console/src/main/java/org/apache/syncope/client/console/tasks/PropagationTaskDirectoryPanel.java
+++ 
b/client/console/src/main/java/org/apache/syncope/client/console/tasks/PropagationTaskDirectoryPanel.java
@@ -183,11 +183,11 @@ public abstract class PropagationTaskDirectoryPanel
     }
 
     @Override
-    protected Collection<ActionType> getBulkActions() {
-        final List<ActionType> bulkActions = new ArrayList<>();
-        bulkActions.add(ActionType.DELETE);
-        bulkActions.add(ActionType.EXECUTE);
-        return bulkActions;
+    protected Collection<ActionType> getBatches() {
+        List<ActionType> batches = new ArrayList<>();
+        batches.add(ActionType.DELETE);
+        batches.add(ActionType.EXECUTE);
+        return batches;
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/syncope/blob/34a2fdbb/client/console/src/main/java/org/apache/syncope/client/console/tasks/ProvisioningTaskDirectoryPanel.java
----------------------------------------------------------------------
diff --git 
a/client/console/src/main/java/org/apache/syncope/client/console/tasks/ProvisioningTaskDirectoryPanel.java
 
b/client/console/src/main/java/org/apache/syncope/client/console/tasks/ProvisioningTaskDirectoryPanel.java
index 0577433..2f44287 100644
--- 
a/client/console/src/main/java/org/apache/syncope/client/console/tasks/ProvisioningTaskDirectoryPanel.java
+++ 
b/client/console/src/main/java/org/apache/syncope/client/console/tasks/ProvisioningTaskDirectoryPanel.java
@@ -34,6 +34,7 @@ import org.apache.syncope.common.lib.to.PullTaskTO;
 import org.apache.syncope.common.lib.to.PushTaskTO;
 import org.apache.syncope.common.lib.types.StandardEntitlement;
 import org.apache.syncope.common.lib.types.TaskType;
+import org.apache.wicket.Component;
 import org.apache.wicket.PageReference;
 import org.apache.wicket.ajax.AjaxRequestTarget;
 import 
org.apache.wicket.authroles.authorization.strategies.role.metadata.MetaDataRoleAuthorizationStrategy;
@@ -43,6 +44,7 @@ import 
org.apache.wicket.extensions.markup.html.repeater.data.table.AbstractColu
 import org.apache.wicket.extensions.markup.html.repeater.data.table.IColumn;
 import 
org.apache.wicket.extensions.markup.html.repeater.data.table.PropertyColumn;
 import org.apache.wicket.markup.html.WebPage;
+import org.apache.wicket.markup.html.basic.Label;
 import org.apache.wicket.markup.repeater.Item;
 import org.apache.wicket.model.IModel;
 import org.apache.wicket.model.Model;
@@ -137,13 +139,18 @@ public abstract class ProvisioningTaskDirectoryPanel<T 
extends ProvisioningTaskT
                     final String componentId,
                     final IModel<T> rowModel) {
 
-                JobTO jobTO = restClient.getJob(rowModel.getObject().getKey());
-                JobActionPanel panel = new JobActionPanel(
-                        componentId, jobTO, false, 
ProvisioningTaskDirectoryPanel.this, pageRef);
-                MetaDataRoleAuthorizationStrategy.authorize(panel, 
WebPage.ENABLE,
-                        String.format("%s,%s",
-                                StandardEntitlement.TASK_EXECUTE,
-                                StandardEntitlement.TASK_UPDATE));
+                Component panel;
+                try {
+                    JobTO jobTO = 
restClient.getJob(rowModel.getObject().getKey());
+                    panel = new JobActionPanel(componentId, jobTO, false, 
ProvisioningTaskDirectoryPanel.this, pageRef);
+                    MetaDataRoleAuthorizationStrategy.authorize(panel, 
WebPage.ENABLE,
+                            String.format("%s,%s",
+                                    StandardEntitlement.TASK_EXECUTE,
+                                    StandardEntitlement.TASK_UPDATE));
+                } catch (Exception e) {
+                    LOG.error("Could not get job for task {}", 
rowModel.getObject().getKey(), e);
+                    panel = new Label(componentId, Model.of());
+                }
                 cellItem.add(panel);
             }
 

Reply via email to