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

[59/70] syncope git commit: [SYNCOPE-666] Any* tests added

http://git-wip-us.apache.org/repos/asf/syncope/blob/a45a46bb/client/console/src/main/java/org/apache/syncope/client/console/panels/Resources.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/panels/Resources.java b/client/console/src/main/java/org/apache/syncope/client/console/panels/Resources.java
deleted file mode 100644
index 755b2d1..0000000
--- a/client/console/src/main/java/org/apache/syncope/client/console/panels/Resources.java
+++ /dev/null
@@ -1,485 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.syncope.client.console.panels;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.Iterator;
-import java.util.List;
-import org.apache.syncope.client.console.PreferenceManager;
-import org.apache.syncope.client.console.commons.Constants;
-import org.apache.syncope.client.console.commons.SortableDataProviderComparator;
-import org.apache.syncope.client.console.pages.BasePage;
-import org.apache.syncope.client.console.pages.ConnectorModalPage;
-import org.apache.syncope.client.console.pages.ProvisioningModalPage;
-import org.apache.syncope.client.console.pages.ResourceModalPage;
-import org.apache.syncope.client.console.rest.ConnectorRestClient;
-import org.apache.syncope.client.console.rest.ResourceRestClient;
-import org.apache.syncope.client.console.wicket.ajax.markup.html.ClearIndicatingAjaxLink;
-import org.apache.syncope.client.console.wicket.markup.html.form.ActionLink;
-import org.apache.syncope.client.console.wicket.markup.html.form.ActionLinksPanel;
-import org.apache.syncope.client.console.wicket.markup.html.form.LinkPanel;
-import org.apache.syncope.common.lib.SyncopeClientException;
-import org.apache.syncope.common.lib.to.ResourceTO;
-import org.apache.syncope.common.lib.to.GroupTO;
-import org.apache.syncope.common.lib.to.UserTO;
-import org.apache.syncope.common.lib.types.Entitlement;
-import org.apache.wicket.AttributeModifier;
-import org.apache.wicket.Page;
-import org.apache.wicket.PageReference;
-import org.apache.wicket.ajax.AjaxRequestTarget;
-import org.apache.wicket.ajax.form.AjaxFormComponentUpdatingBehavior;
-import org.apache.wicket.ajax.markup.html.AjaxLink;
-import org.apache.wicket.authroles.authorization.strategies.role.metadata.MetaDataRoleAuthorizationStrategy;
-import org.apache.wicket.event.IEvent;
-import org.apache.wicket.extensions.ajax.markup.html.modal.ModalWindow;
-import org.apache.wicket.extensions.markup.html.repeater.data.grid.ICellPopulator;
-import org.apache.wicket.extensions.markup.html.repeater.data.sort.SortOrder;
-import org.apache.wicket.extensions.markup.html.repeater.data.table.AbstractColumn;
-import org.apache.wicket.extensions.markup.html.repeater.data.table.IColumn;
-import org.apache.wicket.extensions.markup.html.repeater.data.table.ISortableDataProvider;
-import org.apache.wicket.extensions.markup.html.repeater.data.table.PropertyColumn;
-import org.apache.wicket.extensions.markup.html.repeater.util.SortableDataProvider;
-import org.apache.wicket.markup.html.WebMarkupContainer;
-import org.apache.wicket.markup.html.basic.Label;
-import org.apache.wicket.markup.html.form.DropDownChoice;
-import org.apache.wicket.markup.html.form.Form;
-import org.apache.wicket.markup.html.panel.Panel;
-import org.apache.wicket.markup.repeater.Item;
-import org.apache.wicket.model.AbstractReadOnlyModel;
-import org.apache.wicket.model.IModel;
-import org.apache.wicket.model.Model;
-import org.apache.wicket.model.PropertyModel;
-import org.apache.wicket.model.StringResourceModel;
-import org.apache.wicket.spring.injection.annot.SpringBean;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-/**
- * Resources WebPage.
- */
-public class Resources extends Panel {
-
-    private static final long serialVersionUID = -3789252860990261728L;
-
-    protected static final Logger LOG = LoggerFactory.getLogger(Resources.class);
-
-    private static final int WIN_HEIGHT = 600;
-
-    private static final int WIN_WIDTH = 1100;
-
-    @SpringBean
-    private PreferenceManager prefMan;
-
-    @SpringBean
-    private ResourceRestClient resourceRestClient;
-
-    private final ModalWindow createResourceWin;
-
-    private final ModalWindow editResourceWin;
-
-    private final int resourcePaginatorRows;
-
-    private WebMarkupContainer resourceContainer;
-
-    private final ModalWindow editConnectorWin;
-
-    /**
-     * Modal window to be used for user status management.
-     */
-    protected final ModalWindow statusmodal = new ModalWindow("statusModal");
-
-    /**
-     * Schemas to be shown modal window height.
-     */
-    private static final int STATUS_MODAL_WIN_HEIGHT = 500;
-
-    /**
-     * Schemas to be shown modal window width.
-     */
-    private static final int STATUS_MODAL_WIN_WIDTH = 700;
-
-    @SpringBean
-    private ConnectorRestClient connectorRestClient;
-
-    private final PageReference pageRef;
-
-    public Resources(final String id, final PageReference pageRef) {
-        super(id);
-        this.pageRef = pageRef;
-
-        createResourceWin = new ModalWindow("createResourceWin");
-        add(createResourceWin);
-
-        editResourceWin = new ModalWindow("editResourceWin");
-        add(editResourceWin);
-
-        editConnectorWin = new ModalWindow("editConnectorWin");
-        add(editConnectorWin);
-
-        statusmodal.setCssClassName(ModalWindow.CSS_CLASS_GRAY);
-        statusmodal.setInitialHeight(STATUS_MODAL_WIN_HEIGHT);
-        statusmodal.setInitialWidth(STATUS_MODAL_WIN_WIDTH);
-        statusmodal.setCookieName("status-modal");
-        add(statusmodal);
-
-        resourcePaginatorRows = prefMan.getPaginatorRows(getRequest(), Constants.PREF_RESOURCES_PAGINATOR_ROWS);
-
-        setupResources();
-    }
-
-    private void setupResources() {
-        List<IColumn<ResourceTO, String>> columns = new ArrayList<>();
-
-        columns.add(new PropertyColumn<ResourceTO, String>(new StringResourceModel("key", this, null), "key", "key"));
-
-        columns.add(new AbstractColumn<ResourceTO, String>(
-                new StringResourceModel("connector", this, null, "connector")) {
-
-                    private static final long serialVersionUID = 8263694778917279290L;
-
-                    @Override
-                    public void populateItem(final Item<ICellPopulator<ResourceTO>> cellItem, final String componentId,
-                            final IModel<ResourceTO> rowModel) {
-
-                        final AjaxLink<String> editLink = new ClearIndicatingAjaxLink<String>("link", pageRef) {
-
-                            private static final long serialVersionUID = -7978723352517770644L;
-
-                            @Override
-                            protected void onClickInternal(final AjaxRequestTarget target) {
-
-                                editConnectorWin.setPageCreator(new ModalWindow.PageCreator() {
-
-                                    private static final long serialVersionUID = -7834632442532690940L;
-
-                                    @Override
-                                    public Page createPage() {
-                                        return new ConnectorModalPage(Resources.this.pageRef,
-                                                editConnectorWin,
-                                                connectorRestClient.read(rowModel.getObject().getConnectorId()));
-                                    }
-                                });
-
-                                editConnectorWin.show(target);
-                            }
-                        };
-                        editLink.add(new Label("linkTitle", rowModel.getObject().getConnectorDisplayName()));
-
-                        LinkPanel editConnPanel = new LinkPanel(componentId);
-                        editConnPanel.add(editLink);
-
-                        cellItem.add(editConnPanel);
-
-                        MetaDataRoleAuthorizationStrategy.authorize(editConnPanel, ENABLE, Entitlement.CONNECTOR_READ);
-                    }
-                });
-
-        columns.add(new AbstractColumn<ResourceTO, String>(
-                new StringResourceModel("propagationPrimary", this, null)) {
-
-                    private static final long serialVersionUID = -3503023501954863131L;
-
-                    @Override
-                    public void populateItem(final Item<ICellPopulator<ResourceTO>> item,
-                            final String componentId, final IModel<ResourceTO> model) {
-
-                        item.add(new Label(componentId, ""));
-                        item.add(new AttributeModifier("class", new Model<>(
-                                                Boolean.toString(model.getObject().isPropagationPrimary()))));
-                    }
-
-                    @Override
-                    public String getCssClass() {
-                        return "narrowcolumn";
-                    }
-                });
-
-        columns.add(new PropertyColumn<ResourceTO, String>(new StringResourceModel(
-                "propagationPriority", this, null), "propagationPriority", "propagationPriority") {
-
-                    private static final long serialVersionUID = 1L;
-
-                    @Override
-                    public String getCssClass() {
-                        return "narrowcolumn";
-                    }
-                });
-
-        columns.add(new AbstractColumn<ResourceTO, String>(new StringResourceModel("actions", this, null, "")) {
-
-            private static final long serialVersionUID = 2054811145491901166L;
-
-            @Override
-            public String getCssClass() {
-                return "action";
-            }
-
-            @Override
-            public void populateItem(final Item<ICellPopulator<ResourceTO>> cellItem, final String componentId,
-                    final IModel<ResourceTO> model) {
-
-                final ResourceTO resourceTO = model.getObject();
-
-                final ActionLinksPanel panel = new ActionLinksPanel(componentId, model, pageRef);
-                panel.add(new ActionLink() {
-
-                    private static final long serialVersionUID = -3722207913631435501L;
-
-                    @Override
-                    public void onClick(final AjaxRequestTarget target) {
-                        statusmodal.setPageCreator(new ModalWindow.PageCreator() {
-
-                            private static final long serialVersionUID = -7834632442532690940L;
-
-                            @Override
-                            public Page createPage() {
-                                return new ProvisioningModalPage<>(
-                                        pageRef, statusmodal, model.getObject(), UserTO.class);
-                            }
-                        });
-
-                        statusmodal.show(target);
-                    }
-                }, ActionLink.ActionType.MANAGE_USERS, "Resources");
-
-                panel.add(new ActionLink() {
-
-                    private static final long serialVersionUID = -3722207913631435501L;
-
-                    @Override
-                    public void onClick(final AjaxRequestTarget target) {
-
-                        statusmodal.setPageCreator(new ModalWindow.PageCreator() {
-
-                            private static final long serialVersionUID = -7834632442532690940L;
-
-                            @Override
-                            public Page createPage() {
-                                return new ProvisioningModalPage<>(
-                                        pageRef, statusmodal, model.getObject(), GroupTO.class);
-                            }
-                        });
-
-                        statusmodal.show(target);
-                    }
-                }, ActionLink.ActionType.MANAGE_GROUPS, "Resources");
-
-                panel.add(new ActionLink() {
-
-                    private static final long serialVersionUID = -3722207913631435501L;
-
-                    @Override
-                    public void onClick(final AjaxRequestTarget target) {
-                        resourceTO.setUsyncToken(null);
-                        resourceTO.setRsyncToken(null);
-                        try {
-                            resourceRestClient.update(resourceTO);
-                            info(getString(Constants.OPERATION_SUCCEEDED));
-                        } catch (SyncopeClientException e) {
-                            error(getString(Constants.ERROR) + ":" + e.getMessage());
-
-                            LOG.error("While resetting sync token from " + resourceTO.getKey(), e);
-                        }
-
-                        ((BasePage) pageRef.getPage()).getFeedbackPanel().refresh(target);
-                        target.add(resourceContainer);
-                    }
-                }, ActionLink.ActionType.RESET, "Resources");
-
-                panel.add(new ActionLink() {
-
-                    private static final long serialVersionUID = -3722207913631435501L;
-
-                    @Override
-                    public void onClick(final AjaxRequestTarget target) {
-                        editResourceWin.setPageCreator(new ModalWindow.PageCreator() {
-
-                            private static final long serialVersionUID = -7834632442532690940L;
-
-                            @Override
-                            public Page createPage() {
-                                return new ResourceModalPage(pageRef, editResourceWin, resourceTO, false);
-                            }
-                        });
-
-                        editResourceWin.show(target);
-                    }
-                }, ActionLink.ActionType.EDIT, "Resources");
-
-                panel.add(new ActionLink() {
-
-                    private static final long serialVersionUID = -3722207913631435501L;
-
-                    @Override
-                    public void onClick(final AjaxRequestTarget target) {
-                        try {
-                            resourceRestClient.delete(resourceTO.getKey());
-                            info(getString(Constants.OPERATION_SUCCEEDED));
-                        } catch (SyncopeClientException e) {
-                            error(getString(Constants.ERROR) + ": " + e.getMessage());
-
-                            LOG.error("While deleting resource " + resourceTO.getKey(), e);
-                        }
-
-                        ((BasePage) pageRef.getPage()).getFeedbackPanel().refresh(target);
-                        target.add(resourceContainer);
-                    }
-                }, ActionLink.ActionType.DELETE, "Resources");
-
-                cellItem.add(panel);
-            }
-        });
-
-        final AjaxDataTablePanel<ResourceTO, String> table = new AjaxDataTablePanel<>(
-                "resourceDatatable",
-                columns,
-                (ISortableDataProvider<ResourceTO, String>) new ResourcesProvider(),
-                resourcePaginatorRows,
-                Arrays.asList(new ActionLink.ActionType[] { ActionLink.ActionType.DELETE }),
-                resourceRestClient,
-                "key",
-                "Resources",
-                pageRef);
-
-        resourceContainer = new WebMarkupContainer("resourceContainer");
-        resourceContainer.add(table);
-        resourceContainer.setOutputMarkupId(true);
-
-        add(resourceContainer);
-
-        ((BasePage) pageRef.getPage()).setWindowClosedCallback(createResourceWin, resourceContainer);
-        ((BasePage) pageRef.getPage()).setWindowClosedCallback(editResourceWin, resourceContainer);
-
-        createResourceWin.setCssClassName(ModalWindow.CSS_CLASS_GRAY);
-        createResourceWin.setInitialHeight(WIN_HEIGHT);
-        createResourceWin.setInitialWidth(WIN_WIDTH);
-        createResourceWin.setCookieName("create-res-modal");
-
-        editResourceWin.setCssClassName(ModalWindow.CSS_CLASS_GRAY);
-        editResourceWin.setInitialHeight(WIN_HEIGHT);
-        editResourceWin.setInitialWidth(WIN_WIDTH);
-        editResourceWin.setCookieName("edit-res-modal");
-
-        editConnectorWin.setCssClassName(ModalWindow.CSS_CLASS_GRAY);
-        editConnectorWin.setInitialHeight(WIN_HEIGHT);
-        editConnectorWin.setInitialWidth(WIN_WIDTH);
-        editConnectorWin.setCookieName("edit-conn-modal");
-
-        AjaxLink<Void> createResourceLink
-                = new ClearIndicatingAjaxLink<Void>("createResourceLink", pageRef) {
-
-                    private static final long serialVersionUID = -7978723352517770644L;
-
-                    @Override
-                    protected void onClickInternal(final AjaxRequestTarget target) {
-                        createResourceWin.setPageCreator(new ModalWindow.PageCreator() {
-
-                            private static final long serialVersionUID = -7834632442532690940L;
-
-                            @Override
-                            public Page createPage() {
-                                final ResourceModalPage windows = new ResourceModalPage(Resources.this.pageRef,
-                                        editResourceWin, new ResourceTO(), true);
-                                return windows;
-                            }
-                        });
-
-                        createResourceWin.show(target);
-                    }
-                };
-
-        MetaDataRoleAuthorizationStrategy.authorize(createResourceLink, ENABLE, Entitlement.RESOURCE_CREATE);
-
-        add(createResourceLink);
-
-        @SuppressWarnings("rawtypes")
-        final Form paginatorForm = new Form("resourcePaginatorForm");
-
-        @SuppressWarnings({ "unchecked", "rawtypes" })
-        final DropDownChoice rowsChooser = new DropDownChoice("rowsChooser", new PropertyModel(this,
-                "resourcePaginatorRows"), prefMan.getPaginatorChoices());
-
-        rowsChooser.add(new AjaxFormComponentUpdatingBehavior(Constants.ON_CHANGE) {
-
-            private static final long serialVersionUID = -1107858522700306810L;
-
-            @Override
-            protected void onUpdate(final AjaxRequestTarget target) {
-                prefMan.set(getRequest(), getResponse(), Constants.PREF_RESOURCES_PAGINATOR_ROWS,
-                        String.valueOf(resourcePaginatorRows));
-
-                table.setItemsPerPage(resourcePaginatorRows);
-                target.add(resourceContainer);
-            }
-        });
-
-        paginatorForm.add(rowsChooser);
-        add(paginatorForm);
-    }
-
-    class ResourcesProvider extends SortableDataProvider<ResourceTO, String> {
-
-        private static final long serialVersionUID = -9055916672926643975L;
-
-        private final SortableDataProviderComparator<ResourceTO> comparator;
-
-        public ResourcesProvider() {
-            super();
-            //Default sorting
-            setSort("key", SortOrder.ASCENDING);
-            comparator = new SortableDataProviderComparator<>(this);
-        }
-
-        @Override
-        public Iterator<ResourceTO> iterator(final long first, final long count) {
-            List<ResourceTO> list = resourceRestClient.getAll();
-
-            Collections.sort(list, comparator);
-
-            return list.subList((int) first, (int) first + (int) count).iterator();
-        }
-
-        @Override
-        public long size() {
-            return resourceRestClient.getAll().size();
-        }
-
-        @Override
-        public IModel<ResourceTO> model(final ResourceTO resource) {
-            return new AbstractReadOnlyModel<ResourceTO>() {
-
-                private static final long serialVersionUID = 8952474152465381634L;
-
-                @Override
-                public ResourceTO getObject() {
-                    return resource;
-                }
-            };
-        }
-    }
-
-    @Override
-    public void onEvent(final IEvent<?> event) {
-        if (event.getPayload() instanceof AbstractSearchResultPanel.EventDataWrapper) {
-            ((AbstractSearchResultPanel.EventDataWrapper) event.getPayload()).getTarget().add(resourceContainer);
-        }
-    }
-}

