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 2016/06/23 11:15:50 UTC

[2/2] syncope git commit: [SYNCOPE-874] handling realm provisioning features on the administration console

[SYNCOPE-874] handling realm provisioning features on the administration console


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

Branch: refs/heads/master
Commit: 0370ddc65b42fc163d6bc277572074bfff2a14fb
Parents: 9042203
Author: fmartelli <fa...@gmail.com>
Authored: Thu Jun 23 13:13:32 2016 +0200
Committer: fmartelli <fa...@gmail.com>
Committed: Thu Jun 23 13:13:41 2016 +0200

----------------------------------------------------------------------
 .../client/console/commons/Constants.java       |   2 +
 .../console/commons/status/StatusUtils.java     |  48 +++++
 .../syncope/client/console/pages/Realms.java    |  78 ++++----
 .../client/console/panels/DirectoryPanel.java   |   2 +-
 .../client/console/panels/ListViewPanel.java    |  16 ++
 .../syncope/client/console/panels/Realm.java    | 130 +++++++++++++-
 .../client/console/panels/RealmDetails.java     |  20 ++-
 .../client/console/panels/RealmModalPanel.java  |  94 ----------
 .../console/panels/RealmWizardBuilder.java      |  80 +++++++++
 .../console/panels/RemoteObjectPanel.java       |  32 ++++
 .../policies/PolicyRuleDirectoryPanel.java      |   4 +-
 .../reports/ReportletDirectoryPanel.java        |   4 +-
 .../client/console/rest/RealmRestClient.java    |  15 +-
 .../client/console/wizards/WizardMgtPanel.java  |  17 +-
 .../console/wizards/any/ConnObjectPanel.java    | 111 ++++++------
 .../client/console/wizards/any/StatusPanel.java |  32 ++--
 .../wizards/resources/ResourceMappingPanel.java |  36 +---
 .../resources/ResourceProvisionPanel.java       | 142 +++++++++++++++
 .../META-INF/resources/css/syncopeConsole.css   |   2 +-
 .../client/console/pages/Realms.properties      |   5 +-
 .../client/console/pages/Realms_it.properties   |   5 +-
 .../console/pages/Realms_pt_BR.properties       |   5 +-
 .../client/console/pages/Realms_ru.properties   |   5 +-
 .../syncope/client/console/panels/Realm.html    |   4 +-
 .../client/console/panels/RealmDetails.html     |  21 ++-
 .../console/panels/RealmDetails.properties      |   1 +
 .../console/panels/RealmDetails_it.properties   |   1 +
 .../panels/RealmDetails_pt_BR.properties        |   1 +
 .../console/panels/RealmDetails_ru.properties   |   9 +-
 .../client/console/panels/RealmModalPanel.html  |  23 ---
 .../panels/RealmWizardBuilder$Realm.html        |  23 +++
 .../console/panels/RemoteObjectPanel.html       |  24 +++
 .../console/wizards/any/ConnObjectPanel.html    |   3 -
 .../any/StatusPanel$RemoteObjectPanel.html      |  24 ---
 ...isionWizardBuilder$ConnObjectLink.properties |   4 +-
 ...onWizardBuilder$ConnObjectLink_it.properties |   4 +-
 ...izardBuilder$ConnObjectLink_pt_BR.properties |   4 +-
 .../resources/ResourceProvisionPanel.html       |   8 +
 .../resources/ResourceProvisionPanel.properties |   3 +-
 .../ResourceProvisionPanel_it.properties        |   1 +
 .../ResourceProvisionPanel_pt_BR.properties     |   1 +
 .../ResourceProvisionPanel_ru.properties        |   1 +
 .../syncope/fit/console/AnyObjectsITCase.java   |  23 +--
 .../syncope/fit/console/BulkActionITCase.java   |  14 +-
 .../fit/console/DisplayAttributesITCase.java    |  14 +-
 .../syncope/fit/console/GroupsITCase.java       |  43 ++---
 .../syncope/fit/console/RealmsITCase.java       | 176 +++++++++++++++++--
 .../syncope/fit/console/TopologyITCase.java     |  34 +++-
 .../apache/syncope/fit/console/UsersITCase.java |  29 +--
 49 files changed, 985 insertions(+), 393 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/syncope/blob/0370ddc6/client/console/src/main/java/org/apache/syncope/client/console/commons/Constants.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/commons/Constants.java b/client/console/src/main/java/org/apache/syncope/client/console/commons/Constants.java
