You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@syncope.apache.org by fm...@apache.org on 2015/12/10 18:04:18 UTC

syncope git commit: [SYNCOPE-156] fix for dynamic memberships

Repository: syncope
Updated Branches:
  refs/heads/master b578a788a -> 0d5ba39a3


[SYNCOPE-156] fix for dynamic memberships


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

Branch: refs/heads/master
Commit: 0d5ba39a3d935b733a4e79732d2a79cc7d6afda6
Parents: b578a78
Author: fmartelli <fa...@gmail.com>
Authored: Thu Dec 10 18:04:01 2015 +0100
Committer: fmartelli <fa...@gmail.com>
Committed: Thu Dec 10 18:04:01 2015 +0100

----------------------------------------------------------------------
 .../pages/AnyDisplayAttributesModalPage.java    |   2 +-
 .../pages/GroupDisplayAttributesModalPage.java  |   2 +-
 .../client/console/pages/StatusModal.java       | 158 +++++++++----------
 .../pages/UserDisplayAttributesModalPage.java   |   2 +-
 .../panels/AbstractSearchResultPanel.java       |   7 +-
 .../panels/AnyObjectSearchResultPanel.java      |  12 +-
 .../console/panels/GroupSearchResultPanel.java  |   9 +-
 .../client/console/panels/ListViewPanel.java    |   7 +-
 .../console/panels/UserSearchResultPanel.java   |  40 +++--
 .../client/console/wizards/WizardMgtPanel.java  |   5 +-
 .../client/console/wizards/any/AnyHandler.java  |  38 +++++
 .../console/wizards/any/AnyWizardBuilder.java   |  66 +++++---
 .../client/console/wizards/any/AuxClasses.java  |  72 ++++-----
 .../client/console/wizards/any/Details.java     |   4 +-
 .../console/wizards/any/GroupDetails.java       |  15 +-
 .../console/wizards/any/GroupHandler.java       |  99 ++++++++++++
 .../console/wizards/any/GroupWizardBuilder.java | 109 ++-----------
 .../client/console/wizards/any/UserDetails.java |  22 +--
 .../console/wizards/any/UserWizardBuilder.java  |  27 ++--
 .../panels/AbstractSearchResultPanel.properties |   4 +-
 20 files changed, 403 insertions(+), 297 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/syncope/blob/0d5ba39a/client/console/src/main/java/org/apache/syncope/client/console/pages/AnyDisplayAttributesModalPage.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/pages/AnyDisplayAttributesModalPage.java b/client/console/src/main/java/org/apache/syncope/client/console/pages/AnyDisplayAttributesModalPage.java
