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 2017/12/26 16:26:13 UTC

[2/4] syncope git commit: Enhancing Swagger friendliness for REST services

Enhancing Swagger friendliness for REST services


Project: http://git-wip-us.apache.org/repos/asf/syncope/repo
Commit: http://git-wip-us.apache.org/repos/asf/syncope/commit/130c4a08
Tree: http://git-wip-us.apache.org/repos/asf/syncope/tree/130c4a08
Diff: http://git-wip-us.apache.org/repos/asf/syncope/diff/130c4a08

Branch: refs/heads/2_0_X
Commit: 130c4a084710b77eb7005bf0885cfccaa5d39558
Parents: 5cd0284
Author: Francesco Chicchiriccò <il...@apache.org>
Authored: Tue Dec 26 16:53:45 2017 +0100
Committer: Francesco Chicchiriccò <il...@apache.org>
Committed: Tue Dec 26 16:53:45 2017 +0100

----------------------------------------------------------------------
 .../client/console/bulk/BulkContent.java        |  4 +-
 .../client/console/commons/AnyDataProvider.java |  4 +-
 .../commons/ResourceStatusDataProvider.java     |  2 +-
 .../console/panels/AnyDirectoryPanel.java       |  4 +-
 .../search/AnySelectionDirectoryPanel.java      |  4 +-
 .../console/rest/AbstractAnyRestClient.java     | 35 ++++----------
 .../console/rest/AnyObjectRestClient.java       | 28 ++++++++++--
 .../client/console/rest/GroupRestClient.java    | 24 +++++++++-
 .../client/console/rest/UserRestClient.java     | 15 +++++-
 .../console/status/AnyStatusDirectoryPanel.java |  2 +-
 .../client/console/status/AnyStatusModal.java   |  2 +-
 .../status/ResourceStatusDirectoryPanel.java    |  2 +-
 .../console/status/ResourceStatusModal.java     |  4 +-
 .../client/console/status/StatusModal.java      |  2 +-
 .../rest/api/service/AccessTokenService.java    |  7 ++-
 .../rest/api/service/AnyObjectService.java      | 48 +++++++++++++++++++-
 .../common/rest/api/service/AnyService.java     | 45 ++----------------
 .../rest/api/service/AnyTypeClassService.java   |  6 ++-
 .../common/rest/api/service/AnyTypeService.java |  6 ++-
 .../rest/api/service/ConfigurationService.java  |  6 ++-
 .../api/service/ConnectorHistoryService.java    |  7 ++-
 .../rest/api/service/ConnectorService.java      | 13 ++++--
 .../common/rest/api/service/DomainService.java  |  6 ++-
 .../rest/api/service/DynRealmService.java       |  6 ++-
 .../rest/api/service/ExecutableService.java     |  7 ++-
 .../common/rest/api/service/GroupService.java   | 46 ++++++++++++++++++-
 .../common/rest/api/service/LoggerService.java  |  7 ++-
 .../rest/api/service/MailTemplateService.java   |  9 ++--
 .../rest/api/service/NotificationService.java   |  9 ++--
 .../common/rest/api/service/PolicyService.java  |  6 ++-
 .../api/service/RelationshipTypeService.java    |  6 ++-
 .../common/rest/api/service/ReportService.java  |  6 ++-
 .../rest/api/service/ReportTemplateService.java | 10 ++--
 .../api/service/ResourceHistoryService.java     |  7 ++-
 .../rest/api/service/ResourceService.java       | 19 ++++++--
 .../common/rest/api/service/RoleService.java    | 12 +++--
 .../common/rest/api/service/SchemaService.java  |  6 ++-
 .../api/service/SecurityQuestionService.java    |  6 ++-
 .../common/rest/api/service/TaskService.java    |  6 ++-
 .../rest/api/service/UserSelfService.java       |  6 ++-
 .../common/rest/api/service/UserService.java    | 30 +++++++++++-
 .../rest/api/service/WorkflowService.java       |  6 ++-
 .../syncope/core/logic/AbstractAnyLogic.java    | 10 ++--
 .../syncope/core/logic/AnyObjectLogic.java      |  1 -
 .../apache/syncope/core/logic/GroupLogic.java   |  3 +-
 .../apache/syncope/core/logic/UserLogic.java    |  6 ---
 .../rest/cxf/service/AbstractAnyService.java    | 31 +++----------
 .../cxf/service/AbstractExecutableService.java  |  7 ++-
 .../cxf/service/AccessTokenServiceImpl.java     |  6 ++-
 .../rest/cxf/service/AnyObjectServiceImpl.java  | 26 +++++++++++
 .../cxf/service/AnyTypeClassServiceImpl.java    |  6 ++-
 .../rest/cxf/service/AnyTypeServiceImpl.java    |  6 ++-
 .../cxf/service/ConfigurationServiceImpl.java   |  6 ++-
 .../service/ConnectorHistoryServiceImpl.java    |  7 ++-
 .../rest/cxf/service/ConnectorServiceImpl.java  | 12 +++--
 .../rest/cxf/service/DomainServiceImpl.java     |  6 ++-
 .../rest/cxf/service/DynRealmServiceImpl.java   |  6 ++-
 .../core/rest/cxf/service/GroupServiceImpl.java | 26 +++++++++++
 .../rest/cxf/service/LoggerServiceImpl.java     |  8 ++--
 .../cxf/service/MailTemplateServiceImpl.java    |  9 ++--
 .../cxf/service/NotificationServiceImpl.java    |  9 ++--
 .../rest/cxf/service/PolicyServiceImpl.java     |  6 ++-
 .../service/RelationshipTypeServiceImpl.java    |  6 ++-
 .../rest/cxf/service/ReportServiceImpl.java     |  6 ++-
 .../cxf/service/ReportTemplateServiceImpl.java  |  9 ++--
 .../cxf/service/ResourceHistoryServiceImpl.java |  7 ++-
 .../rest/cxf/service/ResourceServiceImpl.java   | 15 ++++--
 .../core/rest/cxf/service/RoleServiceImpl.java  | 12 +++--
 .../rest/cxf/service/SchemaServiceImpl.java     |  6 ++-
 .../service/SecurityQuestionServiceImpl.java    |  6 ++-
 .../core/rest/cxf/service/TaskServiceImpl.java  |  6 ++-
 .../rest/cxf/service/UserSelfServiceImpl.java   |  6 ++-
 .../core/rest/cxf/service/UserServiceImpl.java  | 18 ++++++++
 .../rest/cxf/service/WorkflowServiceImpl.java   |  6 ++-
 .../rest/api/service/CamelRouteService.java     |  8 +++-
 .../rest/cxf/service/CamelRouteServiceImpl.java |  7 ++-
 .../rest/api/service/SAML2IdPService.java       |  6 ++-
 .../common/rest/api/service/SAML2SPService.java |  3 +-
 .../rest/cxf/service/SAML2IdPServiceImpl.java   |  6 ++-
 .../rest/cxf/service/SAML2SPServiceImpl.java    |  3 +-
 .../rest/api/service/SCIMConfService.java       |  4 +-
 .../rest/cxf/service/SCIMConfServiceImpl.java   |  4 +-
 .../ext/scimv2/cxf/service/UserServiceImpl.java |  2 +-
 .../syncope/fit/core/AuthenticationITCase.java  |  4 +-
 .../syncope/fit/core/MultitenancyITCase.java    |  2 +-
 .../org/apache/syncope/fit/core/SCIMITCase.java |  6 +--
 .../org/apache/syncope/fit/core/UserITCase.java |  4 +-
 87 files changed, 573 insertions(+), 272 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/syncope/blob/130c4a08/client/console/src/main/java/org/apache/syncope/client/console/bulk/BulkContent.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/bulk/BulkContent.java b/client/console/src/main/java/org/apache/syncope/client/console/bulk/BulkContent.java
index 58c8f57..ffaf9bf 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/bulk/BulkContent.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/bulk/BulkContent.java
@@ -183,8 +183,8 @@ public class BulkContent<T extends Serializable, S> extends MultilevelPanel.Seco
                                 throw new IllegalArgumentException("Invalid bulk action executor");
                             }
 
-                            final AbstractAnyRestClient<?, ?> anyRestClient = AbstractAnyRestClient.class.cast(
-                                    bulkActionExecutor);
+                            final AbstractAnyRestClient<?> anyRestClient = AbstractAnyRestClient.class.
+                                    cast(bulkActionExecutor);
 
                             // Group bean information by anyKey
                             final Map<String, List<StatusBean>> beans = new HashMap<>();