http://git-wip-us.apache.org/repos/asf/syncope/blob/a45a46bb/client/console/src/main/java/org/apache/syncope/client/console/rest/ConnectorRestClient.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/rest/ConnectorRestClient.java b/client/console/src/main/java/org/apache/syncope/client/console/rest/ConnectorRestClient.java
index 5535c7b..3298d3f 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/rest/ConnectorRestClient.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/rest/ConnectorRestClient.java
@@ -28,11 +28,11 @@ import org.apache.syncope.common.lib.SyncopeClientException;
 import org.apache.syncope.common.lib.to.BulkAction;
 import org.apache.syncope.common.lib.to.BulkActionResult;
 import org.apache.syncope.common.lib.to.ConnBundleTO;
-import org.apache.syncope.common.lib.to.ConnIdObjectClassTO;
 import org.apache.syncope.common.lib.to.ConnInstanceTO;
 import org.apache.syncope.common.lib.to.PlainSchemaTO;
 import org.apache.syncope.common.lib.to.ResourceTO;
 import org.apache.syncope.common.lib.types.ConnConfProperty;
+import org.apache.syncope.common.lib.wrap.ConnIdObjectClass;
 import org.apache.syncope.common.rest.api.service.ConnectorService;
 import org.apache.syncope.common.rest.api.service.ResourceService;
 import org.springframework.beans.BeanUtils;
