You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@syncope.apache.org by il...@apache.org on 2022/05/18 14:53:19 UTC

[syncope] branch master updated (66eec27159 -> ac55c571f5)

This is an automated email from the ASF dual-hosted git repository.

ilgrosso pushed a change to branch master
in repository https://gitbox.apache.org/repos/asf/syncope.git


    from 66eec27159 Upgrading Jackson
     new 09d2adb4e6 Upgrading Tomcat and JSOUP
     new ac55c571f5 Improving Realms page extendability

The 2 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.


Summary of changes:
 .../client/console/SyncopeConsoleSession.java      |  10 +-
 .../client/console/commons/RealmsUtils.java        |   2 +-
 .../syncope/client/console/pages/Realms.java       | 180 +++++++------
 .../syncope/client/console/panels/AnyPanel.java    |   2 +-
 .../syncope/client/console/panels/Realm.java       | 211 +++++++++-------
 .../client/console/panels/RealmChoicePanel.java    | 277 ++++++++++-----------
 .../client/console/panels/RealmDetails.java        |  12 +-
 .../client/console/panels/RealmWizardBuilder.java  |   3 +-
 .../client/console/rest/RealmRestClient.java       |   4 +-
 .../console/wicket/markup/html/form/Action.java    |   2 +-
 .../wicket/markup/html/form/ActionsPanel.java      |  10 +
 .../client/console/widgets/NumberWidget.java       |  10 +-
 .../client/console/panels/RealmChoicePanel.html    |   2 +-
 .../syncope/core/logic/ReconciliationLogic.java    |   2 +-
 .../java/data/RealmDataBinderImpl.java             |   3 +-
 .../apache/syncope/fit/console/RealmsITCase.java   |   8 +-
 pom.xml                                            |   4 +-
 17 files changed, 398 insertions(+), 344 deletions(-)


[syncope] 01/02: Upgrading Tomcat and JSOUP

Posted by il...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

ilgrosso pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/syncope.git

commit 09d2adb4e669cc80cea1f489456b65a265cfef18
Author: Francesco Chicchiriccò <il...@apache.org>
AuthorDate: Mon May 16 16:16:20 2022 +0200

    Upgrading Tomcat and JSOUP
---
 pom.xml | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/pom.xml b/pom.xml
index 2f3b8fd841..4a5dbb317e 100644
--- a/pom.xml
+++ b/pom.xml
@@ -501,7 +501,7 @@ under the License.
     <cargo.log>${log.directory}/cargo.log</cargo.log>
     <cargo.output>${log.directory}/cargo-output.log</cargo.output>
 
-    <tomcat.version>9.0.62</tomcat.version>
+    <tomcat.version>9.0.63</tomcat.version>
     <wildfly.version>26.1.0.Final</wildfly.version>
     <payara.version>5.2022.2</payara.version>
     <javax.faces.version>2.3.14</javax.faces.version>
@@ -1855,7 +1855,7 @@ under the License.
       <dependency>
         <groupId>org.jsoup</groupId>
         <artifactId>jsoup</artifactId>
-        <version>1.14.3</version>
+        <version>1.15.1</version>
       </dependency>
 
       <!-- TEST -->


[syncope] 02/02: Improving Realms page extendability

Posted by il...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

ilgrosso pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/syncope.git

commit ac55c571f5ca4ea3ca118b626246fb4d5f1dbaea
Author: Francesco Chicchiriccò <il...@apache.org>
AuthorDate: Wed May 18 16:53:08 2022 +0200

    Improving Realms page extendability
---
 .../client/console/SyncopeConsoleSession.java      |  10 +-
 .../client/console/commons/RealmsUtils.java        |   2 +-
 .../syncope/client/console/pages/Realms.java       | 180 +++++++------
 .../syncope/client/console/panels/AnyPanel.java    |   2 +-
 .../syncope/client/console/panels/Realm.java       | 211 +++++++++-------
 .../client/console/panels/RealmChoicePanel.java    | 277 ++++++++++-----------
 .../client/console/panels/RealmDetails.java        |  12 +-
 .../client/console/panels/RealmWizardBuilder.java  |   3 +-
 .../client/console/rest/RealmRestClient.java       |   4 +-
 .../console/wicket/markup/html/form/Action.java    |   2 +-
 .../wicket/markup/html/form/ActionsPanel.java      |  10 +
 .../client/console/widgets/NumberWidget.java       |  10 +-
 .../client/console/panels/RealmChoicePanel.html    |   2 +-
 .../syncope/core/logic/ReconciliationLogic.java    |   2 +-
 .../java/data/RealmDataBinderImpl.java             |   3 +-
 .../apache/syncope/fit/console/RealmsITCase.java   |   8 +-
 16 files changed, 396 insertions(+), 342 deletions(-)

diff --git a/client/idrepo/console/src/main/java/org/apache/syncope/client/console/SyncopeConsoleSession.java b/client/idrepo/console/src/main/java/org/apache/syncope/client/console/SyncopeConsoleSession.java
index 3292c2c667..e0f1c3ecc3 100644
--- a/client/idrepo/console/src/main/java/org/apache/syncope/client/console/SyncopeConsoleSession.java
+++ b/client/idrepo/console/src/main/java/org/apache/syncope/client/console/SyncopeConsoleSession.java
@@ -292,9 +292,13 @@ public class SyncopeConsoleSession extends AuthenticatedWebSession implements Ba
                 : roots.stream().sorted().collect(Collectors.toList());
     }
 