index 7157c09..7ac304d 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/commons/Constants.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/commons/Constants.java
@@ -27,6 +27,8 @@ import org.apache.wicket.model.Model;
 
 public final class Constants {
 
+    public static final String SYNCOPE = "syncope";
+
     public static final String ON_CLICK = "click";
 
     public static final String ON_CHANGE = "change";

http://git-wip-us.apache.org/repos/asf/syncope/blob/0370ddc6/client/console/src/main/java/org/apache/syncope/client/console/commons/status/StatusUtils.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/commons/status/StatusUtils.java b/client/console/src/main/java/org/apache/syncope/client/console/commons/status/StatusUtils.java
index d3d9558..989a19e 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/commons/status/StatusUtils.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/commons/status/StatusUtils.java
@@ -34,6 +34,7 @@ import org.apache.syncope.common.lib.patch.StatusPatch;
 import org.apache.syncope.common.lib.to.AnyTO;
 import org.apache.syncope.common.lib.to.AttrTO;
 import org.apache.syncope.common.lib.to.ConnObjectTO;
+import org.apache.syncope.common.lib.types.PropagationTaskExecStatus;
 import org.apache.wicket.markup.ComponentTag;
 import org.apache.wicket.markup.html.basic.Label;
 import org.apache.wicket.markup.html.panel.Panel;
@@ -223,6 +224,53 @@ public class StatusUtils implements Serializable {
                 break;
         }
 
+        return getLabel(componentId, alt, title, clazz);
+    }
+
+    public static Panel getStatusImagePanel(final String componentId, final PropagationTaskExecStatus status) {
+        return new LabelPanel(componentId, getStatusImage("label", status));
+    }
+
+    public static Label getStatusImage(final String componentId, final PropagationTaskExecStatus status) {
+        final String alt, title, clazz;
+
+        switch (status) {
+
+            case NOT_ATTEMPTED:
+                alt = "not attempted";
+                title = "Not attempted";
+                clazz = Constants.UNDEFINED_ICON;
+                break;
+
+            case CREATED:
+                alt = "created icon";
+                title = "Created";
+                clazz = Constants.CREATED_ICON;
+                break;
+
+            case SUCCESS:
+                alt = "success icon";
+                title = "Propagation succeded";
+                clazz = Constants.ACTIVE_ICON;
+                break;
+
+            case FAILURE:
+                alt = "failure icon";
+                title = "Propagation failed";
+                clazz = Constants.NOT_FOUND_ICON;
+                break;
+
+            default:
+                alt = StringUtils.EMPTY;
+                title = StringUtils.EMPTY;
+                clazz = StringUtils.EMPTY;
+                break;
+        }
+
+        return getLabel(componentId, alt, title, clazz);
+    }
+
+    private static Label getLabel(final String componentId, final String alt, final String title, final String clazz) {
         return new Label(componentId, StringUtils.EMPTY) {
 
             private static final long serialVersionUID = 4755868673082976208L;

http://git-wip-us.apache.org/repos/asf/syncope/blob/0370ddc6/client/console/src/main/java/org/apache/syncope/client/console/pages/Realms.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/pages/Realms.java b/client/console/src/main/java/org/apache/syncope/client/console/pages/Realms.java
index 780a06f..7106ac8 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/pages/Realms.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/pages/Realms.java
@@ -24,7 +24,6 @@ import org.apache.syncope.client.console.BookmarkablePageLinkBuilder;
 import org.apache.syncope.client.console.SyncopeConsoleSession;
 import org.apache.syncope.client.console.commons.Constants;
 import org.apache.syncope.client.console.panels.Realm;
-import org.apache.syncope.client.console.panels.RealmModalPanel;
 import org.apache.syncope.client.console.panels.RealmChoicePanel;
 import org.apache.syncope.client.console.panels.RealmChoicePanel.ChosenRealm;
 import org.apache.syncope.client.console.panels.WizardModalPanel;
@@ -32,20 +31,19 @@ import org.apache.syncope.client.console.rest.RealmRestClient;
 import org.apache.syncope.client.console.tasks.TemplatesTogglePanel;
 import org.apache.syncope.client.console.wicket.markup.html.bootstrap.dialog.BaseModal;
 import org.apache.syncope.client.console.wizards.AjaxWizard;
+import org.apache.syncope.client.console.wizards.any.ResultPage;
 import org.apache.syncope.common.lib.to.AnyTO;
 import org.apache.syncope.common.lib.to.RealmTO;
 import org.apache.syncope.common.lib.to.TemplatableTO;
-import org.apache.syncope.common.lib.types.StandardEntitlement;
 import org.apache.wicket.ajax.AjaxRequestTarget;
+import org.apache.wicket.event.Broadcast;
 import org.apache.wicket.event.IEvent;
+import org.apache.wicket.extensions.ajax.markup.html.modal.ModalWindow;
 import org.apache.wicket.extensions.ajax.markup.html.modal.ModalWindow.WindowClosedCallback;
 import org.apache.wicket.markup.html.WebMarkupContainer;
 import org.apache.wicket.markup.html.basic.Label;
 import org.apache.wicket.model.CompoundPropertyModel;
 import org.apache.wicket.model.IModel;
-import org.apache.wicket.model.Model;
-import org.apache.wicket.model.ResourceModel;
-import org.apache.wicket.model.StringResourceModel;
 import org.apache.wicket.request.mapper.parameter.PageParameters;
 
 public class Realms extends BasePage {
@@ -175,7 +173,7 @@ public class Realms extends BasePage {
         if (realmTO == null) {
             return content;
         }
-        content.addOrReplace(new Realm("body", realmTO, getPageReference(), selectedIndex) {
+        content.addOrReplace(new Realm("body", realmTO, Realms.this.getPageReference(), selectedIndex) {
 
             private static final long serialVersionUID = 8221398624379357183L;
 
@@ -186,42 +184,48 @@ public class Realms extends BasePage {
             }
 
             @Override
-            protected void onClickCreate(final AjaxRequestTarget target) {
-                modal.header(new ResourceModel("newRealm"));
-
-                RealmTO newRealmTO = new RealmTO();
-                modal.setFormModel(newRealmTO);
-
-                RealmModalPanel panel = new RealmModalPanel(
-                        modal,
-                        Realms.this.getPageReference(),
-                        newRealmTO,
-                        realmChoicePanel.getCurrentRealm().getFullPath(),
-                        StandardEntitlement.REALM_CREATE,
-                        true);
-                target.add(modal.setContent(panel));
-
-                modal.addSubmitButton();
-                modal.show(true);
+            protected void setWindowClosedReloadCallback(final BaseModal<?> modal) {
+                modal.setWindowClosedCallback(new ModalWindow.WindowClosedCallback() {
+
+                    private static final long serialVersionUID = 8804221891699487139L;
+
+                    @Override
+                    public void onClose(final AjaxRequestTarget target) {
+                        target.add(realmChoicePanel.reloadRealmTree(target));
+
+                        if (modal.getContent() instanceof ResultPage) {
+                            updateRealmContent(RealmTO.class.cast(
+                                    ResultPage.class.cast(modal.getContent()).getItem()), selectedIndex);
+                            target.add(content);
+                        }
+
+                        modal.show(false);
+                    }
+                });
             }
 
             @Override
-            protected void onClickEdit(final AjaxRequestTarget target, final RealmTO realmTO) {
-                modal.header(new StringResourceModel("editRealm", Model.of(realmTO)));
+            protected void onClickCreate(final AjaxRequestTarget target) {
+                this.wizardBuilder.setParentPath(realmChoicePanel.getCurrentRealm().getFullPath());
+                send(this, Broadcast.EXACT, new AjaxWizard.NewItemActionEvent<RealmTO>(new RealmTO(), target) {
 
-                modal.setFormModel(realmTO);
+                    @Override
+                    public String getEventDescription() {
+                        return "realm.new";
+                    }
+                });
+            }
 
-                RealmModalPanel panel = new RealmModalPanel(
-                        modal,
-                        Realms.this.getPageReference(),
-                        realmTO,
-                        realmTO.getFullPath(),
-                        StandardEntitlement.REALM_UPDATE,
-                        false);
-                target.add(modal.setContent(panel));
+            @Override
+            protected void onClickEdit(final AjaxRequestTarget target, final RealmTO realmTO) {
+                this.wizardBuilder.setParentPath(realmTO.getFullPath());
+                send(this, Broadcast.EXACT, new AjaxWizard.EditItemActionEvent<RealmTO>(realmTO, target) {
 
-                modal.addSubmitButton();
-                modal.show(true);
+                    @Override
+                    public String getEventDescription() {
+                        return "realm.edit";
+                    }
+                });
             }
 
             @Override
@@ -242,7 +246,7 @@ public class Realms extends BasePage {
                     // Escape line breaks
                     SyncopeConsoleSession.get().error(e.getMessage().replace("\n", " "));
                 }
-                ((BasePage) getPage()).getNotificationPanel().refresh(target);
+                ((BasePage) Realms.this.getPage()).getNotificationPanel().refresh(target);
             }
         });
         return content;

http://git-wip-us.apache.org/repos/asf/syncope/blob/0370ddc6/client/console/src/main/java/org/apache/syncope/client/console/panels/DirectoryPanel.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/panels/DirectoryPanel.java b/client/console/src/main/java/org/apache/syncope/client/console/panels/DirectoryPanel.java
index 5951936..59af452 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/panels/DirectoryPanel.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/panels/DirectoryPanel.java
@@ -292,7 +292,7 @@ public abstract class DirectoryPanel<
     }
 
     @Override
-    protected void customActionOnCloseCallback(final AjaxRequestTarget target) {
+    protected void customActionOnFinishCallback(final AjaxRequestTarget target) {
         final EventDataWrapper data = new EventDataWrapper();
         data.setTarget(target);
         data.setRows(rows);

http://git-wip-us.apache.org/repos/asf/syncope/blob/0370ddc6/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 b649c4f..94ed492 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
@@ -370,8 +370,24 @@ public abstract class ListViewPanel<T extends Serializable> extends WizardMgtPan
                 protected T getActualItem(final T item, final List<T> list) {
                     return Builder.this.getActualItem(item, list);
                 }
+
+                @Override
+                protected void customActionOnFinishCallback(final AjaxRequestTarget target) {
+                    Builder.this.customActionOnFinishCallback(target);
+                }
+
+                @Override
+                protected void customActionOnCancelCallback(final AjaxRequestTarget target) {
+                    Builder.this.customActionOnCancelCallback(target);
+                }
             };
         }
+
+        protected void customActionOnCancelCallback(final AjaxRequestTarget target) {
+        }
+
+        protected void customActionOnFinishCallback(final AjaxRequestTarget target) {
+        }
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/syncope/blob/0370ddc6/client/console/src/main/java/org/apache/syncope/client/console/panels/Realm.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/panels/Realm.java b/client/console/src/main/java/org/apache/syncope/client/console/panels/Realm.java
index cb92360..86aa1ad 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/panels/Realm.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/panels/Realm.java
@@ -18,13 +18,22 @@
  */
 package org.apache.syncope.client.console.panels;
 
+import de.agilecoders.wicket.core.markup.html.bootstrap.dialog.Modal;
 import de.agilecoders.wicket.core.markup.html.bootstrap.tabs.AjaxBootstrapTabbedPanel;
+import java.io.Serializable;
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.List;
 import java.util.Map;
+import org.apache.commons.collections4.CollectionUtils;
+import org.apache.commons.collections4.MapUtils;
+import org.apache.commons.lang3.StringUtils;
+import org.apache.commons.lang3.tuple.Pair;
 import org.apache.commons.lang3.tuple.Triple;
 import org.apache.syncope.client.console.commons.AnyTypeComparator;
+import org.apache.syncope.client.console.commons.ConnIdSpecialAttributeName;
+import org.apache.syncope.client.console.commons.Constants;
+import org.apache.syncope.client.console.commons.status.StatusUtils;
 import org.apache.syncope.client.console.layout.AnyObjectFormLayoutInfo;
 import org.apache.syncope.client.console.layout.FormLayoutInfoUtils;
 import org.apache.syncope.client.console.layout.GroupFormLayoutInfo;
@@ -32,19 +41,27 @@ import org.apache.syncope.client.console.layout.UserFormLayoutInfo;
 import org.apache.syncope.client.console.rest.AnyTypeRestClient;
 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.WizardMgtPanel;
+import org.apache.syncope.client.console.wizards.any.ConnObjectPanel;
 import org.apache.syncope.common.lib.to.AnyTypeTO;
+import org.apache.syncope.common.lib.to.ConnObjectTO;
+import org.apache.syncope.common.lib.to.PropagationStatus;
+import org.apache.syncope.common.lib.to.ProvisioningResult;
 import org.apache.syncope.common.lib.to.RealmTO;
+import org.apache.syncope.common.lib.types.PropagationTaskExecStatus;
 import org.apache.syncope.common.lib.types.StandardEntitlement;
+import org.apache.wicket.Component;
 import org.apache.wicket.PageReference;
 import org.apache.wicket.ajax.AjaxRequestTarget;
 import org.apache.wicket.extensions.markup.html.tabs.AbstractTab;
 import org.apache.wicket.extensions.markup.html.tabs.ITab;
+import org.apache.wicket.markup.html.basic.Label;
 import org.apache.wicket.markup.html.panel.Panel;
 import org.apache.wicket.model.Model;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-public abstract class Realm extends Panel {
+public abstract class Realm extends WizardMgtPanel<RealmTO> {
 
     private static final long serialVersionUID = -1100228004207271270L;
 
@@ -56,15 +73,26 @@ public abstract class Realm extends Panel {
 
     private final AnyTypeRestClient anyTypeRestClient = new AnyTypeRestClient();
 
+    protected final RealmWizardBuilder wizardBuilder;
+
     public Realm(final String id, final RealmTO realmTO, final PageReference pageRef, final int selectedIndex) {
-        super(id);
+        super(id, true);
         this.realmTO = realmTO;
         this.anyTypeTOs = anyTypeRestClient.list();
 
-        AjaxBootstrapTabbedPanel<ITab> tabbedPanel =
-                new AjaxBootstrapTabbedPanel<>("tabbedPanel", buildTabList(pageRef));
+        setPageRef(pageRef);
+
+        AjaxBootstrapTabbedPanel<ITab> tabbedPanel
+                = new AjaxBootstrapTabbedPanel<>("tabbedPanel", buildTabList(pageRef));
         tabbedPanel.setSelectedTab(selectedIndex);
-        add(tabbedPanel);
+        addInnerObject(tabbedPanel);
+        this.wizardBuilder = new RealmWizardBuilder(pageRef);
+        addNewItemPanelBuilder(this.wizardBuilder, false);
+
+        setShowResultPage(true);
+
+        modal.size(Modal.Size.Large);
+        setWindowClosedReloadCallback(modal);
     }
 
     public RealmTO getRealmTO() {
@@ -126,8 +154,8 @@ public abstract class Realm extends Panel {
             }
         });
 
-        final Triple<UserFormLayoutInfo, GroupFormLayoutInfo, Map<String, AnyObjectFormLayoutInfo>> formLayoutInfo =
-                FormLayoutInfoUtils.fetch(anyTypeTOs);
+        final Triple<UserFormLayoutInfo, GroupFormLayoutInfo, Map<String, AnyObjectFormLayoutInfo>> formLayoutInfo
+                = FormLayoutInfoUtils.fetch(anyTypeTOs);
 
         Collections.sort(anyTypeTOs, new AnyTypeComparator());
         for (final AnyTypeTO anyTypeTO : anyTypeTOs) {
@@ -145,6 +173,78 @@ public abstract class Realm extends Panel {
         return tabs;
     }
 
+    @Override
+    @SuppressWarnings("unchecked")
+    protected Panel customResultBody(final String panelId, final RealmTO item, final Serializable result) {
+        if (!(result instanceof ProvisioningResult)) {
+            throw new IllegalStateException("Unsupported result type");
+        }
+
+        final MultilevelPanel mlp = new MultilevelPanel(panelId);
+        add(mlp);
+
+        final PropagationStatus syncope = new PropagationStatus();
+        syncope.setStatus(PropagationTaskExecStatus.SUCCESS);
+        syncope.setResource(Constants.SYNCOPE);
+
+        ArrayList<PropagationStatus> propagations = new ArrayList<>();
+        propagations.add(syncope);
+        propagations.addAll(((ProvisioningResult) result).getPropagationStatuses());
+
+        ListViewPanel.Builder<PropagationStatus> builder
+                = new ListViewPanel.Builder<PropagationStatus>(PropagationStatus.class, pageRef) {
+
+            private static final long serialVersionUID = -6809736686861678498L;
+
+            @Override
+            protected Component getValueComponent(final String key, final PropagationStatus bean) {
+                if ("afterObj".equalsIgnoreCase(key)) {
+                    ConnObjectTO afterObj = bean.getAfterObj();
+                    String remoteId = afterObj == null
+                            || MapUtils.isEmpty(afterObj.getPlainAttrMap())
+                            || !afterObj.getPlainAttrMap().containsKey(ConnIdSpecialAttributeName.NAME)
+                            || CollectionUtils.isEmpty(
+                                    afterObj.getPlainAttrMap().get(ConnIdSpecialAttributeName.NAME).getValues())
+                            ? StringUtils.EMPTY
+                            : afterObj.getPlainAttrMap().get(ConnIdSpecialAttributeName.NAME).getValues().
+                            iterator().next();
+
+                    return new Label("field", remoteId);
+                } else if ("status".equalsIgnoreCase(key)) {
+                    return StatusUtils.getStatusImagePanel("field", bean.getStatus());
+                } else {
+                    return super.getValueComponent(key, bean);
+                }
+            }
+        };
+
+        builder.setItems(propagations);
+
+        builder.includes("resource", "afterObj", "status");
+        builder.withChecks(ListViewPanel.CheckAvailability.NONE);
+        builder.setReuseItem(false);
+
+        builder.addAction(new ActionLink<PropagationStatus>() {
+
+            private static final long serialVersionUID = -3722207913631435501L;
+
+            @Override
+            protected boolean statusCondition(final PropagationStatus bean) {
+                return !Constants.SYNCOPE.equals(bean.getResource())
+                        && (PropagationTaskExecStatus.CREATED == bean.getStatus()
+                        || PropagationTaskExecStatus.SUCCESS == bean.getStatus());
+            }
+
+            @Override
+            public void onClick(final AjaxRequestTarget target, final PropagationStatus bean) {
+                mlp.next(bean.getResource(), new RemoteRealmPanel(bean), target);
+            }
+        }, ActionLink.ActionType.VIEW, StandardEntitlement.RESOURCE_GET_CONNOBJECT);
+
+        mlp.setFirstLevel(builder.build(MultilevelPanel.FIRST_LEVEL_ID));
+        return mlp;
+    }
+
     protected abstract void onClickTemplate(final AjaxRequestTarget target);
 
     protected abstract void onClickCreate(final AjaxRequestTarget target);
@@ -153,4 +253,20 @@ public abstract class Realm extends Panel {
 
     protected abstract void onClickDelete(final AjaxRequestTarget target, final RealmTO realmTO);
 
+    public class RemoteRealmPanel extends RemoteObjectPanel {
+
+        private static final long serialVersionUID = 4303365227411467563L;
+
+        private final PropagationStatus bean;
+
+        public RemoteRealmPanel(final PropagationStatus bean) {
+            this.bean = bean;
+            add(new ConnObjectPanel(REMOTE_OBJECT_PANEL_ID, getConnObjectTO()));
+        }
+
+        @Override
+        protected final Pair<ConnObjectTO, ConnObjectTO> getConnObjectTO() {
+            return Pair.of(bean.getBeforeObj(), bean.getAfterObj());
+        }
+    }
 }

http://git-wip-us.apache.org/repos/asf/syncope/blob/0370ddc6/client/console/src/main/java/org/apache/syncope/client/console/panels/RealmDetails.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/panels/RealmDetails.java b/client/console/src/main/java/org/apache/syncope/client/console/panels/RealmDetails.java
index 766a2b8..3d646df 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/panels/RealmDetails.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/panels/RealmDetails.java
@@ -22,16 +22,21 @@ import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
+import org.apache.commons.collections4.CollectionUtils;
 import org.apache.syncope.client.console.SyncopeConsoleSession;
 import org.apache.syncope.client.console.rest.PolicyRestClient;
+import org.apache.syncope.client.console.rest.ResourceRestClient;
 import org.apache.syncope.client.console.wicket.markup.html.form.ActionLinksPanel;
 import org.apache.syncope.client.console.wicket.markup.html.form.AjaxDropDownChoicePanel;
 import org.apache.syncope.client.console.wicket.markup.html.form.AjaxPalettePanel;
 import org.apache.syncope.client.console.wicket.markup.html.form.AjaxTextFieldPanel;
 import org.apache.syncope.client.console.wicket.markup.html.form.FieldPanel;
 import org.apache.syncope.client.console.wicket.markup.html.form.PolicyRenderer;
+import org.apache.syncope.common.lib.EntityTOUtils;
+import org.apache.syncope.common.lib.SyncopeConstants;
 import org.apache.syncope.common.lib.policy.AbstractPolicyTO;
 import org.apache.syncope.common.lib.to.RealmTO;
+import org.apache.syncope.common.lib.to.ResourceTO;
 import org.apache.syncope.common.lib.types.PolicyType;
 import org.apache.wicket.markup.html.WebMarkupContainer;
 import org.apache.wicket.markup.html.form.DropDownChoice;
@@ -110,15 +115,18 @@ public class RealmDetails extends Panel {
         container.setRenderBodyOnly(unwrapped);
         add(container);
 
+        final WebMarkupContainer generics = new WebMarkupContainer("generics");
+        container.add(generics.setVisible(unwrapped));
+
         FieldPanel<String> name = new AjaxTextFieldPanel(
                 "name", "name", new PropertyModel<String>(realmTO, "name"), false);
         name.addRequiredLabel();
-        container.add(name);
+        generics.add(name);
 
         FieldPanel<String> fullPath = new AjaxTextFieldPanel(
                 "fullPath", "fullPath", new PropertyModel<String>(realmTO, "fullPath"), false);
         fullPath.setEnabled(false);
-        container.add(fullPath);
+        generics.add(fullPath);
 
         AjaxDropDownChoicePanel<String> accountPolicy = new AjaxDropDownChoicePanel<>(
                 "accountPolicy",
@@ -148,6 +156,14 @@ public class RealmDetails extends Panel {
         actionsClassNames.setOutputMarkupId(true);
         container.add(actionsClassNames);
 
+        container.add(new AjaxPalettePanel.Builder<String>().build("resources",
+                new PropertyModel<List<String>>(realmTO, "resources"),
+                new ListModel<>(CollectionUtils.collect(new ResourceRestClient().list(),
+                        EntityTOUtils.<ResourceTO>keyTransformer(), new ArrayList<String>()))).
+                setOutputMarkupId(true).
+                setEnabled(!SyncopeConstants.ROOT_REALM.equals(realmTO.getName())).
+                setVisible(!SyncopeConstants.ROOT_REALM.equals(realmTO.getName())));
+
         if (actions == null) {
             add(new Fragment("actions", "emptyFragment", this).setRenderBodyOnly(true));
         } else {

http://git-wip-us.apache.org/repos/asf/syncope/blob/0370ddc6/client/console/src/main/java/org/apache/syncope/client/console/panels/RealmModalPanel.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/panels/RealmModalPanel.java b/client/console/src/main/java/org/apache/syncope/client/console/panels/RealmModalPanel.java
deleted file mode 100644
index a4bdd55..0000000
--- a/client/console/src/main/java/org/apache/syncope/client/console/panels/RealmModalPanel.java
+++ /dev/null
@@ -1,94 +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 org.apache.commons.lang3.StringUtils;
-import org.apache.syncope.client.console.SyncopeConsoleSession;
-import org.apache.syncope.client.console.commons.Constants;
-import org.apache.syncope.client.console.pages.BasePage;
-import org.apache.syncope.client.console.rest.RealmRestClient;
-import org.apache.syncope.client.console.wicket.markup.html.bootstrap.dialog.BaseModal;
-import org.apache.syncope.common.lib.to.RealmTO;
-import org.apache.wicket.PageReference;
-import org.apache.wicket.ajax.AjaxRequestTarget;
-import org.apache.wicket.authroles.authorization.strategies.role.metadata.MetaDataRoleAuthorizationStrategy;
-import org.apache.wicket.behavior.AttributeAppender;
-import org.apache.wicket.markup.html.form.Form;
-
-public class RealmModalPanel extends AbstractModalPanel<RealmTO> {
-
-    private static final long serialVersionUID = -4285220460543213901L;
-
-    private final RealmRestClient realmRestClient = new RealmRestClient();
-
-    private boolean newRealm = false;
-
-    private final String parentPath;
-
-    public RealmModalPanel(
-            final BaseModal<RealmTO> modal,
-            final PageReference pageRef,
-            final RealmTO realmTO,
-            final String parentPath,
-            final String entitlement) {
-
-        this(modal, pageRef, realmTO, parentPath, entitlement, false);
-    }
-
-    public RealmModalPanel(
-            final BaseModal<RealmTO> modal,
-            final PageReference pageRef,
-            final RealmTO realmTO,
-            final String parentPath,
-            final String entitlement,
-            final boolean newRealm) {
-
-        super(modal, pageRef);
-
-        this.newRealm = newRealm;
-        this.parentPath = parentPath;
-
-        RealmDetails realmDetail = new RealmDetails("details", realmTO);
-        realmDetail.add(new AttributeAppender("style", "overflow-x:hidden;"));
-        if (SyncopeConsoleSession.get().owns(entitlement)) {
-            MetaDataRoleAuthorizationStrategy.authorize(realmDetail, ENABLE, entitlement);
-        }
-
-        add(realmDetail);
-    }
-
-    @Override
-    public void onSubmit(final AjaxRequestTarget target, final Form<?> form) {
-        try {
-            final RealmTO updatedRealmTO = RealmTO.class.cast(form.getModelObject());
-            if (newRealm) {
-                realmRestClient.create(this.parentPath, updatedRealmTO);
-            } else {
-                realmRestClient.update(updatedRealmTO);
-            }
-            modal.close(target);
-            SyncopeConsoleSession.get().info(getString(Constants.OPERATION_SUCCEEDED));
-        } catch (Exception e) {
-            LOG.error("While creating or updating realm", e);
-            SyncopeConsoleSession.get().error(StringUtils.isBlank(e.getMessage()) ? e.getClass().getName() : e.
-                    getMessage());
-        }
-        ((BasePage) pageRef.getPage()).getNotificationPanel().refresh(target);
-    }
-}

http://git-wip-us.apache.org/repos/asf/syncope/blob/0370ddc6/client/console/src/main/java/org/apache/syncope/client/console/panels/RealmWizardBuilder.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/panels/RealmWizardBuilder.java b/client/console/src/main/java/org/apache/syncope/client/console/panels/RealmWizardBuilder.java
new file mode 100644
index 0000000..f491f2b
--- /dev/null
+++ b/client/console/src/main/java/org/apache/syncope/client/console/panels/RealmWizardBuilder.java
@@ -0,0 +1,80 @@
+/*
+ * 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.io.Serializable;
+import org.apache.syncope.client.console.rest.RealmRestClient;
+import org.apache.syncope.client.console.wizards.AjaxWizardBuilder;
+import org.apache.syncope.common.lib.to.ProvisioningResult;
+import org.apache.syncope.common.lib.to.RealmTO;
+import org.apache.wicket.PageReference;
+import org.apache.wicket.behavior.AttributeAppender;
+import org.apache.wicket.extensions.wizard.WizardModel;
+import org.apache.wicket.extensions.wizard.WizardStep;
+
+public class RealmWizardBuilder extends AjaxWizardBuilder<RealmTO> {
+
+    private static final long serialVersionUID = 5945391813567245081L;
+
+    private final RealmRestClient realmRestClient = new RealmRestClient();
+
+    private String parentPath;
+
+    /**
+     * Construct.
+     *
+     * @param pageRef Caller page reference.
+     */
+    public RealmWizardBuilder(final PageReference pageRef) {
+        super(new RealmTO(), pageRef);
+    }
+
+    @Override
+    protected Serializable onApplyInternal(final RealmTO modelObject) {
+        final ProvisioningResult<RealmTO> res;
+        if (modelObject.getKey() == null) {
+            res = realmRestClient.create(this.parentPath, modelObject);
+        } else {
+            res = realmRestClient.update(modelObject);
+        }
+        return res;
+    }
+
+    @Override
+    protected WizardModel buildModelSteps(final RealmTO modelObject, final WizardModel wizardModel) {
+        wizardModel.add(new Realm(modelObject));
+        return wizardModel;
+    }
+
+    public static class Realm extends WizardStep {
+
+        private static final long serialVersionUID = -2123790676338327104L;
+
+        public Realm(final RealmTO modelObject) {
+            RealmDetails realmDetail = new RealmDetails("details", modelObject);
+            realmDetail.add(new AttributeAppender("style", "overflow-x:hidden;"));
+            add(realmDetail);
+        }
+
+    }
+
+    public void setParentPath(final String parentPath) {
+        this.parentPath = parentPath;
+    }
+}

http://git-wip-us.apache.org/repos/asf/syncope/blob/0370ddc6/client/console/src/main/java/org/apache/syncope/client/console/panels/RemoteObjectPanel.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/panels/RemoteObjectPanel.java b/client/console/src/main/java/org/apache/syncope/client/console/panels/RemoteObjectPanel.java
new file mode 100644
index 0000000..5a6ab4e
--- /dev/null
+++ b/client/console/src/main/java/org/apache/syncope/client/console/panels/RemoteObjectPanel.java
@@ -0,0 +1,32 @@
+/*
+ * 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 org.apache.commons.lang3.tuple.Pair;
+import org.apache.syncope.client.console.panels.MultilevelPanel.SecondLevel;
+import org.apache.syncope.common.lib.to.ConnObjectTO;
+
+public abstract class RemoteObjectPanel extends SecondLevel {
+
+    private static final long serialVersionUID = 4303365227411467563L;
+
+    protected static final String REMOTE_OBJECT_PANEL_ID = "remoteObject";
+
+    protected abstract Pair<ConnObjectTO, ConnObjectTO> getConnObjectTO();
+}

http://git-wip-us.apache.org/repos/asf/syncope/blob/0370ddc6/client/console/src/main/java/org/apache/syncope/client/console/policies/PolicyRuleDirectoryPanel.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/policies/PolicyRuleDirectoryPanel.java b/client/console/src/main/java/org/apache/syncope/client/console/policies/PolicyRuleDirectoryPanel.java
index 141fe81..ea49fb8 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/policies/PolicyRuleDirectoryPanel.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/policies/PolicyRuleDirectoryPanel.java
@@ -172,7 +172,7 @@ public class PolicyRuleDirectoryPanel<T extends AbstractPolicyTO> extends Direct
                                     });
                                     restClient.updatePolicy(actual);
                                     SyncopeConsoleSession.get().info(getString(Constants.OPERATION_SUCCEEDED));
-                                    customActionOnCloseCallback(target);
+                                    customActionOnFinishCallback(target);
                                 } catch (SyncopeClientException e) {
                                     LOG.error("While deleting {}", rule.getName(), e);
                                     SyncopeConsoleSession.get().error(StringUtils.isBlank(e.getMessage())
@@ -196,7 +196,7 @@ public class PolicyRuleDirectoryPanel<T extends AbstractPolicyTO> extends Direct
                     @Override
                     public void onClick(final AjaxRequestTarget target, final PolicyRuleWrapper ignore) {
                         if (target != null) {
-                            customActionOnCloseCallback(target);
+                            customActionOnFinishCallback(target);
                         }
                     }
                 }, ActionLink.ActionType.RELOAD, StandardEntitlement.TASK_LIST).build(componentId);

http://git-wip-us.apache.org/repos/asf/syncope/blob/0370ddc6/client/console/src/main/java/org/apache/syncope/client/console/reports/ReportletDirectoryPanel.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/reports/ReportletDirectoryPanel.java b/client/console/src/main/java/org/apache/syncope/client/console/reports/ReportletDirectoryPanel.java
index f00463c..f80e3b5 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/reports/ReportletDirectoryPanel.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/reports/ReportletDirectoryPanel.java
@@ -175,7 +175,7 @@ public class ReportletDirectoryPanel extends DirectoryPanel<
                                     });
                                     restClient.update(actual);
                                     SyncopeConsoleSession.get().info(getString(Constants.OPERATION_SUCCEEDED));
-                                    customActionOnCloseCallback(target);
+                                    customActionOnFinishCallback(target);
                                 } catch (SyncopeClientException e) {
                                     LOG.error("While deleting {}", reportlet.getName(), e);
                                     SyncopeConsoleSession.get().error(StringUtils.isBlank(e.getMessage())
@@ -199,7 +199,7 @@ public class ReportletDirectoryPanel extends DirectoryPanel<
                     @Override
                     public void onClick(final AjaxRequestTarget target, final ReportletWrapper ignore) {
                         if (target != null) {
-                            customActionOnCloseCallback(target);
+                            customActionOnFinishCallback(target);
                         }
                     }
                 }, ActionLink.ActionType.RELOAD, StandardEntitlement.TASK_LIST).build(componentId);

http://git-wip-us.apache.org/repos/asf/syncope/blob/0370ddc6/client/console/src/main/java/org/apache/syncope/client/console/rest/RealmRestClient.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/rest/RealmRestClient.java b/client/console/src/main/java/org/apache/syncope/client/console/rest/RealmRestClient.java
index cd22cfc..7ffb5e6 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/rest/RealmRestClient.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/rest/RealmRestClient.java
@@ -19,6 +19,9 @@
 package org.apache.syncope.client.console.rest;
 
 import java.util.List;
+import javax.ws.rs.core.GenericType;
+import javax.ws.rs.core.Response;
+import org.apache.syncope.common.lib.to.ProvisioningResult;
 import org.apache.syncope.common.lib.to.RealmTO;
 import org.apache.syncope.common.rest.api.service.RealmService;
 
@@ -33,12 +36,16 @@ public class RealmRestClient extends BaseRestClient {
         return getService(RealmService.class).list();
     }
 
-    public void create(final String parentPath, final RealmTO realmTO) {
-        getService(RealmService.class).create(parentPath, realmTO);
+    public ProvisioningResult<RealmTO> create(final String parentPath, final RealmTO realmTO) {
+        final Response response = getService(RealmService.class).create(parentPath, realmTO);
+        return response.readEntity(new GenericType<ProvisioningResult<RealmTO>>() {
+        });
     }
 
-    public void update(final RealmTO realmTO) {
-        getService(RealmService.class).update(realmTO);
+    public ProvisioningResult<RealmTO> update(final RealmTO realmTO) {
+        final Response response = getService(RealmService.class).update(realmTO);
+        return response.readEntity(new GenericType<ProvisioningResult<RealmTO>>() {
+        });
     }
 
     public void delete(final String fullPath) {

http://git-wip-us.apache.org/repos/asf/syncope/blob/0370ddc6/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 86d0e38..157d151 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
@@ -211,6 +211,7 @@ public abstract class WizardMgtPanel<T extends Serializable> extends Panel imple
                 } else {
                     container.addOrReplace(initialFragment);
                 }
+                customActionOnCancelCallback(target);
             } else if (event.getPayload() instanceof AjaxWizard.NewItemFinishEvent) {
                 SyncopeConsoleSession.get().info(getString(Constants.OPERATION_SUCCEEDED));
                 ((BasePage) pageRef.getPage()).getNotificationPanel().refresh(target);
@@ -238,7 +239,7 @@ public abstract class WizardMgtPanel<T extends Serializable> extends Panel imple
                 } else {
                     container.addOrReplace(initialFragment);
                 }
-                customActionOnCloseCallback(target);
+                customActionOnFinishCallback(target);
             }
 
             if (containerAutoRefresh) {
@@ -337,7 +338,7 @@ public abstract class WizardMgtPanel<T extends Serializable> extends Panel imple
      *
      * @param modal target modal.
      */
-    protected final void setWindowClosedReloadCallback(final BaseModal<?> modal) {
+    protected void setWindowClosedReloadCallback(final BaseModal<?> modal) {
         modal.setWindowClosedCallback(new ModalWindow.WindowClosedCallback() {
 
             private static final long serialVersionUID = 8804221891699487139L;
@@ -350,11 +351,19 @@ public abstract class WizardMgtPanel<T extends Serializable> extends Panel imple
     }
 
     /**
-     * Custom action to perform on close callback.
+     * Custom action to perform on close callback on finish event.
      *
      * @param target Ajax request target.
      */
-    protected void customActionOnCloseCallback(final AjaxRequestTarget target) {
+    protected void customActionOnFinishCallback(final AjaxRequestTarget target) {
+    }
+
+    /**
+     * Custom action to perform on close callback on cancel event.
+     *
+     * @param target Ajax request target.
+     */
+    protected void customActionOnCancelCallback(final AjaxRequestTarget target) {
     }
 
     /**

http://git-wip-us.apache.org/repos/asf/syncope/blob/0370ddc6/client/console/src/main/java/org/apache/syncope/client/console/wizards/any/ConnObjectPanel.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/wizards/any/ConnObjectPanel.java b/client/console/src/main/java/org/apache/syncope/client/console/wizards/any/ConnObjectPanel.java
index 49f6801..329fff9 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/wizards/any/ConnObjectPanel.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/wizards/any/ConnObjectPanel.java
@@ -20,10 +20,11 @@ package org.apache.syncope.client.console.wizards.any;
 
 import java.util.ArrayList;
 import java.util.Collections;
-import java.util.Comparator;
 import java.util.List;
 import java.util.Map;
 import org.apache.commons.collections4.CollectionUtils;
+import org.apache.commons.collections4.ListUtils;
+import org.apache.commons.collections4.Transformer;
 import org.apache.commons.lang3.tuple.Pair;
 import org.apache.syncope.client.console.commons.ConnIdSpecialAttributeName;
 import org.apache.syncope.common.lib.to.AttrTO;
@@ -49,31 +50,39 @@ public class ConnObjectPanel extends Panel {
     public ConnObjectPanel(final String id, final Pair<ConnObjectTO, ConnObjectTO> connObjectTOs) {
         super(id);
 
-        final IModel<List<AttrTO>> formProps = new LoadableDetachableModel<List<AttrTO>>() {
+        final IModel<List<String>> formProps = new LoadableDetachableModel<List<String>>() {
 
             private static final long serialVersionUID = 5275935387613157437L;
 
             @Override
-            protected List<AttrTO> load() {
-                List<AttrTO> attrs = new ArrayList<>(connObjectTOs == null || connObjectTOs.getRight() == null
+            protected List<String> load() {
+                List<AttrTO> right = new ArrayList<>(connObjectTOs == null || connObjectTOs.getRight() == null
                         ? Collections.<AttrTO>emptyList()
                         : connObjectTOs.getRight().getAttrs());
 
-                Collections.sort(attrs, new Comparator<AttrTO>() {
+                List<AttrTO> left = new ArrayList<>(connObjectTOs == null || connObjectTOs.getLeft() == null
+                        ? Collections.<AttrTO>emptyList()
+                        : connObjectTOs.getLeft().getAttrs());
 
-                    @Override
-                    public int compare(final AttrTO attr1, final AttrTO attr2) {
-                        if (attr1 == null || attr1.getSchema() == null) {
-                            return -1;
-                        }
-                        if (attr2 == null || attr2.getSchema() == null) {
-                            return 1;
-                        }
-                        return attr1.getSchema().compareTo(attr2.getSchema());
-                    }
-                });
+                final List<String> schemas = ListUtils.sum(
+                        CollectionUtils.collect(right, new Transformer<AttrTO, String>() {
+
+                            @Override
+                            public String transform(final AttrTO input) {
+                                return input.getSchema();
+                            }
+                        }, new ArrayList<String>()),
+                        CollectionUtils.collect(left, new Transformer<AttrTO, String>() {
+
+                            @Override
+                            public String transform(final AttrTO input) {
+                                return input.getSchema();
+                            }
+                        }, new ArrayList<String>()));
+
+                Collections.sort(schemas);
 
-                return attrs;
+                return schemas;
             }
         };
 
@@ -81,46 +90,46 @@ public class ConnObjectPanel extends Panel {
                 ? null
                 : connObjectTOs.getLeft().getPlainAttrMap();
 
-        final ListView<AttrTO> propView = new ListView<AttrTO>("propView", formProps) {
+        final Map<String, AttrTO> afterProfile = connObjectTOs == null || connObjectTOs.getRight() == null
+                ? null
+                : connObjectTOs.getRight().getPlainAttrMap();
+
+        final ListView<String> propView = new ListView<String>("propView", formProps) {
 
             private static final long serialVersionUID = 3109256773218160485L;
 
             @Override
-            protected void populateItem(final ListItem<AttrTO> item) {
-                final AttrTO prop = item.getModelObject();
+            protected void populateItem(final ListItem<String> item) {
+                final String prop = item.getModelObject();
 
                 final Fragment valueFragment;
-                if (beforeProfile == null) {
-                    valueFragment = new Fragment("value", "singleValue", ConnObjectPanel.this);
-                    valueFragment.add(getValuePanel("attribute", prop.getSchema(), prop));
-                } else {
-                    final AttrTO before = beforeProfile.get(prop.getSchema());
-
-                    valueFragment = new Fragment("value", "doubleValue", ConnObjectPanel.this);
-                    valueFragment.add(getValuePanel("oldAttribute", prop.getSchema(), before));
-                    valueFragment.add(getValuePanel("newAttribute", prop.getSchema(), prop));
-
-                    if (before == null
-                            || (CollectionUtils.isNotEmpty(prop.getValues())
-                            && CollectionUtils.isEmpty(before.getValues()))
-                            || (CollectionUtils.isEmpty(prop.getValues())
-                            && CollectionUtils.isNotEmpty(before.getValues()))
-                            || (CollectionUtils.isNotEmpty(prop.getValues())
-                            && CollectionUtils.isNotEmpty(before.getValues())
-                            && prop.getValues().size() != before.getValues().size())
-                            || (CollectionUtils.isNotEmpty(prop.getValues())
-                            && CollectionUtils.isNotEmpty(before.getValues())
-                            && !prop.getValues().equals(before.getValues()))) {
-                        valueFragment.add(new Behavior() {
-
-                            private static final long serialVersionUID = 3109256773218160485L;
-
-                            @Override
-                            public void onComponentTag(final Component component, final ComponentTag tag) {
-                                tag.put("class", "highlight");
-                            }
-                        });
-                    }
+                final AttrTO before = beforeProfile == null ? null : beforeProfile.get(prop);
+                final AttrTO after = afterProfile == null ? null : afterProfile.get(prop);
+
+                valueFragment = new Fragment("value", "doubleValue", ConnObjectPanel.this);
+                valueFragment.add(getValuePanel("oldAttribute", prop, before));
+                valueFragment.add(getValuePanel("newAttribute", prop, after));
+
+                if (before == null || after == null
+                        || (CollectionUtils.isNotEmpty(after.getValues())
+                        && CollectionUtils.isEmpty(before.getValues()))
+                        || (CollectionUtils.isEmpty(after.getValues())
+                        && CollectionUtils.isNotEmpty(before.getValues()))
+                        || (CollectionUtils.isNotEmpty(after.getValues())
+                        && CollectionUtils.isNotEmpty(before.getValues())
+                        && after.getValues().size() != before.getValues().size())
+                        || (CollectionUtils.isNotEmpty(after.getValues())
+                        && CollectionUtils.isNotEmpty(before.getValues())
+                        && !after.getValues().equals(before.getValues()))) {
+                    valueFragment.add(new Behavior() {
+
+                        private static final long serialVersionUID = 3109256773218160485L;
+
+                        @Override
+                        public void onComponentTag(final Component component, final ComponentTag tag) {
+                            tag.put("class", "highlight");
+                        }
+                    });
                 }
                 item.add(valueFragment);
             }

http://git-wip-us.apache.org/repos/asf/syncope/blob/0370ddc6/client/console/src/main/java/org/apache/syncope/client/console/wizards/any/StatusPanel.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/wizards/any/StatusPanel.java b/client/console/src/main/java/org/apache/syncope/client/console/wizards/any/StatusPanel.java
index 8594d91..79ec175 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/wizards/any/StatusPanel.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/wizards/any/StatusPanel.java
@@ -24,6 +24,7 @@ import java.util.List;
 import java.util.Map;
 import org.apache.commons.collections4.CollectionUtils;
 import org.apache.commons.lang3.tuple.Pair;
+import org.apache.syncope.client.console.commons.Constants;
 import org.apache.syncope.client.console.commons.SerializableTransformer;
 import org.apache.syncope.client.console.commons.status.ConnObjectWrapper;
 import org.apache.syncope.client.console.commons.status.Status;
@@ -31,7 +32,7 @@ import org.apache.syncope.client.console.commons.status.StatusBean;
 import org.apache.syncope.client.console.commons.status.StatusUtils;
 import org.apache.syncope.client.console.panels.ListViewPanel;
 import org.apache.syncope.client.console.panels.MultilevelPanel;
-import org.apache.syncope.client.console.panels.MultilevelPanel.SecondLevel;
+import org.apache.syncope.client.console.panels.RemoteObjectPanel;
 import org.apache.syncope.client.console.wicket.markup.html.form.ActionLink;
 import org.apache.syncope.common.lib.to.AnyTO;
 import org.apache.syncope.common.lib.to.ConnObjectTO;
@@ -99,7 +100,7 @@ public class StatusPanel extends Panel {
         final List<StatusBean> statusBeans = new ArrayList<>(connObjects.size() + 1);
         initialStatusBeanMap = new LinkedHashMap<>(connObjects.size() + 1);
 
-        final StatusBean syncope = new StatusBean(any, "syncope");
+        final StatusBean syncope = new StatusBean(any, Constants.SYNCOPE);
 
         if (any instanceof UserTO) {
             syncope.setConnObjectLink(((UserTO) any).getUsername());
@@ -169,7 +170,7 @@ public class StatusPanel extends Panel {
 
             @Override
             public void onClick(final AjaxRequestTarget target, final StatusBean bean) {
-                mlp.next(bean.getResourceName(), new RemoteObjectPanel(bean, connObjects), target);
+                mlp.next(bean.getResourceName(), new RemoteAnyPanel(bean, connObjects), target);
             }
         }, ActionLink.ActionType.VIEW, StandardEntitlement.RESOURCE_GET_CONNOBJECT);
 
@@ -185,8 +186,9 @@ public class StatusPanel extends Panel {
         return initialStatusBeanMap;
     }
 
-    private Pair<ConnObjectTO, ConnObjectTO> getConnObjectTO(
-            final String anyKey, final String resourceName, final List<Pair<ConnObjectTO, ConnObjectWrapper>> objects) {
+    protected Pair<ConnObjectTO, ConnObjectTO> getConnObjectTO(
+            final String anyKey, final String resourceName,
+            final List<Pair<ConnObjectTO, ConnObjectWrapper>> objects) {
 
         for (Pair<ConnObjectTO, ConnObjectWrapper> object : objects) {
             if (anyKey.equals(object.getRight().getAny().getKey())
@@ -199,14 +201,24 @@ public class StatusPanel extends Panel {
         return null;
     }
 
-    public class RemoteObjectPanel extends SecondLevel {
+    public class RemoteAnyPanel extends RemoteObjectPanel {
 
         private static final long serialVersionUID = 4303365227411467563L;
 
-        public RemoteObjectPanel(final StatusBean bean, final List<Pair<ConnObjectTO, ConnObjectWrapper>> connObjects) {
-            final Pair<ConnObjectTO, ConnObjectTO> res = getConnObjectTO(bean.getAnyKey(), bean.getResourceName(),
-                    connObjects);
-            add(new ConnObjectPanel("remoteObject", res == null ? null : res));
+        private final StatusBean bean;
+
+        private final List<Pair<ConnObjectTO, ConnObjectWrapper>> connObjects;
+
+        public RemoteAnyPanel(final StatusBean bean, final List<Pair<ConnObjectTO, ConnObjectWrapper>> connObjects) {
+            this.bean = bean;
+            this.connObjects = connObjects;
+
+            add(new ConnObjectPanel(REMOTE_OBJECT_PANEL_ID, getConnObjectTO()));
+        }
+
+        @Override
+        protected final Pair<ConnObjectTO, ConnObjectTO> getConnObjectTO() {
+            return StatusPanel.this.getConnObjectTO(bean.getAnyKey(), bean.getResourceName(), connObjects);
         }
     }
 }

http://git-wip-us.apache.org/repos/asf/syncope/blob/0370ddc6/client/console/src/main/java/org/apache/syncope/client/console/wizards/resources/ResourceMappingPanel.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/wizards/resources/ResourceMappingPanel.java b/client/console/src/main/java/org/apache/syncope/client/console/wizards/resources/ResourceMappingPanel.java
index de90660..158b170 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/wizards/resources/ResourceMappingPanel.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/wizards/resources/ResourceMappingPanel.java
@@ -33,14 +33,11 @@ import java.util.HashSet;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
-import org.apache.commons.collections4.IterableUtils;
-import org.apache.commons.collections4.Predicate;
 import org.apache.commons.lang3.ClassUtils;
 import org.apache.syncope.client.console.commons.ConnIdSpecialAttributeName;
 import org.apache.syncope.client.console.commons.Constants;
 import org.apache.syncope.client.console.rest.AnyTypeClassRestClient;
 import org.apache.syncope.client.console.rest.AnyTypeRestClient;
-import org.apache.syncope.client.console.rest.ConnectorRestClient;
 import org.apache.syncope.client.console.wicket.ajax.form.IndicatorAjaxFormComponentUpdatingBehavior;
 import org.apache.syncope.client.console.wicket.markup.html.form.ActionLink;
 import org.apache.syncope.client.console.wicket.markup.html.form.ActionLinksPanel;
@@ -52,8 +49,6 @@ import org.apache.syncope.client.console.widgets.MappingItemTransformerWidget;
 import org.apache.syncope.common.lib.to.AnyObjectTO;
 import org.apache.syncope.common.lib.to.AnyTypeClassTO;
 import org.apache.syncope.common.lib.to.AnyTypeTO;
-import org.apache.syncope.common.lib.to.ConnIdObjectClassTO;
-import org.apache.syncope.common.lib.to.ConnInstanceTO;
 import org.apache.syncope.common.lib.to.GroupTO;
 import org.apache.syncope.common.lib.to.MappingItemTO;
 import org.apache.syncope.common.lib.to.MappingTO;
@@ -61,7 +56,6 @@ import org.apache.syncope.common.lib.to.ProvisionTO;
 import org.apache.syncope.common.lib.to.ResourceTO;
 import org.apache.syncope.common.lib.to.UserTO;
 import org.apache.syncope.common.lib.types.AnyTypeKind;
-import org.apache.syncope.common.lib.types.ConnConfProperty;
 import org.apache.syncope.common.lib.types.MappingPurpose;
 import org.apache.syncope.common.lib.types.StandardEntitlement;
 import org.apache.wicket.ajax.AjaxRequestTarget;
@@ -121,11 +115,6 @@ public class ResourceMappingPanel extends Panel {
      */
     private final AnyTypeClassRestClient anyTypeClassRestClient = new AnyTypeClassRestClient();
 
-    /**
-     * ConnInstance rest client.
-     */
-    private final ConnectorRestClient connRestClient = new ConnectorRestClient();
-
     private final Label passwordLabel;
 
     /**
@@ -284,7 +273,10 @@ public class ResourceMappingPanel extends Panel {
                         "extAttrName",
                         getString("extAttrName"),
                         new PropertyModel<String>(mapItem, "extAttrName"));
-                extAttrName.setChoices(getExtAttrNames(resourceTO.getConnector(), resourceTO.getConfOverride()));
+                extAttrName.setChoices(ResourceProvisionPanel.getExtAttrNames(
+                        ResourceMappingPanel.this.provisionTO.getObjectClass(),
+                        resourceTO.getConnector(),
+                        resourceTO.getConfOverride()));
 
                 boolean required = !mapItem.isPassword();
                 extAttrName.setRequired(required).hideLabel();
@@ -463,26 +455,6 @@ public class ResourceMappingPanel extends Panel {
         passwordLabel.setVisible(AnyTypeKind.USER.name().equals(this.provisionTO.getAnyType()));
     }
 
-    private List<String> getExtAttrNames(final String connectorKey, final Set<ConnConfProperty> conf) {
-        ConnInstanceTO connInstanceTO = new ConnInstanceTO();
-        connInstanceTO.setKey(connectorKey);
-        connInstanceTO.getConf().addAll(conf);
-
-        // SYNCOPE-156: use provided info to give schema names (and type!) by ObjectClass
-        ConnIdObjectClassTO connIdObjectClass = IterableUtils.find(
-                connRestClient.buildObjectClassInfo(connInstanceTO, false), new Predicate<ConnIdObjectClassTO>() {
-
-            @Override
-            public boolean evaluate(final ConnIdObjectClassTO object) {
-                return object.getType().equalsIgnoreCase(ResourceMappingPanel.this.provisionTO.getObjectClass());
-            }
-        });
-
-        return connIdObjectClass == null
-                ? new ArrayList<String>()
-                : connIdObjectClass.getAttributes();
-    }
-
     /**
      * Set attribute names for a drop down choice list.
      *

http://git-wip-us.apache.org/repos/asf/syncope/blob/0370ddc6/client/console/src/main/java/org/apache/syncope/client/console/wizards/resources/ResourceProvisionPanel.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/wizards/resources/ResourceProvisionPanel.java b/client/console/src/main/java/org/apache/syncope/client/console/wizards/resources/ResourceProvisionPanel.java
index 873f728..e7debac 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/wizards/resources/ResourceProvisionPanel.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/wizards/resources/ResourceProvisionPanel.java
@@ -22,6 +22,7 @@ import java.io.Serializable;
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.List;
+import java.util.Set;
 import org.apache.commons.collections4.IterableUtils;
 import org.apache.commons.collections4.IteratorUtils;
 import org.apache.commons.collections4.Predicate;
@@ -33,21 +34,33 @@ import org.apache.syncope.client.console.pages.BasePage;
 import org.apache.syncope.client.console.panels.AbstractModalPanel;
 import org.apache.syncope.client.console.panels.ListViewPanel;
 import org.apache.syncope.client.console.panels.ListViewPanel.ListViewReload;
+import org.apache.syncope.client.console.rest.ConnectorRestClient;
 import org.apache.syncope.client.console.rest.ResourceRestClient;
+import org.apache.syncope.client.console.wicket.ajax.form.IndicatorAjaxFormComponentUpdatingBehavior;
 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.wicket.markup.html.form.AjaxCheckBoxPanel;
+import org.apache.syncope.client.console.wicket.markup.html.form.AjaxTextFieldPanel;
 import org.apache.syncope.client.console.wizards.AjaxWizard;
 import org.apache.syncope.client.console.wizards.WizardMgtPanel;
+import org.apache.syncope.common.lib.to.ConnIdObjectClassTO;
+import org.apache.syncope.common.lib.to.ConnInstanceTO;
 import org.apache.syncope.common.lib.to.MappingItemTO;
 import org.apache.syncope.common.lib.to.ProvisionTO;
 import org.apache.syncope.common.lib.to.ResourceTO;
+import org.apache.syncope.common.lib.to.OrgUnitTO;
+import org.apache.syncope.common.lib.types.ConnConfProperty;
 import org.apache.syncope.common.lib.types.StandardEntitlement;
 import org.apache.syncope.common.rest.api.service.ResourceService;
 import org.apache.wicket.PageReference;
 import org.apache.wicket.ajax.AjaxRequestTarget;
 import org.apache.wicket.event.Broadcast;
+import org.apache.wicket.event.IEvent;
+import org.apache.wicket.markup.html.WebMarkupContainer;
 import org.apache.wicket.markup.html.form.Form;
 import org.apache.wicket.model.Model;
+import org.apache.wicket.model.PropertyModel;
+import org.apache.wicket.model.ResourceModel;
 import org.apache.wicket.model.StringResourceModel;
 
 public class ResourceProvisionPanel extends AbstractModalPanel<Serializable> {
@@ -56,6 +69,10 @@ public class ResourceProvisionPanel extends AbstractModalPanel<Serializable> {
 
     private final ResourceTO resourceTO;
 
+    private Model<OrgUnitTO> baseModel;
+
+    private final WebMarkupContainer aboutRealmProvison;
+
     public ResourceProvisionPanel(
             final BaseModal<Serializable> modal,
             final ResourceTO resourceTO,
@@ -63,8 +80,90 @@ public class ResourceProvisionPanel extends AbstractModalPanel<Serializable> {
         super(modal, pageRef);
         this.resourceTO = resourceTO;
 
+        baseModel = Model.of(resourceTO.getOrgUnit() == null ? new OrgUnitTO() : resourceTO.getOrgUnit());
+
         setOutputMarkupId(true);
 
+        // ----------------------------------------------------------------------
+        // Realms provisioning
+        // ----------------------------------------------------------------------
+        aboutRealmProvison = new WebMarkupContainer("aboutRealmProvison");
+        aboutRealmProvison.setOutputMarkupPlaceholderTag(true);
+        add(aboutRealmProvison);
+
+        boolean realmProvisionEnabled = resourceTO.getOrgUnit() != null;
+
+        final AjaxCheckBoxPanel enableRealmsProvision = new AjaxCheckBoxPanel(
+                "enableRealmsProvision",
+                "enableRealmsProvision",
+                Model.of(realmProvisionEnabled),
+                false);
+        aboutRealmProvison.add(enableRealmsProvision);
+
+        final WebMarkupContainer realmsProvisionContainer = new WebMarkupContainer("realmsProvisionContainer");
+        realmsProvisionContainer.setOutputMarkupPlaceholderTag(true);
+        realmsProvisionContainer.setEnabled(realmProvisionEnabled).setVisible(realmProvisionEnabled);
+        aboutRealmProvison.add(realmsProvisionContainer);
+
+        final AjaxTextFieldPanel objectClass = new AjaxTextFieldPanel(
+                "objectClass",
+                getString("objectClass"),
+                new PropertyModel<String>(baseModel.getObject(), "objectClass"),
+                false);
+        realmsProvisionContainer.add(objectClass.addRequiredLabel());
+
+        final AjaxTextFieldPanel extAttrName = new AjaxTextFieldPanel(
+                "extAttrName",
+                getString("extAttrName"),
+                new PropertyModel<String>(baseModel.getObject(), "extAttrName"),
+                false);
+        extAttrName.setChoices(ResourceProvisionPanel.getExtAttrNames(
+                resourceTO.getOrgUnit() == null ? StringUtils.EMPTY : resourceTO.getOrgUnit().getObjectClass(),
+                resourceTO.getConnector(),
+                resourceTO.getConfOverride()));
+        realmsProvisionContainer.add(extAttrName.addRequiredLabel());
+
+        objectClass.getField().add(new IndicatorAjaxFormComponentUpdatingBehavior(Constants.ON_BLUR) {
+
+            private static final long serialVersionUID = -1107858522700306810L;
+
+            @Override
+            protected void onUpdate(final AjaxRequestTarget target) {
+                extAttrName.setChoices(ResourceProvisionPanel.getExtAttrNames(
+                        objectClass.getModelObject(),
+                        resourceTO.getConnector(),
+                        resourceTO.getConfOverride()));
+                target.focusComponent(extAttrName);
+            }
+        });
+
+        final AjaxTextFieldPanel connObjectLink = new AjaxTextFieldPanel(
+                "connObjectLink",
+                new ResourceModel("connObjectLink", "connObjectLink").getObject(),
+                new PropertyModel<String>(baseModel.getObject(), "connObjectLink"),
+                false);
+        realmsProvisionContainer.add(connObjectLink.addRequiredLabel());
+
+        enableRealmsProvision.getField().add(new IndicatorAjaxFormComponentUpdatingBehavior(Constants.ON_CHANGE) {
+
+            private static final long serialVersionUID = -1107858522700306810L;
+
+            @Override
+            protected void onUpdate(final AjaxRequestTarget target) {
+                boolean realmProvisionEnabled = enableRealmsProvision.getModelObject();
+                realmsProvisionContainer.setEnabled(realmProvisionEnabled).setVisible(realmProvisionEnabled);
+                target.add(realmsProvisionContainer);
+
+                if (realmProvisionEnabled) {
+                    resourceTO.setOrgUnit(baseModel.getObject());
+                } else {
+                    resourceTO.setOrgUnit(null);
+                }
+
+            }
+        });
+        // ----------------------------------------------------------------------
+
         final ProvisionWizardBuilder wizard = new ProvisionWizardBuilder(resourceTO, pageRef);
 
         final ListViewPanel.Builder<ProvisionTO> builder = new ListViewPanel.Builder<ProvisionTO>(
@@ -87,6 +186,19 @@ public class ResourceProvisionPanel extends AbstractModalPanel<Serializable> {
                             }
                         });
             }
+
+            @Override
+            protected void customActionOnCancelCallback(final AjaxRequestTarget target) {
+                ResourceProvisionPanel.this.aboutRealmProvison.setVisible(true);
+                target.add(ResourceProvisionPanel.this.aboutRealmProvison);
+            }
+
+            @Override
+            protected void customActionOnFinishCallback(final AjaxRequestTarget target) {
+                ResourceProvisionPanel.this.aboutRealmProvison.setVisible(true);
+                target.add(ResourceProvisionPanel.this.aboutRealmProvison);
+            }
+
         };
 
         builder.setItems(resourceTO.getProvisions());
@@ -221,4 +333,34 @@ public class ResourceProvisionPanel extends AbstractModalPanel<Serializable> {
         }
         ((BasePage) pageRef.getPage()).getNotificationPanel().refresh(target);
     }
+
+    protected static List<String> getExtAttrNames(
+            final String objectClass, final String connectorKey, final Set<ConnConfProperty> conf) {
+        ConnInstanceTO connInstanceTO = new ConnInstanceTO();
+        connInstanceTO.setKey(connectorKey);
+        connInstanceTO.getConf().addAll(conf);
+
+        // SYNCOPE-156: use provided info to give schema names (and type!) by ObjectClass
+        ConnIdObjectClassTO connIdObjectClass = IterableUtils.find(new ConnectorRestClient().
+                buildObjectClassInfo(connInstanceTO, false), new Predicate<ConnIdObjectClassTO>() {
+
+            @Override
+            public boolean evaluate(final ConnIdObjectClassTO object) {
+                return object.getType().equalsIgnoreCase(objectClass);
+            }
+        });
+
+        return connIdObjectClass == null ? new ArrayList<String>() : connIdObjectClass.getAttributes();
+    }
+
+    @Override
+    public void onEvent(final IEvent<?> event) {
+
+        if (event.getPayload() instanceof AjaxWizard.NewItemActionEvent) {
+            aboutRealmProvison.setVisible(false);
+            ((AjaxWizard.NewItemEvent) event.getPayload()).getTarget().add(aboutRealmProvison);
+        }
+
+        super.onEvent(event);
+    }
 }

http://git-wip-us.apache.org/repos/asf/syncope/blob/0370ddc6/client/console/src/main/resources/META-INF/resources/css/syncopeConsole.css
----------------------------------------------------------------------
diff --git a/client/console/src/main/resources/META-INF/resources/css/syncopeConsole.css b/client/console/src/main/resources/META-INF/resources/css/syncopeConsole.css
index fb59b39..feecdbb 100644
--- a/client/console/src/main/resources/META-INF/resources/css/syncopeConsole.css
+++ b/client/console/src/main/resources/META-INF/resources/css/syncopeConsole.css
@@ -150,7 +150,7 @@ div.wicket-modal div.w_content_3 {
 
 .tab-content {
   margin-bottom: 10px;
-  margin-top: 10px;
+  margin-top: 5px;
   position: relative;
   overflow-x: hidden;
   overflow-y: auto;

http://git-wip-us.apache.org/repos/asf/syncope/blob/0370ddc6/client/console/src/main/resources/org/apache/syncope/client/console/pages/Realms.properties
----------------------------------------------------------------------
diff --git a/client/console/src/main/resources/org/apache/syncope/client/console/pages/Realms.properties b/client/console/src/main/resources/org/apache/syncope/client/console/pages/Realms.properties
index 3f7890a..a8eb7d5 100644
--- a/client/console/src/main/resources/org/apache/syncope/client/console/pages/Realms.properties
+++ b/client/console/src/main/resources/org/apache/syncope/client/console/pages/Realms.properties
@@ -14,6 +14,7 @@
 # KIND, either express or implied.  See the License for the
 # specific language governing permissions and limitations
 # under the License.
-newRealm=New Realm
-editRealm=Edit Realm ${fullPath}
+any.realm.new=New Realm
+any.realm.edit=Edit Realm ${fullPath}
 inner.template.edit=Edit ${left} template for '${right.fullPath}' 
+afterObj=Object Link

http://git-wip-us.apache.org/repos/asf/syncope/blob/0370ddc6/client/console/src/main/resources/org/apache/syncope/client/console/pages/Realms_it.properties
----------------------------------------------------------------------
diff --git a/client/console/src/main/resources/org/apache/syncope/client/console/pages/Realms_it.properties b/client/console/src/main/resources/org/apache/syncope/client/console/pages/Realms_it.properties
index 7151e21..8e84750 100644
--- a/client/console/src/main/resources/org/apache/syncope/client/console/pages/Realms_it.properties
+++ b/client/console/src/main/resources/org/apache/syncope/client/console/pages/Realms_it.properties
@@ -14,6 +14,7 @@
 # KIND, either express or implied.  See the License for the
 # specific language governing permissions and limitations
 # under the License.
-newRealm=New Realm
-editRealm=Edit Realm ${fullPath}
+any.realm.new=New Realm
+any.realm.edit=Edit Realm ${fullPath}
 inner.template.edit=Modifica ${left} template per '${right.fullPath}' 
+afterObj=Object Link

http://git-wip-us.apache.org/repos/asf/syncope/blob/0370ddc6/client/console/src/main/resources/org/apache/syncope/client/console/pages/Realms_pt_BR.properties
----------------------------------------------------------------------
diff --git a/client/console/src/main/resources/org/apache/syncope/client/console/pages/Realms_pt_BR.properties b/client/console/src/main/resources/org/apache/syncope/client/console/pages/Realms_pt_BR.properties
index 3f7890a..a8eb7d5 100644
--- a/client/console/src/main/resources/org/apache/syncope/client/console/pages/Realms_pt_BR.properties
+++ b/client/console/src/main/resources/org/apache/syncope/client/console/pages/Realms_pt_BR.properties
@@ -14,6 +14,7 @@
 # KIND, either express or implied.  See the License for the
 # specific language governing permissions and limitations
 # under the License.
-newRealm=New Realm
-editRealm=Edit Realm ${fullPath}
+any.realm.new=New Realm
+any.realm.edit=Edit Realm ${fullPath}
 inner.template.edit=Edit ${left} template for '${right.fullPath}' 
+afterObj=Object Link

http://git-wip-us.apache.org/repos/asf/syncope/blob/0370ddc6/client/console/src/main/resources/org/apache/syncope/client/console/pages/Realms_ru.properties
----------------------------------------------------------------------
diff --git a/client/console/src/main/resources/org/apache/syncope/client/console/pages/Realms_ru.properties b/client/console/src/main/resources/org/apache/syncope/client/console/pages/Realms_ru.properties
index 209f852..bec91ef 100644
--- a/client/console/src/main/resources/org/apache/syncope/client/console/pages/Realms_ru.properties
+++ b/client/console/src/main/resources/org/apache/syncope/client/console/pages/Realms_ru.properties
@@ -16,7 +16,8 @@
 # under the License.
 #
 # newRealm=\u00d0\u00a1\u00d0\u00be\u00d0\u00b7\u00d0\u00b4\u00d0\u00b0\u00d1\u0082\u00d1\u008c \u00d0\u00be\u00d0\u00b1\u00d0\u00bb\u00d0\u00b0\u00d1\u0081\u00d1\u0082\u00d1\u008c
-newRealm=\u0421\u043e\u0437\u0434\u0430\u0442\u044c \u043e\u0431\u043b\u0430\u0441\u0442\u044c
+any.realm.new=\u0421\u043e\u0437\u0434\u0430\u0442\u044c \u043e\u0431\u043b\u0430\u0441\u0442\u044c
 # editRealm=\u00d0\u0098\u00d0\u00b7\u00d0\u00bc\u00d0\u00b5\u00d0\u00bd\u00d0\u00b8\u00d1\u0082\u00d1\u008c \u00d0\u00be\u00d0\u00b1\u00d0\u00bb\u00d0\u00b0\u00d1\u0081\u00d1\u0082\u00d1\u008c ${fullPath}
-editRealm=\u0418\u0437\u043c\u0435\u043d\u0438\u0442\u044c \u043e\u0431\u043b\u0430\u0441\u0442\u044c ${fullPath}
+any.realm.edit=\u0418\u0437\u043c\u0435\u043d\u0438\u0442\u044c \u043e\u0431\u043b\u0430\u0441\u0442\u044c ${fullPath}
 inner.template.edit=Edit ${left} template for '${right.fullPath}' 
+afterObj=Object Link

http://git-wip-us.apache.org/repos/asf/syncope/blob/0370ddc6/client/console/src/main/resources/org/apache/syncope/client/console/panels/Realm.html
----------------------------------------------------------------------
diff --git a/client/console/src/main/resources/org/apache/syncope/client/console/panels/Realm.html b/client/console/src/main/resources/org/apache/syncope/client/console/panels/Realm.html
index c674ea8..25a998f 100644
--- a/client/console/src/main/resources/org/apache/syncope/client/console/panels/Realm.html
+++ b/client/console/src/main/resources/org/apache/syncope/client/console/panels/Realm.html
@@ -17,7 +17,7 @@ specific language governing permissions and limitations
 under the License.
 -->
 <html xmlns="http://www.w3.org/1999/xhtml" xmlns:wicket="http://wicket.apache.org">
-  <wicket:panel>
+  <wicket:extend>
     <div wicket:id="tabbedPanel"></div>
-  </wicket:panel>
+  </wicket:extend>
 </html>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/syncope/blob/0370ddc6/client/console/src/main/resources/org/apache/syncope/client/console/panels/RealmDetails.html
----------------------------------------------------------------------
diff --git a/client/console/src/main/resources/org/apache/syncope/client/console/panels/RealmDetails.html b/client/console/src/main/resources/org/apache/syncope/client/console/panels/RealmDetails.html
index dacb356..76c4b98 100644
--- a/client/console/src/main/resources/org/apache/syncope/client/console/panels/RealmDetails.html
+++ b/client/console/src/main/resources/org/apache/syncope/client/console/panels/RealmDetails.html
@@ -19,13 +19,26 @@ under the License.
 <html xmlns="http://www.w3.org/1999/xhtml" xmlns:wicket="http://wicket.apache.org">
   <wicket:panel>
     <div wicket:id="container" class="summarize">
-      <span wicket:id="name">[name]</span>
-      <span wicket:id="fullPath">[fullPath]</span>
-      <span wicket:id="accountPolicy">[accountPolicy]</span>
-      <span wicket:id="passwordPolicy">[passwordPolicy]</span>
+      <div wicket:id="generics">
+        <div class="form-group">
+          <span wicket:id="name">[name]</span>
+        </div>
+        <div class="form-group">
+          <span wicket:id="fullPath">[fullPath]</span>
+        </div>
+      </div>
+      <div class="form-group">
+        <span wicket:id="accountPolicy">[accountPolicy]</span>
+      </div>
+      <div class="form-group">
+        <span wicket:id="passwordPolicy">[passwordPolicy]</span>
+      </div>
       <div class="form-group form-palette">
         <span wicket:id="actionsClassNames">[actionsClassNames]</span>
       </div>
+      <div class="form-group form-palette">
+        <span wicket:id="resources">[resources]</span>
+      </div>
     </div>
 
     <span wicket:id="actions"></span>

http://git-wip-us.apache.org/repos/asf/syncope/blob/0370ddc6/client/console/src/main/resources/org/apache/syncope/client/console/panels/RealmDetails.properties
----------------------------------------------------------------------
diff --git a/client/console/src/main/resources/org/apache/syncope/client/console/panels/RealmDetails.properties b/client/console/src/main/resources/org/apache/syncope/client/console/panels/RealmDetails.properties
index 5dd65af..c4848a1 100644
--- a/client/console/src/main/resources/org/apache/syncope/client/console/panels/RealmDetails.properties
+++ b/client/console/src/main/resources/org/apache/syncope/client/console/panels/RealmDetails.properties
@@ -18,3 +18,4 @@ fullPath=Path
 accountPolicy=Account Policy
 passwordPolicy=Password Policy
 actionsClassNames=Actions
+resources=Assigned resources

http://git-wip-us.apache.org/repos/asf/syncope/blob/0370ddc6/client/console/src/main/resources/org/apache/syncope/client/console/panels/RealmDetails_it.properties
----------------------------------------------------------------------
diff --git a/client/console/src/main/resources/org/apache/syncope/client/console/panels/RealmDetails_it.properties b/client/console/src/main/resources/org/apache/syncope/client/console/panels/RealmDetails_it.properties
index 6d4cead..05d20c2 100644
--- a/client/console/src/main/resources/org/apache/syncope/client/console/panels/RealmDetails_it.properties
+++ b/client/console/src/main/resources/org/apache/syncope/client/console/panels/RealmDetails_it.properties
@@ -18,3 +18,4 @@ fullPath=Percorso
 accountPolicy=Account Policy
 passwordPolicy=Password Policy
 actionsClassNames=Actions
+resources=Risorse assegnate

http://git-wip-us.apache.org/repos/asf/syncope/blob/0370ddc6/client/console/src/main/resources/org/apache/syncope/client/console/panels/RealmDetails_pt_BR.properties
----------------------------------------------------------------------
diff --git a/client/console/src/main/resources/org/apache/syncope/client/console/panels/RealmDetails_pt_BR.properties b/client/console/src/main/resources/org/apache/syncope/client/console/panels/RealmDetails_pt_BR.properties
index db6910f..786313f 100644
--- a/client/console/src/main/resources/org/apache/syncope/client/console/panels/RealmDetails_pt_BR.properties
+++ b/client/console/src/main/resources/org/apache/syncope/client/console/panels/RealmDetails_pt_BR.properties
@@ -18,3 +18,4 @@ fullPath=Caminho
 accountPolicy=Pol\u00edtica de Conta
 passwordPolicy=Pol\u00edtica de Senha
 actionsClassNames=Actions
+resources=Assigned resources

http://git-wip-us.apache.org/repos/asf/syncope/blob/0370ddc6/client/console/src/main/resources/org/apache/syncope/client/console/panels/RealmDetails_ru.properties
----------------------------------------------------------------------
diff --git a/client/console/src/main/resources/org/apache/syncope/client/console/panels/RealmDetails_ru.properties b/client/console/src/main/resources/org/apache/syncope/client/console/panels/RealmDetails_ru.properties
index a79ba76..27396c6 100644
--- a/client/console/src/main/resources/org/apache/syncope/client/console/panels/RealmDetails_ru.properties
+++ b/client/console/src/main/resources/org/apache/syncope/client/console/panels/RealmDetails_ru.properties
@@ -15,11 +15,12 @@
 # specific language governing permissions and limitations
 # under the License.
 #
-# fullPath=\u041f\u0443\u0442\u044c
+# fullPath=\u00d0\u009f\u00d1\u0083\u00d1\u0082\u00d1\u008c
 fullPath=\u041f\u0443\u0442\u044c
-# accountPolicy=\u041f\u043e\u043b\u0438\u0442\u0438\u043a\u0430 \u0443\u0447\u0435\u0442\u043d\u044b\u0445 \u0437\u0430\u043f\u0438\u0441\u0435\u0439
+# accountPolicy=\u00d0\u009f\u00d0\u00be\u00d0\u00bb\u00d0\u00b8\u00d1\u0082\u00d0\u00b8\u00d0\u00ba\u00d0\u00b0 \u00d1\u0083\u00d1\u0087\u00d0\u00b5\u00d1\u0082\u00d0\u00bd\u00d1\u008b\u00d1\u0085 \u00d0\u00b7\u00d0\u00b0\u00d0\u00bf\u00d0\u00b8\u00d1\u0081\u00d0\u00b5\u00d0\u00b9
 accountPolicy=\u041f\u043e\u043b\u0438\u0442\u0438\u043a\u0430 \u0443\u0447\u0435\u0442\u043d\u044b\u0445 \u0437\u0430\u043f\u0438\u0441\u0435\u0439
-# passwordPolicy=\u041f\u043e\u043b\u0438\u0442\u0438\u043a\u0430 \u043f\u0430\u0440\u043e\u043b\u0435\u0439
+# passwordPolicy=\u00d0\u009f\u00d0\u00be\u00d0\u00bb\u00d0\u00b8\u00d1\u0082\u00d0\u00b8\u00d0\u00ba\u00d0\u00b0 \u00d0\u00bf\u00d0\u00b0\u00d1\u0080\u00d0\u00be\u00d0\u00bb\u00d0\u00b5\u00d0\u00b9
 passwordPolicy=\u041f\u043e\u043b\u0438\u0442\u0438\u043a\u0430 \u043f\u0430\u0440\u043e\u043b\u0435\u0439
-# actionsClassNames=\u0414\u0435\u0439\u0441\u0442\u0432\u0438\u044f
+# actionsClassNames=\u00d0\u0094\u00d0\u00b5\u00d0\u00b9\u00d1\u0081\u00d1\u0082\u00d0\u00b2\u00d0\u00b8\u00d1\u008f
 actionsClassNames=\u0414\u0435\u0439\u0441\u0442\u0432\u0438\u044f
+resources=Assigned resources