@@ -196,8 +196,8 @@ public class ConnectorRestClient extends BaseRestClient {
         return schemaNames;
     }
 
-    public List<ConnIdObjectClassTO> getSupportedObjectClasses(final ConnInstanceTO connectorTO) {
-        List<ConnIdObjectClassTO> result = Collections.emptyList();
+    public List<ConnIdObjectClass> getSupportedObjectClasses(final ConnInstanceTO connectorTO) {
+        List<ConnIdObjectClass> result = Collections.emptyList();
         try {
             result = getService(ConnectorService.class).getSupportedObjectClasses(connectorTO.getKey(), connectorTO);
         } catch (Exception e) {

http://git-wip-us.apache.org/repos/asf/syncope/blob/a45a46bb/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 ef490e2..a146857 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
@@ -25,6 +25,7 @@ import org.apache.syncope.client.console.commons.status.StatusBean;
 import org.apache.syncope.client.console.commons.status.StatusUtils;
 import org.apache.syncope.client.lib.SyncopeClient;
 import org.apache.syncope.common.lib.mod.GroupMod;
+import org.apache.syncope.common.lib.mod.ResourceAssociationMod;
 import org.apache.syncope.common.lib.to.BulkAction;
 import org.apache.syncope.common.lib.to.BulkActionResult;
 import org.apache.syncope.common.lib.to.ConnObjectTO;
@@ -119,31 +120,34 @@ public class GroupRestClient extends AbstractAnyRestClient {
         return getService(GroupService.class).bulk(action);
     }
 
-    public void unlink(final String etag, final long groupId, final List<StatusBean> statuses) {
+    public void unlink(final String etag, final long groupKey, final List<StatusBean> statuses) {
         synchronized (this) {
             GroupService service = getService(etag, GroupService.class);
-            service.bulkDeassociation(groupId, ResourceDeassociationActionType.UNLINK,
+            service.bulkDeassociation(groupKey, ResourceDeassociationActionType.UNLINK,
                     CollectionWrapper.wrap(StatusUtils.buildStatusMod(statuses).getResourceNames(),
                             ResourceKey.class));
             resetClient(GroupService.class);
         }
     }
 
-    public void link(final String etag, final long groupId, final List<StatusBean> statuses) {
+    public void link(final String etag, final long groupKey, final List<StatusBean> statuses) {
         synchronized (this) {
             GroupService service = getService(etag, GroupService.class);
-            service.bulkAssociation(groupId, ResourceAssociationActionType.LINK,
-                    CollectionWrapper.wrap(StatusUtils.buildStatusMod(statuses).getResourceNames(),
-                            ResourceKey.class));
+
+            ResourceAssociationMod associationMod = new ResourceAssociationMod();
+            associationMod.getTargetResources().addAll(
+                    CollectionWrapper.wrap(StatusUtils.buildStatusMod(statuses).getResourceNames(), ResourceKey.class));
+            service.bulkAssociation(groupKey, ResourceAssociationActionType.LINK, associationMod);
+
             resetClient(GroupService.class);
         }
     }
 
-    public BulkActionResult deprovision(final String etag, final long groupId, final List<StatusBean> statuses) {
+    public BulkActionResult deprovision(final String etag, final long groupKey, final List<StatusBean> statuses) {
         BulkActionResult result;
         synchronized (this) {
             GroupService service = getService(etag, GroupService.class);
-            result = service.bulkDeassociation(groupId, ResourceDeassociationActionType.DEPROVISION,
+            result = service.bulkDeassociation(groupKey, ResourceDeassociationActionType.DEPROVISION,
                     CollectionWrapper.wrap(StatusUtils.buildStatusMod(statuses).getResourceNames(),
                             ResourceKey.class)).
                     readEntity(BulkActionResult.class);
@@ -152,24 +156,27 @@ public class GroupRestClient extends AbstractAnyRestClient {
         return result;
     }
 
-    public BulkActionResult provision(final String etag, final long groupId, final List<StatusBean> statuses) {
+    public BulkActionResult provision(final String etag, final long groupKey, final List<StatusBean> statuses) {
         BulkActionResult result;
         synchronized (this) {
             GroupService service = getService(etag, GroupService.class);
-            result = service.bulkAssociation(groupId, ResourceAssociationActionType.PROVISION,
-                    CollectionWrapper.wrap(StatusUtils.buildStatusMod(statuses).getResourceNames(),
-                            ResourceKey.class)).
+
+            ResourceAssociationMod associationMod = new ResourceAssociationMod();
+            associationMod.getTargetResources().addAll(
+                    CollectionWrapper.wrap(StatusUtils.buildStatusMod(statuses).getResourceNames(), ResourceKey.class));
+
+            result = service.bulkAssociation(groupKey, ResourceAssociationActionType.PROVISION, associationMod).
                     readEntity(BulkActionResult.class);
             resetClient(GroupService.class);
         }
         return result;
     }
 
-    public BulkActionResult unassign(final String etag, final long groupId, final List<StatusBean> statuses) {
+    public BulkActionResult unassign(final String etag, final long groupKey, final List<StatusBean> statuses) {
         BulkActionResult result;
         synchronized (this) {
             GroupService service = getService(etag, GroupService.class);
-            result = service.bulkDeassociation(groupId, ResourceDeassociationActionType.UNASSIGN,
+            result = service.bulkDeassociation(groupKey, ResourceDeassociationActionType.UNASSIGN,
                     CollectionWrapper.wrap(StatusUtils.buildStatusMod(statuses).getResourceNames(),
                             ResourceKey.class)).
                     readEntity(BulkActionResult.class);
@@ -178,14 +185,18 @@ public class GroupRestClient extends AbstractAnyRestClient {
         return result;
     }
 
-    public BulkActionResult assign(final String etag, final long groupId, final List<StatusBean> statuses) {
+    public BulkActionResult assign(final String etag, final long groupKey, final List<StatusBean> statuses) {
         BulkActionResult result;
         synchronized (this) {
             GroupService service = getService(etag, GroupService.class);
-            result = service.bulkAssociation(groupId, ResourceAssociationActionType.ASSIGN,
-                    CollectionWrapper.wrap(StatusUtils.buildStatusMod(statuses).getResourceNames(),
-                            ResourceKey.class)).
+
+            ResourceAssociationMod associationMod = new ResourceAssociationMod();
+            associationMod.getTargetResources().addAll(
+                    CollectionWrapper.wrap(StatusUtils.buildStatusMod(statuses).getResourceNames(), ResourceKey.class));
+
+            result = service.bulkAssociation(groupKey, ResourceAssociationActionType.ASSIGN, associationMod).
                     readEntity(BulkActionResult.class);
+
             resetClient(GroupService.class);
         }
         return result;

http://git-wip-us.apache.org/repos/asf/syncope/blob/a45a46bb/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 64daf50..bfe6385 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
@@ -122,22 +122,22 @@ public class UserRestClient extends AbstractAnyRestClient {
         return getService(ResourceService.class).readConnObject(resourceName, AnyTypeKind.USER.name(), id);
     }
 
-    public void suspend(final String etag, final long userId, final List<StatusBean> statuses) {
+    public void suspend(final String etag, final long userKey, final List<StatusBean> statuses) {
         StatusMod statusMod = StatusUtils.buildStatusMod(statuses, false);
         statusMod.setType(StatusMod.ModType.SUSPEND);
         synchronized (this) {
             UserService service = getService(etag, UserService.class);
-            service.status(userId, statusMod);
+            service.status(userKey, statusMod);
             resetClient(UserService.class);
         }
     }
 
-    public void reactivate(final String etag, final long userId, final List<StatusBean> statuses) {
+    public void reactivate(final String etag, final long userKey, final List<StatusBean> statuses) {
         StatusMod statusMod = StatusUtils.buildStatusMod(statuses, true);
         statusMod.setType(StatusMod.ModType.REACTIVATE);
         synchronized (this) {
             UserService service = getService(etag, UserService.class);
-            service.status(userId, statusMod);
+            service.status(userKey, statusMod);
             resetClient(UserService.class);
         }
     }
@@ -147,34 +147,34 @@ public class UserRestClient extends AbstractAnyRestClient {
         return getService(UserService.class).bulk(action);
     }
 
-    public void unlink(final String etag, final long userId, final List<StatusBean> statuses) {
+    public void unlink(final String etag, final long userKey, final List<StatusBean> statuses) {
         synchronized (this) {
             UserService service = getService(etag, UserService.class);
-            service.bulkDeassociation(userId, ResourceDeassociationActionType.UNLINK,
+            service.bulkDeassociation(userKey, ResourceDeassociationActionType.UNLINK,
                     CollectionWrapper.wrap(StatusUtils.buildStatusMod(statuses).getResourceNames(),
                             ResourceKey.class));
             resetClient(UserService.class);
         }
     }
 
-    public void link(final String etag, final long userId, final List<StatusBean> statuses) {
+    public void link(final String etag, final long userKey, final List<StatusBean> statuses) {
         synchronized (this) {
             UserService service = getService(etag, UserService.class);
 
-            final ResourceAssociationMod associationMod = new ResourceAssociationMod();
+            ResourceAssociationMod associationMod = new ResourceAssociationMod();
             associationMod.getTargetResources().addAll(
                     CollectionWrapper.wrap(StatusUtils.buildStatusMod(statuses).getResourceNames(), ResourceKey.class));
-            service.bulkAssociation(userId, ResourceAssociationActionType.LINK, associationMod);
+            service.bulkAssociation(userKey, ResourceAssociationActionType.LINK, associationMod);
 
             resetClient(UserService.class);
         }
     }
 
-    public BulkActionResult deprovision(final String etag, final long userId, final List<StatusBean> statuses) {
+    public BulkActionResult deprovision(final String etag, final long userKey, final List<StatusBean> statuses) {
         BulkActionResult result;
         synchronized (this) {
             UserService service = getService(etag, UserService.class);
-            result = service.bulkDeassociation(userId, ResourceDeassociationActionType.DEPROVISION,
+            result = service.bulkDeassociation(userKey, ResourceDeassociationActionType.DEPROVISION,
                     CollectionWrapper.wrap(StatusUtils.buildStatusMod(statuses).getResourceNames(),
                             ResourceKey.class)).
                     readEntity(BulkActionResult.class);
@@ -183,32 +183,31 @@ public class UserRestClient extends AbstractAnyRestClient {
         return result;
     }
 
-    public BulkActionResult provision(final String etag, final long userId,
+    public BulkActionResult provision(final String etag, final long userKey,
             final List<StatusBean> statuses, final boolean changepwd, final String password) {
 
         BulkActionResult result;
         synchronized (this) {
             UserService service = getService(etag, UserService.class);
 
-            final ResourceAssociationMod associationMod = new ResourceAssociationMod();
-            associationMod.getTargetResources().addAll(CollectionWrapper.wrap(StatusUtils.buildStatusMod(statuses).
-                    getResourceNames(),
-                    ResourceKey.class));
+            ResourceAssociationMod associationMod = new ResourceAssociationMod();
+            associationMod.getTargetResources().addAll(
+                    CollectionWrapper.wrap(StatusUtils.buildStatusMod(statuses).getResourceNames(), ResourceKey.class));
             associationMod.setChangePwd(changepwd);
             associationMod.setPassword(password);
 
-            result = service.bulkAssociation(userId, ResourceAssociationActionType.PROVISION, associationMod).
+            result = service.bulkAssociation(userKey, ResourceAssociationActionType.PROVISION, associationMod).
                     readEntity(BulkActionResult.class);
             resetClient(UserService.class);
         }
         return result;
     }
 
-    public BulkActionResult unassign(final String etag, final long userId, final List<StatusBean> statuses) {
+    public BulkActionResult unassign(final String etag, final long userKey, final List<StatusBean> statuses) {
         BulkActionResult result;
         synchronized (this) {
             UserService service = getService(etag, UserService.class);
-            result = service.bulkDeassociation(userId, ResourceDeassociationActionType.UNASSIGN,
+            result = service.bulkDeassociation(userKey, ResourceDeassociationActionType.UNASSIGN,
                     CollectionWrapper.wrap(StatusUtils.buildStatusMod(statuses).getResourceNames(),
                             ResourceKey.class)).
                     readEntity(BulkActionResult.class);
@@ -217,21 +216,20 @@ public class UserRestClient extends AbstractAnyRestClient {
         return result;
     }
 
-    public BulkActionResult assign(final String etag, final long userId,
+    public BulkActionResult assign(final String etag, final long userKey,
             final List<StatusBean> statuses, final boolean changepwd, final String password) {
 
         BulkActionResult result;
         synchronized (this) {
             UserService service = getService(etag, UserService.class);
 
-            final ResourceAssociationMod associationMod = new ResourceAssociationMod();
-            associationMod.getTargetResources().addAll(CollectionWrapper.wrap(StatusUtils.buildStatusMod(statuses).
-                    getResourceNames(),
-                    ResourceKey.class));
+            ResourceAssociationMod associationMod = new ResourceAssociationMod();
+            associationMod.getTargetResources().addAll(
+                    CollectionWrapper.wrap(StatusUtils.buildStatusMod(statuses).getResourceNames(), ResourceKey.class));
             associationMod.setChangePwd(changepwd);
             associationMod.setPassword(password);
 
-            result = service.bulkAssociation(userId, ResourceAssociationActionType.ASSIGN, associationMod).
+            result = service.bulkAssociation(userKey, ResourceAssociationActionType.ASSIGN, associationMod).
                     readEntity(BulkActionResult.class);
             resetClient(UserService.class);
         }

http://git-wip-us.apache.org/repos/asf/syncope/blob/a45a46bb/client/console/src/main/java/org/apache/syncope/client/console/wicket/extensions/markup/html/repeater/data/table/ActionResultColumn.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/wicket/extensions/markup/html/repeater/data/table/ActionResultColumn.java b/client/console/src/main/java/org/apache/syncope/client/console/wicket/extensions/markup/html/repeater/data/table/ActionResultColumn.java
index 013fa3a..8f6cc5c 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/wicket/extensions/markup/html/repeater/data/table/ActionResultColumn.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/wicket/extensions/markup/html/repeater/data/table/ActionResultColumn.java
@@ -37,19 +37,16 @@ public class ActionResultColumn<T, S> extends AbstractColumn<T, S> {
 
     private static final long serialVersionUID = 7955560320949560716L;
 
-    /**
-     * Logger.
-     */
     private static final Logger LOG = LoggerFactory.getLogger(ActionResultColumn.class);
 
     private final BulkActionResult results;
 
-    private final String idFieldName;
+    private final String keyFieldName;
 
-    public ActionResultColumn(final BulkActionResult results, final String idFieldName) {
+    public ActionResultColumn(final BulkActionResult results, final String keyFieldName) {
         super(new Model<String>());
         this.results = results;
-        this.idFieldName = idFieldName;
+        this.keyFieldName = keyFieldName;
     }
 
     @Override
@@ -65,10 +62,10 @@ public class ActionResultColumn<T, S> extends AbstractColumn<T, S> {
     @Override
     public void populateItem(final Item<ICellPopulator<T>> item, final String componentId, final IModel<T> rowModel) {
         try {
-            final PropertyDescriptor propDesc = BeanUtils.getPropertyDescriptor(rowModel.getObject().getClass(),
-                    idFieldName);
-            final Object id = propDesc.getReadMethod().invoke(rowModel.getObject(), new Object[0]);
-            final Status status = id == null ? null : results.getResultMap().get(id.toString());
+            PropertyDescriptor propDesc =
+                    BeanUtils.getPropertyDescriptor(rowModel.getObject().getClass(), keyFieldName);
+            Object id = propDesc.getReadMethod().invoke(rowModel.getObject(), new Object[0]);
+            Status status = id == null ? null : results.getResults().get(id.toString());
             item.add(new Label(componentId, status == null ? Status.SUCCESS : status.toString()));
         } catch (Exception e) {
             LOG.error("Errore retrieving target id value", e);

http://git-wip-us.apache.org/repos/asf/syncope/blob/a45a46bb/client/console/src/main/resources/org/apache/syncope/client/console/pages/ResourceModalPage.properties
----------------------------------------------------------------------
diff --git a/client/console/src/main/resources/org/apache/syncope/client/console/pages/ResourceModalPage.properties b/client/console/src/main/resources/org/apache/syncope/client/console/pages/ResourceModalPage.properties
index 8a8eb3f..789919b 100644
--- a/client/console/src/main/resources/org/apache/syncope/client/console/pages/ResourceModalPage.properties
+++ b/client/console/src/main/resources/org/apache/syncope/client/console/pages/ResourceModalPage.properties
@@ -28,7 +28,7 @@ extAttrNames=External attributes
 intMappingTypes=Internal mapping types
 entity=Entity
 groupSchema=Group Schema
-accountId=AccountId
+connObjectKey=ConnObjectKey
 mandatoryCondition=Mandatory
 password=Password
 purpose=Purpose
@@ -39,9 +39,9 @@ intAttrNames=Internal attributes
 enforceMandatoryCondition=Enforce mandatory condition
 fieldName=Field name
 
-accountIdValidation=There must be exactly one AccountId
+connObjectKeyValidation=There must be exactly one ConnObjectKey
 propagationMode=Propagation mode
-accountLink=Account link
+connObjectLink=ConnObjectLink
 enable=Enable
 
 createTraceLevel=Create trace level

http://git-wip-us.apache.org/repos/asf/syncope/blob/a45a46bb/client/console/src/main/resources/org/apache/syncope/client/console/pages/ResourceModalPage_it.properties
----------------------------------------------------------------------
diff --git a/client/console/src/main/resources/org/apache/syncope/client/console/pages/ResourceModalPage_it.properties b/client/console/src/main/resources/org/apache/syncope/client/console/pages/ResourceModalPage_it.properties
index b98b3ae..54179a5 100644
--- a/client/console/src/main/resources/org/apache/syncope/client/console/pages/ResourceModalPage_it.properties
+++ b/client/console/src/main/resources/org/apache/syncope/client/console/pages/ResourceModalPage_it.properties
@@ -28,7 +28,7 @@ extAttrNames=Attributi esterni
 intMappingTypes=Tipo mapping interno
 entity=Entit&agrave;
 groupSchema=Schema Gruppo
-accountId=AccountId
+connObjectKey=ConnObjectKey
 mandatoryCondition=Obbligatorio
 password=Password
 purpose=Scopo
@@ -39,9 +39,9 @@ intAttrNames=Attributi interni
 enforceMandatoryCondition=Abilita mandatory condition
 fieldName=Nome campo
 
-accountIdValidation=Deve essere definito esattamente un AccountId
+connObjectKeyValidation=Deve essere definito esattamente un ConnObjectKey
 propagationMode=Modalit\u00e0 di propagazione
-accountLink=Account link
+connObjectLink=ConnObjectLink
 enable=Abilita
 
 createTraceLevel=Livello di tracciamento delle creazioni

http://git-wip-us.apache.org/repos/asf/syncope/blob/a45a46bb/client/console/src/main/resources/org/apache/syncope/client/console/pages/ResourceModalPage_pt_BR.properties
----------------------------------------------------------------------
diff --git a/client/console/src/main/resources/org/apache/syncope/client/console/pages/ResourceModalPage_pt_BR.properties b/client/console/src/main/resources/org/apache/syncope/client/console/pages/ResourceModalPage_pt_BR.properties
index a91df81..45c3616 100644
--- a/client/console/src/main/resources/org/apache/syncope/client/console/pages/ResourceModalPage_pt_BR.properties
+++ b/client/console/src/main/resources/org/apache/syncope/client/console/pages/ResourceModalPage_pt_BR.properties
@@ -28,7 +28,7 @@ extAttrNames=Atributos Externos
 intMappingTypes=Tipos internos de mapeamentos
 entity=Entidade
 groupSchema=Esquema de Grupo
-accountId=Identificador da Conta
+connObjectKey=ConnObjectKey
 mandatoryCondition=Obrigat\u00f3rio
 password=Senha
 purpose=Prop\u00f3sito
@@ -39,9 +39,9 @@ intAttrNames=Atributos internos
 enforceMandatoryCondition=Aplicar condi\u00e7\u00e3o obrigat\u00f3ria
 fieldName=Nome do Campo
 
-accountIdValidation=Precisa ser exatamente um Identificador de Conta
+connObjectKeyValidation=Precisa ser exatamente um ConnObjectKey
 propagationMode=Modo de propaga\u00e7\u00e3o
-accountLink=Link de Conta
+connObjectLink=ConnObjectLink
 enable=Habilitado
 
 createTraceLevel=Criar n\u00edvel de trace

http://git-wip-us.apache.org/repos/asf/syncope/blob/a45a46bb/client/console/src/main/resources/org/apache/syncope/client/console/panels/ResourceMappingPanel.html
----------------------------------------------------------------------
diff --git a/client/console/src/main/resources/org/apache/syncope/client/console/panels/ResourceMappingPanel.html b/client/console/src/main/resources/org/apache/syncope/client/console/panels/ResourceMappingPanel.html
index 0e145bb..fe6c4ef 100644
--- a/client/console/src/main/resources/org/apache/syncope/client/console/panels/ResourceMappingPanel.html
+++ b/client/console/src/main/resources/org/apache/syncope/client/console/panels/ResourceMappingPanel.html
@@ -43,7 +43,7 @@ under the License.
                 </span>
               </a>
             </th>
-            <th><wicket:message key="accountId"/></th>
+            <th><wicket:message key="connObjectKey"/></th>
             <th><label wicket:id="passwordLabel"/></th>
             <th><wicket:message key="purpose"/></th>
           </tr>
@@ -67,7 +67,7 @@ under the License.
               <span wicket:id="mandatoryCondition">[mandatoryCondition]</span>
             </td>
             <td>
-              <span wicket:id="accountId">[accountId]</span>
+              <span wicket:id="connObjectKey">[connObjectKey]</span>
             </td>
             <td>
               <span wicket:id="password">[password]</span>
@@ -90,21 +90,21 @@ under the License.
         </tfoot>
       </table>
 
-      <table id="accountLinkTable"
+      <table id="connObjectLinkTable"
              class="table"
              style="font-size: 1em;margin-top:2px;"
-             wicket:id="accountLinkContainer">
+             wicket:id="connObjectLinkContainer">
         <tbody>
           <tr>
             <th width="10%" align="left"><wicket:message key="enable"/></th>
-            <th align="left"><wicket:message key="accountLink"/></th>
+            <th align="left"><wicket:message key="connObjectLink"/></th>
           </tr>
           <tr>
             <td width="10%">
-              <span wicket:id="accountLinkCheckbox">[accountLinkCheckbox]</span>
+              <span wicket:id="connObjectLinkCheckbox">[connObjectLinkCheckbox]</span>
             </td>
             <td>
-              <span wicket:id="accountLink">[accountLink]</span>
+              <span wicket:id="connObjectLink">[connObjectLink]</span>
             </td>
           </tr>
         </tbody>

http://git-wip-us.apache.org/repos/asf/syncope/blob/a45a46bb/client/console/src/main/resources/org/apache/syncope/client/console/panels/Resources.html
----------------------------------------------------------------------
diff --git a/client/console/src/main/resources/org/apache/syncope/client/console/panels/Resources.html b/client/console/src/main/resources/org/apache/syncope/client/console/panels/Resources.html
deleted file mode 100644
index 3d02b33..0000000
--- a/client/console/src/main/resources/org/apache/syncope/client/console/panels/Resources.html
+++ /dev/null
@@ -1,52 +0,0 @@
-<!--
-Licensed to the Apache Software Foundation (ASF) under one
-or more contributor license agreements.  See the NOTICE file
-distributed with this work for additional information
-regarding copyright ownership.  The ASF licenses this file
-to you under the Apache License, Version 2.0 (the
-"License"); you may not use this file except in compliance
-with the License.  You may obtain a copy of the License at
-
-  http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing,
-software distributed under the License is distributed on an
-"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-KIND, either express or implied.  See the License for the
-specific language governing permissions and limitations
-under the License.
--->
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
-  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-
-<html xmlns="http://www.w3.org/1999/xhtml" xmlns:wicket="http://xmlns.jcp.org/jsf/composite">
-  <body>
-    <wicket:panel>
-
-      <div>
-        <div id="users-contain" class="ui-widget" style="width:inherit">
-          <span wicket:id="resourceContainer">
-            <span wicket:id="resourceDatatable">[resources]</span>
-          </span>
-
-          <span style="float:right">
-            <form wicket:id="resourcePaginatorForm" style="display:inline">
-              <label><wicket:message key="displayRows"/></label>
-              <select class="text ui-widget-content ui-corner-all" wicket:id="rowsChooser"/>
-            </form>
-          </span>
-        </div>
-
-        <div wicket:id="statusModal">[Show modal window for provisioning status]</div>
-        <div wicket:id="createResourceWin">[Show modal window for creating resource]</div>
-        <div wicket:id="editResourceWin">[Show modal window for editing resource]</div>
-        <div wicket:id="editConnectorWin">[Show modal window for editing connector]</div>
-
-        <a class="ui-button ui-widget ui-state-default ui-corner-all ui-button-text-only" wicket:id="createResourceLink">
-          <wicket:message key="create-resource"/>
-        </a>
-      </div>
-
-    </wicket:panel>
-  </body>
-</html>

http://git-wip-us.apache.org/repos/asf/syncope/blob/a45a46bb/client/console/src/main/resources/org/apache/syncope/client/console/panels/Resources.properties
----------------------------------------------------------------------
diff --git a/client/console/src/main/resources/org/apache/syncope/client/console/panels/Resources.properties b/client/console/src/main/resources/org/apache/syncope/client/console/panels/Resources.properties
deleted file mode 100644
index fb6b8a1..0000000
--- a/client/console/src/main/resources/org/apache/syncope/client/console/panels/Resources.properties
+++ /dev/null
@@ -1,34 +0,0 @@
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License.  You may obtain a copy of the License at
-#
-#   http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied.  See the License for the
-# specific language governing permissions and limitations
-# under the License.
-tab1=Resources
-edit=Edit
-delete=Delete
-create-resource=Create
-propagationPriority=Propagation priority
-propagationPrimary=Propagation primary
-
-tab2=Connectors
-displayName=Display name
-version=Version
-bundleName=Bundle name
-edit=Edit
-delete=Delete
-create-connector=Create
-delete_error=Operation forbidden:the connector you're trying to delete is connected to a Resource
-connector=Connector
-reloadConnectors=Reload connectors
-confirmReloadConnectors=This request is potentially dangerous for running operations, continue?

http://git-wip-us.apache.org/repos/asf/syncope/blob/a45a46bb/client/console/src/main/resources/org/apache/syncope/client/console/panels/Resources_it.properties
----------------------------------------------------------------------
diff --git a/client/console/src/main/resources/org/apache/syncope/client/console/panels/Resources_it.properties b/client/console/src/main/resources/org/apache/syncope/client/console/panels/Resources_it.properties
deleted file mode 100644
index 80a5185..0000000
--- a/client/console/src/main/resources/org/apache/syncope/client/console/panels/Resources_it.properties
+++ /dev/null
@@ -1,34 +0,0 @@
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License.  You may obtain a copy of the License at
-#
-#   http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied.  See the License for the
-# specific language governing permissions and limitations
-# under the License.
-tab1=Risorse
-edit=Modifica
-delete=Rimuovi
-create-resource=Crea
-propagationPriority=Priorit\u00e0 in propagazione
-propagationPrimary=Primaria in propagazione
-
-tab2=Connettori
-create-connector=Crea
-version=Versione
-bundleName=Bundle name
-edit=Modifica
-delete=Elimina
-delete_error=Operazione vietata: il connettore che si desidera rimuovere \u00e8 correlato ad una risorsa
-displayName=Nome visualizzato
-connector=Connettore
-reloadConnectors=Ricarica connettori
-confirmReloadConnectors=Questa richiesta \u00e8 potenzialmente dannosa per le operazioni in corso, proseguire?

http://git-wip-us.apache.org/repos/asf/syncope/blob/a45a46bb/client/console/src/main/resources/org/apache/syncope/client/console/panels/Resources_pt_BR.properties
----------------------------------------------------------------------
diff --git a/client/console/src/main/resources/org/apache/syncope/client/console/panels/Resources_pt_BR.properties b/client/console/src/main/resources/org/apache/syncope/client/console/panels/Resources_pt_BR.properties
deleted file mode 100644
index a631352..0000000
--- a/client/console/src/main/resources/org/apache/syncope/client/console/panels/Resources_pt_BR.properties
+++ /dev/null
@@ -1,32 +0,0 @@
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License.  You may obtain a copy of the License at
-#
-#   http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied.  See the License for the
-# specific language governing permissions and limitations
-# under the License.
-tab1=Recursos
-edit=Alterar
-delete=Excluir
-create-resource=Criar
-propagationPriority=Prioridade de propaga\u00e7\u00e3o
-propagationPrimary=Propaga\u00e7\u00e3o prim\u00e1ria
-
-tab2=Conectores
-displayName=Mostar
-version=Vers\u00e3o
-bundleName=Nome do Pacote
-create-connector=Criar
-delete_error=Opera\u00e7\u00e3o n\u00e3o permitida\: o conector que voc\u00ea est\u00e1 tentando excluir est\u00e1 conectado a um recurso
-connector=Conector
-reloadConnectors=Carregar Conector
-confirmReloadConnectors=Esta requis\u00e7\u00e3o \u00e9 potencialmente perigosa para opera\u00e7\u00f5es em execu\u00e7\u00e3o, prosseguir?

http://git-wip-us.apache.org/repos/asf/syncope/blob/a45a46bb/client/lib/src/main/java/org/apache/syncope/client/lib/SyncopeClient.java
----------------------------------------------------------------------
diff --git a/client/lib/src/main/java/org/apache/syncope/client/lib/SyncopeClient.java b/client/lib/src/main/java/org/apache/syncope/client/lib/SyncopeClient.java
index c981739..b744dc1 100644
--- a/client/lib/src/main/java/org/apache/syncope/client/lib/SyncopeClient.java
+++ b/client/lib/src/main/java/org/apache/syncope/client/lib/SyncopeClient.java
@@ -33,6 +33,7 @@ import org.apache.cxf.jaxrs.client.WebClient;
 import org.apache.syncope.client.lib.builders.ListQueryBuilder;
 import org.apache.syncope.client.lib.builders.AnyListQueryBuilder;
 import org.apache.syncope.client.lib.builders.AnySearchQueryBuilder;
+import org.apache.syncope.common.lib.search.AnyObjectFiqlSearchConditionBuilder;
 import org.apache.syncope.common.lib.search.OrderByClauseBuilder;
 import org.apache.syncope.common.lib.search.GroupFiqlSearchConditionBuilder;
 import org.apache.syncope.common.lib.search.UserFiqlSearchConditionBuilder;
@@ -89,6 +90,15 @@ public class SyncopeClient {
     }
 
     /**
+     * Returns a new instance of {@link AnyObjectFiqlSearchConditionBuilder}, for assisted building of FIQL queries.
+     *
+     * @return default instance of {@link AnyObjectFiqlSearchConditionBuilder}
+     */
+    public static AnyObjectFiqlSearchConditionBuilder getAnyObjectSearchConditionBuilder() {
+        return new AnyObjectFiqlSearchConditionBuilder();
+    }
+
+    /**
      * Returns a new instance of {@link OrderByClauseBuilder}, for assisted building of {@link orderby} clauses.
      *
      * @return default instance of {@link OrderByClauseBuilder}
@@ -119,8 +129,7 @@ public class SyncopeClient {
 
     /**
      * Returns a new instance of {@link AnySearchQueryBuilder}, for assisted building of some service's
-     * {@code search()}
-     * arguments.
+     * {@code search()} arguments.
      *
      * @return default instance of {@link AnySearchQueryBuilder}
      */

http://git-wip-us.apache.org/repos/asf/syncope/blob/a45a46bb/client/lib/src/main/java/org/apache/syncope/client/lib/builders/AnyListQueryBuilder.java
----------------------------------------------------------------------
diff --git a/client/lib/src/main/java/org/apache/syncope/client/lib/builders/AnyListQueryBuilder.java b/client/lib/src/main/java/org/apache/syncope/client/lib/builders/AnyListQueryBuilder.java
index 62e4bbe..afd29e9 100644
--- a/client/lib/src/main/java/org/apache/syncope/client/lib/builders/AnyListQueryBuilder.java
+++ b/client/lib/src/main/java/org/apache/syncope/client/lib/builders/AnyListQueryBuilder.java
@@ -45,6 +45,7 @@ public class AnyListQueryBuilder extends ListQueryBuilder {
         if (instance.getRealms() == null) {
             instance.setRealms(new ArrayList<String>());
         }
+        instance.getRealms().add(realm);
 
         return this;
     }

http://git-wip-us.apache.org/repos/asf/syncope/blob/a45a46bb/common/lib/src/main/java/org/apache/syncope/common/lib/mod/AnyMod.java
----------------------------------------------------------------------
diff --git a/common/lib/src/main/java/org/apache/syncope/common/lib/mod/AnyMod.java b/common/lib/src/main/java/org/apache/syncope/common/lib/mod/AnyMod.java
index e5fcb85..f84e65a 100644
--- a/common/lib/src/main/java/org/apache/syncope/common/lib/mod/AnyMod.java
+++ b/common/lib/src/main/java/org/apache/syncope/common/lib/mod/AnyMod.java
@@ -18,6 +18,7 @@
  */
 package org.apache.syncope.common.lib.mod;
 
+import com.fasterxml.jackson.annotation.JsonIgnore;
 import com.fasterxml.jackson.annotation.JsonProperty;
 import java.util.HashSet;
 import java.util.Set;
@@ -144,6 +145,7 @@ public abstract class AnyMod extends AbstractBaseBean {
     /**
      * @return true is all backing collections are empty.
      */
+    @JsonIgnore
     public boolean isEmpty() {
         return plainAttrsToUpdate.isEmpty() && plainAttrsToRemove.isEmpty()
                 && derAttrsToAdd.isEmpty() && derAttrsToRemove.isEmpty()

http://git-wip-us.apache.org/repos/asf/syncope/blob/a45a46bb/common/lib/src/main/java/org/apache/syncope/common/lib/search/AbstractFiqlSearchConditionBuilder.java
----------------------------------------------------------------------
diff --git a/common/lib/src/main/java/org/apache/syncope/common/lib/search/AbstractFiqlSearchConditionBuilder.java b/common/lib/src/main/java/org/apache/syncope/common/lib/search/AbstractFiqlSearchConditionBuilder.java
index 9279e72..0ace0b5 100644
--- a/common/lib/src/main/java/org/apache/syncope/common/lib/search/AbstractFiqlSearchConditionBuilder.java
+++ b/common/lib/src/main/java/org/apache/syncope/common/lib/search/AbstractFiqlSearchConditionBuilder.java
@@ -49,6 +49,7 @@ public abstract class AbstractFiqlSearchConditionBuilder extends FiqlSearchCondi
         return new Builder(properties);
     }
 
+    @Override
     public SyncopeProperty is(final String property) {
         return newBuilderInstance().is(property);
     }

http://git-wip-us.apache.org/repos/asf/syncope/blob/a45a46bb/common/lib/src/main/java/org/apache/syncope/common/lib/search/AnyObjectFiqlSearchConditionBuilder.java
----------------------------------------------------------------------
diff --git a/common/lib/src/main/java/org/apache/syncope/common/lib/search/AnyObjectFiqlSearchConditionBuilder.java b/common/lib/src/main/java/org/apache/syncope/common/lib/search/AnyObjectFiqlSearchConditionBuilder.java
new file mode 100644
index 0000000..67e7e15
--- /dev/null
+++ b/common/lib/src/main/java/org/apache/syncope/common/lib/search/AnyObjectFiqlSearchConditionBuilder.java
@@ -0,0 +1,71 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.syncope.common.lib.search;
+
+import java.util.Map;
+import org.apache.cxf.jaxrs.ext.search.client.CompleteCondition;
+
+/**
+ * Extends {@link AbstractFiqlSearchConditionBuilder} by providing some additional facilities for searching
+ * any objects in Syncope.
+ */
+public class AnyObjectFiqlSearchConditionBuilder extends AbstractFiqlSearchConditionBuilder {
+
+    public AnyObjectFiqlSearchConditionBuilder() {
+        super();
+    }
+
+    public AnyObjectFiqlSearchConditionBuilder(final Map<String, String> properties) {
+        super(properties);
+    }
+
+    @Override
+    protected Builder newBuilderInstance() {
+        return new Builder(properties);
+    }
+
+    @Override
+    public AnyObjectProperty is(final String property) {
+        return newBuilderInstance().is(property);
+    }
+
+    public CompleteCondition type(final String type) {
+        return newBuilderInstance().is(SpecialAttr.TYPE.toString()).equalTo(type);
+    }
+
+    protected static class Builder extends AbstractFiqlSearchConditionBuilder.Builder
+            implements AnyObjectProperty, CompleteCondition {
+
+        public Builder(final Map<String, String> properties) {
+            super(properties);
+        }
+
+        public Builder(final Builder parent) {
+            super(parent);
+        }
+
+        @Override
+        public AnyObjectProperty is(final String property) {
+            Builder b = new Builder(this);
+            b.result = property;
+            return b;
+        }
+
+    }
+}

http://git-wip-us.apache.org/repos/asf/syncope/blob/a45a46bb/common/lib/src/main/java/org/apache/syncope/common/lib/search/AnyObjectProperty.java
----------------------------------------------------------------------
diff --git a/common/lib/src/main/java/org/apache/syncope/common/lib/search/AnyObjectProperty.java b/common/lib/src/main/java/org/apache/syncope/common/lib/search/AnyObjectProperty.java
new file mode 100644
index 0000000..c675712
--- /dev/null
+++ b/common/lib/src/main/java/org/apache/syncope/common/lib/search/AnyObjectProperty.java
@@ -0,0 +1,23 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.syncope.common.lib.search;
+
+public interface AnyObjectProperty extends SyncopeProperty {
+
+}

http://git-wip-us.apache.org/repos/asf/syncope/blob/a45a46bb/common/lib/src/main/java/org/apache/syncope/common/lib/search/SpecialAttr.java
----------------------------------------------------------------------
diff --git a/common/lib/src/main/java/org/apache/syncope/common/lib/search/SpecialAttr.java b/common/lib/src/main/java/org/apache/syncope/common/lib/search/SpecialAttr.java
index 9877267..551a0ad 100644
--- a/common/lib/src/main/java/org/apache/syncope/common/lib/search/SpecialAttr.java
+++ b/common/lib/src/main/java/org/apache/syncope/common/lib/search/SpecialAttr.java
@@ -25,6 +25,7 @@ import org.apache.commons.collections4.Predicate;
 public enum SpecialAttr {
 
     NULL("$null"),
+    TYPE("$type"),
     RESOURCES("$resources"),
     GROUPS("$groups"),
     ROLES("$roles");

http://git-wip-us.apache.org/repos/asf/syncope/blob/a45a46bb/common/lib/src/main/java/org/apache/syncope/common/lib/to/ConnIdObjectClassTO.java
----------------------------------------------------------------------
diff --git a/common/lib/src/main/java/org/apache/syncope/common/lib/to/ConnIdObjectClassTO.java b/common/lib/src/main/java/org/apache/syncope/common/lib/to/ConnIdObjectClassTO.java
deleted file mode 100644
index c562b69..0000000
--- a/common/lib/src/main/java/org/apache/syncope/common/lib/to/ConnIdObjectClassTO.java
+++ /dev/null
@@ -1,74 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.syncope.common.lib.to;
-
-import javax.xml.bind.annotation.XmlEnum;
-import javax.xml.bind.annotation.XmlRootElement;
-import javax.xml.bind.annotation.XmlType;
-import org.apache.syncope.common.lib.AbstractBaseBean;
-
-/**
- * Mimic ConnId's ObjectClass information.
- */
-@XmlRootElement(name = "connIdObjectClass")
-@XmlType
-public class ConnIdObjectClassTO extends AbstractBaseBean {
-
-    private static final long serialVersionUID = 5802458031138859994L;
-
-    @XmlEnum
-    public enum DefaultType {
-
-        ACCOUNT("__ACCOUNT__"),
-        GROUP("__GROUP__");
-
-        private final String specialName;
-
-        private DefaultType(final String specialName) {
-            this.specialName = specialName;
-        }
-
-        public String getSpecialName() {
-            return specialName;
-        }
-    }
-
-    public static final ConnIdObjectClassTO ACCOUNT = new ConnIdObjectClassTO(DefaultType.ACCOUNT.getSpecialName());
-
-    public static final ConnIdObjectClassTO GROUP = new ConnIdObjectClassTO(DefaultType.GROUP.getSpecialName());
-
-    private String type;
-
-    public ConnIdObjectClassTO() {
-        super();
-    }
-
-    public ConnIdObjectClassTO(final String type) {
-        super();
-        this.type = type;
-    }
-
-    public String getType() {
-        return type;
-    }
-
-    public void setType(final String type) {
-        this.type = type;
-    }
-}

http://git-wip-us.apache.org/repos/asf/syncope/blob/a45a46bb/common/lib/src/main/java/org/apache/syncope/common/lib/to/MappingTO.java
----------------------------------------------------------------------
diff --git a/common/lib/src/main/java/org/apache/syncope/common/lib/to/MappingTO.java b/common/lib/src/main/java/org/apache/syncope/common/lib/to/MappingTO.java
index 92be8e1..c573278 100644
--- a/common/lib/src/main/java/org/apache/syncope/common/lib/to/MappingTO.java
+++ b/common/lib/src/main/java/org/apache/syncope/common/lib/to/MappingTO.java
@@ -61,7 +61,7 @@ public class MappingTO extends AbstractBaseBean {
     protected boolean addConnObjectKeyItem(final MappingItemTO connObjectItem) {
         if (IntMappingType.UserVirtualSchema == connObjectItem.getIntMappingType()
                 || IntMappingType.GroupVirtualSchema == connObjectItem.getIntMappingType()
-                || IntMappingType.AnyVirtualSchema == connObjectItem.getIntMappingType()
+                || IntMappingType.AnyObjectVirtualSchema == connObjectItem.getIntMappingType()
                 || IntMappingType.Password == connObjectItem.getIntMappingType()) {
 
             throw new IllegalArgumentException("Virtual attributes cannot be set as connObjectKey");

http://git-wip-us.apache.org/repos/asf/syncope/blob/a45a46bb/common/lib/src/main/java/org/apache/syncope/common/lib/types/IntMappingType.java
----------------------------------------------------------------------
diff --git a/common/lib/src/main/java/org/apache/syncope/common/lib/types/IntMappingType.java b/common/lib/src/main/java/org/apache/syncope/common/lib/types/IntMappingType.java
index 3537bc5..4588a36 100644
--- a/common/lib/src/main/java/org/apache/syncope/common/lib/types/IntMappingType.java
+++ b/common/lib/src/main/java/org/apache/syncope/common/lib/types/IntMappingType.java
@@ -53,10 +53,10 @@ public enum IntMappingType {
     // -------------------------
     // Any attribute types (the same in AnyMappingType)
     // -------------------------
-    AnyPlainSchema(AnyTypeKind.ANY_OBJECT),
-    AnyDerivedSchema(AnyTypeKind.ANY_OBJECT),
-    AnyVirtualSchema(AnyTypeKind.ANY_OBJECT),
-    AnyKey(AnyTypeKind.ANY_OBJECT);
+    AnyObjectPlainSchema(AnyTypeKind.ANY_OBJECT),
+    AnyObjectDerivedSchema(AnyTypeKind.ANY_OBJECT),
+    AnyObjectVirtualSchema(AnyTypeKind.ANY_OBJECT),
+    AnyObjectKey(AnyTypeKind.ANY_OBJECT);
 
     private final AnyTypeKind anyTypeKind;
 
@@ -119,7 +119,7 @@ public enum IntMappingType {
     public static Set<IntMappingType> getEmbedded() {
         return EnumSet.of(IntMappingType.UserKey, IntMappingType.Username, IntMappingType.Password,
                 IntMappingType.GroupKey, IntMappingType.GroupName, IntMappingType.GroupOwnerSchema,
-                IntMappingType.AnyKey);
+                IntMappingType.AnyObjectKey);
     }
 
     /**
@@ -192,10 +192,10 @@ public enum IntMappingType {
      */
     private enum AnyMappingType {
 
-        AnyPlainSchema,
-        AnyDerivedSchema,
-        AnyVirtualSchema,
-        AnyKey;
+        AnyObjectPlainSchema,
+        AnyObjectDerivedSchema,
+        AnyObjectVirtualSchema,
+        AnyObjectKey;
 
     }
 }

http://git-wip-us.apache.org/repos/asf/syncope/blob/a45a46bb/common/lib/src/main/java/org/apache/syncope/common/lib/wrap/ConnIdObjectClass.java
----------------------------------------------------------------------
diff --git a/common/lib/src/main/java/org/apache/syncope/common/lib/wrap/ConnIdObjectClass.java b/common/lib/src/main/java/org/apache/syncope/common/lib/wrap/ConnIdObjectClass.java
new file mode 100644
index 0000000..868b3f1
--- /dev/null
+++ b/common/lib/src/main/java/org/apache/syncope/common/lib/wrap/ConnIdObjectClass.java
@@ -0,0 +1,30 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.syncope.common.lib.wrap;
+
+import javax.xml.bind.annotation.XmlRootElement;
+import javax.xml.bind.annotation.XmlType;
+
+@XmlRootElement(name = "connIdObjectClass")
+@XmlType
+public class ConnIdObjectClass extends AbstractWrappable<String> {
+
+    private static final long serialVersionUID = 613925852330408531L;
+
+}

http://git-wip-us.apache.org/repos/asf/syncope/blob/a45a46bb/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
new file mode 100644
index 0000000..b460b54
--- /dev/null
+++ b/common/rest-api/src/main/java/org/apache/syncope/common/rest/api/service/AnyObjectService.java
@@ -0,0 +1,49 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.syncope.common.rest.api.service;
+
+import javax.ws.rs.BeanParam;
+import javax.ws.rs.GET;
+import javax.ws.rs.MatrixParam;
+import javax.ws.rs.Path;
+import javax.ws.rs.Produces;
+import javax.ws.rs.core.MediaType;
+import org.apache.syncope.common.lib.mod.AnyObjectMod;
+import org.apache.syncope.common.lib.to.AnyObjectTO;
+import org.apache.syncope.common.lib.to.PagedResult;
+import org.apache.syncope.common.rest.api.beans.AnyListQuery;
+
+/**
+ * REST operations for anyObjects.
+ */
+@Path("anyObjects")
+public interface AnyObjectService extends AnyService<AnyObjectTO, AnyObjectMod> {
+
+    /**
+     * Returns a paged list of existing any objects matching the given query, for the given type.
+     *
+     * @param type any type
+     * @param listQuery query conditions
+     * @return paged list of existing any objects matching the given query, for the given type
+     */
+    @GET
+    @Produces({ MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON })
+    PagedResult<AnyObjectTO> list(@MatrixParam("type") String type, @BeanParam AnyListQuery listQuery);
+
+}

http://git-wip-us.apache.org/repos/asf/syncope/blob/a45a46bb/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
new file mode 100644
index 0000000..90fbf7d
--- /dev/null
+++ b/common/rest-api/src/main/java/org/apache/syncope/common/rest/api/service/AnyService.java
@@ -0,0 +1,191 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.syncope.common.rest.api.service;
+
+import java.util.List;
+import javax.validation.constraints.NotNull;
+import javax.ws.rs.BeanParam;
+import javax.ws.rs.Consumes;
+import javax.ws.rs.DELETE;
+import javax.ws.rs.GET;
+import javax.ws.rs.POST;
+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.model.wadl.Description;
+import org.apache.cxf.jaxrs.model.wadl.Descriptions;
+import org.apache.cxf.jaxrs.model.wadl.DocTarget;
+import org.apache.syncope.common.lib.mod.AnyMod;
+import org.apache.syncope.common.lib.mod.ResourceAssociationMod;
+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.PagedResult;
+import org.apache.syncope.common.lib.types.ResourceAssociationActionType;
+import org.apache.syncope.common.lib.types.ResourceDeassociationActionType;
+import org.apache.syncope.common.lib.wrap.ResourceKey;
+import org.apache.syncope.common.rest.api.beans.AnyListQuery;
+import org.apache.syncope.common.rest.api.beans.AnySearchQuery;
+
+public interface AnyService<TO extends AnyTO, MOD extends AnyMod> extends JAXRSService {
+
+    /**
+     * Reads the any object matching the provided key.
+     *
+     * @param key key of any object to be read
+     * @return any object with matching id
+     */
+    @GET
+    @Path("{key}")
+    @Produces({ MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON })
+    TO read(@NotNull @PathParam("key") Long key);
+
+    /**
+     * Returns a paged list of existing any objects matching the given query.
+     *
+     * @param listQuery query conditions
+     * @return paged list of existing any objects matching the given query
+     */
+    @GET
+    @Produces({ MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON })
+    PagedResult<TO> list(@BeanParam AnyListQuery listQuery);
+
+    /**
+     * Returns a paged list of any objects matching the given query.
+     *
+     * @param searchQuery query conditions
+     * @return paged list of any objects matching the given query
+     */
+    @GET
+    @Path("search")
+    @Produces({ MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON })
+    PagedResult<TO> search(@BeanParam AnySearchQuery searchQuery);
+
+    /**
+     * Creates a new any object.
+     *
+     * @param anyTO any object to be created
+     * @return <tt>Response</tt> object featuring <tt>Location</tt> header of created any object as well as the any
+     * object itself enriched with propagation status information - {@link AnyTO} as <tt>Entity</tt>
+     */
+    @Descriptions({
+        @Description(target = DocTarget.RESPONSE,
+                value = "Featuring <tt>Location</tt> header of created any object as well as the "
+                + "any object itself enriched with propagation status information - "
+                + "<tt>AnyTO</tt> as <tt>Entity</tt>")
+    })
+    @POST
+    @Produces({ MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON })
+    @Consumes({ MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON })
+    Response create(@NotNull TO anyTO);
+
+    /**
+     * Updates any object matching the provided key.
+     *
+     * @param key key of any object to be updated
+     * @param anyMod modification to be applied to any object matching the provided key
+     * @return <tt>Response</tt> object featuring the updated any object enriched with propagation status information
+     * - {@link AnyTO} as <tt>Entity</tt>
+     */
+    @Descriptions({
+        @Description(target = DocTarget.RESPONSE,
+                value = "Featuring the updated any object enriched with propagation status information - "
+                + "<tt>AnyTO</tt> as <tt>Entity</tt>")
+    })
+    @POST
+    @Path("{key}")
+    @Produces({ MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON })
+    @Consumes({ MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON })
+    Response update(@NotNull @PathParam("key") Long key, @NotNull MOD anyMod);
+
+    /**
+     * Deletes any object matching provided key.
+     *
+     * @param key key of any object to be deleted
+     * @return <tt>Response</tt> object featuring the deleted any object enriched with propagation status information
+     * - {@link AnyTO} as <tt>Entity</tt>
+     */
+    @Descriptions({
+        @Description(target = DocTarget.RESPONSE,
+                value = "Featuring the deleted any object enriched with propagation status information - "
+                + "<tt>AnyTO</tt> as <tt>Entity</tt>")
+    })
+    @DELETE
+    @Path("{key}")
+    @Produces({ MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON })
+    @Consumes({ MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON })
+    Response delete(@NotNull @PathParam("key") Long key);
+
+    /**
+     * Executes resource-related operations on given any object.
+     *
+     * @param key any object id.
+     * @param type resource association action type
+     * @param resourceNames external resources to be used for propagation-related operations
+     * @return <tt>Response</tt> object featuring
+     * {@link BulkActionResult} as <tt>Entity</tt>
+     */
+    @Descriptions({
+        @Description(target = DocTarget.RESPONSE,
+                value = "Featuring <tt>BulkActionResult</tt> as <tt>Entity</tt>")
+    })
+    @POST
+    @Path("{key}/deassociate/{type}")
+    @Produces({ MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON })
+    @Consumes({ MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON })
+    Response bulkDeassociation(
+            @NotNull @PathParam("key") Long key,
+            @NotNull @PathParam("type") ResourceDeassociationActionType type,
+            @NotNull List<ResourceKey> resourceNames);
+
+    /**
+     * Executes resource-related operations on given any object.
+     *
+     * @param key any object id.
+     * @param type resource association action type
+     * @param associationMod external resources to be used for propagation-related operations
+     * @return <tt>Response</tt> object featuring {@link BulkActionResult} as <tt>Entity</tt>
+     */
+    @Descriptions({
+        @Description(target = DocTarget.RESPONSE,
+                value = "Featuring <tt>BulkActionResult</tt> as <tt>Entity</tt>")
+    })
+    @POST
+    @Path("{key}/associate/{type}")
+    @Produces({ MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON })
+    @Consumes({ MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON })
+    Response bulkAssociation(
+            @NotNull @PathParam("key") Long key,
+            @NotNull @PathParam("type") ResourceAssociationActionType type,
+            @NotNull ResourceAssociationMod associationMod);
+
+    /**
+     * Executes the provided bulk action.
+     *
+     * @param bulkAction list of any object ids against which the bulk action will be performed.
+     * @return Bulk action result
+     */
+    @POST
+    @Path("bulk")
+    @Produces({ MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON })
+    @Consumes({ MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON })
+    BulkActionResult bulk(@NotNull BulkAction bulkAction);
+}

http://git-wip-us.apache.org/repos/asf/syncope/blob/a45a46bb/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 07fc6a4..e0c240f 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
@@ -38,11 +38,11 @@ import org.apache.cxf.jaxrs.model.wadl.DocTarget;
 import org.apache.syncope.common.lib.to.BulkAction;
 import org.apache.syncope.common.lib.to.BulkActionResult;
 import org.apache.syncope.common.lib.to.ConnBundleTO;
-import org.apache.syncope.common.lib.to.ConnIdObjectClassTO;
 import org.apache.syncope.common.lib.to.ConnInstanceTO;
 import org.apache.syncope.common.lib.to.PlainSchemaTO;
 import org.apache.syncope.common.lib.types.ConnConfProperty;
 import org.apache.syncope.common.lib.wrap.BooleanWrap;
+import org.apache.syncope.common.lib.wrap.ConnIdObjectClass;
 
 /**
  * REST operations for connector bundles and instances.
@@ -100,7 +100,7 @@ public interface ConnectorService extends JAXRSService {
     @Path("{key}/supportedObjectClasses")
     @Produces({ MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON })
     @Consumes({ MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON })
-    List<ConnIdObjectClassTO> getSupportedObjectClasses(
+    List<ConnIdObjectClass> getSupportedObjectClasses(
             @NotNull @PathParam("key") Long key,
             @NotNull ConnInstanceTO connInstanceTO);