index 9c2eaef..d5731ff 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/pages/AnyDisplayAttributesModalPage.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/pages/AnyDisplayAttributesModalPage.java
@@ -38,7 +38,7 @@ public class AnyDisplayAttributesModalPage<T extends AnyTO> extends DisplayAttri
     public static final String[] ANY_DEFAULT_SELECTION = { "key" };
 
     public AnyDisplayAttributesModalPage(
-            final BaseModal<T> modal,
+            final BaseModal<?> modal,
             final PageReference pageRef,
             final List<String> schemaNames,
             final List<String> dSchemaNames) {

http://git-wip-us.apache.org/repos/asf/syncope/blob/0d5ba39a/client/console/src/main/java/org/apache/syncope/client/console/pages/GroupDisplayAttributesModalPage.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/pages/GroupDisplayAttributesModalPage.java b/client/console/src/main/java/org/apache/syncope/client/console/pages/GroupDisplayAttributesModalPage.java
index 9b33379..09dbb06 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/pages/GroupDisplayAttributesModalPage.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/pages/GroupDisplayAttributesModalPage.java
@@ -35,7 +35,7 @@ public class GroupDisplayAttributesModalPage extends DisplayAttributesModalPage
     public static final String[] GROUP_DEFAULT_SELECTION = { "key", "name" };
 
     public GroupDisplayAttributesModalPage(
-            final BaseModal<GroupTO> modal,
+            final BaseModal<?> modal,
             final PageReference pageRef,
             final List<String> schemaNames,
             final List<String> dSchemaNames) {

http://git-wip-us.apache.org/repos/asf/syncope/blob/0d5ba39a/client/console/src/main/java/org/apache/syncope/client/console/pages/StatusModal.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/pages/StatusModal.java b/client/console/src/main/java/org/apache/syncope/client/console/pages/StatusModal.java
index e6c7a27..8ee6357 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/pages/StatusModal.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/pages/StatusModal.java
@@ -103,7 +103,7 @@ public class StatusModal<T extends AnyTO> extends AbstractStatusModalPage {
     private final List<IColumn<StatusBean, String>> columns;
 
     public StatusModal(
-            final BaseModal<T> modal,
+            final BaseModal<?> modal,
             final PageReference pageRef,
             final AnyTO attributableTO) {
 
@@ -111,7 +111,7 @@ public class StatusModal<T extends AnyTO> extends AbstractStatusModalPage {
     }
 
     public StatusModal(
-            final BaseModal<T> modal,
+            final BaseModal<?> modal,
             final PageReference pageRef,
             final AnyTO anyTO,
             final boolean statusOnly) {
@@ -130,29 +130,29 @@ public class StatusModal<T extends AnyTO> extends AbstractStatusModalPage {
         columns.add(new AbstractColumn<StatusBean, String>(
                 new StringResourceModel("resourceName", this, null), "resourceName") {
 
-                    private static final long serialVersionUID = 2054811145491901166L;
+            private static final long serialVersionUID = 2054811145491901166L;
+
+            @Override
+            public void populateItem(
+                    final Item<ICellPopulator<StatusBean>> cellItem,
+                    final String componentId,
+                    final IModel<StatusBean> model) {
+
+                cellItem.add(new Label(componentId, model.getObject().getResourceName()) {
+
+                    private static final long serialVersionUID = 8432079838783825801L;
 
                     @Override
-                    public void populateItem(
-                            final Item<ICellPopulator<StatusBean>> cellItem,
-                            final String componentId,
-                            final IModel<StatusBean> model) {
-
-                                cellItem.add(new Label(componentId, model.getObject().getResourceName()) {
-
-                                    private static final long serialVersionUID = 8432079838783825801L;
-
-                                    @Override
-                                    protected void onComponentTag(final ComponentTag tag) {
-                                        if (model.getObject().isLinked()) {
-                                            super.onComponentTag(tag);
-                                        } else {
-                                            tag.put("style", "color: #DDDDDD");
-                                        }
-                                    }
-                                });
-                            }
+                    protected void onComponentTag(final ComponentTag tag) {
+                        if (model.getObject().isLinked()) {
+                            super.onComponentTag(tag);
+                        } else {
+                            tag.put("style", "color: #DDDDDD");
+                        }
+                    }
                 });
+            }
+        });
 
         columns.add(new PropertyColumn<StatusBean, String>(
                 new StringResourceModel("connObjectLink", this, null), "connObjectLink", "connObjectLink"));
@@ -160,27 +160,27 @@ public class StatusModal<T extends AnyTO> extends AbstractStatusModalPage {
         columns.add(new AbstractColumn<StatusBean, String>(
                 new StringResourceModel("status", this, null)) {
 
-                    private static final long serialVersionUID = -3503023501954863131L;
+            private static final long serialVersionUID = -3503023501954863131L;
 
-                    @Override
-                    public String getCssClass() {
-                        return "action";
-                    }
+            @Override
+            public String getCssClass() {
+                return "action";
+            }
 
-                    @Override
-                    public void populateItem(
-                            final Item<ICellPopulator<StatusBean>> cellItem,
-                            final String componentId,
-                            final IModel<StatusBean> model) {
-
-                                if (model.getObject().isLinked()) {
-                                    cellItem.add(statusUtils.getStatusImagePanel(componentId, model.getObject().
-                                                    getStatus()));
-                                } else {
-                                    cellItem.add(new Label(componentId, ""));
-                                }
-                            }
-                });
+            @Override
+            public void populateItem(
+                    final Item<ICellPopulator<StatusBean>> cellItem,
+                    final String componentId,
+                    final IModel<StatusBean> model) {
+
+                if (model.getObject().isLinked()) {
+                    cellItem.add(statusUtils.getStatusImagePanel(componentId, model.getObject().
+                            getStatus()));
+                } else {
+                    cellItem.add(new Label(componentId, ""));
+                }
+            }
+        });
 
         table = new ActionDataTablePanel<StatusBean, String>(
                 "resourceDatatable",
@@ -189,13 +189,13 @@ public class StatusModal<T extends AnyTO> extends AbstractStatusModalPage {
                 rowsPerPage,
                 pageRef) {
 
-                    private static final long serialVersionUID = 6510391461033818316L;
+            private static final long serialVersionUID = 6510391461033818316L;
 
-                    @Override
-                    public boolean isElementEnabled(final StatusBean element) {
-                        return !statusOnly || element.getStatus() != Status.OBJECT_NOT_FOUND;
-                    }
-                };
+            @Override
+            public boolean isElementEnabled(final StatusBean element) {
+                return !statusOnly || element.getStatus() != Status.OBJECT_NOT_FOUND;
+            }
+        };
         table.setOutputMarkupId(true);
 
         final String pageId = anyTO instanceof GroupTO ? "Groups" : "Users";
@@ -248,13 +248,13 @@ public class StatusModal<T extends AnyTO> extends AbstractStatusModalPage {
         final ClearIndicatingAjaxButton goon = new ClearIndicatingAjaxButton("continue", new ResourceModel("continue"),
                 pageRef) {
 
-                    private static final long serialVersionUID = -2341391430136818027L;
+            private static final long serialVersionUID = -2341391430136818027L;
 
-                    @Override
-                    protected void onSubmitInternal(final AjaxRequestTarget target, final Form<?> form) {
-                        // none
-                    }
-                };
+            @Override
+            protected void onSubmitInternal(final AjaxRequestTarget target, final Form<?> form) {
+                // none
+            }
+        };
 
         pwdMgtForm.add(goon);
 
@@ -555,18 +555,18 @@ public class StatusModal<T extends AnyTO> extends AbstractStatusModalPage {
         final ClearIndicatingAjaxButton goon = new ClearIndicatingAjaxButton("continue", new ResourceModel("continue",
                 "Continue"), pageRef) {
 
-                    private static final long serialVersionUID = -2341391430136818027L;
+            private static final long serialVersionUID = -2341391430136818027L;
 
-                    @Override
-                    protected void onSubmitInternal(final AjaxRequestTarget target, final Form<?> form) {
-                        try {
-                            if (StringUtils.isNotBlank(password.getModelObject())
+            @Override
+            protected void onSubmitInternal(final AjaxRequestTarget target, final Form<?> form) {
+                try {
+                    if (StringUtils.isNotBlank(password.getModelObject())
                             && !password.getModelObject().equals(confirm.getModelObject())) {
-                                throw new Exception(getString("passwordMismatch"));
-                            }
+                        throw new Exception(getString("passwordMismatch"));
+                    }
 
-                            final BulkActionResult bulkActionResult;
-                            switch (type) {
+                    final BulkActionResult bulkActionResult;
+                    switch (type) {
 //                                case ASSIGN:
 //                                    bulkActionResult = userRestClient.assign(
 //                                            anyTO.getETagValue(),
@@ -583,27 +583,27 @@ public class StatusModal<T extends AnyTO> extends AbstractStatusModalPage {
 //                                            changepwd.getModelObject(),
 //                                            password.getModelObject());
 //                                    break;
-                                default:
-                                    bulkActionResult = null;
-                                // ignore
-                            }
+                        default:
+                            bulkActionResult = null;
+                        // ignore
+                    }
 
-                            ((BasePage) pageRef.getPage()).setModalResult(true);
+                    ((BasePage) pageRef.getPage()).setModalResult(true);
 
-                            if (bulkActionResult != null) {
-                                loadBulkActionResultPage(target, selection, bulkActionResult);
-                            } else {
+                    if (bulkActionResult != null) {
+                        loadBulkActionResultPage(target, selection, bulkActionResult);
+                    } else {
 
-                                target.add(((BasePage) pageRef.getPage()).getFeedbackPanel());
-                                modal.close(target);
-                            }
-                        } catch (Exception e) {
-                            LOG.error("Error provisioning resources", e);
-                            error(getString(Constants.ERROR) + ": " + e.getMessage());
-                            modal.getFeedbackPanel().refresh(target);
-                        }
+                        target.add(((BasePage) pageRef.getPage()).getFeedbackPanel());
+                        modal.close(target);
                     }
-                }.feedbackPanelAutomaticReload(false);
+                } catch (Exception e) {
+                    LOG.error("Error provisioning resources", e);
+                    error(getString(Constants.ERROR) + ": " + e.getMessage());
+                    modal.getFeedbackPanel().refresh(target);
+                }
+            }
+        }.feedbackPanelAutomaticReload(false);
 
         pwdMgtForm.addOrReplace(goon);
 

http://git-wip-us.apache.org/repos/asf/syncope/blob/0d5ba39a/client/console/src/main/java/org/apache/syncope/client/console/pages/UserDisplayAttributesModalPage.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/pages/UserDisplayAttributesModalPage.java b/client/console/src/main/java/org/apache/syncope/client/console/pages/UserDisplayAttributesModalPage.java
index 2ce0a30..0529f9f 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/pages/UserDisplayAttributesModalPage.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/pages/UserDisplayAttributesModalPage.java
@@ -35,7 +35,7 @@ public class UserDisplayAttributesModalPage extends DisplayAttributesModalPage {
     public static final String[] USER_DEFAULT_SELECTION = { "key", "username", "status" };
 
     public UserDisplayAttributesModalPage(
-            final BaseModal<UserTO> modal,
+            final BaseModal<?> modal,
             final PageReference pageRef,
             final List<String> schemaNames,
             final List<String> dSchemaNames) {

http://git-wip-us.apache.org/repos/asf/syncope/blob/0d5ba39a/client/console/src/main/java/org/apache/syncope/client/console/panels/AbstractSearchResultPanel.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/panels/AbstractSearchResultPanel.java b/client/console/src/main/java/org/apache/syncope/client/console/panels/AbstractSearchResultPanel.java
index 9c534d0..d3bdd34 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/panels/AbstractSearchResultPanel.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/panels/AbstractSearchResultPanel.java
@@ -28,6 +28,7 @@ import org.apache.syncope.client.console.rest.AbstractAnyRestClient;
 import org.apache.syncope.client.console.wicket.markup.html.bootstrap.dialog.BaseModal;
 import org.apache.syncope.client.console.wicket.markup.html.form.ActionLink;
 import org.apache.syncope.client.console.wizards.WizardMgtPanel;
+import org.apache.syncope.client.console.wizards.any.AnyHandler;
 import org.apache.syncope.common.lib.to.AnyTO;
 import org.apache.wicket.PageReference;
 import org.apache.wicket.ajax.AjaxRequestTarget;
@@ -43,7 +44,7 @@ import org.apache.wicket.model.PropertyModel;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-public abstract class AbstractSearchResultPanel<T extends AnyTO> extends WizardMgtPanel<T> {
+public abstract class AbstractSearchResultPanel<T extends AnyTO> extends WizardMgtPanel<AnyHandler<T>> {
 
     private static final long serialVersionUID = -9170191461250434024L;
 
@@ -294,7 +295,7 @@ public abstract class AbstractSearchResultPanel<T extends AnyTO> extends WizardM
 
     protected abstract String getPageId();
 
-    public abstract static class Builder<T extends AnyTO> extends WizardMgtPanel.Builder<T> {
+    public abstract static class Builder<T extends AnyTO> extends WizardMgtPanel.Builder<AnyHandler<T>> {
 
         private static final long serialVersionUID = 5088962796986706805L;
 
@@ -330,7 +331,7 @@ public abstract class AbstractSearchResultPanel<T extends AnyTO> extends WizardM
                 final String realm,
                 final String type) {
 
-            super(reference, pageRef);
+            super(pageRef);
             this.filtered = filtered;
             this.fiql = fiql;
             this.restClient = restClient;

http://git-wip-us.apache.org/repos/asf/syncope/blob/0d5ba39a/client/console/src/main/java/org/apache/syncope/client/console/panels/AnyObjectSearchResultPanel.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/panels/AnyObjectSearchResultPanel.java b/client/console/src/main/java/org/apache/syncope/client/console/panels/AnyObjectSearchResultPanel.java
index 0d9c7ed..2bb56d7 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/panels/AnyObjectSearchResultPanel.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/panels/AnyObjectSearchResultPanel.java
@@ -36,6 +36,7 @@ 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.wizards.AjaxWizard;
 import org.apache.syncope.client.console.wizards.WizardMgtPanel;
+import org.apache.syncope.client.console.wizards.any.AnyHandler;
 import org.apache.syncope.common.lib.SyncopeClientException;
 import org.apache.syncope.common.lib.to.AnyTO;
 import org.apache.syncope.common.lib.to.AnyTypeClassTO;
@@ -144,23 +145,24 @@ public class AnyObjectSearchResultPanel<T extends AnyTO> extends AbstractSearchR
                     private static final long serialVersionUID = -7978723352517770644L;
 
                     @Override
-                    public void onClick(final AjaxRequestTarget target, final AnyTO anyTO) {
+                    public void onClick(final AjaxRequestTarget target, final T ignore) {
                         send(AnyObjectSearchResultPanel.this, Broadcast.EXACT,
-                                new AjaxWizard.EditItemActionEvent<>(model.getObject(), target));
+                                new AjaxWizard.EditItemActionEvent<AnyHandler<T>>(
+                                        new AnyHandler<T>(model.getObject()), target));
                     }
                 }, ActionLink.ActionType.EDIT, entitlement).add(new ActionLink<T>() {
 
                     private static final long serialVersionUID = -7978723352517770644L;
 
                     @Override
-                    public void onClick(final AjaxRequestTarget target, final T anyTO) {
+                    public void onClick(final AjaxRequestTarget target, final T ignore) {
                         try {
                             restClient.delete(model.getObject().getETagValue(), model.getObject().getKey());
                             info(getString(Constants.OPERATION_SUCCEEDED));
                             target.add(container);
                         } catch (SyncopeClientException e) {
                             error(getString(Constants.ERROR) + ": " + e.getMessage());
-                            LOG.error("While deleting object {}", anyTO.getKey(), e);
+                            LOG.error("While deleting object {}", model.getObject().getKey(), e);
                         }
                         ((BasePage) getPage()).getFeedbackPanel().refresh(target);
                     }
@@ -241,7 +243,7 @@ public class AnyObjectSearchResultPanel<T extends AnyTO> extends AbstractSearchR
         }
 
         @Override
-        protected WizardMgtPanel<AnyObjectTO> newInstance(final String parentId) {
+        protected WizardMgtPanel<AnyHandler<AnyObjectTO>> newInstance(final String parentId) {
             return new AnyObjectSearchResultPanel<>(
                     type, parentId, filtered, fiql, pageRef, restClient, anyTypeClassTOs, realm, type + "_LIST");
         }

http://git-wip-us.apache.org/repos/asf/syncope/blob/0d5ba39a/client/console/src/main/java/org/apache/syncope/client/console/panels/GroupSearchResultPanel.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/panels/GroupSearchResultPanel.java b/client/console/src/main/java/org/apache/syncope/client/console/panels/GroupSearchResultPanel.java
index 86ccb13..eb692f8 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/panels/GroupSearchResultPanel.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/panels/GroupSearchResultPanel.java
@@ -36,6 +36,8 @@ import org.apache.syncope.client.console.wicket.markup.html.form.ActionLink.Acti
 import org.apache.syncope.client.console.wicket.markup.html.form.ActionLinksPanel;
 import org.apache.syncope.client.console.wizards.AjaxWizard;
 import org.apache.syncope.client.console.wizards.WizardMgtPanel;
+import org.apache.syncope.client.console.wizards.any.AnyHandler;
+import org.apache.syncope.client.console.wizards.any.GroupHandler;
 import org.apache.syncope.common.lib.SyncopeClientException;
 import org.apache.syncope.common.lib.to.AnyTO;
 import org.apache.syncope.common.lib.to.AnyTypeClassTO;
@@ -122,7 +124,8 @@ public final class GroupSearchResultPanel extends AnyObjectSearchResultPanel<Gro
                     @Override
                     public void onClick(final AjaxRequestTarget target, final GroupTO anyTO) {
                         send(GroupSearchResultPanel.this, Broadcast.EXACT,
-                                new AjaxWizard.EditItemActionEvent<AnyTO>(model.getObject(), target));
+                                new AjaxWizard.EditItemActionEvent<GroupHandler>(
+                                        new GroupHandler(model.getObject()), target));
                     }
                 }, ActionLink.ActionType.EDIT, entitlement).add(new ActionLink<GroupTO>() {
 
@@ -136,7 +139,7 @@ public final class GroupSearchResultPanel extends AnyObjectSearchResultPanel<Gro
                             target.add(container);
                         } catch (SyncopeClientException e) {
                             error(getString(Constants.ERROR) + ": " + e.getMessage());
-                            LOG.error("While deleting object {}", anyTO.getKey(), e);
+                            LOG.error("While deleting object {}", model.getObject().getKey(), e);
                         }
                         ((BasePage) getPage()).getFeedbackPanel().refresh(target);
 
@@ -243,7 +246,7 @@ public final class GroupSearchResultPanel extends AnyObjectSearchResultPanel<Gro
         }
 
         @Override
-        protected WizardMgtPanel<GroupTO> newInstance(final String parentId) {
+        protected WizardMgtPanel<AnyHandler<GroupTO>> newInstance(final String parentId) {
             return new GroupSearchResultPanel(
                     type, parentId, filtered, fiql, pageRef, restClient, anyTypeClassTOs, realm,
                     StandardEntitlement.GROUP_SEARCH);

http://git-wip-us.apache.org/repos/asf/syncope/blob/0d5ba39a/client/console/src/main/java/org/apache/syncope/client/console/panels/ListViewPanel.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/panels/ListViewPanel.java b/client/console/src/main/java/org/apache/syncope/client/console/panels/ListViewPanel.java
index be47039..69e69d7 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/panels/ListViewPanel.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/panels/ListViewPanel.java
@@ -232,8 +232,11 @@ public abstract class ListViewPanel<T extends Serializable> extends WizardMgtPan
 
         private boolean reuseItem = true;
 
+        private final Class<T> reference;
+
         public Builder(final Class<T> reference, final PageReference pageRef) {
-            super(reference, pageRef);
+            super(pageRef);
+            this.reference = reference;
             this.items = null;
             this.actions = ActionLinksPanel.<T>builder(pageRef);
         }
@@ -358,7 +361,7 @@ public abstract class ListViewPanel<T extends Serializable> extends WizardMgtPan
 
             final T item = ((AjaxWizard.NewItemEvent<T>) event.getPayload()).getItem();
             final AjaxRequestTarget target = ((AjaxWizard.NewItemEvent<T>) event.getPayload()).getTarget();
-            
+
             if (event.getPayload() instanceof AjaxWizard.NewItemFinishEvent) {
                 if (item != null && !this.listOfItems.contains(item)) {
                     this.listOfItems.add(item);

http://git-wip-us.apache.org/repos/asf/syncope/blob/0d5ba39a/client/console/src/main/java/org/apache/syncope/client/console/panels/UserSearchResultPanel.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/panels/UserSearchResultPanel.java b/client/console/src/main/java/org/apache/syncope/client/console/panels/UserSearchResultPanel.java
index 3e7ce11..7bc12b3 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/panels/UserSearchResultPanel.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/panels/UserSearchResultPanel.java
@@ -38,6 +38,7 @@ import org.apache.syncope.client.console.wicket.markup.html.form.ActionLink.Acti
 import org.apache.syncope.client.console.wicket.markup.html.form.ActionLinksPanel;
 import org.apache.syncope.client.console.wizards.AjaxWizard;
 import org.apache.syncope.client.console.wizards.WizardMgtPanel;
+import org.apache.syncope.client.console.wizards.any.AnyHandler;
 import org.apache.syncope.common.lib.SyncopeClientException;
 import org.apache.syncope.common.lib.to.AnyTO;
 import org.apache.syncope.common.lib.to.AnyTypeClassTO;
@@ -126,14 +127,16 @@ public final class UserSearchResultPanel extends AnyObjectSearchResultPanel<User
                     private static final long serialVersionUID = -7978723352517770644L;
 
                     @Override
-                    public void onClick(final AjaxRequestTarget target, final UserTO anyTO) {
-                        final IModel<UserTO> model = new CompoundPropertyModel<>(anyTO);
-                        modal.setFormModel(model);
+                    public void onClick(final AjaxRequestTarget target, final UserTO ignore) {
+                        final IModel<AnyHandler<UserTO>> formModel
+                                = new CompoundPropertyModel<>(new AnyHandler<UserTO>(model.getObject()));
+                        modal.setFormModel(formModel);
 
-                        target.add(modal.
-                                setContent(new StatusModal<>(modal, page.getPageReference(), model.getObject())));
+                        target.add(modal.setContent(new StatusModal<>(
+                                modal, page.getPageReference(), formModel.getObject().getInnerObject())));
 
-                        modal.header(new Model<>(MessageFormat.format(getString("any.edit"), anyTO.getKey())));
+                        modal.header(new Model<>(MessageFormat.format(
+                                getString("any.edit"), model.getObject().getKey())));
                         modal.show(true);
                     }
                 }, ActionLink.ActionType.MANAGE_RESOURCES, StandardEntitlement.USER_LIST).add(new ActionLink<UserTO>() {
@@ -141,14 +144,16 @@ public final class UserSearchResultPanel extends AnyObjectSearchResultPanel<User
                     private static final long serialVersionUID = -7978723352517770644L;
 
                     @Override
-                    public void onClick(final AjaxRequestTarget target, final UserTO anyTO) {
-                        final IModel<UserTO> model = new CompoundPropertyModel<>(anyTO);
-                        modal.setFormModel(model);
+                    public void onClick(final AjaxRequestTarget target, final UserTO ignore) {
+                        final IModel<AnyHandler<UserTO>> formModel
+                                = new CompoundPropertyModel<>(new AnyHandler<UserTO>(model.getObject()));
+                        modal.setFormModel(formModel);
 
-                        target.add(modal.setContent(new StatusModal<>(modal, page.getPageReference(), model.getObject(),
-                                true)));
+                        target.add(modal.setContent(new StatusModal<>(
+                                modal, page.getPageReference(), formModel.getObject().getInnerObject(), true)));
 
-                        modal.header(new Model<>(MessageFormat.format(getString("any.edit"), anyTO.getKey())));
+                        modal.header(new Model<>(MessageFormat.format(
+                                getString("any.edit"), model.getObject().getKey())));
                         modal.show(true);
                     }
                 }, ActionLink.ActionType.ENABLE, entitlement).add(new ActionLink<UserTO>() {
@@ -156,23 +161,24 @@ public final class UserSearchResultPanel extends AnyObjectSearchResultPanel<User
                     private static final long serialVersionUID = -7978723352517770644L;
 
                     @Override
-                    public void onClick(final AjaxRequestTarget target, final UserTO modelObject) {
+                    public void onClick(final AjaxRequestTarget target, final UserTO ignore) {
                         send(UserSearchResultPanel.this, Broadcast.EXACT,
-                                new AjaxWizard.EditItemActionEvent<AnyTO>(model.getObject(), target));
+                                new AjaxWizard.EditItemActionEvent<AnyHandler<UserTO>>(
+                                        new AnyHandler<UserTO>(model.getObject()), target));
                     }
                 }, ActionLink.ActionType.EDIT, entitlement).add(new ActionLink<UserTO>() {
 
                     private static final long serialVersionUID = -7978723352517770644L;
 
                     @Override
-                    public void onClick(final AjaxRequestTarget target, final UserTO anyTO) {
+                    public void onClick(final AjaxRequestTarget target, final UserTO ignore) {
                         try {
                             restClient.delete(model.getObject().getETagValue(), model.getObject().getKey());
                             info(getString(Constants.OPERATION_SUCCEEDED));
                             target.add(container);
                         } catch (SyncopeClientException e) {
                             error(getString(Constants.ERROR) + ": " + e.getMessage());
-                            LOG.error("While deleting object {}", anyTO.getKey(), e);
+                            LOG.error("While deleting object {}", model.getObject().getKey(), e);
                         }
                         ((BasePage) getPage()).getFeedbackPanel().refresh(target);
                     }
@@ -252,7 +258,7 @@ public final class UserSearchResultPanel extends AnyObjectSearchResultPanel<User
         }
 
         @Override
-        protected WizardMgtPanel<UserTO> newInstance(final String parentId) {
+        protected WizardMgtPanel<AnyHandler<UserTO>> newInstance(final String parentId) {
             return new UserSearchResultPanel(
                     type, parentId, filtered, fiql, pageRef, restClient, anyTypeClassTOs, realm,
                     StandardEntitlement.USER_LIST);

http://git-wip-us.apache.org/repos/asf/syncope/blob/0d5ba39a/client/console/src/main/java/org/apache/syncope/client/console/wizards/WizardMgtPanel.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/wizards/WizardMgtPanel.java b/client/console/src/main/java/org/apache/syncope/client/console/wizards/WizardMgtPanel.java
index 5cf7513..dcf83bf 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/wizards/WizardMgtPanel.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/wizards/WizardMgtPanel.java
@@ -183,15 +183,12 @@ public abstract class WizardMgtPanel<T extends Serializable> extends Panel imple
 
         protected final PageReference pageRef;
 
-        protected final Class<T> reference;
-
         private AjaxWizardBuilder<T> newItemPanelBuilder;
 
         private NotificationPanel notificationPanel;
 
-        protected Builder(final Class<T> reference, final PageReference pageRef) {
+        protected Builder(final PageReference pageRef) {
             this.pageRef = pageRef;
-            this.reference = reference;
         }
 
         protected abstract WizardMgtPanel<T> newInstance(final String id);

http://git-wip-us.apache.org/repos/asf/syncope/blob/0d5ba39a/client/console/src/main/java/org/apache/syncope/client/console/wizards/any/AnyHandler.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/wizards/any/AnyHandler.java b/client/console/src/main/java/org/apache/syncope/client/console/wizards/any/AnyHandler.java
new file mode 100644
index 0000000..4e1b13c
--- /dev/null
+++ b/client/console/src/main/java/org/apache/syncope/client/console/wizards/any/AnyHandler.java
@@ -0,0 +1,38 @@
+/*
+ * 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.wizards.any;
+
+import java.io.Serializable;
+import org.apache.syncope.common.lib.to.AnyTO;
+
+public class AnyHandler<T extends AnyTO> implements Serializable {
+
+    private static final long serialVersionUID = 8058288034211558375L;
+
+    protected final T anyTO;
+
+    public AnyHandler(final T anyTO) {
+        this.anyTO = anyTO;
+    }
+
+    public T getInnerObject() {
+        return anyTO;
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/syncope/blob/0d5ba39a/client/console/src/main/java/org/apache/syncope/client/console/wizards/any/AnyWizardBuilder.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/wizards/any/AnyWizardBuilder.java b/client/console/src/main/java/org/apache/syncope/client/console/wizards/any/AnyWizardBuilder.java
index 6ccf566..3c321dd 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/wizards/any/AnyWizardBuilder.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/wizards/any/AnyWizardBuilder.java
@@ -34,7 +34,8 @@ import org.apache.wicket.PageReference;
 import org.apache.wicket.extensions.wizard.WizardModel;
 import org.apache.wicket.model.util.ListModel;
 
-public class AnyWizardBuilder<T extends AnyTO> extends AjaxWizardBuilder<T> implements Serializable {
+public class AnyWizardBuilder<T extends AnyTO> extends AjaxWizardBuilder<AnyHandler<T>>
+        implements Serializable {
 
     private static final long serialVersionUID = -2480279868319546243L;
 
@@ -52,62 +53,85 @@ public class AnyWizardBuilder<T extends AnyTO> extends AjaxWizardBuilder<T> impl
      */
     public AnyWizardBuilder(
             final String id, final T anyTO, final List<String> anyTypeClasses, final PageReference pageRef) {
-        super(id, anyTO, pageRef);
+        super(id, new AnyHandler<T>(anyTO), pageRef);
+        this.anyTypeClasses = anyTypeClasses;
+    }
+
+    /**
+     * Construct.
+     *
+     * @param id The component id
+     * @param handler any handler
+     * @param anyTypeClasses any type classes
+     * @param pageRef Caller page reference.
+     */
+    public AnyWizardBuilder(
+            final String id,
+            final AnyHandler<T> handler,
+            final List<String> anyTypeClasses,
+            final PageReference pageRef) {
+        super(id, handler, pageRef);
         this.anyTypeClasses = anyTypeClasses;
     }
 
     @Override
-    protected WizardModel buildModelSteps(final T modelObject, final WizardModel wizardModel) {
+    protected WizardModel buildModelSteps(final AnyHandler<T> modelObject, final WizardModel wizardModel) {
         final String[] clazzes = anyTypeClasses.toArray(new String[] {});
         // optional details panel step
         addOptionalDetailsPanel(modelObject, wizardModel);
 
-        wizardModel.add(new AuxClasses(modelObject, clazzes));
+        wizardModel.add(new AuxClasses(modelObject.getInnerObject(), clazzes));
 
         // attributes panel steps
-        wizardModel.add(new PlainAttrs(modelObject, null, Mode.ADMIN, clazzes));
-        wizardModel.add(new DerAttrs(modelObject, clazzes));
-        wizardModel.add(new VirAttrs(modelObject, clazzes));
+        wizardModel.add(new PlainAttrs(modelObject.getInnerObject(), null, Mode.ADMIN, clazzes));
+        wizardModel.add(new DerAttrs(modelObject.getInnerObject(), clazzes));
+        wizardModel.add(new VirAttrs(modelObject.getInnerObject(), clazzes));
 
         // role panel step (jst available for users)
-        if ((this instanceof UserWizardBuilder) && (modelObject instanceof UserTO)) {
-            wizardModel.add(new Roles(UserTO.class.cast(modelObject)));
+        if ((this instanceof UserWizardBuilder) && (modelObject.getInnerObject() instanceof UserTO)) {
+            wizardModel.add(new Roles(UserTO.class.cast(modelObject.getInnerObject())));
         }
 
         // resource panel step
-        wizardModel.add(new Resources(modelObject));
+        wizardModel.add(new Resources(modelObject.getInnerObject()));
         return wizardModel;
     }
 
     @Override
-    protected void onCancelInternal(final T modelObject) {
+    protected void onCancelInternal(final AnyHandler<T> modelObject) {
         // do nothing
     }
 
     @Override
-    protected void onApplyInternal(final T modelObject) {
-        if (!(modelObject instanceof AnyObjectTO)) {
+    protected void onApplyInternal(final AnyHandler<T> modelObject) {
+        final T obj = modelObject.getInnerObject();
+
+        if (!(obj instanceof AnyObjectTO)) {
             throw new IllegalArgumentException();
         }
 
         final ProvisioningResult<AnyObjectTO> actual;
 
-        if (modelObject.getKey() == 0) {
-            actual = anyTypeRestClient.create(AnyObjectTO.class.cast(modelObject));
+        if (obj.getKey() == 0) {
+            actual = anyTypeRestClient.create(AnyObjectTO.class.cast(obj));
         } else {
-            final AnyObjectPatch patch = AnyOperations.diff(modelObject, getOriginalItem(), true);
+            final AnyObjectPatch patch = AnyOperations.diff(obj, getOriginalItem().getInnerObject(), true);
 
             // update user just if it is changed
             if (!patch.isEmpty()) {
-                actual = anyTypeRestClient.update(getOriginalItem().getETagValue(), patch);
+                actual = anyTypeRestClient.update(getOriginalItem().getInnerObject().getETagValue(), patch);
             }
         }
     }
 
-    protected AnyWizardBuilder<T> addOptionalDetailsPanel(final T modelObject, final WizardModel wizardModel) {
-        if (modelObject.getKey() > 0) {
-            wizardModel.add(
-                    new Details<T>(modelObject, new ListModel<>(Collections.<StatusBean>emptyList()), pageRef, true));
+    protected AnyWizardBuilder<T> addOptionalDetailsPanel(
+            final AnyHandler<T> modelObject, final WizardModel wizardModel) {
+        if (modelObject.getInnerObject().getKey() > 0) {
+            wizardModel.add(new Details<T>(
+                    modelObject,
+                    new ListModel<>(Collections.<StatusBean>emptyList()),
+                    pageRef,
+                    true));
         }
         return this;
     }

http://git-wip-us.apache.org/repos/asf/syncope/blob/0d5ba39a/client/console/src/main/java/org/apache/syncope/client/console/wizards/any/AuxClasses.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/wizards/any/AuxClasses.java b/client/console/src/main/java/org/apache/syncope/client/console/wizards/any/AuxClasses.java
index e90be42..4f2beb0 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/wizards/any/AuxClasses.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/wizards/any/AuxClasses.java
@@ -89,56 +89,56 @@ public class AuxClasses extends WizardStep {
                         @Override
                         public MembershipTO getObject(
                                 final String id, final IModel<? extends List<? extends MembershipTO>> choices) {
-                                    for (MembershipTO membershipTO : choices.getObject()) {
-                                        if (id.equalsIgnoreCase(membershipTO.getGroupName())) {
-                                            return membershipTO;
-                                        }
-                                    }
-                                    return null;
+                            for (MembershipTO membershipTO : choices.getObject()) {
+                                if (id.equalsIgnoreCase(membershipTO.getGroupName())) {
+                                    return membershipTO;
                                 }
+                            }
+                            return null;
+                        }
                     });
 
             fragment.add(builder.setAllowOrder(true).withFilter().build(
                     "groups", new ListModel<MembershipTO>(memberships),
                     new AjaxPalettePanel.Builder.Query<MembershipTO>() {
 
-                        private static final long serialVersionUID = 1L;
+                private static final long serialVersionUID = 1L;
+
+                @Override
+                public List<MembershipTO> execute(final String filter) {
+                    return CollectionUtils.collect(
+                            groupRestClient.search(
+                                    entityTO.getRealm(),
+                                    SyncopeClient.getGroupSearchConditionBuilder().
+                                    isAssignable().and().is("name").equalTo(filter).query(),
+                                    -1, -1,
+                                    new SortParam<>("name", true),
+                                    null),
+                            new Transformer<GroupTO, MembershipTO>() {
 
                         @Override
-                        public List<MembershipTO> execute(final String filter) {
-                            return CollectionUtils.collect(
-                                    groupRestClient.search(
-                                            entityTO.getRealm(),
-                                            SyncopeClient.getGroupSearchConditionBuilder().
-                                            isAssignable().and().is("name").equalTo(filter).query(),
-                                            -1, -1,
-                                            new SortParam<>("name", true),
-                                            null),
-                                    new Transformer<GroupTO, MembershipTO>() {
-
-                                        @Override
-                                        public MembershipTO transform(final GroupTO input) {
-                                            final MembershipTO membershipTO = new MembershipTO();
-                                            membershipTO.setGroupName(input.getName());
-                                            membershipTO.setRightKey(input.getKey());
-                                            membershipTO.setRightType(input.getType());
-                                            membershipTO.setLeftKey(entityTO.getKey());
-                                            membershipTO.setLeftType(entityTO.getType());
-                                            return membershipTO;
-                                        }
-                                    }, new ArrayList<MembershipTO>());
+                        public MembershipTO transform(final GroupTO input) {
+                            final MembershipTO membershipTO = new MembershipTO();
+                            membershipTO.setGroupName(input.getName());
+                            membershipTO.setRightKey(input.getKey());
+                            membershipTO.setRightType(input.getType());
+                            membershipTO.setLeftKey(entityTO.getKey());
+                            membershipTO.setLeftType(entityTO.getType());
+                            return membershipTO;
                         }
-                    }).setOutputMarkupId(true));
+                    }, new ArrayList<MembershipTO>());
+                }
+            }).setOutputMarkupId(true));
 
             final ArrayList<String> dynamics = CollectionUtils.collect(dyngroups,
                     new Transformer<Long, String>() {
 
-                        @Override
-                        public String transform(final Long input) {
-                            final GroupTO groupTO = groupRestClient.read(input);
-                            return String.format("[%d] %s", groupTO.getKey(), groupTO.getName());
-                        }
-                    }, new ArrayList<String>());
+                @Override
+                public String transform(final Long input) {
+                    final GroupTO groupTO = groupRestClient.read(input);
+                    return String.format("[%d] %s", groupTO.getKey(), groupTO.getName());
+                }
+            }, new ArrayList<String>());
 
             fragment.add(new AjaxPalettePanel.Builder<String>().setAllowOrder(true).build(
                     "dyngroups",

http://git-wip-us.apache.org/repos/asf/syncope/blob/0d5ba39a/client/console/src/main/java/org/apache/syncope/client/console/wizards/any/Details.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/wizards/any/Details.java b/client/console/src/main/java/org/apache/syncope/client/console/wizards/any/Details.java
index 974d3dd..bb588e5 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/wizards/any/Details.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/wizards/any/Details.java
@@ -34,12 +34,14 @@ public class Details<T extends AnyTO> extends WizardStep {
     protected final StatusPanel statusPanel;
 
     public Details(
-            final T anyTO,
+            final AnyHandler<T> handler,
             final IModel<List<StatusBean>> statusModel,
             final PageReference pageRef,
             final boolean includeStatusPanel) {
         this.pageRef = pageRef;
 
+        T anyTO = handler.getInnerObject();
+
         statusPanel = new StatusPanel("status", anyTO, statusModel, pageRef);
 
         add(statusPanel.setEnabled(includeStatusPanel).

http://git-wip-us.apache.org/repos/asf/syncope/blob/0d5ba39a/client/console/src/main/java/org/apache/syncope/client/console/wizards/any/GroupDetails.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/wizards/any/GroupDetails.java b/client/console/src/main/java/org/apache/syncope/client/console/wizards/any/GroupDetails.java
index 9705fc4..6b3d7f1 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/wizards/any/GroupDetails.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/wizards/any/GroupDetails.java
@@ -80,12 +80,14 @@ public class GroupDetails extends Details<GroupTO> {
     private final OwnerModel gOwnerModel;
 
     public GroupDetails(
-            final GroupTO groupTO,
+            final GroupHandler groupHandler,
             final IModel<List<StatusBean>> statusModel,
             final boolean templateMode,
             final PageReference pageRef,
             final boolean includeStatusPanel) {
-        super(groupTO, statusModel, pageRef, includeStatusPanel);
+        super(groupHandler, statusModel, pageRef, includeStatusPanel);
+
+        final GroupTO groupTO = GroupHandler.class.cast(groupHandler).getInnerObject();
 
         final LoadableDetachableModel<List<AnyTypeTO>> types = new LoadableDetachableModel<List<AnyTypeTO>>() {
 
@@ -220,10 +222,10 @@ public class GroupDetails extends Details<GroupTO> {
 
             @Override
             public Panel getPanel(final String panelId) {
-                return new UserSearchPanel.Builder(new PropertyModel<List<SearchClause>>(groupTO, "uDynClauses")).
+                return new UserSearchPanel.Builder(new PropertyModel<List<SearchClause>>(groupHandler, "uDynClauses")).
                         required(false).build(panelId);
             }
-        }), Model.of(StringUtils.isBlank(groupTO.getUDynMembershipCond()) ? -1 : 0)).setOutputMarkupId(true));
+        }), Model.of(StringUtils.isBlank(groupHandler.getUDynMembershipCond()) ? -1 : 0)).setOutputMarkupId(true));
         // ------------------------ 
 
         // ------------------------
@@ -245,11 +247,10 @@ public class GroupDetails extends Details<GroupTO> {
                     @Override
                     public Panel getPanel(final String panelId) {
                         return new AnyObjectSearchPanel.Builder(
-                                new MapOfListModel<SearchClause>(groupTO, "aDynClauses",
-                                        item.getModelObject().getKey())).
+                                new MapOfListModel<SearchClause>(groupHandler, "aDynClauses", key)).
                                 required(false).build(panelId);
                     }
-                }), Model.of(StringUtils.isBlank(groupTO.getADynMembershipConds().get(key)) ? -1 : 0))
+                }), Model.of(StringUtils.isBlank(groupHandler.getADynMembershipConds().get(key)) ? -1 : 0))
                         .setOutputMarkupId(true));
             }
         });

http://git-wip-us.apache.org/repos/asf/syncope/blob/0d5ba39a/client/console/src/main/java/org/apache/syncope/client/console/wizards/any/GroupHandler.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/wizards/any/GroupHandler.java b/client/console/src/main/java/org/apache/syncope/client/console/wizards/any/GroupHandler.java
new file mode 100644
index 0000000..0afba05
--- /dev/null
+++ b/client/console/src/main/java/org/apache/syncope/client/console/wizards/any/GroupHandler.java
@@ -0,0 +1,99 @@
+/*
+ * 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.wizards.any;
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import org.apache.commons.collections4.CollectionUtils;
+import org.apache.syncope.client.console.panels.search.SearchClause;
+import org.apache.syncope.client.console.panels.search.SearchUtils;
+import org.apache.syncope.client.lib.SyncopeClient;
+import org.apache.syncope.common.lib.search.AbstractFiqlSearchConditionBuilder;
+import org.apache.syncope.common.lib.to.GroupTO;
+
+public class GroupHandler extends AnyHandler<GroupTO> {
+
+    private static final long serialVersionUID = 8058288034211558376L;
+
+    private List<SearchClause> uDynClauses;
+
+    private Map<String, List<SearchClause>> aDynClauses;
+
+    public GroupHandler(final GroupTO anyTO) {
+        super(anyTO);
+    }
+
+    public List<SearchClause> getUDynClauses() {
+        if (this.uDynClauses == null) {
+            this.uDynClauses = SearchUtils.getSearchClauses(this.anyTO.getUDynMembershipCond());
+        }
+        return this.uDynClauses;
+    }
+
+    public void setUDynClauses(final List<SearchClause> uDynClauses) {
+        this.uDynClauses = uDynClauses;
+    }
+
+    public Map<String, List<SearchClause>> getADynClauses() {
+        if (this.aDynClauses == null) {
+            this.aDynClauses = SearchUtils.getSearchClauses(this.anyTO.getADynMembershipConds());
+        }
+        return this.aDynClauses;
+    }
+
+    public void setADynClauses(final Map<String, List<SearchClause>> aDynClauses) {
+        this.aDynClauses = aDynClauses;
+    }
+
+    public String getUDynMembershipCond() {
+        if (CollectionUtils.isEmpty(this.uDynClauses)) {
+            return this.anyTO.getUDynMembershipCond();
+        } else {
+            return getFIQLString(this.uDynClauses, SyncopeClient.getUserSearchConditionBuilder());
+        }
+    }
+
+    public Map<String, String> getADynMembershipConds() {
+        if (this.aDynClauses == null || this.aDynClauses.isEmpty()) {
+            return this.anyTO.getADynMembershipConds();
+        } else {
+            final Map<String, String> res = new HashMap<>();
+
+            for (Map.Entry<String, List<SearchClause>> entry : this.aDynClauses.entrySet()) {
+                if (CollectionUtils.isNotEmpty(entry.getValue())) {
+                    res.put(entry.getKey(), getFIQLString(entry.getValue(),
+                            SyncopeClient.getAnyObjectSearchConditionBuilder(entry.getKey())));
+                }
+            }
+
+            return res;
+        }
+    }
+
+    private String getFIQLString(final List<SearchClause> clauses, final AbstractFiqlSearchConditionBuilder bld) {
+        return SearchUtils.buildFIQL(clauses, bld);
+    }
+
+    public GroupTO fillDynamicConditions() {
+        this.anyTO.setUDynMembershipCond(this.getUDynMembershipCond());
+        this.anyTO.getADynMembershipConds().putAll(this.getADynMembershipConds());
+        return this.anyTO;
+    }
+}

http://git-wip-us.apache.org/repos/asf/syncope/blob/0d5ba39a/client/console/src/main/java/org/apache/syncope/client/console/wizards/any/GroupWizardBuilder.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/wizards/any/GroupWizardBuilder.java b/client/console/src/main/java/org/apache/syncope/client/console/wizards/any/GroupWizardBuilder.java
index f0f0760..43b5f73 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/wizards/any/GroupWizardBuilder.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/wizards/any/GroupWizardBuilder.java
@@ -16,25 +16,17 @@
 package org.apache.syncope.client.console.wizards.any;
 
 import java.util.Collections;
-import java.util.HashMap;
 import java.util.List;
-import java.util.Map;
-import org.apache.commons.collections4.CollectionUtils;
 import org.apache.syncope.client.console.commons.status.StatusBean;
-import org.apache.syncope.client.console.panels.search.SearchClause;
-import org.apache.syncope.client.console.panels.search.SearchUtils;
 import org.apache.syncope.client.console.rest.GroupRestClient;
 import org.apache.syncope.client.console.wizards.AjaxWizardBuilder;
-import org.apache.syncope.client.lib.SyncopeClient;
 import org.apache.syncope.common.lib.AnyOperations;
 import org.apache.syncope.common.lib.patch.GroupPatch;
-import org.apache.syncope.common.lib.search.AbstractFiqlSearchConditionBuilder;
 import org.apache.syncope.common.lib.to.GroupTO;
 import org.apache.syncope.common.lib.to.ProvisioningResult;
 import org.apache.wicket.PageReference;
 import org.apache.wicket.extensions.wizard.WizardModel;
 import org.apache.wicket.model.util.ListModel;
-import org.springframework.beans.BeanUtils;
 
 public class GroupWizardBuilder extends AnyWizardBuilder<GroupTO> {
 
@@ -52,7 +44,7 @@ public class GroupWizardBuilder extends AnyWizardBuilder<GroupTO> {
      */
     public GroupWizardBuilder(
             final String id, final GroupTO groupTO, final List<String> anyTypeClasses, final PageReference pageRef) {
-        super(id, groupTO, anyTypeClasses, pageRef);
+        super(id, new GroupHandler(groupTO), anyTypeClasses, pageRef);
     }
 
     /**
@@ -63,107 +55,36 @@ public class GroupWizardBuilder extends AnyWizardBuilder<GroupTO> {
      * @return the current builder.
      */
     @Override
-    public AjaxWizardBuilder<GroupTO> setItem(final GroupTO item) {
-        final GroupTO actual = new GroupHandler();
-        BeanUtils.copyProperties(item == null ? getDefaultItem() : item, actual);
-        return super.setItem(actual);
+    public AjaxWizardBuilder<AnyHandler<GroupTO>> setItem(final AnyHandler<GroupTO> item) {
+        return item == null ? super.setItem(item) : super.setItem(new GroupHandler(item.getInnerObject()));
     }
 
     @Override
-    protected void onApplyInternal(final GroupTO modelObject) {
+    protected void onApplyInternal(final AnyHandler<GroupTO> modelObject) {
         final ProvisioningResult<GroupTO> actual;
 
         GroupTO toBeProcessed = modelObject instanceof GroupHandler
-                ? GroupHandler.class.cast(modelObject).toGroupTO()
-                : modelObject;
+                ? GroupHandler.class.cast(modelObject).fillDynamicConditions()
+                : modelObject.getInnerObject();
 
-        if (modelObject.getKey() == 0) {
+        if (toBeProcessed.getKey() == 0) {
             actual = groupRestClient.create(toBeProcessed);
         } else {
-            final GroupPatch patch = AnyOperations.diff(toBeProcessed, getOriginalItem(), true);
-
+            final GroupPatch patch = AnyOperations.diff(toBeProcessed, getOriginalItem().getInnerObject(), true);
             // update user just if it is changed
             if (!patch.isEmpty()) {
-                actual = groupRestClient.update(getOriginalItem().getETagValue(), patch);
+                actual = groupRestClient.update(getOriginalItem().getInnerObject().getETagValue(), patch);
             }
         }
     }
 
     @Override
-    protected GroupWizardBuilder addOptionalDetailsPanel(final GroupTO modelObject, final WizardModel wizardModel) {
-        wizardModel.add(new GroupDetails(modelObject,
-                new ListModel<>(Collections.<StatusBean>emptyList()), false, pageRef, modelObject.getKey() > 0));
+    protected GroupWizardBuilder addOptionalDetailsPanel(
+            final AnyHandler<GroupTO> modelObject, final WizardModel wizardModel) {
+        wizardModel.add(new GroupDetails(
+                GroupHandler.class.cast(modelObject),
+                new ListModel<>(Collections.<StatusBean>emptyList()),
+                false, pageRef, modelObject.getInnerObject().getKey() > 0));
         return this;
     }
-
-    /**
-     * Class tprovided to handle asychronous FIQL string translations.
-     */
-    public static class GroupHandler extends GroupTO {
-
-        private static final long serialVersionUID = 8058288034211558375L;
-
-        private List<SearchClause> uDynClauses;
-
-        private Map<String, List<SearchClause>> aDynClauses;
-
-        public List<SearchClause> getUDynClauses() {
-            if (this.uDynClauses == null) {
-                this.uDynClauses = SearchUtils.getSearchClauses(super.getUDynMembershipCond());
-            }
-            return this.uDynClauses;
-        }
-
-        public void setUDynClauses(final List<SearchClause> uDynClauses) {
-            this.uDynClauses = uDynClauses;
-        }
-
-        public Map<String, List<SearchClause>> getADynClauses() {
-            if (this.aDynClauses == null) {
-                this.aDynClauses = SearchUtils.getSearchClauses(super.getADynMembershipConds());
-            }
-            return this.aDynClauses;
-        }
-
-        public void setADynClauses(final Map<String, List<SearchClause>> aDynClauses) {
-            this.aDynClauses = aDynClauses;
-        }
-
-        @Override
-        public String getUDynMembershipCond() {
-            if (CollectionUtils.isEmpty(this.uDynClauses)) {
-                return super.getUDynMembershipCond();
-            } else {
-                return getFIQLString(this.uDynClauses, SyncopeClient.getUserSearchConditionBuilder());
-            }
-        }
-
-        @Override
-        public Map<String, String> getADynMembershipConds() {
-            if (this.aDynClauses == null || this.aDynClauses.isEmpty()) {
-                return super.getADynMembershipConds();
-            } else {
-                final Map<String, String> res = new HashMap<>();
-
-                for (Map.Entry<String, List<SearchClause>> entry : this.aDynClauses.entrySet()) {
-                    res.put(entry.getKey(), getFIQLString(entry.getValue(),
-                            SyncopeClient.getAnyObjectSearchConditionBuilder(entry.getKey())));
-                }
-
-                return res;
-            }
-        }
-
-        private String getFIQLString(final List<SearchClause> clauses, final AbstractFiqlSearchConditionBuilder bld) {
-            return SearchUtils.buildFIQL(clauses, bld);
-        }
-
-        public GroupTO toGroupTO() {
-            final GroupTO res = new GroupTO();
-            BeanUtils.copyProperties(this, res, "uDynClauses", "aDynClauses");
-            res.setUDynMembershipCond(this.getUDynMembershipCond());
-            res.getADynMembershipConds().putAll(this.getADynMembershipConds());
-            return res;
-        }
-    }
 }

http://git-wip-us.apache.org/repos/asf/syncope/blob/0d5ba39a/client/console/src/main/java/org/apache/syncope/client/console/wizards/any/UserDetails.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/wizards/any/UserDetails.java b/client/console/src/main/java/org/apache/syncope/client/console/wizards/any/UserDetails.java
index 9a6239a..ef1ea05 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/wizards/any/UserDetails.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/wizards/any/UserDetails.java
@@ -48,13 +48,15 @@ public class UserDetails extends Details<UserTO> {
     private static final String PASSWORD_CONTENT_PATH = "body:content";
 
     public UserDetails(
-            final UserTO userTO,
+            final AnyHandler<UserTO> handler,
             final IModel<List<StatusBean>> statusModel,
             final boolean resetPassword,
             final boolean templateMode,
             final PageReference pageRef,
             final boolean includeStatusPanel) {
-        super(userTO, statusModel, pageRef, includeStatusPanel);
+        super(handler, statusModel, pageRef, includeStatusPanel);
+
+        final UserTO userTO = handler.getInnerObject();
         // ------------------------
         // Username
         // ------------------------
@@ -82,15 +84,15 @@ public class UserDetails extends Details<UserTO> {
         final Collapsible collapsible = new Collapsible("collapsePanel", Collections.<ITab>singletonList(
                 new AbstractTab(new ResourceModel("password.change", "Change password")) {
 
-                    private static final long serialVersionUID = 1037272333056449378L;
+            private static final long serialVersionUID = 1037272333056449378L;
 
-                    @Override
-                    public Panel getPanel(final String panelId) {
-                        final PasswordPanel panel = new PasswordPanel(panelId, userTO, resetPassword, templateMode);
-                        panel.setEnabled(model.getObject() >= 0);
-                        return panel;
-                    }
-                }
+            @Override
+            public Panel getPanel(final String panelId) {
+                final PasswordPanel panel = new PasswordPanel(panelId, userTO, resetPassword, templateMode);
+                panel.setEnabled(model.getObject() >= 0);
+                return panel;
+            }
+        }
         ), model) {
 
             private static final long serialVersionUID = 1L;

http://git-wip-us.apache.org/repos/asf/syncope/blob/0d5ba39a/client/console/src/main/java/org/apache/syncope/client/console/wizards/any/UserWizardBuilder.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/wizards/any/UserWizardBuilder.java b/client/console/src/main/java/org/apache/syncope/client/console/wizards/any/UserWizardBuilder.java
index 6f9097e..28245b9 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/wizards/any/UserWizardBuilder.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/wizards/any/UserWizardBuilder.java
@@ -47,33 +47,40 @@ public class UserWizardBuilder extends AnyWizardBuilder<UserTO> {
      * @param pageRef Caller page reference.
      */
     public UserWizardBuilder(
-            final String id, final UserTO userTO, final List<String> anyTypeClasses, final PageReference pageRef) {
+            final String id,
+            final UserTO userTO,
+            final List<String> anyTypeClasses,
+            final PageReference pageRef) {
         super(id, userTO, anyTypeClasses, pageRef);
         statusModel = new ListModel<>(new ArrayList<StatusBean>());
     }
 
     @Override
-    protected void onApplyInternal(final UserTO modelObject) {
+    protected void onApplyInternal(final AnyHandler<UserTO> modelObject) {
         final ProvisioningResult<UserTO> actual;
 
-        if (modelObject.getKey() == 0) {
-            actual = userRestClient.create(modelObject, StringUtils.isNotBlank(modelObject.getPassword()));
+        final UserTO inner = modelObject.getInnerObject();
+
+        if (inner.getKey() == 0) {
+            actual = userRestClient.create(inner, StringUtils.isNotBlank(inner.getPassword()));
         } else {
-            final UserPatch patch = AnyOperations.diff(modelObject, getOriginalItem(), false);
+            final UserPatch patch = AnyOperations.diff(inner, getOriginalItem().getInnerObject(), false);
             if (!statusModel.getObject().isEmpty()) {
-                patch.setPassword(StatusUtils.buildPasswordPatch(modelObject.getPassword(), statusModel.getObject()));
+                patch.setPassword(StatusUtils.buildPasswordPatch(inner.getPassword(), statusModel.getObject()));
             }
 
             // update user just if it is changed
             if (!patch.isEmpty()) {
-                actual = userRestClient.update(getOriginalItem().getETagValue(), patch);
+                actual = userRestClient.update(getOriginalItem().getInnerObject().getETagValue(), patch);
             }
         }
     }
 
     @Override
-    protected UserWizardBuilder addOptionalDetailsPanel(final UserTO modelObject, final WizardModel wizardModel) {
-        wizardModel.add(new UserDetails(modelObject, statusModel, false, false, pageRef, modelObject.getKey() > 0));
+    protected UserWizardBuilder addOptionalDetailsPanel(
+            final AnyHandler<UserTO> modelObject, final WizardModel wizardModel) {
+        wizardModel.add(new UserDetails(
+                modelObject, statusModel, false, false, pageRef, modelObject.getInnerObject().getKey() > 0));
         return this;
     }
 
@@ -84,7 +91,7 @@ public class UserWizardBuilder extends AnyWizardBuilder<UserTO> {
      * @return the current wizard.
      */
     @Override
-    public UserWizardBuilder setItem(final UserTO item) {
+    public UserWizardBuilder setItem(final AnyHandler<UserTO> item) {
         super.setItem(item);
         statusModel.getObject().clear();
         return this;

http://git-wip-us.apache.org/repos/asf/syncope/blob/0d5ba39a/client/console/src/main/resources/org/apache/syncope/client/console/panels/AbstractSearchResultPanel.properties
----------------------------------------------------------------------
diff --git a/client/console/src/main/resources/org/apache/syncope/client/console/panels/AbstractSearchResultPanel.properties b/client/console/src/main/resources/org/apache/syncope/client/console/panels/AbstractSearchResultPanel.properties
index 05b5945..db9e17e 100644
--- a/client/console/src/main/resources/org/apache/syncope/client/console/panels/AbstractSearchResultPanel.properties
+++ b/client/console/src/main/resources/org/apache/syncope/client/console/panels/AbstractSearchResultPanel.properties
@@ -29,6 +29,6 @@ creationDate=Creation Date
 tokenValued=Valued
 tokenNotValued=Not valued
 
-any.edit=Edit ${type} ${key}
-any.new=New ${type}
+any.edit=Edit ${anyTO.type} ${anyTO.key}
+any.new=New ${anyTO.type}
 any.attr.display=Attributes to be displayed