-    public Optional<String> getRootRealm() {
-        List<String> roots = getSearchableRealms();
-        return roots.isEmpty() ? Optional.empty() : roots.stream().findFirst();
+    public Optional<String> getRootRealm(final String initial) {
+        List<String> searchable = getSearchableRealms();
+        return searchable.isEmpty()
+                ? Optional.empty()
+                : initial != null && searchable.stream().anyMatch(initial::startsWith)
+                ? Optional.of(initial)
+                : searchable.stream().findFirst();
     }
 
     public boolean owns(final String entitlements, final String... realms) {
diff --git a/client/idrepo/console/src/main/java/org/apache/syncope/client/console/commons/RealmsUtils.java b/client/idrepo/console/src/main/java/org/apache/syncope/client/console/commons/RealmsUtils.java
index bfef5acc9d..1553337c36 100644
--- a/client/idrepo/console/src/main/java/org/apache/syncope/client/console/commons/RealmsUtils.java
+++ b/client/idrepo/console/src/main/java/org/apache/syncope/client/console/commons/RealmsUtils.java
@@ -48,7 +48,7 @@ public final class RealmsUtils {
     public static boolean isSearchEnabled(final List<String> realms) {
         return realms.isEmpty()
                 ? false
-                : new RealmRestClient().search(
+                : RealmRestClient.search(
                         new RealmQuery.Builder().keyword(
                                 realms.contains(SyncopeConstants.ROOT_REALM)
                                 ? SyncopeConstants.ROOT_REALM
diff --git a/client/idrepo/console/src/main/java/org/apache/syncope/client/console/pages/Realms.java b/client/idrepo/console/src/main/java/org/apache/syncope/client/console/pages/Realms.java
index 1f2b18b653..706fd73d62 100644
--- a/client/idrepo/console/src/main/java/org/apache/syncope/client/console/pages/Realms.java
+++ b/client/idrepo/console/src/main/java/org/apache/syncope/client/console/pages/Realms.java
@@ -20,6 +20,7 @@ package org.apache.syncope.client.console.pages;
 
 import de.agilecoders.wicket.core.markup.html.bootstrap.dialog.Modal;
 import java.io.Serializable;
+import java.util.List;
 import org.apache.syncope.client.console.SyncopeConsoleSession;
 import org.apache.syncope.client.console.panels.Realm;
 import org.apache.syncope.client.console.panels.RealmChoicePanel;
@@ -30,13 +31,16 @@ import org.apache.syncope.client.console.wicket.markup.html.bootstrap.dialog.Bas
 import org.apache.syncope.client.ui.commons.wizards.AjaxWizard;
 import org.apache.syncope.client.console.wizards.any.ResultPage;
 import org.apache.syncope.client.console.BookmarkablePageLinkBuilder;
+import org.apache.syncope.client.console.rest.AnyTypeRestClient;
 import org.apache.syncope.client.ui.commons.Constants;
 import org.apache.syncope.client.ui.commons.pages.BaseWebPage;
 import org.apache.syncope.client.ui.commons.panels.WizardModalPanel;
 import org.apache.syncope.common.lib.to.AnyTO;
+import org.apache.syncope.common.lib.to.AnyTypeTO;
 import org.apache.syncope.common.lib.to.ProvisioningResult;
 import org.apache.syncope.common.lib.to.RealmTO;
 import org.apache.syncope.common.lib.to.TemplatableTO;
+import org.apache.wicket.PageReference;
 import org.apache.wicket.ajax.AjaxRequestTarget;
 import org.apache.wicket.event.Broadcast;
 import org.apache.wicket.event.IEvent;
@@ -51,15 +55,19 @@ public class Realms extends BasePage {
 
     private static final long serialVersionUID = -1100228004207271270L;
 
-    private final TemplatesTogglePanel templates;
+    public static final String SELECTED_INDEX = "selectedIndex";
 
-    private final RealmChoicePanel realmChoicePanel;
+    public static final String INITIAL_REALM = "initialRealm";
 
-    private final WebMarkupContainer content;
+    protected final TemplatesTogglePanel templates;
 
-    private final BaseModal<RealmTO> modal;
+    protected final RealmChoicePanel realmChoicePanel;
 
-    private final BaseModal<Serializable> templateModal;
+    protected final WebMarkupContainer content;
+
+    protected final BaseModal<RealmTO> modal;
+
+    protected final BaseModal<Serializable> templateModal;
 
     public Realms(final PageParameters parameters) {
         super(parameters);
@@ -82,8 +90,7 @@ public class Realms extends BasePage {
 
         content = new WebMarkupContainer("content");
 
-        realmChoicePanel = new RealmChoicePanel("realmChoicePanel", getPageReference());
-        realmChoicePanel.setOutputMarkupId(true);
+        realmChoicePanel = buildRealmChoicePanel(parameters.get(INITIAL_REALM).toOptionalString(), getPageReference());
         content.add(realmChoicePanel);
 
         content.add(new Label("body", "Root realm"));
@@ -120,7 +127,17 @@ public class Realms extends BasePage {
             templateModal.show(false);
         });
 
-        updateRealmContent(realmChoicePanel.getCurrentRealm(), parameters.get("selectedIndex").toInt(0));
+        updateRealmContent(realmChoicePanel.getCurrentRealm(), parameters.get(SELECTED_INDEX).toInt(0));
+    }
+
+    protected RealmChoicePanel buildRealmChoicePanel(final String initialRealm, final PageReference pageRef) {
+        RealmChoicePanel panel = new RealmChoicePanel("realmChoicePanel", initialRealm, pageRef);
+        panel.setOutputMarkupId(true);
+        return panel;
+    }
+
+    public RealmChoicePanel getRealmChoicePanel() {
+        return realmChoicePanel;
     }
 
     @Override
@@ -156,88 +173,89 @@ public class Realms extends BasePage {
         }
     }
 
-    private WebMarkupContainer updateRealmContent(final RealmTO realmTO, final int selectedIndex) {
-        if (realmTO == null) {
-            return content;
+    protected WebMarkupContainer updateRealmContent(final RealmTO realmTO, final int selectedIndex) {
+        if (realmTO != null) {
+            content.addOrReplace(new Content(realmTO, AnyTypeRestClient.listAnyTypes(), selectedIndex));
         }
-        content.addOrReplace(new Realm("body", realmTO, Realms.this.getPageReference(), selectedIndex) {
+        return content;
+    }
 
-            private static final long serialVersionUID = 8221398624379357183L;
+    protected class Content extends Realm {
 
-            @Override
-            protected void onClickTemplate(final AjaxRequestTarget target) {
-                templates.setTargetObject(realmTO);
-                templates.toggle(target, true);
-            }
+        private static final long serialVersionUID = 8221398624379357183L;
 
-            @Override
-            protected void setWindowClosedReloadCallback(final BaseModal<?> modal) {
-                modal.setWindowClosedCallback(target -> {
-                    if (modal.getContent() instanceof ResultPage) {
-                        Serializable result = ResultPage.class.cast(modal.getContent()).getResult();
-
-                        RealmTO newRealmTO = RealmTO.class.cast(ProvisioningResult.class.cast(result).getEntity());
-                        // reload realmChoicePanel label too - SYNCOPE-1151
-                        target.add(realmChoicePanel.reloadRealmTree(target, Model.of(newRealmTO)));
-                        realmChoicePanel.setCurrentRealm(newRealmTO);
-                        send(Realms.this, Broadcast.DEPTH, new ChosenRealm<>(newRealmTO, target));
-                    } else {
-                        target.add(realmChoicePanel.reloadRealmTree(target));
-                    }
-                    target.add(content);
-                    modal.show(false);
-                });
-            }
-
-            @Override
-            protected void onClickCreate(final AjaxRequestTarget target) {
-                this.wizardBuilder.setParentPath(realmChoicePanel.getCurrentRealm().getFullPath());
-                send(this, Broadcast.EXACT, new AjaxWizard.NewItemActionEvent<RealmTO>(new RealmTO(), target) {
-
-                    @Override
-                    public String getEventDescription() {
-                        return "realm.new";
-                    }
-                });
-            }
+        protected Content(final RealmTO realmTO, final List<AnyTypeTO> anyTypes, final int selectedIndex) {
+            super("body", realmTO, anyTypes, selectedIndex, Realms.this.getPageReference());
+        }
 
-            @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) {
-
-                    @Override
-                    public String getEventDescription() {
-                        return "realm.edit";
-                    }
-                });
-            }
+        @Override
+        protected void onClickTemplate(final AjaxRequestTarget target) {
+            templates.setTargetObject(realmTO);
+            templates.toggle(target, true);
+        }
 
-            @Override
-            protected void onClickDelete(final AjaxRequestTarget target, final RealmTO realmTO) {
-                try {
-                    if (realmTO.getKey() == null) {
-                        throw new Exception("Root realm cannot be deleted");
-                    }
-                    RealmRestClient.delete(realmTO.getFullPath());
-                    RealmTO parent = realmChoicePanel.moveToParentRealm(realmTO.getKey());
+        @Override
+        protected void setWindowClosedReloadCallback(final BaseModal<?> modal) {
+            modal.setWindowClosedCallback(target -> {
+                if (modal.getContent() instanceof ResultPage) {
+                    Serializable result = ResultPage.class.cast(modal.getContent()).getResult();
+
+                    RealmTO newRealmTO = RealmTO.class.cast(ProvisioningResult.class.cast(result).getEntity());
+                    // reload realmChoicePanel label too - SYNCOPE-1151
+                    target.add(realmChoicePanel.reloadRealmTree(target, Model.of(newRealmTO)));
+                    realmChoicePanel.setCurrentRealm(newRealmTO);
+                    send(Realms.this, Broadcast.DEPTH, new ChosenRealm<>(newRealmTO, target));
+                } else {
                     target.add(realmChoicePanel.reloadRealmTree(target));
+                }
+                target.add(content);
+                modal.show(false);
+            });
+        }
 
-                    SyncopeConsoleSession.get().success(getString(Constants.OPERATION_SUCCEEDED));
-                    updateRealmContent(parent, selectedIndex);
-                    target.add(content);
-                } catch (Exception e) {
-                    LOG.error("While deleting realm", e);
-                    // Escape line breaks
-                    SyncopeConsoleSession.get().error(e.getMessage().replace("\n", " "));
+        @Override
+        protected void onClickCreate(final AjaxRequestTarget target) {
+            this.wizardBuilder.setParentPath(realmChoicePanel.getCurrentRealm().getFullPath());
+            send(this, Broadcast.EXACT, new AjaxWizard.NewItemActionEvent<RealmTO>(new RealmTO(), target) {
+
+                @Override
+                public String getEventDescription() {
+                    return "realm.new";
                 }
-                ((BaseWebPage) Realms.this.getPage()).getNotificationPanel().refresh(target);
-            }
-        });
-        return content;
-    }
+            });
+        }
 
-    public RealmChoicePanel getRealmChoicePanel() {
-        return realmChoicePanel;
+        @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) {
+
+                @Override
+                public String getEventDescription() {
+                    return "realm.edit";
+                }
+            });
+        }
+
+        @Override
+        protected void onClickDelete(final AjaxRequestTarget target, final RealmTO realmTO) {
+            try {
+                if (realmTO.getKey() == null) {
+                    throw new Exception("Root realm cannot be deleted");
+                }
+                RealmRestClient.delete(realmTO.getFullPath());
+                RealmTO parent = realmChoicePanel.moveToParentRealm(realmTO.getKey());
+                target.add(realmChoicePanel.reloadRealmTree(target));
+
+                SyncopeConsoleSession.get().success(getString(Constants.OPERATION_SUCCEEDED));
+                updateRealmContent(parent, selectedIndex);
+                target.add(content);
+            } catch (Exception e) {
+                LOG.error("While deleting realm", e);
+                // Escape line breaks
+                SyncopeConsoleSession.get().error(e.getMessage().replace("\n", " "));
+            }
+            ((BaseWebPage) Realms.this.getPage()).getNotificationPanel().refresh(target);
+        }
     }
 }
diff --git a/client/idrepo/console/src/main/java/org/apache/syncope/client/console/panels/AnyPanel.java b/client/idrepo/console/src/main/java/org/apache/syncope/client/console/panels/AnyPanel.java
index efb5b91e68..ec9590ab6a 100644
--- a/client/idrepo/console/src/main/java/org/apache/syncope/client/console/panels/AnyPanel.java
+++ b/client/idrepo/console/src/main/java/org/apache/syncope/client/console/panels/AnyPanel.java
@@ -83,7 +83,7 @@ public class AnyPanel extends Panel implements ModalPanel {
                 PageReference pageRef);
     }
 
-    protected static DirectoryPanelSupplier DEFAULT_DIRECTORYPANEL_SUPPLIER =
+    protected static final DirectoryPanelSupplier DEFAULT_DIRECTORYPANEL_SUPPLIER =
             (id, anyTypeTO, realmTO, anyLayout, pageRef) -> {
 
                 Panel panel;
diff --git a/client/idrepo/console/src/main/java/org/apache/syncope/client/console/panels/Realm.java b/client/idrepo/console/src/main/java/org/apache/syncope/client/console/panels/Realm.java
index 625d2bc423..8ce7769914 100644
--- a/client/idrepo/console/src/main/java/org/apache/syncope/client/console/panels/Realm.java
+++ b/client/idrepo/console/src/main/java/org/apache/syncope/client/console/panels/Realm.java
@@ -33,7 +33,6 @@ import org.apache.syncope.client.console.commons.ITabComponent;
 import org.apache.syncope.client.ui.commons.status.StatusUtils;
 import org.apache.syncope.client.console.layout.AnyLayout;
 import org.apache.syncope.client.console.layout.AnyLayoutUtils;
-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.ActionsPanel;
 import org.apache.syncope.client.console.wizards.WizardMgtPanel;
@@ -41,7 +40,6 @@ import org.apache.syncope.client.console.wizards.any.ConnObjectPanel;
 import org.apache.syncope.common.lib.SyncopeConstants;
 import org.apache.syncope.common.lib.to.AnyTypeTO;
 import org.apache.syncope.common.lib.to.ConnObjectTO;
-import org.apache.syncope.common.lib.to.EntityTO;
 import org.apache.syncope.common.lib.to.PropagationStatus;
 import org.apache.syncope.common.lib.to.ProvisioningResult;
 import org.apache.syncope.common.lib.to.RealmTO;
@@ -55,7 +53,6 @@ import org.apache.wicket.markup.html.WebMarkupContainer;
 import org.apache.wicket.markup.html.basic.Label;
 import org.apache.wicket.markup.html.panel.Panel;
 import org.apache.wicket.model.IModel;
-import org.apache.wicket.model.Model;
 import org.apache.wicket.model.ResourceModel;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -66,24 +63,32 @@ public abstract class Realm extends WizardMgtPanel<RealmTO> {
 
     protected static final Logger LOG = LoggerFactory.getLogger(Realm.class);
 
-    private final RealmTO realmTO;
+    protected final RealmTO realmTO;
 
-    private final List<AnyTypeTO> anyTypes;
+    protected final List<AnyTypeTO> anyTypes;
+
+    protected final int selectedIndex;
 
     protected final RealmWizardBuilder wizardBuilder;
 
-    public Realm(final String id, final RealmTO realmTO, final PageReference pageRef, final int selectedIndex) {
+    public Realm(
+            final String id,
+            final RealmTO realmTO,
+            final List<AnyTypeTO> anyTypes,
+            final int selectedIndex,
+            final PageReference pageRef) {
+
         super(id, true);
         this.realmTO = realmTO;
-        this.anyTypes = AnyTypeRestClient.listAnyTypes();
+        this.anyTypes = anyTypes;
+        this.selectedIndex = selectedIndex;
 
         setPageRef(pageRef);
 
-        AjaxBootstrapTabbedPanel<ITab> tabbedPanel =
-                new AjaxBootstrapTabbedPanel<>("tabbedPanel", buildTabList(pageRef));
-        tabbedPanel.setSelectedTab(selectedIndex);
-        addInnerObject(tabbedPanel);
-        this.wizardBuilder = new RealmWizardBuilder(pageRef);
+        addInnerObject(new AjaxBootstrapTabbedPanel<>("tabbedPanel", buildTabList(pageRef)).
+                setSelectedTab(selectedIndex));
+
+        this.wizardBuilder = buildNewItemPanelBuilder(pageRef);
         addNewItemPanelBuilder(this.wizardBuilder, false);
 
         setShowResultPage(true);
@@ -92,81 +97,25 @@ public abstract class Realm extends WizardMgtPanel<RealmTO> {
         setWindowClosedReloadCallback(modal);
     }
 
+    protected RealmWizardBuilder buildNewItemPanelBuilder(final PageReference pageRef) {
+        return new RealmWizardBuilder(pageRef);
+    }
+
     public RealmTO getRealmTO() {
         return realmTO;
     }
 
-    private List<ITab> buildTabList(final PageReference pageRef) {
+    protected List<ITab> buildTabList(final PageReference pageRef) {
         List<ITab> tabs = new ArrayList<>();
 
-        tabs.add(new ITabComponent(new Model<>("DETAILS"),
-                IdRepoEntitlement.REALM_CREATE, IdRepoEntitlement.REALM_UPDATE, IdRepoEntitlement.REALM_DELETE) {
-
-            private static final long serialVersionUID = -5861786415855103549L;
-
-            @Override
-            public Panel getPanel(final String panelId) {
-                final ActionsPanel<RealmTO> actionPanel = new ActionsPanel<>("actions", null);
-
-                if (StringUtils.startsWith(realmTO.getFullPath(), SyncopeConstants.ROOT_REALM)) {
-                    actionPanel.add(new ActionLink<>(realmTO) {
-
-                        private static final long serialVersionUID = 2802988981431379827L;
-
-                        @Override
-                        public void onClick(final AjaxRequestTarget target, final RealmTO ignore) {
-                            onClickCreate(target);
-                        }
-                    }, ActionLink.ActionType.CREATE, IdRepoEntitlement.REALM_CREATE).hideLabel();
-
-                    actionPanel.add(new ActionLink<>(realmTO) {
-
-                        private static final long serialVersionUID = 2802988981431379828L;
-
-                        @Override
-                        public void onClick(final AjaxRequestTarget target, final RealmTO ignore) {
-                            onClickEdit(target, realmTO);
-                        }
-                    }, ActionLink.ActionType.EDIT, IdRepoEntitlement.REALM_UPDATE).hideLabel();
-
-                    actionPanel.add(new ActionLink<>(realmTO) {
-
-                        private static final long serialVersionUID = 2802988981431379827L;
-
-                        @Override
-                        public void onClick(final AjaxRequestTarget target, final RealmTO ignore) {
-                            onClickTemplate(target);
-                        }
-                    }, ActionLink.ActionType.TEMPLATE, IdRepoEntitlement.REALM_UPDATE).hideLabel();
-
-                    actionPanel.add(new ActionLink<>(realmTO) {
-
-                        private static final long serialVersionUID = 2802988981431379829L;
-
-                        @Override
-                        public void onClick(final AjaxRequestTarget target, final RealmTO ignore) {
-                            onClickDelete(target, realmTO);
-                        }
-                    }, ActionLink.ActionType.DELETE, IdRepoEntitlement.REALM_DELETE, true).hideLabel();
-                }
-
-                RealmDetails panel = new RealmDetails(panelId, realmTO, actionPanel, false);
-                panel.setContentEnabled(false);
-                actionPanel.setEnabled(true);
-                return panel;
-            }
-
-            @Override
-            public boolean isVisible() {
-                return SyncopeWebApplication.get().getSecuritySettings().getAuthorizationStrategy().
-                        isActionAuthorized(this, RENDER);
-            }
-        });
+        tabs.add(new RealmDetailsTabPanel());
 
         AnyLayout anyLayout = AnyLayoutUtils.fetch(
-                anyTypes.stream().map(EntityTO::getKey).collect(Collectors.toList()));
+                anyTypes.stream().map(AnyTypeTO::getKey).collect(Collectors.toList()));
         for (AnyTypeTO anyType : anyTypes) {
-            tabs.add(new ITabComponent(new Model<>(anyType.getKey()), String.format("%s_SEARCH", anyType.getKey())) {
+            tabs.add(new ITabComponent(
+                    new ResourceModel("anyType." + anyType.getKey(), anyType.getKey()),
+                    String.format("%s_SEARCH", anyType.getKey())) {
 
                 private static final long serialVersionUID = 1169585538404171118L;
 
@@ -194,10 +143,10 @@ public abstract class Realm extends WizardMgtPanel<RealmTO> {
             throw new IllegalStateException("Unsupported result type");
         }
 
-        final MultilevelPanel mlp = new MultilevelPanel(panelId);
+        MultilevelPanel mlp = new MultilevelPanel(panelId);
         add(mlp);
 
-        final PropagationStatus syncope = new PropagationStatus();
+        PropagationStatus syncope = new PropagationStatus();
         syncope.setStatus(ExecStatus.SUCCESS);
         syncope.setResource(Constants.SYNCOPE);
 
@@ -205,8 +154,8 @@ public abstract class Realm extends WizardMgtPanel<RealmTO> {
         propagations.add(syncope);
         propagations.addAll(((ProvisioningResult) result).getPropagationStatuses());
 
-        ListViewPanel.Builder<PropagationStatus> builder = new ListViewPanel.Builder<>(
-            PropagationStatus.class, pageRef) {
+        ListViewPanel.Builder<PropagationStatus> builder =
+                new ListViewPanel.Builder<>(PropagationStatus.class, pageRef) {
 
             private static final long serialVersionUID = -6809736686861678498L;
 
@@ -215,19 +164,21 @@ public abstract class Realm extends WizardMgtPanel<RealmTO> {
                 if ("afterObj".equalsIgnoreCase(key)) {
                     ConnObjectTO afterObj = bean.getAfterObj();
                     String remoteId = afterObj == null
-                        || afterObj.getAttrs().isEmpty()
-                        || afterObj.getAttr(ConnIdSpecialName.NAME).isEmpty()
-                        || afterObj.getAttr(ConnIdSpecialName.NAME).get().getValues() == null
-                        || afterObj.getAttr(ConnIdSpecialName.NAME).get().getValues().isEmpty()
-                        ? StringUtils.EMPTY
-                        : afterObj.getAttr(ConnIdSpecialName.NAME).get().getValues().get(0);
+                            || afterObj.getAttrs().isEmpty()
+                            || afterObj.getAttr(ConnIdSpecialName.NAME).isEmpty()
+                            || afterObj.getAttr(ConnIdSpecialName.NAME).get().getValues() == null
+                            || afterObj.getAttr(ConnIdSpecialName.NAME).get().getValues().isEmpty()
+                            ? StringUtils.EMPTY
+                            : afterObj.getAttr(ConnIdSpecialName.NAME).get().getValues().get(0);
 
                     return new Label("field", remoteId);
-                } else if ("status".equalsIgnoreCase(key)) {
+                }
+
+                if ("status".equalsIgnoreCase(key)) {
                     return StatusUtils.getStatusImagePanel("field", bean.getStatus());
-                } else {
-                    return super.getValueComponent(key, bean);
                 }
+
+                return super.getValueComponent(key, bean);
             }
         };
 
@@ -244,8 +195,8 @@ public abstract class Realm extends WizardMgtPanel<RealmTO> {
             @Override
             protected boolean statusCondition(final PropagationStatus bean) {
                 return !Constants.SYNCOPE.equals(bean.getResource())
-                    && (ExecStatus.CREATED == bean.getStatus()
-                    || ExecStatus.SUCCESS == bean.getStatus());
+                        && (ExecStatus.CREATED == bean.getStatus()
+                        || ExecStatus.SUCCESS == bean.getStatus());
             }
 
             @Override
@@ -282,13 +233,13 @@ public abstract class Realm extends WizardMgtPanel<RealmTO> {
 
     protected abstract void onClickDelete(AjaxRequestTarget target, RealmTO realmTO);
 
-    static class RemoteRealmPanel extends RemoteObjectPanel {
+    protected static class RemoteRealmPanel extends RemoteObjectPanel {
 
         private static final long serialVersionUID = 4303365227411467563L;
 
-        private final PropagationStatus bean;
+        protected final PropagationStatus bean;
 
-        RemoteRealmPanel(final PropagationStatus bean) {
+        protected RemoteRealmPanel(final PropagationStatus bean) {
             this.bean = bean;
             add(new ConnObjectPanel(
                     REMOTE_OBJECT_PANEL_ID,
@@ -302,4 +253,72 @@ public abstract class Realm extends WizardMgtPanel<RealmTO> {
             return Pair.of(bean.getBeforeObj(), bean.getAfterObj());
         }
     }
+
+    protected class RealmDetailsTabPanel extends ITabComponent {
+
+        private static final long serialVersionUID = -5861786415855103549L;
+
+        protected RealmDetailsTabPanel() {
+            super(new ResourceModel("realm.details", "DETAILS"),
+                    IdRepoEntitlement.REALM_CREATE, IdRepoEntitlement.REALM_UPDATE, IdRepoEntitlement.REALM_DELETE);
+        }
+
+        @Override
+        public Panel getPanel(final String panelId) {
+            ActionsPanel<RealmTO> actionPanel = new ActionsPanel<>("actions", null);
+
+            if (StringUtils.startsWith(realmTO.getFullPath(), SyncopeConstants.ROOT_REALM)) {
+                actionPanel.add(new ActionLink<>(realmTO) {
+
+                    private static final long serialVersionUID = 2802988981431379827L;
+
+                    @Override
+                    public void onClick(final AjaxRequestTarget target, final RealmTO ignore) {
+                        onClickCreate(target);
+                    }
+                }, ActionLink.ActionType.CREATE, IdRepoEntitlement.REALM_CREATE).hideLabel();
+
+                actionPanel.add(new ActionLink<>(realmTO) {
+
+                    private static final long serialVersionUID = 2802988981431379828L;
+
+                    @Override
+                    public void onClick(final AjaxRequestTarget target, final RealmTO ignore) {
+                        onClickEdit(target, realmTO);
+                    }
+                }, ActionLink.ActionType.EDIT, IdRepoEntitlement.REALM_UPDATE).hideLabel();
+
+                actionPanel.add(new ActionLink<>(realmTO) {
+
+                    private static final long serialVersionUID = 2802988981431379827L;
+
+                    @Override
+                    public void onClick(final AjaxRequestTarget target, final RealmTO ignore) {
+                        onClickTemplate(target);
+                    }
+                }, ActionLink.ActionType.TEMPLATE, IdRepoEntitlement.REALM_UPDATE).hideLabel();
+
+                actionPanel.add(new ActionLink<>(realmTO) {
+
+                    private static final long serialVersionUID = 2802988981431379829L;
+
+                    @Override
+                    public void onClick(final AjaxRequestTarget target, final RealmTO ignore) {
+                        onClickDelete(target, realmTO);
+                    }
+                }, ActionLink.ActionType.DELETE, IdRepoEntitlement.REALM_DELETE, true).hideLabel();
+            }
+
+            RealmDetails panel = new RealmDetails(panelId, realmTO, actionPanel, false);
+            panel.setContentEnabled(false);
+            actionPanel.setEnabled(true);
+            return panel;
+        }
+
+        @Override
+        public boolean isVisible() {
+            return SyncopeWebApplication.get().getSecuritySettings().getAuthorizationStrategy().
+                    isActionAuthorized(this, RENDER);
+        }
+    }
 }
diff --git a/client/idrepo/console/src/main/java/org/apache/syncope/client/console/panels/RealmChoicePanel.java b/client/idrepo/console/src/main/java/org/apache/syncope/client/console/panels/RealmChoicePanel.java
index d4c149d602..da1cbe8636 100644
--- a/client/idrepo/console/src/main/java/org/apache/syncope/client/console/panels/RealmChoicePanel.java
+++ b/client/idrepo/console/src/main/java/org/apache/syncope/client/console/panels/RealmChoicePanel.java
@@ -59,6 +59,7 @@ import org.apache.wicket.markup.html.basic.Label;
 import org.apache.wicket.markup.html.link.AbstractLink;
 import org.apache.wicket.markup.html.panel.Fragment;
 import org.apache.wicket.markup.html.panel.Panel;
+import org.apache.wicket.model.IModel;
 import org.apache.wicket.model.LoadableDetachableModel;
 import org.apache.wicket.model.Model;
 import org.apache.wicket.model.ResourceModel;
@@ -68,34 +69,36 @@ public class RealmChoicePanel extends Panel {
 
     private static final long serialVersionUID = -1100228004207271270L;
 
-    private static final String SEARCH_REALMS = "searchRealms";
+    protected static final String SEARCH_REALMS = "searchRealms";
 
-    private final PageReference pageRef;
+    protected final PageReference pageRef;
 
-    private final LoadableDetachableModel<List<Pair<String, RealmTO>>> realmTree;
+    protected final LoadableDetachableModel<List<Pair<String, RealmTO>>> realmTree;
 
-    private final LoadableDetachableModel<List<DynRealmTO>> dynRealmTree;
+    protected final LoadableDetachableModel<List<DynRealmTO>> dynRealmTree;
 
-    private final WebMarkupContainerNoVeil container;
+    protected final WebMarkupContainerNoVeil container;
 
-    private Model<RealmTO> model;
+    protected Model<RealmTO> model;
 
-    private final Collection<String> availableRealms;
+    protected final Map<String, Pair<RealmTO, List<RealmTO>>> tree;
 
-    private final Map<String, Pair<RealmTO, List<RealmTO>>> tree;
+    protected final List<AbstractLink> links = new ArrayList<>();
 
-    private final List<AbstractLink> links = new ArrayList<>();
+    protected String searchQuery;
 
-    private String searchQuery;
+    protected List<RealmTO> realmsChoices;
 
-    private List<RealmTO> realmsChoices;
+    protected final boolean isSearchEnabled;
 
-    private final boolean isSearchEnabled;
+    protected final Label realmDisplayKey;
 
-    public RealmChoicePanel(final String id, final PageReference pageRef) {
+    protected final Label realmDisplayValue;
+
+    public RealmChoicePanel(final String id, final String initialRealm, final PageReference pageRef) {
         super(id);
         this.pageRef = pageRef;
-        availableRealms = SyncopeConsoleSession.get().getSearchableRealms();
+
         tree = new HashMap<>();
         isSearchEnabled = RealmsUtils.isSearchEnabled(SyncopeConsoleSession.get().getSearchableRealms());
 
@@ -106,23 +109,18 @@ public class RealmChoicePanel extends Panel {
             @Override
             protected List<Pair<String, RealmTO>> load() {
                 Map<String, Pair<RealmTO, List<RealmTO>>> map = reloadRealmParentMap();
-                List<Pair<String, RealmTO>> full;
+                Stream<Pair<String, RealmTO>> full;
                 if (isSearchEnabled) {
-                    full = map.entrySet().stream().map(el -> Pair.of(
-                        el.getKey(),
-                        el.getValue().getLeft())).
-                        collect(Collectors.toList());
+                    full = map.entrySet().stream().
+                            map(el -> Pair.of(el.getKey(), el.getValue().getLeft()));
                 } else {
                     full = map.entrySet().stream().
-                        map(el -> Pair.of(
-                            el.getValue().getLeft().getFullPath(),
-                            el.getValue().getKey())).
-                        sorted(Comparator.comparing(Pair::getLeft)).
-                        collect(Collectors.toList());
+                            map(el -> Pair.of(el.getValue().getLeft().getFullPath(), el.getValue().getKey())).
+                            sorted(Comparator.comparing(Pair::getLeft));
                 }
-                return full.stream().filter(realm -> availableRealms.stream().anyMatch(
-                    availableRealm -> realm.getValue().getFullPath().startsWith(availableRealm))).
-                    collect(Collectors.toList());
+                return full.filter(realm -> SyncopeConsoleSession.get().getSearchableRealms().stream().anyMatch(
+                        availableRealm -> realm.getValue().getFullPath().startsWith(availableRealm))).
+                        collect(Collectors.toList());
             }
         };
 
@@ -132,30 +130,31 @@ public class RealmChoicePanel extends Panel {
 
             @Override
             protected List<DynRealmTO> load() {
-                List<DynRealmTO> dynRealms = RealmRestClient.listDynReams();
+                List<DynRealmTO> dynRealms = RealmRestClient.listDynRealms();
                 dynRealms.sort((left, right) -> {
                     if (left == null) {
                         return -1;
-                    } else if (right == null) {
+                    }
+                    if (right == null) {
                         return 1;
-                    } else {
-                        return left.getKey().compareTo(right.getKey());
                     }
+                    return left.getKey().compareTo(right.getKey());
                 });
-                return dynRealms.stream().filter(dynRealm -> availableRealms.stream().
-                    anyMatch(availableRealm -> SyncopeConstants.ROOT_REALM.equals(availableRealm)
+                return dynRealms.stream().filter(dynRealm -> SyncopeConsoleSession.get().getSearchableRealms().stream().
+                        anyMatch(availableRealm -> SyncopeConstants.ROOT_REALM.equals(availableRealm)
                         || dynRealm.getKey().equals(availableRealm))).collect(Collectors.toList());
             }
         };
 
-        RealmTO realmTO = SyncopeConsoleSession.get().getRootRealm().map(rootRealm -> {
+        RealmTO realm = SyncopeConsoleSession.get().getRootRealm(initialRealm).map(rootRealm -> {
             String rootRealmName = StringUtils.substringAfterLast(rootRealm, "/");
 
             List<RealmTO> realmTOs = RealmRestClient.search(
                     RealmsUtils.buildQuery(SyncopeConstants.ROOT_REALM.equals(rootRealm)
                             ? SyncopeConstants.ROOT_REALM : rootRealmName)).getResult();
 
-            return realmTOs.stream().filter(realm -> rootRealm.equals(realm.getFullPath())).findFirst().
+            return realmTOs.stream().
+                    filter(r -> rootRealm.equals(r.getFullPath())).findFirst().
                     orElseGet(() -> {
                         RealmTO placeholder = new RealmTO();
                         placeholder.setName(rootRealmName);
@@ -164,74 +163,88 @@ public class RealmChoicePanel extends Panel {
                     });
         }).orElseGet(RealmTO::new);
 
-        model = Model.of(realmTO);
-        searchQuery = realmTO.getName();
+        model = Model.of(realm);
+        searchQuery = realm.getName();
+
         container = new WebMarkupContainerNoVeil("container", realmTree);
-        container.setOutputMarkupId(true);
-        add(container);
+        add(container.setOutputMarkupId(true));
+
+        realmDisplayKey = new Label("realmDisplayKey", realmDisplayKeyModel(null));
+        container.addOrReplace(realmDisplayKey.setOutputMarkupId(true).setOutputMarkupPlaceholderTag(true));
+        realmDisplayValue = new Label("realmDisplayValue", realmDisplayValueText());
+        container.addOrReplace(realmDisplayValue.setOutputMarkupId(true).setOutputMarkupPlaceholderTag(true));
+
         reloadRealmTree();
     }
 
-    public final void reloadRealmTree() {
-        Label realmLabel = new Label("realmLabel", new Model<>());
-        realmLabel.setOutputMarkupId(true);
-
-        container.addOrReplace(realmLabel);
+    protected IModel<String> realmDisplayKeyModel(final Boolean dynamic) {
+        return dynamic == null
+                ? model.getObject().getFullPath().startsWith(SyncopeConstants.ROOT_REALM)
+                ? new ResourceModel("realmDisplayKey", "Realm")
+                : new ResourceModel("dynRealmLabel", "Dynamic Realm")
+                : dynamic
+                        ? new ResourceModel("dynRealmLabel", "Dynamic Realm")
+                        : new ResourceModel("realmDisplayKey", "Realm");
+    }
 
-        if (StringUtils.startsWith(model.getObject().getFullPath(), SyncopeConstants.ROOT_REALM)) {
-            realmLabel.setDefaultModel(new ResourceModel("realmLabel", "Realm"));
-        } else {
-            realmLabel.setDefaultModel(new ResourceModel("dynRealmLabel", "Dynamic Realm"));
-        }
+    protected String realmDisplayValueText() {
+        return RealmsUtils.getFullPath(model.getObject().getFullPath());
+    }
 
-        Label label = new Label("realm", RealmsUtils.getFullPath(model.getObject().getFullPath()));
-        label.setOutputMarkupId(true);
-        container.addOrReplace(label);
+    protected void chooseRealm(final RealmTO realm, final AjaxRequestTarget target) {
+        model.setObject(realm);
+        realmDisplayValue.setDefaultModelObject(realmDisplayValueText());
+        realmDisplayKey.setDefaultModel(realmDisplayKeyModel(false));
+        target.add(realmDisplayValue);
+        send(pageRef.getPage(), Broadcast.EXACT, new ChosenRealm<>(realm, target));
+    }
 
+    public void reloadRealmTree() {
         if (isSearchEnabled) {
             realmsChoices = buildRealmChoices();
-            final AutoCompleteSettings settings = new AutoCompleteSettings();
+            AutoCompleteSettings settings = new AutoCompleteSettings();
             settings.setShowCompleteListOnFocusGain(false);
             settings.setShowListOnEmptyInput(false);
 
-            final AutoCompleteTextField<String> searchRealms =
-                new AutoCompleteTextField<>(SEARCH_REALMS, new Model<>(), settings) {
+            AutoCompleteTextField<String> searchRealms =
+                    new AutoCompleteTextField<>(SEARCH_REALMS, new Model<>(), settings) {
 
-                    private static final long serialVersionUID = -6635259975264955783L;
+                private static final long serialVersionUID = -6635259975264955783L;
 
-                    @Override
-                    protected Iterator<String> getChoices(final String input) {
-                        searchQuery = input;
-                        realmsChoices = RealmsUtils.checkInput(input)
+                @Override
+                protected Iterator<String> getChoices(final String input) {
+                    searchQuery = input;
+                    realmsChoices = RealmsUtils.checkInput(input)
                             ? buildRealmChoices()
                             : List.of();
-                        return realmsChoices.stream().
-                            map(RealmTO::getFullPath).sorted().collect(Collectors.toList()).iterator();
-                    }
+                    return realmsChoices.stream().map(RealmTO::getFullPath).sorted().iterator();
+                }
 
-                    @Override
-                    protected AutoCompleteBehavior<String> newAutoCompleteBehavior(
+                @Override
+                protected AutoCompleteBehavior<String> newAutoCompleteBehavior(
                         final IAutoCompleteRenderer<String> renderer,
                         final AutoCompleteSettings settings) {
-                        return super.newAutoCompleteBehavior(new AbstractAutoCompleteRenderer<>() {
 
-                            private static final long serialVersionUID = -4789925973199139157L;
+                    return super.newAutoCompleteBehavior(new AbstractAutoCompleteRenderer<>() {
+
+                        private static final long serialVersionUID = -4789925973199139157L;
 
-                            @Override
-                            protected void renderChoice(
+                        @Override
+                        protected void renderChoice(
                                 final String object,
                                 final Response response,
                                 final String criteria) {
-                                response.write(object);
-                            }
-
-                            @Override
-                            protected String getTextValue(final String object) {
-                                return object;
-                            }
-                        }, settings);
-                    }
-                };
+
+                            response.write(object);
+                        }
+
+                        @Override
+                        protected String getTextValue(final String object) {
+                            return object;
+                        }
+                    }, settings);
+                }
+            };
 
             searchRealms.add(new IndicatorAjaxFormComponentUpdatingBehavior(Constants.ON_CHANGE) {
 
@@ -239,15 +252,9 @@ public class RealmChoicePanel extends Panel {
 
                 @Override
                 protected void onUpdate(final AjaxRequestTarget target) {
-                    realmsChoices.stream().filter(
-                            item -> item.getFullPath().equals(searchRealms.getModelObject())).
-                            findFirst().ifPresent(realm -> {
-                                model.setObject(realm);
-                                label.setDefaultModelObject(model.getObject().getFullPath());
-                                realmLabel.setDefaultModel(new ResourceModel("realmLabel", "Realm"));
-                                target.add(label);
-                                send(pageRef.getPage(), Broadcast.EXACT, new ChosenRealm<>(realm, target));
-                            });
+                    realmsChoices.stream().
+                            filter(item -> item.getFullPath().equals(searchRealms.getModelObject())).
+                            findFirst().ifPresent(realm -> chooseRealm(realm, target));
                 }
             });
 
@@ -262,7 +269,7 @@ public class RealmChoicePanel extends Panel {
 
                 @Override
                 protected List<AbstractLink> newSubMenuButtons(final String buttonMarkupId) {
-                    buildRealmLinks(label, realmLabel);
+                    buildRealmLinks();
                     return RealmChoicePanel.this.links;
                 }
             };
@@ -277,13 +284,13 @@ public class RealmChoicePanel extends Panel {
         }
     }
 
-    private void buildRealmLinks(final Label label, final Label realmLabel) {
+    protected void buildRealmLinks() {
         RealmChoicePanel.this.links.clear();
         RealmChoicePanel.this.links.add(new BootstrapAjaxLink<>(
-            ButtonList.getButtonMarkupId(),
-            new Model<>(),
-            Buttons.Type.Link,
-            new ResourceModel("realms", "Realms")) {
+                ButtonList.getButtonMarkupId(),
+                new Model<>(),
+                Buttons.Type.Link,
+                new ResourceModel("realms", "Realms")) {
 
             private static final long serialVersionUID = -7978723352517770744L;
 
@@ -304,36 +311,31 @@ public class RealmChoicePanel extends Panel {
 
         realmTree.getObject().forEach(link -> {
             RealmChoicePanel.this.links.add(new BootstrapAjaxLink<>(
-                ButtonList.getButtonMarkupId(),
-                Model.of(link.getRight()),
-                Buttons.Type.Link,
-                new Model<>(link.getLeft())) {
+                    ButtonList.getButtonMarkupId(),
+                    Model.of(link.getRight()),
+                    Buttons.Type.Link,
+                    new Model<>(link.getLeft())) {
 
                 private static final long serialVersionUID = -7978723352517770644L;
 
                 @Override
                 public void onClick(final AjaxRequestTarget target) {
-                    model.setObject(link.getRight());
-                    label.setDefaultModelObject(model.getObject().getFullPath());
-                    realmLabel.setDefaultModel(new ResourceModel("realmLabel", "Realm"));
-                    target.add(label);
-                    send(pageRef.getPage(), Broadcast.EXACT, new ChosenRealm<>(link.getRight(), target));
+                    chooseRealm(link.getRight(), target);
                 }
             });
         });
 
         if (!dynRealmTree.getObject().isEmpty()) {
             RealmChoicePanel.this.links.add(new BootstrapAjaxLink<>(
-                ButtonList.getButtonMarkupId(),
-                new Model<>(),
-                Buttons.Type.Link,
-                new ResourceModel("dynrealms", "Dynamic Realms")) {
+                    ButtonList.getButtonMarkupId(),
+                    new Model<>(),
+                    Buttons.Type.Link,
+                    new ResourceModel("dynrealms", "Dynamic Realms")) {
 
                 private static final long serialVersionUID = -7978723352517770744L;
 
                 @Override
                 public void onClick(final AjaxRequestTarget target) {
-
                 }
 
                 @Override
@@ -348,34 +350,44 @@ public class RealmChoicePanel extends Panel {
             });
 
             dynRealmTree.getObject().forEach(dynRealmTO -> {
-                final RealmTO realmTO = new RealmTO();
-                realmTO.setKey(dynRealmTO.getKey());
-                realmTO.setName(dynRealmTO.getKey());
-                realmTO.setFullPath(dynRealmTO.getKey());
+                RealmTO realm = new RealmTO();
+                realm.setKey(dynRealmTO.getKey());
+                realm.setName(dynRealmTO.getKey());
+                realm.setFullPath(dynRealmTO.getKey());
 
                 RealmChoicePanel.this.links.add(new BootstrapAjaxLink<>(
-                    ButtonList.getButtonMarkupId(),
-                    new Model<>(),
-                    Buttons.Type.Link,
-                    new Model<>(realmTO.getKey())) {
+                        ButtonList.getButtonMarkupId(),
+                        new Model<>(),
+                        Buttons.Type.Link,
+                        new Model<>(realm.getKey())) {
 
                     private static final long serialVersionUID = -7978723352517770644L;
 
                     @Override
                     public void onClick(final AjaxRequestTarget target) {
-                        model.setObject(realmTO);
-                        label.setDefaultModelObject(realmTO.getKey());
-                        realmLabel.setDefaultModel(new ResourceModel("dynRealmLabel", "Dynamic Realm"));
-                        target.add(label);
-                        send(pageRef.getPage(), Broadcast.EXACT, new ChosenRealm<>(realmTO, target));
+                        chooseRealm(realm, target);
                     }
                 });
             });
         }
     }
 
+    protected List<RealmTO> buildRealmChoices() {
+        return Stream.of(
+                realmTree.getObject().stream().map(Pair::getValue).collect(Collectors.toList()),
+                dynRealmTree.getObject().stream().map(item -> {
+                    RealmTO realm = new RealmTO();
+                    realm.setKey(item.getKey());
+                    realm.setName(item.getKey());
+                    realm.setFullPath(item.getKey());
+                    return realm;
+                }).collect(Collectors.toList())).flatMap(Collection::stream).
+                collect(Collectors.toList());
+    }
+
     public final RealmChoicePanel reloadRealmTree(final AjaxRequestTarget target) {
         reloadRealmTree();
+        chooseRealm(model.getObject(), target);
         target.add(container);
         return this;
     }
@@ -386,7 +398,7 @@ public class RealmChoicePanel extends Panel {
         return this;
     }
 
-    private Map<String, Pair<RealmTO, List<RealmTO>>> reloadRealmParentMap() {
+    protected Map<String, Pair<RealmTO, List<RealmTO>>> reloadRealmParentMap() {
         List<RealmTO> realmsToList = isSearchEnabled
                 ? RealmRestClient.search(RealmsUtils.buildQuery(searchQuery)).getResult()
                 : RealmRestClient.list();
@@ -396,7 +408,7 @@ public class RealmChoicePanel extends Panel {
                 collect(Collectors.toList()));
     }
 
-    private Map<String, Pair<RealmTO, List<RealmTO>>> reloadRealmParentMap(final List<RealmTO> realms) {
+    protected Map<String, Pair<RealmTO, List<RealmTO>>> reloadRealmParentMap(final List<RealmTO> realms) {
         tree.clear();
 
         Map<String, List<RealmTO>> cache = new HashMap<>();
@@ -421,20 +433,6 @@ public class RealmChoicePanel extends Panel {
         return tree;
     }
 
-    private List<RealmTO> buildRealmChoices() {
-        return Stream.of(
-                realmTree.getObject().stream().map(Pair::getValue).collect(Collectors.toList()),
-                dynRealmTree.getObject().stream().map(
-                        item -> {
-                            final RealmTO realmTO = new RealmTO();
-                            realmTO.setKey(item.getKey());
-                            realmTO.setName(item.getKey());
-                            realmTO.setFullPath(item.getKey());
-                            return realmTO;
-                        }).collect(Collectors.toList())).flatMap(Collection::stream).
-                collect(Collectors.toList());
-    }
-
     /**
      * Gets current selected realm.
      *
@@ -458,14 +456,13 @@ public class RealmChoicePanel extends Panel {
             }
         }
         return null;
-
     }
 
     public static class ChosenRealm<T> {
 
-        private final AjaxRequestTarget target;
+        protected final AjaxRequestTarget target;
 
-        private final T obj;
+        protected final T obj;
 
         public ChosenRealm(final T obj, final AjaxRequestTarget target) {
             this.obj = obj;
diff --git a/client/idrepo/console/src/main/java/org/apache/syncope/client/console/panels/RealmDetails.java b/client/idrepo/console/src/main/java/org/apache/syncope/client/console/panels/RealmDetails.java
index 9c689f4c30..ccdbe61388 100644
--- a/client/idrepo/console/src/main/java/org/apache/syncope/client/console/panels/RealmDetails.java
+++ b/client/idrepo/console/src/main/java/org/apache/syncope/client/console/panels/RealmDetails.java
@@ -57,7 +57,7 @@ public class RealmDetails extends Panel {
         @Override
         protected List<String> load() {
             return ImplementationRestClient.list(IdRepoImplementationType.LOGIC_ACTIONS).stream().
-                map(EntityTO::getKey).sorted().collect(Collectors.toList());
+                    map(EntityTO::getKey).sorted().collect(Collectors.toList());
         }
     };
 
@@ -71,6 +71,8 @@ public class RealmDetails extends Panel {
         }
     };
 
+    private final ActionsPanel<RealmTO> actionsPanel;
+
     @SpringBean
     private RealmPolicyProvider realmPolicyProvider;
 
@@ -83,11 +85,13 @@ public class RealmDetails extends Panel {
     public RealmDetails(
             final String id,
             final RealmTO realmTO,
-            final ActionsPanel<?> actionsPanel,
+            final ActionsPanel<RealmTO> actionsPanel,
             final boolean unwrapped) {
 
         super(id);
 
+        this.actionsPanel = actionsPanel;
+
         container = new WebMarkupContainer("container");
         container.setOutputMarkupId(true);
         container.setRenderBodyOnly(unwrapped);
@@ -139,4 +143,8 @@ public class RealmDetails extends Panel {
         container.setEnabled(enable);
         return this;
     }
+
+    public ActionsPanel<RealmTO> getActionsPanel() {
+        return actionsPanel;
+    }
 }
diff --git a/client/idrepo/console/src/main/java/org/apache/syncope/client/console/panels/RealmWizardBuilder.java b/client/idrepo/console/src/main/java/org/apache/syncope/client/console/panels/RealmWizardBuilder.java
index f85ab7b437..edefc3e4d8 100644
--- a/client/idrepo/console/src/main/java/org/apache/syncope/client/console/panels/RealmWizardBuilder.java
+++ b/client/idrepo/console/src/main/java/org/apache/syncope/client/console/panels/RealmWizardBuilder.java
@@ -32,7 +32,7 @@ public class RealmWizardBuilder extends BaseAjaxWizardBuilder<RealmTO> {
 
     private static final long serialVersionUID = 5945391813567245081L;
 
-    private String parentPath;
+    protected String parentPath;
 
     /**
      * Construct.
@@ -69,7 +69,6 @@ public class RealmWizardBuilder extends BaseAjaxWizardBuilder<RealmTO> {
             realmDetail.add(new AttributeAppender("style", "overflow-x:hidden;"));
             add(realmDetail);
         }
-
     }
 
     public void setParentPath(final String parentPath) {
diff --git a/client/idrepo/console/src/main/java/org/apache/syncope/client/console/rest/RealmRestClient.java b/client/idrepo/console/src/main/java/org/apache/syncope/client/console/rest/RealmRestClient.java
index 1581dd3d84..46d5ca820d 100644
--- a/client/idrepo/console/src/main/java/org/apache/syncope/client/console/rest/RealmRestClient.java
+++ b/client/idrepo/console/src/main/java/org/apache/syncope/client/console/rest/RealmRestClient.java
@@ -45,11 +45,11 @@ public class RealmRestClient extends BaseRestClient {
         return getService(RealmService.class).list(SyncopeConstants.ROOT_REALM);
     }
 
-    public static List<DynRealmTO> listDynReams() {
+    public static List<DynRealmTO> listDynRealms() {
         return getService(DynRealmService.class).list();
     }
 
-    public static DynRealmTO readDynReams(final String key) {
+    public static DynRealmTO readDynRealm(final String key) {
         return getService(DynRealmService.class).read(key);
     }
 
diff --git a/client/idrepo/console/src/main/java/org/apache/syncope/client/console/wicket/markup/html/form/Action.java b/client/idrepo/console/src/main/java/org/apache/syncope/client/console/wicket/markup/html/form/Action.java
index f01a984106..a3979b3fa7 100644
--- a/client/idrepo/console/src/main/java/org/apache/syncope/client/console/wicket/markup/html/form/Action.java
+++ b/client/idrepo/console/src/main/java/org/apache/syncope/client/console/wicket/markup/html/form/Action.java
@@ -69,7 +69,7 @@ public final class Action<T extends Serializable> implements Serializable {
     }
 
     public String[] getRealms() {
-        return realms.toArray(new String[realms.size()]);
+        return realms.toArray(String[]::new);
     }
 
     public void setRealm(final String realm) {
diff --git a/client/idrepo/console/src/main/java/org/apache/syncope/client/console/wicket/markup/html/form/ActionsPanel.java b/client/idrepo/console/src/main/java/org/apache/syncope/client/console/wicket/markup/html/form/ActionsPanel.java
index f34ea520f0..3d598a5151 100644
--- a/client/idrepo/console/src/main/java/org/apache/syncope/client/console/wicket/markup/html/form/ActionsPanel.java
+++ b/client/idrepo/console/src/main/java/org/apache/syncope/client/console/wicket/markup/html/form/ActionsPanel.java
@@ -82,6 +82,16 @@ public final class ActionsPanel<T extends Serializable> extends Panel {
         return action;
     }
 
+    public Action<T> add(final int index, final Action<T> action) {
+        actions.add(index, action);
+        return action;
+    }
+
+    public Action<T> set(final int index, final Action<T> action) {
+        actions.set(index, action);
+        return action;
+    }
+
     public List<Action<T>> getActions() {
         return actions;
     }
diff --git a/client/idrepo/console/src/main/java/org/apache/syncope/client/console/widgets/NumberWidget.java b/client/idrepo/console/src/main/java/org/apache/syncope/client/console/widgets/NumberWidget.java
index e6e577f7a4..1f720a6f32 100644
--- a/client/idrepo/console/src/main/java/org/apache/syncope/client/console/widgets/NumberWidget.java
+++ b/client/idrepo/console/src/main/java/org/apache/syncope/client/console/widgets/NumberWidget.java
@@ -54,13 +54,13 @@ public class NumberWidget extends BaseWidget {
         List<String> anyTypes = AnyTypeRestClient.list();
         switch (id) {
             case "totalUsers":
-                pageParameters.add("selectedIndex", 1);
+                pageParameters.add(Realms.SELECTED_INDEX, 1);
                 responsePage = Realms.class;
                 isAuthorized = SyncopeConsoleSession.get().owns(IdRepoEntitlement.USER_SEARCH);
                 break;
 
             case "totalGroups":
-                pageParameters.add("selectedIndex", 2);
+                pageParameters.add(Realms.SELECTED_INDEX, 2);
                 responsePage = Realms.class;
                 isAuthorized = SyncopeConsoleSession.get().owns(IdRepoEntitlement.GROUP_SEARCH);
                 break;
@@ -71,7 +71,7 @@ public class NumberWidget extends BaseWidget {
                     for (int i = 0; i < anyTypes.size() && selectedIndex == null; i++) {
                         if (anyTypes.get(i).equals(label)) {
                             selectedIndex = i + 1;
-                            pageParameters.add("selectedIndex", selectedIndex);
+                            pageParameters.add(Realms.SELECTED_INDEX, selectedIndex);
                         }
                     }
                     responsePage = Realms.class;
@@ -87,7 +87,7 @@ public class NumberWidget extends BaseWidget {
                 for (int i = 0; i < anyTypes.size() && selectedIndex == null; i++) {
                     if (anyTypes.get(i).equals(label)) {
                         selectedIndex = i + 1;
-                        pageParameters.add("selectedIndex", selectedIndex);
+                        pageParameters.add(Realms.SELECTED_INDEX, selectedIndex);
                     }
                 }
                 responsePage = Realms.class;
@@ -95,7 +95,7 @@ public class NumberWidget extends BaseWidget {
                 break;
 
             default:
-                pageParameters.add("selectedIndex", 0);
+                pageParameters.add(Realms.SELECTED_INDEX, 0);
                 responsePage = Realms.class;
         }
 
diff --git a/client/idrepo/console/src/main/resources/org/apache/syncope/client/console/panels/RealmChoicePanel.html b/client/idrepo/console/src/main/resources/org/apache/syncope/client/console/panels/RealmChoicePanel.html
index 7d14dfc236..0691389902 100644
--- a/client/idrepo/console/src/main/resources/org/apache/syncope/client/console/panels/RealmChoicePanel.html
+++ b/client/idrepo/console/src/main/resources/org/apache/syncope/client/console/panels/RealmChoicePanel.html
@@ -20,7 +20,7 @@ under the License.
   <wicket:panel>
     <div wicket:id="container" class="realm-header">
       <div class="realm-label">
-        <label wicket:id="realmLabel"/>: <label wicket:id="realm"/> 
+        <label wicket:id="realmDisplayKey"/>: <label wicket:id="realmDisplayValue"/>
       </div>
       <span wicket:id="realmsFragment"></span>
 
diff --git a/core/idm/logic/src/main/java/org/apache/syncope/core/logic/ReconciliationLogic.java b/core/idm/logic/src/main/java/org/apache/syncope/core/logic/ReconciliationLogic.java
index 1361304553..ef3deee89b 100644
--- a/core/idm/logic/src/main/java/org/apache/syncope/core/logic/ReconciliationLogic.java
+++ b/core/idm/logic/src/main/java/org/apache/syncope/core/logic/ReconciliationLogic.java
@@ -627,7 +627,7 @@ public class ReconciliationLogic extends AbstractTransactionalLogic<EntityTO> {
                 csvSchema(spec),
                 null,
                 os,
-                columns.toArray(new String[columns.size()]))) {
+                columns.toArray(String[]::new))) {
 
             SyncopeStreamPushExecutor executor =
                     (SyncopeStreamPushExecutor) ApplicationContextProvider.getBeanFactory().
diff --git a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/RealmDataBinderImpl.java b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/RealmDataBinderImpl.java
index 43df9c9f6f..df5593da37 100644
--- a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/RealmDataBinderImpl.java
+++ b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/RealmDataBinderImpl.java
@@ -310,8 +310,7 @@ public class RealmDataBinderImpl implements RealmDataBinder {
         if (admin) {
             realmTO.setAccountPolicy(realm.getAccountPolicy() == null ? null : realm.getAccountPolicy().getKey());
             realmTO.setPasswordPolicy(realm.getPasswordPolicy() == null ? null : realm.getPasswordPolicy().getKey());
-            realmTO.setAuthPolicy(
-                    realm.getAuthPolicy() == null ? null : realm.getAuthPolicy().getKey());
+            realmTO.setAuthPolicy(realm.getAuthPolicy() == null ? null : realm.getAuthPolicy().getKey());
             realmTO.setAccessPolicy(realm.getAccessPolicy() == null ? null : realm.getAccessPolicy().getKey());
             realmTO.setAttrReleasePolicy(
                     realm.getAttrReleasePolicy() == null ? null : realm.getAttrReleasePolicy().getKey());
diff --git a/fit/core-reference/src/test/java/org/apache/syncope/fit/console/RealmsITCase.java b/fit/core-reference/src/test/java/org/apache/syncope/fit/console/RealmsITCase.java
index a77eae8cd9..47ee9853ab 100644
--- a/fit/core-reference/src/test/java/org/apache/syncope/fit/console/RealmsITCase.java
+++ b/fit/core-reference/src/test/java/org/apache/syncope/fit/console/RealmsITCase.java
@@ -73,7 +73,7 @@ public class RealmsITCase extends AbstractConsoleITCase {
                 "body:content:realmChoicePanel:container:realmsFragment:realms:dropdown-menu:buttons:5:button",
                 Constants.ON_CLICK);
 
-        TESTER.assertLabel("body:content:realmChoicePanel:container:realm", "/testRealm");
+        TESTER.assertLabel("body:content:realmChoicePanel:container:realmDisplayValue", "/testRealm");
 
         TESTER.getRequest().addParameter("confirm", "true");
         TESTER.clickLink(
@@ -86,7 +86,7 @@ public class RealmsITCase extends AbstractConsoleITCase {
                 "body:content:body:container:content:tabbedPanel:panel:container:policies:1:field-label",
                 "Account Policy");
 
-        TESTER.assertLabel("body:content:realmChoicePanel:container:realm", "/");
+        TESTER.assertLabel("body:content:realmChoicePanel:container:realmDisplayValue", "/");
     }
 
     @Test
@@ -116,7 +116,7 @@ public class RealmsITCase extends AbstractConsoleITCase {
                 "body:content:realmChoicePanel:container:realmsFragment:realms:dropdown-menu:buttons:4:button",
                 Constants.ON_CLICK);
 
-        TESTER.assertLabel("body:content:realmChoicePanel:container:realm", "/odd");
+        TESTER.assertLabel("body:content:realmChoicePanel:container:realmDisplayValue", "/odd");
 
         TESTER.clickLink(
                 "body:content:body:container:content:tabbedPanel:panel:actions:actions:actionRepeater:2:action:action");
@@ -136,7 +136,7 @@ public class RealmsITCase extends AbstractConsoleITCase {
         assertSuccessMessage();
         TESTER.cleanupFeedbackMessages();
 
-        TESTER.assertLabel("body:content:realmChoicePanel:container:realm", "/odd");
+        TESTER.assertLabel("body:content:realmChoicePanel:container:realmDisplayValue", "/odd");
 
         TESTER.clickLink(
                 "body:content:body:container:content:tabbedPanel:panel:actions:actions:actionRepeater:2:action:action");