http://git-wip-us.apache.org/repos/asf/syncope/blob/130c4a08/client/console/src/main/java/org/apache/syncope/client/console/commons/AnyDataProvider.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/commons/AnyDataProvider.java b/client/console/src/main/java/org/apache/syncope/client/console/commons/AnyDataProvider.java
index 8b3c67b..ff4161c 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/commons/AnyDataProvider.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/commons/AnyDataProvider.java
@@ -42,7 +42,7 @@ public class AnyDataProvider<A extends AnyTO> extends DirectoryDataProvider<A> {
 
     private final SortableAnyProviderComparator<A> comparator;
 
-    private final AbstractAnyRestClient<A, ?> restClient;
+    private final AbstractAnyRestClient<A> restClient;
 
     protected String fiql;
 
@@ -55,7 +55,7 @@ public class AnyDataProvider<A extends AnyTO> extends DirectoryDataProvider<A> {
     private final PageReference pageRef;
 
     public AnyDataProvider(
-            final AbstractAnyRestClient<A, ?> restClient,
+            final AbstractAnyRestClient<A> restClient,
             final int paginatorRows,
             final boolean filtered,
             final String realm,

http://git-wip-us.apache.org/repos/asf/syncope/blob/130c4a08/client/console/src/main/java/org/apache/syncope/client/console/commons/ResourceStatusDataProvider.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/commons/ResourceStatusDataProvider.java b/client/console/src/main/java/org/apache/syncope/client/console/commons/ResourceStatusDataProvider.java
index 0d936a5..e54e4e6 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/commons/ResourceStatusDataProvider.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/commons/ResourceStatusDataProvider.java
@@ -50,7 +50,7 @@ public class ResourceStatusDataProvider extends DirectoryDataProvider<StatusBean
 
     private final SortableDataProviderComparator<StatusBean> comparator;
 
-    private final AbstractAnyRestClient<? extends AnyTO, ?> restClient;
+    private final AbstractAnyRestClient<? extends AnyTO> restClient;
 
     protected String fiql;
 

http://git-wip-us.apache.org/repos/asf/syncope/blob/130c4a08/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 4a7d513..3b05c8b 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
@@ -64,7 +64,7 @@ import org.apache.wicket.model.ResourceModel;
 import org.apache.wicket.model.util.ListModel;
 import org.springframework.util.ReflectionUtils;
 
-public abstract class AnyDirectoryPanel<A extends AnyTO, E extends AbstractAnyRestClient<A, ?>>
+public abstract class AnyDirectoryPanel<A extends AnyTO, E extends AbstractAnyRestClient<A>>
         extends DirectoryPanel<A, AnyWrapper<A>, AnyDataProvider<A>, E> {
 
     private static final long serialVersionUID = -1100228004207271270L;
@@ -240,7 +240,7 @@ public abstract class AnyDirectoryPanel<A extends AnyTO, E extends AbstractAnyRe
         List<AnyTypeClassTO> getAnyTypeClassTOs();
     }
 
-    public abstract static class Builder<A extends AnyTO, E extends AbstractAnyRestClient<A, ?>>
+    public abstract static class Builder<A extends AnyTO, E extends AbstractAnyRestClient<A>>
             extends DirectoryPanel.Builder<A, AnyWrapper<A>, E>
             implements AnyDirectoryPanelBuilder {
 

http://git-wip-us.apache.org/repos/asf/syncope/blob/130c4a08/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 7eeb59c..3ce4143 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
@@ -35,7 +35,7 @@ import org.apache.wicket.ajax.AjaxRequestTarget;
 import org.apache.wicket.event.Broadcast;
 import org.apache.wicket.model.IModel;
 
-public abstract class AnySelectionDirectoryPanel<A extends AnyTO, E extends AbstractAnyRestClient<A, ?>>
+public abstract class AnySelectionDirectoryPanel<A extends AnyTO, E extends AbstractAnyRestClient<A>>
         extends AnyDirectoryPanel<A, E> {
 
     private static final long serialVersionUID = -1100228004207271272L;
@@ -71,7 +71,7 @@ public abstract class AnySelectionDirectoryPanel<A extends AnyTO, E extends Abst
         return Collections.<ActionType>emptyList();
     }
 
-    public abstract static class Builder<A extends AnyTO, E extends AbstractAnyRestClient<A, ?>>
+    public abstract static class Builder<A extends AnyTO, E extends AbstractAnyRestClient<A>>
             extends AnyDirectoryPanel.Builder<A, E> {
 
         private static final long serialVersionUID = 5460024856989891156L;

http://git-wip-us.apache.org/repos/asf/syncope/blob/130c4a08/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 4796ddb..4cfdddb 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
@@ -20,10 +20,8 @@ package org.apache.syncope.client.console.rest;
 
 import java.util.List;
 import javax.ws.rs.core.GenericType;
-import javax.ws.rs.core.Response;
 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.AnyPatch;
 import org.apache.syncope.common.lib.patch.AssociationPatch;
 import org.apache.syncope.common.lib.patch.DeassociationPatch;
 import org.apache.syncope.common.lib.patch.StatusPatch;
@@ -36,11 +34,11 @@ import org.apache.syncope.common.lib.types.ResourceDeassociationAction;
 import org.apache.syncope.common.rest.api.service.AnyService;
 import org.apache.wicket.extensions.markup.html.repeater.util.SortParam;
 
-public abstract class AbstractAnyRestClient<TO extends AnyTO, P extends AnyPatch> extends BaseRestClient {
+public abstract class AbstractAnyRestClient<TO extends AnyTO> extends BaseRestClient {
 
     private static final long serialVersionUID = 1962529678091410544L;
 
-    protected abstract Class<? extends AnyService<TO, P>> getAnyServiceClass();
+    protected abstract Class<? extends AnyService<TO>> getAnyServiceClass();
 
     public abstract int searchCount(String realm, String fiql, String type);
 
@@ -50,23 +48,6 @@ public abstract class AbstractAnyRestClient<TO extends AnyTO, P extends AnyPatch
         return getService(getAnyServiceClass()).read(key);
     }
 
-    public ProvisioningResult<TO> create(final TO to) {
-        Response response = getService(getAnyServiceClass()).create(to);
-        return response.readEntity(new GenericType<ProvisioningResult<TO>>() {
-        });
-    }
-
-    public ProvisioningResult<TO> update(final String etag, final P patch) {
-        ProvisioningResult<TO> result;
-        synchronized (this) {
-            result = getService(etag, getAnyServiceClass()).update(patch).
-                    readEntity(new GenericType<ProvisioningResult<TO>>() {
-                    });
-            resetClient(getAnyServiceClass());
-        }
-        return result;
-    }
-
     public ProvisioningResult<TO> delete(final String etag, final String key) {
         ProvisioningResult<TO> result;
         synchronized (this) {
@@ -81,7 +62,7 @@ public abstract class AbstractAnyRestClient<TO extends AnyTO, P extends AnyPatch
     public BulkActionResult unlink(final String etag, final String key, final List<StatusBean> statuses) {
         BulkActionResult result;
         synchronized (this) {
-            AnyService<?, ?> service = getService(etag, getAnyServiceClass());
+            AnyService<?> service = getService(etag, getAnyServiceClass());
 
             DeassociationPatch deassociationPatch = new DeassociationPatch.Builder().key(key).
                     action(ResourceDeassociationAction.UNLINK).
@@ -97,7 +78,7 @@ public abstract class AbstractAnyRestClient<TO extends AnyTO, P extends AnyPatch
     public BulkActionResult link(final String etag, final String key, final List<StatusBean> statuses) {
         BulkActionResult result;
         synchronized (this) {
-            AnyService<?, ?> service = getService(etag, getAnyServiceClass());
+            AnyService<?> service = getService(etag, getAnyServiceClass());
 
             StatusPatch statusPatch = StatusUtils.buildStatusPatch(statuses);
 
@@ -116,7 +97,7 @@ public abstract class AbstractAnyRestClient<TO extends AnyTO, P extends AnyPatch
     public BulkActionResult deprovision(final String etag, final String key, final List<StatusBean> statuses) {
         BulkActionResult result;
         synchronized (this) {
-            AnyService<?, ?> service = getService(etag, getAnyServiceClass());
+            AnyService<?> service = getService(etag, getAnyServiceClass());
 
             DeassociationPatch deassociationPatch = new DeassociationPatch.Builder().key(key).
                     action(ResourceDeassociationAction.DEPROVISION).
@@ -132,7 +113,7 @@ public abstract class AbstractAnyRestClient<TO extends AnyTO, P extends AnyPatch
     public BulkActionResult provision(final String etag, final String key, final List<StatusBean> statuses) {
         BulkActionResult result;
         synchronized (this) {
-            AnyService<?, ?> service = getService(etag, getAnyServiceClass());
+            AnyService<?> service = getService(etag, getAnyServiceClass());
 
             StatusPatch statusPatch = StatusUtils.buildStatusPatch(statuses);
 
@@ -151,7 +132,7 @@ public abstract class AbstractAnyRestClient<TO extends AnyTO, P extends AnyPatch
     public BulkActionResult unassign(final String etag, final String key, final List<StatusBean> statuses) {
         BulkActionResult result;
         synchronized (this) {
-            AnyService<?, ?> service = getService(etag, getAnyServiceClass());
+            AnyService<?> service = getService(etag, getAnyServiceClass());
 
             DeassociationPatch deassociationPatch = new DeassociationPatch.Builder().key(key).
                     action(ResourceDeassociationAction.UNASSIGN).
@@ -167,7 +148,7 @@ public abstract class AbstractAnyRestClient<TO extends AnyTO, P extends AnyPatch
     public BulkActionResult assign(final String etag, final String key, final List<StatusBean> statuses) {
         BulkActionResult result;
         synchronized (this) {
-            AnyService<?, ?> service = getService(etag, getAnyServiceClass());
+            AnyService<?> service = getService(etag, getAnyServiceClass());
 
             StatusPatch statusPatch = StatusUtils.buildStatusPatch(statuses);
 

http://git-wip-us.apache.org/repos/asf/syncope/blob/130c4a08/client/console/src/main/java/org/apache/syncope/client/console/rest/AnyObjectRestClient.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/rest/AnyObjectRestClient.java b/client/console/src/main/java/org/apache/syncope/client/console/rest/AnyObjectRestClient.java
index 4e6092c..31cd3a8 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/rest/AnyObjectRestClient.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/rest/AnyObjectRestClient.java
@@ -18,9 +18,14 @@
  */
 package org.apache.syncope.client.console.rest;
 
+import static org.apache.syncope.client.console.rest.BaseRestClient.getService;
+
 import java.util.List;
+import javax.ws.rs.core.GenericType;
+import javax.ws.rs.core.Response;
 import org.apache.syncope.common.lib.patch.AnyObjectPatch;
 import org.apache.syncope.common.lib.to.AnyObjectTO;
+import org.apache.syncope.common.lib.to.ProvisioningResult;
 import org.apache.syncope.common.rest.api.beans.AnyQuery;
 import org.apache.syncope.common.rest.api.service.AnyObjectService;
 import org.apache.syncope.common.rest.api.service.AnyService;
@@ -29,15 +34,32 @@ import org.apache.wicket.extensions.markup.html.repeater.util.SortParam;
 /**
  * Console client for invoking Rest any type class services.
  */
-public class AnyObjectRestClient extends AbstractAnyRestClient<AnyObjectTO, AnyObjectPatch> {
+public class AnyObjectRestClient extends AbstractAnyRestClient<AnyObjectTO> {
 
     private static final long serialVersionUID = -8874495991295283249L;
 
     @Override
-    protected Class<? extends AnyService<AnyObjectTO, AnyObjectPatch>> getAnyServiceClass() {
+    protected Class<? extends AnyService<AnyObjectTO>> getAnyServiceClass() {
         return AnyObjectService.class;
     }
 
+    public ProvisioningResult<AnyObjectTO> create(final AnyObjectTO anyObjectTO) {
+        Response response = getService(AnyObjectService.class).create(anyObjectTO);
+        return response.readEntity(new GenericType<ProvisioningResult<AnyObjectTO>>() {
+        });
+    }
+
+    public ProvisioningResult<AnyObjectTO> update(final String etag, final AnyObjectPatch patch) {
+        ProvisioningResult<AnyObjectTO> result;
+        synchronized (this) {
+            result = getService(etag, AnyObjectService.class).update(patch).
+                    readEntity(new GenericType<ProvisioningResult<AnyObjectTO>>() {
+                    });
+            resetClient(getAnyServiceClass());
+        }
+        return result;
+    }
+
     @Override
     public int searchCount(final String realm, final String fiql, final String type) {
         return getService(AnyObjectService.class).
@@ -52,6 +74,6 @@ public class AnyObjectRestClient extends AbstractAnyRestClient<AnyObjectTO, AnyO
 
         return getService(AnyObjectService.class).search(
                 new AnyQuery.Builder().realm(realm).fiql(fiql).page(page).size(size).
-                orderBy(toOrderBy(sort)).details(false).build()).getResult();
+                        orderBy(toOrderBy(sort)).details(false).build()).getResult();
     }
 }

http://git-wip-us.apache.org/repos/asf/syncope/blob/130c4a08/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 60ec367..c7ff004 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
@@ -20,9 +20,12 @@ package org.apache.syncope.client.console.rest;
 
 import java.util.ArrayList;
 import java.util.List;
+import javax.ws.rs.core.GenericType;
+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.PagedResult;
+import org.apache.syncope.common.lib.to.ProvisioningResult;
 import org.apache.syncope.common.lib.types.BulkMembersActionType;
 import org.apache.syncope.common.rest.api.beans.AnyQuery;
 import org.apache.syncope.common.rest.api.service.AnyService;
@@ -32,15 +35,32 @@ import org.apache.wicket.extensions.markup.html.repeater.util.SortParam;
 /**
  * Console client for invoking Rest Group's services.
  */
-public class GroupRestClient extends AbstractAnyRestClient<GroupTO, GroupPatch> {
+public class GroupRestClient extends AbstractAnyRestClient<GroupTO> {
 
     private static final long serialVersionUID = -8549081557283519638L;
 
     @Override
-    protected Class<? extends AnyService<GroupTO, GroupPatch>> getAnyServiceClass() {
+    protected Class<? extends AnyService<GroupTO>> getAnyServiceClass() {
         return GroupService.class;
     }
 
+    public ProvisioningResult<GroupTO> create(final GroupTO groupTO) {
+        Response response = getService(GroupService.class).create(groupTO);
+        return response.readEntity(new GenericType<ProvisioningResult<GroupTO>>() {
+        });
+    }
+
+    public ProvisioningResult<GroupTO> update(final String etag, final GroupPatch patch) {
+        ProvisioningResult<GroupTO> result;
+        synchronized (this) {
+            result = getService(etag, GroupService.class).update(patch).
+                    readEntity(new GenericType<ProvisioningResult<GroupTO>>() {
+                    });
+            resetClient(getAnyServiceClass());
+        }
+        return result;
+    }
+
     @Override
     public int searchCount(final String realm, final String fiql, final String type) {
         return getService(GroupService.class).

http://git-wip-us.apache.org/repos/asf/syncope/blob/130c4a08/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 68e3a01..b64ff9b 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
@@ -42,12 +42,12 @@ import org.apache.wicket.extensions.markup.html.repeater.util.SortParam;
 /**
  * Console client for invoking rest users services.
  */
-public class UserRestClient extends AbstractAnyRestClient<UserTO, UserPatch> {
+public class UserRestClient extends AbstractAnyRestClient<UserTO> {
 
     private static final long serialVersionUID = -1575748964398293968L;
 
     @Override
-    protected Class<? extends AnyService<UserTO, UserPatch>> getAnyServiceClass() {
+    protected Class<? extends AnyService<UserTO>> getAnyServiceClass() {
         return UserService.class;
     }
 
@@ -57,6 +57,17 @@ public class UserRestClient extends AbstractAnyRestClient<UserTO, UserPatch> {
         });
     }
 
+    public ProvisioningResult<UserTO> update(final String etag, final UserPatch patch) {
+        ProvisioningResult<UserTO> result;
+        synchronized (this) {
+            result = getService(etag, UserService.class).update(patch).
+                    readEntity(new GenericType<ProvisioningResult<UserTO>>() {
+                    });
+            resetClient(getAnyServiceClass());
+        }
+        return result;
+    }
+
     @Override
     public int searchCount(final String realm, final String fiql, final String type) {
         return getService(UserService.class).

http://git-wip-us.apache.org/repos/asf/syncope/blob/130c4a08/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 c5a90e8..104faf6 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
@@ -60,7 +60,7 @@ import org.apache.wicket.model.IModel;
 import org.apache.wicket.model.StringResourceModel;
 
 public class AnyStatusDirectoryPanel
-        extends DirectoryPanel<StatusBean, StatusBean, DirectoryDataProvider<StatusBean>, AbstractAnyRestClient<?, ?>>
+        extends DirectoryPanel<StatusBean, StatusBean, DirectoryDataProvider<StatusBean>, AbstractAnyRestClient<?>>
         implements ModalPanel {
 
     private static final long serialVersionUID = -9148734710505211261L;

http://git-wip-us.apache.org/repos/asf/syncope/blob/130c4a08/client/console/src/main/java/org/apache/syncope/client/console/status/AnyStatusModal.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/status/AnyStatusModal.java b/client/console/src/main/java/org/apache/syncope/client/console/status/AnyStatusModal.java
index 3d069f0..c51981c 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/status/AnyStatusModal.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/status/AnyStatusModal.java
@@ -42,7 +42,7 @@ public class AnyStatusModal<T extends AnyTO> extends StatusModal<T> {
 
     @Override
     protected DirectoryPanel<
-        StatusBean, StatusBean, DirectoryDataProvider<StatusBean>, AbstractAnyRestClient<?, ?>> getStatusDirectoryPanel(
+        StatusBean, StatusBean, DirectoryDataProvider<StatusBean>, AbstractAnyRestClient<?>> getStatusDirectoryPanel(
             final MultilevelPanel mlp,
             final BaseModal<?> baseModal,
             final PageReference pageReference,

http://git-wip-us.apache.org/repos/asf/syncope/blob/130c4a08/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 041305e..1431442 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
@@ -50,7 +50,7 @@ import org.apache.wicket.model.IModel;
 import org.apache.wicket.model.StringResourceModel;
 
 public class ResourceStatusDirectoryPanel
-        extends DirectoryPanel<StatusBean, StatusBean, DirectoryDataProvider<StatusBean>, AbstractAnyRestClient<?, ?>>
+        extends DirectoryPanel<StatusBean, StatusBean, DirectoryDataProvider<StatusBean>, AbstractAnyRestClient<?>>
         implements ModalPanel {
 
     private static final long serialVersionUID = -9148734710505211261L;

http://git-wip-us.apache.org/repos/asf/syncope/blob/130c4a08/client/console/src/main/java/org/apache/syncope/client/console/status/ResourceStatusModal.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/status/ResourceStatusModal.java b/client/console/src/main/java/org/apache/syncope/client/console/status/ResourceStatusModal.java
index 18bdd0f..7e71f3d 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/status/ResourceStatusModal.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/status/ResourceStatusModal.java
@@ -55,6 +55,8 @@ public class ResourceStatusModal extends StatusModal<ResourceTO> {
         List<String> availableAnyTypes = CollectionUtils.collect(
                 resource.getProvisions(), new SerializableTransformer<ProvisionTO, String>() {
 
+            private static final long serialVersionUID = -5381554547270182818L;
+
             @Override
             public String transform(final ProvisionTO provision) {
                 return provision.getAnyType();
@@ -82,7 +84,7 @@ public class ResourceStatusModal extends StatusModal<ResourceTO> {
 
     @Override
     protected DirectoryPanel<
-        StatusBean, StatusBean, DirectoryDataProvider<StatusBean>, AbstractAnyRestClient<?, ?>> getStatusDirectoryPanel(
+        StatusBean, StatusBean, DirectoryDataProvider<StatusBean>, AbstractAnyRestClient<?>> getStatusDirectoryPanel(
             final MultilevelPanel mlp,
             final BaseModal<?> baseModal,
             final PageReference pageReference,

http://git-wip-us.apache.org/repos/asf/syncope/blob/130c4a08/client/console/src/main/java/org/apache/syncope/client/console/status/StatusModal.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/status/StatusModal.java b/client/console/src/main/java/org/apache/syncope/client/console/status/StatusModal.java
index 1059919..baba5a5 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/status/StatusModal.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/status/StatusModal.java
@@ -52,7 +52,7 @@ public abstract class StatusModal<T extends Serializable> extends Panel implemen
     }
 
     protected abstract DirectoryPanel<
-        StatusBean, StatusBean, DirectoryDataProvider<StatusBean>, AbstractAnyRestClient<?, ?>> getStatusDirectoryPanel(
+        StatusBean, StatusBean, DirectoryDataProvider<StatusBean>, AbstractAnyRestClient<?>> getStatusDirectoryPanel(
             final MultilevelPanel mlp,
             final BaseModal<?> baseModal,
             final PageReference pageReference,

http://git-wip-us.apache.org/repos/asf/syncope/blob/130c4a08/common/rest-api/src/main/java/org/apache/syncope/common/rest/api/service/AccessTokenService.java
----------------------------------------------------------------------
diff --git a/common/rest-api/src/main/java/org/apache/syncope/common/rest/api/service/AccessTokenService.java b/common/rest-api/src/main/java/org/apache/syncope/common/rest/api/service/AccessTokenService.java
index e9f5ff3..c66b7f3 100644
--- a/common/rest-api/src/main/java/org/apache/syncope/common/rest/api/service/AccessTokenService.java
+++ b/common/rest-api/src/main/java/org/apache/syncope/common/rest/api/service/AccessTokenService.java
@@ -57,10 +57,12 @@ public interface AccessTokenService extends JAXRSService {
 
     /**
      * Invalidates the access token of the requesting user.
+     *
+     * @return an empty response if operation was successful
      */
     @POST
     @Path("logout")
-    void logout();
+    Response logout();
 
     /**
      * Returns a paged list of existing access tokens matching the given query.
@@ -75,8 +77,9 @@ public interface AccessTokenService extends JAXRSService {
      * Invalidates the access token matching the provided key.
      *
      * @param key access token key
+     * @return an empty response if operation was successful
      */
     @DELETE
     @Path("{key}")
-    void delete(@PathParam("key") String key);
+    Response delete(@PathParam("key") String key);
 }

http://git-wip-us.apache.org/repos/asf/syncope/blob/130c4a08/common/rest-api/src/main/java/org/apache/syncope/common/rest/api/service/AnyObjectService.java
----------------------------------------------------------------------
diff --git a/common/rest-api/src/main/java/org/apache/syncope/common/rest/api/service/AnyObjectService.java b/common/rest-api/src/main/java/org/apache/syncope/common/rest/api/service/AnyObjectService.java
index 4127345..144fcf2 100644
--- a/common/rest-api/src/main/java/org/apache/syncope/common/rest/api/service/AnyObjectService.java
+++ b/common/rest-api/src/main/java/org/apache/syncope/common/rest/api/service/AnyObjectService.java
@@ -18,7 +18,15 @@
  */
 package org.apache.syncope.common.rest.api.service;
 
+import javax.validation.constraints.NotNull;
+import javax.ws.rs.Consumes;
+import javax.ws.rs.POST;
+import javax.ws.rs.PUT;
 import javax.ws.rs.Path;
+import javax.ws.rs.Produces;
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.Response;
+import org.apache.cxf.jaxrs.ext.PATCH;
 import org.apache.syncope.common.lib.patch.AnyObjectPatch;
 import org.apache.syncope.common.lib.to.AnyObjectTO;
 
@@ -26,5 +34,43 @@ import org.apache.syncope.common.lib.to.AnyObjectTO;
  * REST operations for anyObjects.
  */
 @Path("anyObjects")
-public interface AnyObjectService extends AnyService<AnyObjectTO, AnyObjectPatch> {
+public interface AnyObjectService extends AnyService<AnyObjectTO> {
+
+    /**
+     * Creates a new any object.
+     *
+     * @param anyObjectTO any object to be created
+     * @return Response object featuring Location header of created any object as well as the any
+     * object itself enriched with propagation status information - ProvisioningResult as Entity
+     */
+    @POST
+    @Produces({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML })
+    @Consumes({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML })
+    Response create(@NotNull AnyObjectTO anyObjectTO);
+
+    /**
+     * Updates any object matching the provided key.
+     *
+     * @param anyObjectPatch modification to be applied to any object matching the provided key
+     * @return Response object featuring the updated any object enriched with propagation status information
+     * - ProvisioningResult as Entity
+     */
+    @PATCH
+    @Path("{key}")
+    @Produces({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML })
+    @Consumes({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML })
+    Response update(@NotNull AnyObjectPatch anyObjectPatch);
+
+    /**
+     * Updates any object matching the provided key.
+     *
+     * @param anyObjectTO complete update
+     * @return Response object featuring the updated any object enriched with propagation status information
+     * - ProvisioningResult as Entity
+     */
+    @PUT
+    @Path("{key}")
+    @Produces({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML })
+    @Consumes({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML })
+    Response update(@NotNull AnyObjectTO anyObjectTO);
 }

http://git-wip-us.apache.org/repos/asf/syncope/blob/130c4a08/common/rest-api/src/main/java/org/apache/syncope/common/rest/api/service/AnyService.java
----------------------------------------------------------------------
diff --git a/common/rest-api/src/main/java/org/apache/syncope/common/rest/api/service/AnyService.java b/common/rest-api/src/main/java/org/apache/syncope/common/rest/api/service/AnyService.java
index ac2fc20..a72cc16 100644
--- a/common/rest-api/src/main/java/org/apache/syncope/common/rest/api/service/AnyService.java
+++ b/common/rest-api/src/main/java/org/apache/syncope/common/rest/api/service/AnyService.java
@@ -31,8 +31,6 @@ import javax.ws.rs.PathParam;
 import javax.ws.rs.Produces;
 import javax.ws.rs.core.MediaType;
 import javax.ws.rs.core.Response;
-import org.apache.cxf.jaxrs.ext.PATCH;
-import org.apache.syncope.common.lib.patch.AnyPatch;
 import org.apache.syncope.common.lib.patch.AssociationPatch;
 import org.apache.syncope.common.lib.patch.DeassociationPatch;
 import org.apache.syncope.common.lib.to.AnyTO;
@@ -42,7 +40,7 @@ import org.apache.syncope.common.lib.to.PagedResult;
 import org.apache.syncope.common.lib.types.SchemaType;
 import org.apache.syncope.common.rest.api.beans.AnyQuery;
 
-public interface AnyService<TO extends AnyTO, P extends AnyPatch> extends JAXRSService {
+public interface AnyService<TO extends AnyTO> extends JAXRSService {
 
     /**
      * Reads the list of attributes owned by the given any object for the given schema type.
@@ -103,31 +101,6 @@ public interface AnyService<TO extends AnyTO, P extends AnyPatch> extends JAXRSS
     PagedResult<TO> search(@BeanParam AnyQuery anyQuery);
 
     /**
-     * Creates a new any object.
-     *
-     * @param anyTO any object to be created
-     * @return Response object featuring Location header of created any object as well as the any
-     * object itself enriched with propagation status information - ProvisioningResult as Entity
-     */
-    @POST
-    @Produces({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML })
-    @Consumes({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML })
-    Response create(@NotNull TO anyTO);
-
-    /**
-     * Updates any object matching the provided key.
-     *
-     * @param anyPatch modification to be applied to any object matching the provided key
-     * @return Response object featuring the updated any object enriched with propagation status information
-     * - ProvisioningResult as Entity
-     */
-    @PATCH
-    @Path("{key}")
-    @Produces({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML })
-    @Consumes({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML })
-    Response update(@NotNull P anyPatch);
-
-    /**
      * Adds or replaces the attribute, owned by the given any object, for the given schema type and schema.
      *
      * @param key any object key or name
@@ -145,30 +118,18 @@ public interface AnyService<TO extends AnyTO, P extends AnyPatch> extends JAXRSS
             @NotNull AttrTO attrTO);
 
     /**
-     * Updates any object matching the provided key.
-     *
-     * @param anyTO complete update
-     * @return Response object featuring the updated any object enriched with propagation status information
-     * - ProvisioningResult as Entity
-     */
-    @PUT
-    @Path("{key}")
-    @Produces({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML })
-    @Consumes({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML })
-    Response update(@NotNull TO anyTO);
-
-    /**
      * Deletes the attribute, owned by the given any object, for the given schema type and schema.
      *
      * @param key any object key or name
      * @param schemaType schema type
      * @param schema schema
+     * @return an empty response if operation was successful
      */
     @DELETE
     @Path("{key}/{schemaType}/{schema}")
     @Produces({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML })
     @Consumes({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML })
-    void delete(
+    Response delete(
             @NotNull @PathParam("key") String key,
             @NotNull @PathParam("schemaType") SchemaType schemaType,
             @NotNull @PathParam("schema") String schema);

http://git-wip-us.apache.org/repos/asf/syncope/blob/130c4a08/common/rest-api/src/main/java/org/apache/syncope/common/rest/api/service/AnyTypeClassService.java
----------------------------------------------------------------------
diff --git a/common/rest-api/src/main/java/org/apache/syncope/common/rest/api/service/AnyTypeClassService.java b/common/rest-api/src/main/java/org/apache/syncope/common/rest/api/service/AnyTypeClassService.java
index 3a91e4a..74846a1 100644
--- a/common/rest-api/src/main/java/org/apache/syncope/common/rest/api/service/AnyTypeClassService.java
+++ b/common/rest-api/src/main/java/org/apache/syncope/common/rest/api/service/AnyTypeClassService.java
@@ -72,18 +72,20 @@ public interface AnyTypeClassService extends JAXRSService {
      * Updates the anyTypeClass matching the provided key.
      *
      * @param anyTypeClassTO anyTypeClass to be stored
+     * @return an empty response if operation was successful
      */
     @PUT
     @Path("{key}")
     @Consumes({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML })
-    void update(@NotNull AnyTypeClassTO anyTypeClassTO);
+    Response update(@NotNull AnyTypeClassTO anyTypeClassTO);
 
     /**
      * Deletes the anyTypeClass matching the provided key.
      *
      * @param key anyTypeClass key to be deleted
+     * @return an empty response if operation was successful
      */
     @DELETE
     @Path("{key}")
-    void delete(@NotNull @PathParam("key") String key);
+    Response delete(@NotNull @PathParam("key") String key);
 }

http://git-wip-us.apache.org/repos/asf/syncope/blob/130c4a08/common/rest-api/src/main/java/org/apache/syncope/common/rest/api/service/AnyTypeService.java
----------------------------------------------------------------------
diff --git a/common/rest-api/src/main/java/org/apache/syncope/common/rest/api/service/AnyTypeService.java b/common/rest-api/src/main/java/org/apache/syncope/common/rest/api/service/AnyTypeService.java
index aa639e8..667009c 100644
--- a/common/rest-api/src/main/java/org/apache/syncope/common/rest/api/service/AnyTypeService.java
+++ b/common/rest-api/src/main/java/org/apache/syncope/common/rest/api/service/AnyTypeService.java
@@ -72,18 +72,20 @@ public interface AnyTypeService extends JAXRSService {
      * Updates the anyType matching the provided key.
      *
      * @param anyTypeTO anyType to be stored
+     * @return an empty response if operation was successful
      */
     @PUT
     @Path("{key}")
     @Consumes({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML })
-    void update(@NotNull AnyTypeTO anyTypeTO);
+    Response update(@NotNull AnyTypeTO anyTypeTO);
 
     /**
      * Deletes the anyType matching the provided key.
      *
      * @param key anyType key to be deleted
+     * @return an empty response if operation was successful
      */
     @DELETE
     @Path("{key}")
-    void delete(@NotNull @PathParam("key") String key);
+    Response delete(@NotNull @PathParam("key") String key);
 }

http://git-wip-us.apache.org/repos/asf/syncope/blob/130c4a08/common/rest-api/src/main/java/org/apache/syncope/common/rest/api/service/ConfigurationService.java
----------------------------------------------------------------------
diff --git a/common/rest-api/src/main/java/org/apache/syncope/common/rest/api/service/ConfigurationService.java b/common/rest-api/src/main/java/org/apache/syncope/common/rest/api/service/ConfigurationService.java
index 41466e2..add8bd2 100644
--- a/common/rest-api/src/main/java/org/apache/syncope/common/rest/api/service/ConfigurationService.java
+++ b/common/rest-api/src/main/java/org/apache/syncope/common/rest/api/service/ConfigurationService.java
@@ -70,19 +70,21 @@ public interface ConfigurationService extends JAXRSService {
      * Creates / updates the configuration parameter with the given schema.
      *
      * @param value parameter value
+     * @return an empty response if operation was successful
      */
     @PUT
     @Path("{schema}")
     @Consumes({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML })
-    void set(@NotNull AttrTO value);
+    Response set(@NotNull AttrTO value);
 
     /**
      * Deletes the configuration parameter with matching schema.
      *
      * @param schema configuration parameter schema
+     * @return an empty response if operation was successful
      */
     @DELETE
     @Path("{schema}")
     @Consumes({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML })
-    void delete(@NotNull @PathParam("schema") String schema);
+    Response delete(@NotNull @PathParam("schema") String schema);
 }

http://git-wip-us.apache.org/repos/asf/syncope/blob/130c4a08/common/rest-api/src/main/java/org/apache/syncope/common/rest/api/service/ConnectorHistoryService.java
----------------------------------------------------------------------
diff --git a/common/rest-api/src/main/java/org/apache/syncope/common/rest/api/service/ConnectorHistoryService.java b/common/rest-api/src/main/java/org/apache/syncope/common/rest/api/service/ConnectorHistoryService.java
index 1825d08..f7f0466 100644
--- a/common/rest-api/src/main/java/org/apache/syncope/common/rest/api/service/ConnectorHistoryService.java
+++ b/common/rest-api/src/main/java/org/apache/syncope/common/rest/api/service/ConnectorHistoryService.java
@@ -27,6 +27,7 @@ import javax.ws.rs.Path;
 import javax.ws.rs.PathParam;
 import javax.ws.rs.Produces;
 import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.Response;
 import org.apache.syncope.common.lib.to.ConnInstanceHistoryConfTO;
 
 /**
@@ -50,17 +51,19 @@ public interface ConnectorHistoryService extends JAXRSService {
      * Restores the connector configuration history instance matching the provided key.
      *
      * @param key connector configuration history instance key to be restored
+     * @return an empty response if operation was successful
      */
     @POST
     @Path("{key}")
-    void restore(@NotNull @PathParam("key") String key);
+    Response restore(@NotNull @PathParam("key") String key);
 
     /**
      * Deletes the connector configuration history instance matching the provided key.
      *
      * @param key connector configuration history instance key to be deleted
+     * @return an empty response if operation was successful
      */
     @DELETE
     @Path("{key}")
-    void delete(@NotNull @PathParam("key") String key);
+    Response delete(@NotNull @PathParam("key") String key);
 }

http://git-wip-us.apache.org/repos/asf/syncope/blob/130c4a08/common/rest-api/src/main/java/org/apache/syncope/common/rest/api/service/ConnectorService.java
----------------------------------------------------------------------
diff --git a/common/rest-api/src/main/java/org/apache/syncope/common/rest/api/service/ConnectorService.java b/common/rest-api/src/main/java/org/apache/syncope/common/rest/api/service/ConnectorService.java
index 4c63bd2..4a1adfe 100644
--- a/common/rest-api/src/main/java/org/apache/syncope/common/rest/api/service/ConnectorService.java
+++ b/common/rest-api/src/main/java/org/apache/syncope/common/rest/api/service/ConnectorService.java
@@ -123,35 +123,40 @@ public interface ConnectorService extends JAXRSService {
      * Updates the connector instance matching the provided key.
      *
      * @param connInstanceTO connector instance to be stored
+     * @return an empty response if operation was successful
      */
     @PUT
     @Path("{key}")
     @Consumes({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML })
-    void update(@NotNull ConnInstanceTO connInstanceTO);
+    Response update(@NotNull ConnInstanceTO connInstanceTO);
 
     /**
      * Deletes the connector instance matching the provided key.
      *
      * @param key connector instance key to be deleted
+     * @return an empty response if operation was successful
      */
     @DELETE
     @Path("{key}")
-    void delete(@NotNull @PathParam("key") String key);
+    Response delete(@NotNull @PathParam("key") String key);
 
     /**
      * Checks whether the connection to resource could be established.
      *
      * @param connInstanceTO connector instance to be used for connection check
+     * @return an empty response if operation was successful
      */
     @POST
     @Path("check")
     @Consumes({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML })
-    void check(@NotNull ConnInstanceTO connInstanceTO);
+    Response check(@NotNull ConnInstanceTO connInstanceTO);
 
     /**
      * Reload all connector bundles and instances.
+     *
+     * @return an empty response if operation was successful
      */
     @POST
     @Path("reload")
-    void reload();
+    Response reload();
 }

http://git-wip-us.apache.org/repos/asf/syncope/blob/130c4a08/common/rest-api/src/main/java/org/apache/syncope/common/rest/api/service/DomainService.java
----------------------------------------------------------------------
diff --git a/common/rest-api/src/main/java/org/apache/syncope/common/rest/api/service/DomainService.java b/common/rest-api/src/main/java/org/apache/syncope/common/rest/api/service/DomainService.java
index 3443ff6..2e343b9 100644
--- a/common/rest-api/src/main/java/org/apache/syncope/common/rest/api/service/DomainService.java
+++ b/common/rest-api/src/main/java/org/apache/syncope/common/rest/api/service/DomainService.java
@@ -72,18 +72,20 @@ public interface DomainService extends JAXRSService {
      * Updates the domain matching the provided key.
      *
      * @param domainTO domain to be stored
+     * @return an empty response if operation was successful
      */
     @PUT
     @Path("{key}")
     @Consumes({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML })
-    void update(@NotNull DomainTO domainTO);
+    Response update(@NotNull DomainTO domainTO);
 
     /**
      * Deletes the domain matching the provided key.
      *
      * @param key domain key to be deleted
+     * @return an empty response if operation was successful
      */
     @DELETE
     @Path("{key}")
-    void delete(@NotNull @PathParam("key") String key);
+    Response delete(@NotNull @PathParam("key") String key);
 }

http://git-wip-us.apache.org/repos/asf/syncope/blob/130c4a08/common/rest-api/src/main/java/org/apache/syncope/common/rest/api/service/DynRealmService.java
----------------------------------------------------------------------
diff --git a/common/rest-api/src/main/java/org/apache/syncope/common/rest/api/service/DynRealmService.java b/common/rest-api/src/main/java/org/apache/syncope/common/rest/api/service/DynRealmService.java
index dc9836d..1ebea81 100644
--- a/common/rest-api/src/main/java/org/apache/syncope/common/rest/api/service/DynRealmService.java
+++ b/common/rest-api/src/main/java/org/apache/syncope/common/rest/api/service/DynRealmService.java
@@ -72,19 +72,21 @@ public interface DynRealmService extends JAXRSService {
      * Updates the dynamic realm matching the provided key.
      *
      * @param dynDynRealmTO dynamic realm to be stored
+     * @return an empty response if operation was successful
      */
     @PUT
     @Path("{key}")
     @Consumes({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML })
-    void update(@NotNull DynRealmTO dynDynRealmTO);
+    Response update(@NotNull DynRealmTO dynDynRealmTO);
 
     /**
      * Deletes the dynamic realm matching the provided key.
      *
      * @param key dynamic realm key to be deleted
+     * @return an empty response if operation was successful
      */
     @DELETE
     @Path("{key}")
-    void delete(@NotNull @PathParam("key") String key);
+    Response delete(@NotNull @PathParam("key") String key);
 
 }

http://git-wip-us.apache.org/repos/asf/syncope/blob/130c4a08/common/rest-api/src/main/java/org/apache/syncope/common/rest/api/service/ExecutableService.java
----------------------------------------------------------------------
diff --git a/common/rest-api/src/main/java/org/apache/syncope/common/rest/api/service/ExecutableService.java b/common/rest-api/src/main/java/org/apache/syncope/common/rest/api/service/ExecutableService.java
index b97f252..11fd1dc 100644
--- a/common/rest-api/src/main/java/org/apache/syncope/common/rest/api/service/ExecutableService.java
+++ b/common/rest-api/src/main/java/org/apache/syncope/common/rest/api/service/ExecutableService.java
@@ -31,6 +31,7 @@ import javax.ws.rs.PathParam;
 import javax.ws.rs.Produces;
 import javax.ws.rs.QueryParam;
 import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.Response;
 import org.apache.syncope.common.lib.to.BulkActionResult;
 import org.apache.syncope.common.lib.to.ExecTO;
 import org.apache.syncope.common.lib.to.JobTO;
@@ -68,10 +69,11 @@ public interface ExecutableService extends JAXRSService {
      * Deletes the executable execution matching the provided key.
      *
      * @param executionKey key of executable execution to be deleted
+     * @return an empty response if operation was successful
      */
     @DELETE
     @Path("executions/{executionKey}")
-    void deleteExecution(@NotNull @PathParam("executionKey") String executionKey);
+    Response deleteExecution(@NotNull @PathParam("executionKey") String executionKey);
 
     /**
      * Deletes the executions belonging matching the given query.
@@ -110,8 +112,9 @@ public interface ExecutableService extends JAXRSService {
      *
      * @param key executable key
      * @param action action to execute
+     * @return an empty response if operation was successful
      */
     @POST
     @Path("jobs/{key}")
-    void actionJob(@NotNull @PathParam("key") String key, @QueryParam("action") JobAction action);
+    Response actionJob(@NotNull @PathParam("key") String key, @QueryParam("action") JobAction action);
 }

http://git-wip-us.apache.org/repos/asf/syncope/blob/130c4a08/common/rest-api/src/main/java/org/apache/syncope/common/rest/api/service/GroupService.java
----------------------------------------------------------------------
diff --git a/common/rest-api/src/main/java/org/apache/syncope/common/rest/api/service/GroupService.java b/common/rest-api/src/main/java/org/apache/syncope/common/rest/api/service/GroupService.java
index 549b41a..c060bdb 100644
--- a/common/rest-api/src/main/java/org/apache/syncope/common/rest/api/service/GroupService.java
+++ b/common/rest-api/src/main/java/org/apache/syncope/common/rest/api/service/GroupService.java
@@ -20,12 +20,16 @@ package org.apache.syncope.common.rest.api.service;
 
 import java.util.List;
 import javax.validation.constraints.NotNull;
+import javax.ws.rs.Consumes;
 import javax.ws.rs.GET;
 import javax.ws.rs.POST;
+import javax.ws.rs.PUT;
 import javax.ws.rs.Path;
 import javax.ws.rs.PathParam;
 import javax.ws.rs.Produces;
 import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.Response;
+import org.apache.cxf.jaxrs.ext.PATCH;
 import org.apache.syncope.common.lib.patch.GroupPatch;
 import org.apache.syncope.common.lib.to.ExecTO;
 import org.apache.syncope.common.lib.to.GroupTO;
@@ -35,10 +39,48 @@ import org.apache.syncope.common.lib.types.BulkMembersActionType;
  * REST operations for groups.
  */
 @Path("groups")
-public interface GroupService extends AnyService<GroupTO, GroupPatch> {
+public interface GroupService extends AnyService<GroupTO> {
 
     /**
-     * This method is similar to read() but uses different authentication handling to ensure that a user
+     * Creates a new group.
+     *
+     * @param groupTO group to be created
+     * @return Response object featuring Location header of created group as well as the any
+     * object itself enriched with propagation status information - ProvisioningResult as Entity
+     */
+    @POST
+    @Produces({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML })
+    @Consumes({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML })
+    Response create(@NotNull GroupTO groupTO);
+
+    /**
+     * Updates group matching the provided key.
+     *
+     * @param groupPatch modification to be applied to group matching the provided key
+     * @return Response object featuring the updated group enriched with propagation status information
+     * - ProvisioningResult as Entity
+     */
+    @PATCH
+    @Path("{key}")
+    @Produces({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML })
+    @Consumes({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML })
+    Response update(@NotNull GroupPatch groupPatch);
+
+    /**
+     * Updates group matching the provided key.
+     *
+     * @param groupTO complete update
+     * @return Response object featuring the updated group enriched with propagation status information
+     * - ProvisioningResult as Entity
+     */
+    @PUT
+    @Path("{key}")
+    @Produces({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML })
+    @Consumes({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML })
+    Response update(@NotNull GroupTO groupTO);
+
+    /**
+     * This method is similar to read() but uses different authentication handling to ensure that a group
      * can read his own groups.
      *
      * @return own groups

http://git-wip-us.apache.org/repos/asf/syncope/blob/130c4a08/common/rest-api/src/main/java/org/apache/syncope/common/rest/api/service/LoggerService.java
----------------------------------------------------------------------
diff --git a/common/rest-api/src/main/java/org/apache/syncope/common/rest/api/service/LoggerService.java b/common/rest-api/src/main/java/org/apache/syncope/common/rest/api/service/LoggerService.java
index 4b9aa83..b1d889c 100644
--- a/common/rest-api/src/main/java/org/apache/syncope/common/rest/api/service/LoggerService.java
+++ b/common/rest-api/src/main/java/org/apache/syncope/common/rest/api/service/LoggerService.java
@@ -28,6 +28,7 @@ import javax.ws.rs.Path;
 import javax.ws.rs.PathParam;
 import javax.ws.rs.Produces;
 import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.Response;
 import org.apache.syncope.common.lib.log.EventCategoryTO;
 import org.apache.syncope.common.lib.log.LogAppender;
 import org.apache.syncope.common.lib.log.LogStatementTO;
@@ -99,20 +100,22 @@ public interface LoggerService extends JAXRSService {
      *
      * @param type LoggerType to be selected
      * @param logger Logger to be created or updated
+     * @return an empty response if operation was successful
      */
     @PUT
     @Path("{type}/{key}")
     @Consumes({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML })
-    void update(@NotNull @PathParam("type") LoggerType type, @NotNull LoggerTO logger);
+    Response update(@NotNull @PathParam("type") LoggerType type, @NotNull LoggerTO logger);
 
     /**
      * Deletes the logger with matching name.
      *
      * @param type LoggerType to be selected
      * @param name Logger name to be deleted
+     * @return an empty response if operation was successful
      */
     @DELETE
     @Path("{type}/{name}")
-    void delete(@NotNull @PathParam("type") LoggerType type, @NotNull @PathParam("name") String name);
+    Response delete(@NotNull @PathParam("type") LoggerType type, @NotNull @PathParam("name") String name);
 
 }

http://git-wip-us.apache.org/repos/asf/syncope/blob/130c4a08/common/rest-api/src/main/java/org/apache/syncope/common/rest/api/service/MailTemplateService.java
----------------------------------------------------------------------
diff --git a/common/rest-api/src/main/java/org/apache/syncope/common/rest/api/service/MailTemplateService.java b/common/rest-api/src/main/java/org/apache/syncope/common/rest/api/service/MailTemplateService.java
index 15f7703..1cd8e73 100644
--- a/common/rest-api/src/main/java/org/apache/syncope/common/rest/api/service/MailTemplateService.java
+++ b/common/rest-api/src/main/java/org/apache/syncope/common/rest/api/service/MailTemplateService.java
@@ -74,10 +74,11 @@ public interface MailTemplateService extends JAXRSService {
      * Deletes the mail template matching the given key.
      *
      * @param key key for mail template to be deleted
+     * @return an empty response if operation was successful
      */
     @DELETE
     @Path("{key}")
-    void delete(@NotNull @PathParam("key") String key);
+    Response delete(@NotNull @PathParam("key") String key);
 
     /**
      * Gets the template for the given key and format, if available.
@@ -98,10 +99,11 @@ public interface MailTemplateService extends JAXRSService {
      * @param key mail template
      * @param format template format
      * @param templateIn template to be set
+     * @return an empty response if operation was successful
      */
     @PUT
     @Path("{key}/{format}")
-    void setFormat(
+    Response setFormat(
             @NotNull @PathParam("key") String key,
             @NotNull @PathParam("format") MailTemplateFormat format,
             InputStream templateIn);
@@ -111,10 +113,11 @@ public interface MailTemplateService extends JAXRSService {
      *
      * @param key mail template
      * @param format template format
+     * @return an empty response if operation was successful
      */
     @DELETE
     @Path("{key}/{format}")
-    void removeFormat(
+    Response removeFormat(
             @NotNull @PathParam("key") String key,
             @NotNull @PathParam("format") MailTemplateFormat format);
 

http://git-wip-us.apache.org/repos/asf/syncope/blob/130c4a08/common/rest-api/src/main/java/org/apache/syncope/common/rest/api/service/NotificationService.java
----------------------------------------------------------------------
diff --git a/common/rest-api/src/main/java/org/apache/syncope/common/rest/api/service/NotificationService.java b/common/rest-api/src/main/java/org/apache/syncope/common/rest/api/service/NotificationService.java
index 3baf310..458ae63 100644
--- a/common/rest-api/src/main/java/org/apache/syncope/common/rest/api/service/NotificationService.java
+++ b/common/rest-api/src/main/java/org/apache/syncope/common/rest/api/service/NotificationService.java
@@ -75,20 +75,22 @@ public interface NotificationService extends JAXRSService {
      * Updates the notification matching the given key.
      *
      * @param notificationTO notification to be stored
+     * @return an empty response if operation was successful
      */
     @PUT
     @Path("{key}")
     @Consumes({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML })
-    void update(@NotNull NotificationTO notificationTO);
+    Response update(@NotNull NotificationTO notificationTO);
 
     /**
      * Deletes the notification matching the given key.
      *
      * @param key key for notification to be deleted
+     * @return an empty response if operation was successful
      */
     @DELETE
     @Path("{key}")
-    void delete(@NotNull @PathParam("key") String key);
+    Response delete(@NotNull @PathParam("key") String key);
 
     /**
      * Returns details about notification job.
@@ -104,8 +106,9 @@ public interface NotificationService extends JAXRSService {
      * Executes an action on the notification job.
      *
      * @param action action to execute
+     * @return an empty response if operation was successful
      */
     @POST
     @Path("job")
-    void actionJob(@QueryParam("action") JobAction action);
+    Response actionJob(@QueryParam("action") JobAction action);
 }

http://git-wip-us.apache.org/repos/asf/syncope/blob/130c4a08/common/rest-api/src/main/java/org/apache/syncope/common/rest/api/service/PolicyService.java
----------------------------------------------------------------------
diff --git a/common/rest-api/src/main/java/org/apache/syncope/common/rest/api/service/PolicyService.java b/common/rest-api/src/main/java/org/apache/syncope/common/rest/api/service/PolicyService.java
index 2177d51..7c62196 100644
--- a/common/rest-api/src/main/java/org/apache/syncope/common/rest/api/service/PolicyService.java
+++ b/common/rest-api/src/main/java/org/apache/syncope/common/rest/api/service/PolicyService.java
@@ -77,19 +77,21 @@ public interface PolicyService extends JAXRSService {
      * Updates policy matching the given key.
      *
      * @param policyTO Policy to replace existing policy
+     * @return an empty response if operation was successful
      */
     @PUT
     @Path("{key}")
     @Consumes({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML })
-    void update(@NotNull AbstractPolicyTO policyTO);
+    Response update(@NotNull AbstractPolicyTO policyTO);
 
     /**
      * Delete policy matching the given key.
      *
      * @param key key of policy to be deleted
+     * @return an empty response if operation was successful
      */
     @DELETE
     @Path("{key}")
-    void delete(@NotNull @PathParam("key") String key);
+    Response delete(@NotNull @PathParam("key") String key);
 
 }

http://git-wip-us.apache.org/repos/asf/syncope/blob/130c4a08/common/rest-api/src/main/java/org/apache/syncope/common/rest/api/service/RelationshipTypeService.java
----------------------------------------------------------------------
diff --git a/common/rest-api/src/main/java/org/apache/syncope/common/rest/api/service/RelationshipTypeService.java b/common/rest-api/src/main/java/org/apache/syncope/common/rest/api/service/RelationshipTypeService.java
index 4b3c640..dfd516f 100644
--- a/common/rest-api/src/main/java/org/apache/syncope/common/rest/api/service/RelationshipTypeService.java
+++ b/common/rest-api/src/main/java/org/apache/syncope/common/rest/api/service/RelationshipTypeService.java
@@ -72,18 +72,20 @@ public interface RelationshipTypeService extends JAXRSService {
      * Updates the relationshipType matching the provided key.
      *
      * @param relationshipTypeTO relationshipType to be stored
+     * @return an empty response if operation was successful
      */
     @PUT
     @Path("{key}")
     @Consumes({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML })
-    void update(@NotNull RelationshipTypeTO relationshipTypeTO);
+    Response update(@NotNull RelationshipTypeTO relationshipTypeTO);
 
     /**
      * Deletes the relationshipType matching the provided key.
      *
      * @param key relationshipType key to be deleted
+     * @return an empty response if operation was successful
      */
     @DELETE
     @Path("{key}")
-    void delete(@NotNull @PathParam("key") String key);
+    Response delete(@NotNull @PathParam("key") String key);
 }

http://git-wip-us.apache.org/repos/asf/syncope/blob/130c4a08/common/rest-api/src/main/java/org/apache/syncope/common/rest/api/service/ReportService.java
----------------------------------------------------------------------
diff --git a/common/rest-api/src/main/java/org/apache/syncope/common/rest/api/service/ReportService.java b/common/rest-api/src/main/java/org/apache/syncope/common/rest/api/service/ReportService.java
index cf79682..4db9321 100644
--- a/common/rest-api/src/main/java/org/apache/syncope/common/rest/api/service/ReportService.java
+++ b/common/rest-api/src/main/java/org/apache/syncope/common/rest/api/service/ReportService.java
@@ -74,20 +74,22 @@ public interface ReportService extends ExecutableService {
      * Updates report with matching key.
      *
      * @param reportTO report to be stored
+     * @return an empty response if operation was successful
      */
     @PUT
     @Path("{key}")
     @Consumes({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML })
-    void update(@NotNull ReportTO reportTO);
+    Response update(@NotNull ReportTO reportTO);
 
     /**
      * Deletes report with matching key.
      *
      * @param key Deletes report with matching key
+     * @return an empty response if operation was successful
      */
     @DELETE
     @Path("{key}")
-    void delete(@NotNull @PathParam("key") String key);
+    Response delete(@NotNull @PathParam("key") String key);
 
     /**
      * Exports the report execution with matching key in the requested format.

http://git-wip-us.apache.org/repos/asf/syncope/blob/130c4a08/common/rest-api/src/main/java/org/apache/syncope/common/rest/api/service/ReportTemplateService.java
----------------------------------------------------------------------
diff --git a/common/rest-api/src/main/java/org/apache/syncope/common/rest/api/service/ReportTemplateService.java b/common/rest-api/src/main/java/org/apache/syncope/common/rest/api/service/ReportTemplateService.java
index 12c197a..6bfb151 100644
--- a/common/rest-api/src/main/java/org/apache/syncope/common/rest/api/service/ReportTemplateService.java
+++ b/common/rest-api/src/main/java/org/apache/syncope/common/rest/api/service/ReportTemplateService.java
@@ -74,10 +74,11 @@ public interface ReportTemplateService extends JAXRSService {
      * Deletes the report template matching the given key.
      *
      * @param key key for report template to be deleted
+     * @return an empty response if operation was successful
      */
     @DELETE
     @Path("{key}")
-    void delete(@NotNull @PathParam("key") String key);
+    Response delete(@NotNull @PathParam("key") String key);
 
     /**
      * Gets the template for the given key and format, if available.
@@ -85,6 +86,7 @@ public interface ReportTemplateService extends JAXRSService {
      * @param key report template
      * @param format template format
      * @return report template with matching key and format, if available
+     * @return an empty response if operation was successful
      */
     @GET
     @Path("{key}/{format}")
@@ -98,10 +100,11 @@ public interface ReportTemplateService extends JAXRSService {
      * @param key report template
      * @param format template format
      * @param templateIn template to be set
+     * @return an empty response if operation was successful
      */
     @PUT
     @Path("{key}/{format}")
-    void setFormat(
+    Response setFormat(
             @NotNull @PathParam("key") String key,
             @NotNull @PathParam("format") ReportTemplateFormat format,
             InputStream templateIn);
@@ -111,10 +114,11 @@ public interface ReportTemplateService extends JAXRSService {
      *
      * @param key report template
      * @param format template format
+     * @return an empty response if operation was successful
      */
     @DELETE
     @Path("{key}/{format}")
-    void removeFormat(
+    Response removeFormat(
             @NotNull @PathParam("key") String key,
             @NotNull @PathParam("format") ReportTemplateFormat format);
 

http://git-wip-us.apache.org/repos/asf/syncope/blob/130c4a08/common/rest-api/src/main/java/org/apache/syncope/common/rest/api/service/ResourceHistoryService.java
----------------------------------------------------------------------
diff --git a/common/rest-api/src/main/java/org/apache/syncope/common/rest/api/service/ResourceHistoryService.java b/common/rest-api/src/main/java/org/apache/syncope/common/rest/api/service/ResourceHistoryService.java
index fbf748a..67c8d58 100644
--- a/common/rest-api/src/main/java/org/apache/syncope/common/rest/api/service/ResourceHistoryService.java
+++ b/common/rest-api/src/main/java/org/apache/syncope/common/rest/api/service/ResourceHistoryService.java
@@ -27,6 +27,7 @@ import javax.ws.rs.Path;
 import javax.ws.rs.PathParam;
 import javax.ws.rs.Produces;
 import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.Response;
 import org.apache.syncope.common.lib.to.ResourceHistoryConfTO;
 
 /**
@@ -50,17 +51,19 @@ public interface ResourceHistoryService extends JAXRSService {
      * Restores the resource configuration history matching the provided key.
      *
      * @param key resource configuration history key to be restored
+     * @return an empty response if operation was successful
      */
     @POST
     @Path("{key}")
-    void restore(@NotNull @PathParam("key") String key);
+    Response restore(@NotNull @PathParam("key") String key);
 
     /**
      * Deletes the resource configuration history matching the provided key.
      *
      * @param key resource configuration history key to be deleted
+     * @return an empty response if operation was successful
      */
     @DELETE
     @Path("{key}")
-    void delete(@NotNull @PathParam("key") String key);
+    Response delete(@NotNull @PathParam("key") String key);
 }

http://git-wip-us.apache.org/repos/asf/syncope/blob/130c4a08/common/rest-api/src/main/java/org/apache/syncope/common/rest/api/service/ResourceService.java
----------------------------------------------------------------------
diff --git a/common/rest-api/src/main/java/org/apache/syncope/common/rest/api/service/ResourceService.java b/common/rest-api/src/main/java/org/apache/syncope/common/rest/api/service/ResourceService.java
index 1ec1f4f..e6adc5a 100644
--- a/common/rest-api/src/main/java/org/apache/syncope/common/rest/api/service/ResourceService.java
+++ b/common/rest-api/src/main/java/org/apache/syncope/common/rest/api/service/ResourceService.java
@@ -111,11 +111,12 @@ public interface ResourceService extends JAXRSService {
      * Updates the resource matching the given name.
      *
      * @param resourceTO resource to be stored
+     * @return an empty response if operation was successful
      */
     @PUT
     @Path("{key}")
     @Consumes({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML })
-    void update(@NotNull ResourceTO resourceTO);
+    Response update(@NotNull ResourceTO resourceTO);
 
     /**
      * Queries the connector underlying the given resource for the latest sync token value associated to the given any
@@ -123,41 +124,49 @@ public interface ResourceService extends JAXRSService {
      *
      * @param key resource
      * @param anyTypeKey any type
+     * @return an empty response if operation was successful
      */
     @POST
     @Path("{key}/{anyTypeKey}")
-    void setLatestSyncToken(@NotNull @PathParam("key") String key, @NotNull @PathParam("anyTypeKey") String anyTypeKey);
+    Response setLatestSyncToken(
+            @NotNull @PathParam("key") String key,
+            @NotNull @PathParam("anyTypeKey") String anyTypeKey);
 
     /**
      * Removes the sync token value associated to the given any type from the given resource.
      *
      * @param key resource
      * @param anyTypeKey any type
+     * @return an empty response if operation was successful
      */
     @DELETE
     @Path("{key}/{anyTypeKey}")
-    void removeSyncToken(@NotNull @PathParam("key") String key, @NotNull @PathParam("anyTypeKey") String anyTypeKey);
+    Response removeSyncToken(
+            @NotNull @PathParam("key") String key,
+            @NotNull @PathParam("anyTypeKey") String anyTypeKey);
 
     /**
      * Deletes the resource matching the given name.
      *
      * @param key name of resource to be deleted
+     * @return an empty response if operation was successful
      */
     @DELETE
     @Path("{key}")
     @Consumes({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML })
-    void delete(@NotNull @PathParam("key") String key);
+    Response delete(@NotNull @PathParam("key") String key);
 
     /**
      * Checks whether the connection to resource could be established.
      *
      * @param resourceTO resource to be checked
+     * @return an empty response if operation was successful
      */
     @POST
     @Path("check")
     @Produces({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML })
     @Consumes({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML })
-    void check(@NotNull ResourceTO resourceTO);
+    Response check(@NotNull ResourceTO resourceTO);
 
     /**
      * De-associate any objects from the given resource.

http://git-wip-us.apache.org/repos/asf/syncope/blob/130c4a08/common/rest-api/src/main/java/org/apache/syncope/common/rest/api/service/RoleService.java
----------------------------------------------------------------------
diff --git a/common/rest-api/src/main/java/org/apache/syncope/common/rest/api/service/RoleService.java b/common/rest-api/src/main/java/org/apache/syncope/common/rest/api/service/RoleService.java
index 782a3d2..557db76 100644
--- a/common/rest-api/src/main/java/org/apache/syncope/common/rest/api/service/RoleService.java
+++ b/common/rest-api/src/main/java/org/apache/syncope/common/rest/api/service/RoleService.java
@@ -73,20 +73,22 @@ public interface RoleService extends JAXRSService {
      * Updates the role matching the provided key.
      *
      * @param roleTO role to be stored
+     * @return an empty response if operation was successful
      */
     @PUT
     @Path("{key}")
     @Consumes({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML })
-    void update(@NotNull RoleTO roleTO);
+    Response update(@NotNull RoleTO roleTO);
 
     /**
      * Deletes the role matching the provided key.
      *
      * @param key role key to be deleted
+     * @return an empty response if operation was successful
      */
     @DELETE
     @Path("{key}")
-    void delete(@NotNull @PathParam("key") String key);
+    Response delete(@NotNull @PathParam("key") String key);
 
     /**
      * Gets the console layout information as JSON string for the role with the given key, if available.
@@ -104,18 +106,20 @@ public interface RoleService extends JAXRSService {
      *
      * @param key role key
      * @param consoleLayoutInfoIn console layout information to be set
+     * @return an empty response if operation was successful
      */
     @PUT
     @Path("{key}/consoleLayout")
     @Consumes({ MediaType.APPLICATION_JSON })
-    void setConsoleLayoutInfo(@NotNull @PathParam("key") String key, InputStream consoleLayoutInfoIn);
+    Response setConsoleLayoutInfo(@NotNull @PathParam("key") String key, InputStream consoleLayoutInfoIn);
 
     /**
      * Removes the console layout information for the role with the given key, if available.
      *
      * @param key role key
+     * @return an empty response if operation was successful
      */
     @DELETE
     @Path("{key}/consoleLayout")
-    void removeConsoleLayoutInfo(@NotNull @PathParam("key") String key);
+    Response removeConsoleLayoutInfo(@NotNull @PathParam("key") String key);
 }

http://git-wip-us.apache.org/repos/asf/syncope/blob/130c4a08/common/rest-api/src/main/java/org/apache/syncope/common/rest/api/service/SchemaService.java
----------------------------------------------------------------------
diff --git a/common/rest-api/src/main/java/org/apache/syncope/common/rest/api/service/SchemaService.java b/common/rest-api/src/main/java/org/apache/syncope/common/rest/api/service/SchemaService.java
index 1f9f9a0..51403bd 100644
--- a/common/rest-api/src/main/java/org/apache/syncope/common/rest/api/service/SchemaService.java
+++ b/common/rest-api/src/main/java/org/apache/syncope/common/rest/api/service/SchemaService.java
@@ -84,19 +84,21 @@ public interface SchemaService extends JAXRSService {
      *
      * @param type type for schemas to be updated
      * @param schemaTO updated schema to be stored
+     * @return an empty response if operation was successful
      */
     @PUT
     @Path("{type}/{key}")
     @Consumes({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML })
-    void update(@NotNull @PathParam("type") SchemaType type, @NotNull AbstractSchemaTO schemaTO);
+    Response update(@NotNull @PathParam("type") SchemaType type, @NotNull AbstractSchemaTO schemaTO);
 
     /**
      * Deletes the schema matching the given type and key.
      *
      * @param type type for schema to be deleted
      * @param key name of schema to be deleted
+     * @return an empty response if operation was successful
      */
     @DELETE
     @Path("{type}/{key}")
-    void delete(@NotNull @PathParam("type") SchemaType type, @NotNull @PathParam("key") String key);
+    Response delete(@NotNull @PathParam("type") SchemaType type, @NotNull @PathParam("key") String key);
 }

http://git-wip-us.apache.org/repos/asf/syncope/blob/130c4a08/common/rest-api/src/main/java/org/apache/syncope/common/rest/api/service/SecurityQuestionService.java
----------------------------------------------------------------------
diff --git a/common/rest-api/src/main/java/org/apache/syncope/common/rest/api/service/SecurityQuestionService.java b/common/rest-api/src/main/java/org/apache/syncope/common/rest/api/service/SecurityQuestionService.java
index 08ebbfe..9b43250 100644
--- a/common/rest-api/src/main/java/org/apache/syncope/common/rest/api/service/SecurityQuestionService.java
+++ b/common/rest-api/src/main/java/org/apache/syncope/common/rest/api/service/SecurityQuestionService.java
@@ -72,20 +72,22 @@ public interface SecurityQuestionService extends JAXRSService {
      * Updates the security question matching the provided key.
      *
      * @param securityQuestionTO security question to be stored
+     * @return an empty response if operation was successful
      */
     @PUT
     @Path("{key}")
     @Consumes({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML })
-    void update(@NotNull SecurityQuestionTO securityQuestionTO);
+    Response update(@NotNull SecurityQuestionTO securityQuestionTO);
 
     /**
      * Deletes the security question matching the provided key.
      *
      * @param key security question key to be deleted
+     * @return an empty response if operation was successful
      */
     @DELETE
     @Path("{key}")
-    void delete(@NotNull @PathParam("key") String key);
+    Response delete(@NotNull @PathParam("key") String key);
 
     /**
      * Ask for security question configured for the user matching the given username, if any.

http://git-wip-us.apache.org/repos/asf/syncope/blob/130c4a08/common/rest-api/src/main/java/org/apache/syncope/common/rest/api/service/TaskService.java
----------------------------------------------------------------------
diff --git a/common/rest-api/src/main/java/org/apache/syncope/common/rest/api/service/TaskService.java b/common/rest-api/src/main/java/org/apache/syncope/common/rest/api/service/TaskService.java
index 0d1bf41..205e6cd 100644
--- a/common/rest-api/src/main/java/org/apache/syncope/common/rest/api/service/TaskService.java
+++ b/common/rest-api/src/main/java/org/apache/syncope/common/rest/api/service/TaskService.java
@@ -85,20 +85,22 @@ public interface TaskService extends ExecutableService {
      * Updates the task matching the provided key.
      *
      * @param taskTO updated task to be stored
+     * @return an empty response if operation was successful
      */
     @PUT
     @Path("{key}")
     @Consumes({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML })
-    void update(@NotNull AbstractTaskTO taskTO);
+    Response update(@NotNull AbstractTaskTO taskTO);
 
     /**
      * Deletes the task matching the provided key.
      *
      * @param key key of task to be deleted
+     * @return an empty response if operation was successful
      */
     @DELETE
     @Path("{key}")
-    void delete(@NotNull @PathParam("key") String key);
+    Response delete(@NotNull @PathParam("key") String key);
 
     /**
      * Executes the provided bulk action.

http://git-wip-us.apache.org/repos/asf/syncope/blob/130c4a08/common/rest-api/src/main/java/org/apache/syncope/common/rest/api/service/UserSelfService.java
----------------------------------------------------------------------
diff --git a/common/rest-api/src/main/java/org/apache/syncope/common/rest/api/service/UserSelfService.java b/common/rest-api/src/main/java/org/apache/syncope/common/rest/api/service/UserSelfService.java
index ff95a55..651c9d0 100644
--- a/common/rest-api/src/main/java/org/apache/syncope/common/rest/api/service/UserSelfService.java
+++ b/common/rest-api/src/main/java/org/apache/syncope/common/rest/api/service/UserSelfService.java
@@ -116,10 +116,11 @@ public interface UserSelfService extends JAXRSService {
      *
      * @param username username for which the security answer is provided
      * @param securityAnswer actual answer text
+     * @return an empty response if operation was successful
      */
     @POST
     @Path("requestPasswordReset")
-    void requestPasswordReset(@NotNull @QueryParam("username") String username, String securityAnswer);
+    Response requestPasswordReset(@NotNull @QueryParam("username") String username, String securityAnswer);
 
     /**
      * Reset the password value for the user matching the provided token, if available and still valid.
@@ -129,8 +130,9 @@ public interface UserSelfService extends JAXRSService {
      *
      * @param token password reset token
      * @param password new password to be set
+     * @return an empty response if operation was successful
      */
     @POST
     @Path("confirmPasswordReset")
-    void confirmPasswordReset(@NotNull @QueryParam("token") String token, String password);
+    Response confirmPasswordReset(@NotNull @QueryParam("token") String token, String password);
 }

http://git-wip-us.apache.org/repos/asf/syncope/blob/130c4a08/common/rest-api/src/main/java/org/apache/syncope/common/rest/api/service/UserService.java
----------------------------------------------------------------------
diff --git a/common/rest-api/src/main/java/org/apache/syncope/common/rest/api/service/UserService.java b/common/rest-api/src/main/java/org/apache/syncope/common/rest/api/service/UserService.java
index 9157b27..310e631 100644
--- a/common/rest-api/src/main/java/org/apache/syncope/common/rest/api/service/UserService.java
+++ b/common/rest-api/src/main/java/org/apache/syncope/common/rest/api/service/UserService.java
@@ -22,11 +22,13 @@ import javax.validation.constraints.NotNull;
 import javax.ws.rs.Consumes;
 import javax.ws.rs.DefaultValue;
 import javax.ws.rs.POST;
+import javax.ws.rs.PUT;
 import javax.ws.rs.Path;
 import javax.ws.rs.Produces;
 import javax.ws.rs.QueryParam;
 import javax.ws.rs.core.MediaType;
 import javax.ws.rs.core.Response;
+import org.apache.cxf.jaxrs.ext.PATCH;
 import org.apache.syncope.common.lib.patch.StatusPatch;
 import org.apache.syncope.common.lib.patch.UserPatch;
 import org.apache.syncope.common.lib.to.UserTO;
@@ -35,7 +37,7 @@ import org.apache.syncope.common.lib.to.UserTO;
  * REST operations for users.
  */
 @Path("users")
-public interface UserService extends AnyService<UserTO, UserPatch> {
+public interface UserService extends AnyService<UserTO> {
 
     /**
      * Creates a new user.
@@ -53,6 +55,32 @@ public interface UserService extends AnyService<UserTO, UserPatch> {
             @DefaultValue("true") @QueryParam("storePassword") boolean storePassword);
 
     /**
+     * Updates user matching the provided key.
+     *
+     * @param userPatch modification to be applied to user matching the provided key
+     * @return Response object featuring the updated user enriched with propagation status information
+     * - ProvisioningResult as Entity
+     */
+    @PATCH
+    @Path("{key}")
+    @Produces({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML })
+    @Consumes({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML })
+    Response update(@NotNull UserPatch userPatch);
+
+    /**
+     * Updates user matching the provided key.
+     *
+     * @param userTO complete update
+     * @return Response object featuring the updated user enriched with propagation status information
+     * - ProvisioningResult as Entity
+     */
+    @PUT
+    @Path("{key}")
+    @Produces({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML })
+    @Consumes({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML })
+    Response update(@NotNull UserTO userTO);
+
+    /**
      * Performs a status update on given user.
      *
      * @param statusPatch status update details