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 2016/03/07 16:52:21 UTC

[5/6] syncope git commit: [SYNCOPE-744] Here is the reconciliation status widget

[SYNCOPE-744] Here is the reconciliation status widget


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

Branch: refs/heads/master
Commit: f9f50c575114043bc558084e6109fefcf7862ea5
Parents: 581f524
Author: Francesco Chicchiriccò <il...@apache.org>
Authored: Mon Mar 7 16:51:20 2016 +0100
Committer: Francesco Chicchiriccò <il...@apache.org>
Committed: Mon Mar 7 16:51:20 2016 +0100

----------------------------------------------------------------------
 client/console/pom.xml                          |  10 +-
 .../client/console/SyncopeConsoleSession.java   |   5 +
 .../client/console/bulk/BulkActionModal.java    |   2 +-
 .../client/console/bulk/BulkContent.java        |  19 +-
 .../console/pages/MustChangePassword.java       |   4 +-
 .../syncope/client/console/pages/Realms.java    |   4 +-
 .../console/panels/AbstractLogsPanel.java       |   5 +-
 .../console/panels/ActionDataTablePanel.java    |  10 +-
 .../console/panels/AjaxDataTablePanel.java      |   3 +-
 .../panels/AnyObjectSearchResultPanel.java      |  21 +-
 .../console/panels/AnyTypeClassesPanel.java     |  10 +-
 .../client/console/panels/AnyTypesPanel.java    |  15 +-
 .../client/console/panels/ConnectorModal.java   |   5 +-
 .../console/panels/DashboardControlPanel.java   |   9 +
 .../console/panels/GroupSearchResultPanel.java  |  16 +-
 .../client/console/panels/ListViewPanel.java    |   4 +-
 .../panels/ParametersEditModalPanel.java        |   3 +-
 .../client/console/panels/ParametersPanel.java  |   9 +-
 .../syncope/client/console/panels/Realm.java    |  14 +-
 .../client/console/panels/RealmModalPanel.java  |   3 +-
 .../console/panels/RelationshipTypesPanel.java  |  12 +-
 .../console/panels/ResourceMappingPanel.java    |   4 +-
 .../client/console/panels/ResourceModal.java    |   5 +-
 .../console/panels/RoleSearchResultPanel.java   |   7 +-
 .../client/console/panels/SchemaTypePanel.java  |  14 +-
 .../panels/SecurityQuestionsModalPanel.java     |   5 +-
 .../console/panels/SecurityQuestionsPanel.java  |   8 +-
 .../console/panels/UserSearchResultPanel.java   |  22 +-
 .../panels/XMLWorkflowEditorModalPanel.java     |   2 +-
 .../search/AnySelectionSearchResultPanel.java   |   7 +-
 .../console/rest/AnyObjectRestClient.java       |   3 +-
 .../console/rest/ExecutionRestClient.java       |   8 +-
 .../client/console/rest/GroupRestClient.java    |   1 -
 .../client/console/rest/ReportRestClient.java   |  20 +-
 .../client/console/rest/TaskRestClient.java     |   5 +
 .../tasks/PropagationTaskSearchResultPanel.java |  20 +-
 .../tasks/SchedTaskSearchResultPanel.java       |  13 +-
 .../console/tasks/StartAtTogglePanel.java       |   7 +-
 .../client/console/tasks/TaskExecutions.java    |  10 +-
 .../client/console/topology/Topology.java       |   2 +-
 .../console/topology/TopologyTogglePanel.java   |   5 +-
 .../wicket/ajax/IndicatorAjaxTimerBehavior.java |   2 +-
 .../markup/html/ClearIndicatingAjaxButton.java  |  66 ---
 .../markup/html/ClearIndicatingAjaxLink.java    |  61 ---
 .../ajax/markup/html/IndicatorAjaxLink.java     |  41 ++
 .../data/table/BooleanPropertyColumn.java       |   1 -
 .../wicket/markup/html/form/ActionLink.java     |   4 +-
 .../markup/html/form/ActionLinksPanel.java      | 236 ++++----
 .../markup/html/form/BinaryFieldPanel.java      |   2 +-
 .../client/console/widgets/JobActionPanel.java  |  13 +-
 .../client/console/widgets/JobWidget.java       |  61 ++-
 .../client/console/widgets/ProgressBean.java    |  71 +++
 .../client/console/widgets/ProgressPanel.java   |  45 ++
 .../client/console/widgets/ProgressesPanel.java |  51 ++
 .../ReconciliationDetailsModalPanel.java        | 177 ++++++
 .../console/widgets/ReconciliationWidget.java   | 532 +++++++++++++++++++
 .../console/widgets/reconciliation/Any.java     |  71 +++
 .../console/widgets/reconciliation/Anys.java    |  55 ++
 .../widgets/reconciliation/Misaligned.java      |  51 ++
 .../console/widgets/reconciliation/Missing.java |  44 ++
 .../reconciliation/ReconciliationReport.java    |  66 +++
 .../ReconciliationReportParser.java             | 192 +++++++
 .../client/console/wizards/AjaxWizard.java      |   6 +-
 .../client/console/wizards/WizardMgtPanel.java  |   9 +-
 .../console/wizards/any/Relationships.java      |   9 +-
 .../client/console/wizards/any/ResultPage.java  |   5 +-
 .../client/console/wizards/any/StatusPanel.java |   2 +-
 .../META-INF/resources/css/syncopeConsole.css   |  10 +
 .../syncope/client/console/pages/Realms.html    |  19 +-
 .../console/panels/DashboardControlPanel.html   |   6 +
 .../client/console/panels/ParametersPanel.html  |   2 +-
 .../console/panels/WorkflowTogglePanel.html     |  51 +-
 .../markup/html/form/ActionLinksPanel.html      |  10 +
 .../console/widgets/AnyByRealmWidget.html       |   2 +-
 .../console/widgets/CompletenessWidget.html     |   2 +-
 .../client/console/widgets/JobWidget.html       |  20 +-
 .../client/console/widgets/JobWidget.properties |   3 +
 .../console/widgets/JobWidget_it.properties     |   3 +
 .../console/widgets/JobWidget_pt_BR.properties  |   3 +
 .../client/console/widgets/LoadWidget.html      |   2 +-
 .../client/console/widgets/ProgressPanel.html   |  30 ++
 .../client/console/widgets/ProgressesPanel.html |  24 +
 .../console/widgets/ProgressesPanel.properties  |  17 +
 .../widgets/ProgressesPanel_it.properties       |  17 +
 .../widgets/ProgressesPanel_pt_BR.properties    |  17 +
 .../ReconciliationDetailsModalPanel.html        |  23 +
 .../console/widgets/ReconciliationWidget.html   |  55 ++
 .../widgets/ReconciliationWidget.properties     |  21 +
 .../widgets/ReconciliationWidget_it.properties  |  21 +
 .../ReconciliationWidget_pt_BR.properties       |  21 +
 .../console/widgets/UsersByStatusWidget.html    |   2 +-
 .../ProvisionWizardBuilder$Mapping.properties   |   2 +-
 ...ProvisionWizardBuilder$Mapping_it.properties |   3 +-
 ...visionWizardBuilder$Mapping_pt_BR.properties |   2 +-
 .../rest/api/service/NotificationService.java   |   2 +
 .../common/rest/api/service/ReportService.java  |   2 +-
 .../common/rest/api/service/TaskService.java    |   2 +-
 .../core/logic/report/GroupReportlet.java       |   2 +-
 .../logic/report/ReconciliationReportlet.java   |  93 ++--
 .../core/logic/report/UserReportlet.java        |   2 +-
 .../syncope/core/misc/utils/MappingUtils.java   |   2 +-
 .../test/resources/domains/MasterContent.xml    |  10 +-
 .../java/data/RealmDataBinderImpl.java          |  42 +-
 .../client/console/panels/CamelRoutesPanel.java |   5 +-
 ext/swagger-ui/pom.xml                          |   2 -
 .../fit/console/AbstractConsoleITCase.java      |   1 -
 .../syncope/fit/console/ParametersITCase.java   |   7 +-
 .../apache/syncope/fit/core/SearchITCase.java   |  17 +-
 .../resources/scriptedsql/CreateScript.groovy   |   4 +-
 .../resources/scriptedsql/UpdateScript.groovy   |   4 +-
 pom.xml                                         |  10 +
 111 files changed, 2258 insertions(+), 561 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/syncope/blob/f9f50c57/client/console/pom.xml
----------------------------------------------------------------------
diff --git a/client/console/pom.xml b/client/console/pom.xml
index 6817358..9588709 100644
--- a/client/console/pom.xml
+++ b/client/console/pom.xml
@@ -94,11 +94,6 @@ under the License.
       <groupId>com.pingunaut</groupId>
       <artifactId>wicket-chartjs</artifactId>
     </dependency>	
-      
-    <dependency>
-      <groupId>org.apache.logging.log4j</groupId>
-      <artifactId>log4j-core</artifactId>
-    </dependency>
     
     <dependency>
       <groupId>org.apache.syncope.client</groupId>
@@ -139,6 +134,11 @@ under the License.
       <groupId>org.webjars</groupId>
       <artifactId>jquery-ui</artifactId>
     </dependency>
+    
+    <dependency>
+      <groupId>org.apache.logging.log4j</groupId>
+      <artifactId>log4j-core</artifactId>
+    </dependency>
   </dependencies>
   
   <build>

http://git-wip-us.apache.org/repos/asf/syncope/blob/f9f50c57/client/console/src/main/java/org/apache/syncope/client/console/SyncopeConsoleSession.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/SyncopeConsoleSession.java b/client/console/src/main/java/org/apache/syncope/client/console/SyncopeConsoleSession.java
index d383e4c..396752a 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/SyncopeConsoleSession.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/SyncopeConsoleSession.java
@@ -183,6 +183,11 @@ public class SyncopeConsoleSession extends AuthenticatedWebSession {
         return roles;
     }
 
+    public void refreshAuth() {
+        authenticate(username, password);
+        roles = null;
+    }
+
     @SuppressWarnings("unchecked")
     private <T> T getCachedService(final Class<T> serviceClass) {
         T service;

http://git-wip-us.apache.org/repos/asf/syncope/blob/f9f50c57/client/console/src/main/java/org/apache/syncope/client/console/bulk/BulkActionModal.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/bulk/BulkActionModal.java b/client/console/src/main/java/org/apache/syncope/client/console/bulk/BulkActionModal.java
index 9aeb197..033ee0a 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/bulk/BulkActionModal.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/bulk/BulkActionModal.java
@@ -42,7 +42,7 @@ public class BulkActionModal<T extends Serializable, S> extends AbstractModalPan
             final String keyFieldName) {
 
         super(modal, pageRef);
-        add(new BulkContent<T, S>("content", modal, pageRef, items, columns, actions, bulkActionExecutor, keyFieldName).
+        add(new BulkContent<>("content", modal, items, columns, actions, bulkActionExecutor, keyFieldName).
                 setRenderBodyOnly(true));
     }
 }

http://git-wip-us.apache.org/repos/asf/syncope/blob/f9f50c57/client/console/src/main/java/org/apache/syncope/client/console/bulk/BulkContent.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/bulk/BulkContent.java b/client/console/src/main/java/org/apache/syncope/client/console/bulk/BulkContent.java
index 2cc2f1f..153c39c 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/bulk/BulkContent.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/bulk/BulkContent.java
@@ -38,13 +38,11 @@ import org.apache.syncope.client.console.wicket.markup.html.bootstrap.dialog.Bas
 import org.apache.syncope.client.console.wicket.markup.html.form.ActionLink;
 import org.apache.syncope.client.console.wicket.markup.html.form.ActionLink.ActionType;
 import org.apache.syncope.client.console.wicket.markup.html.form.ActionLinksPanel;
-import org.apache.syncope.common.lib.SyncopeClientException;
 import org.apache.syncope.common.lib.to.BulkAction;
 import org.apache.syncope.common.lib.to.BulkActionResult;
 import org.apache.syncope.common.lib.types.ResourceAssociationAction;
 import org.apache.syncope.common.lib.types.ResourceDeassociationAction;
 import org.apache.syncope.common.lib.types.StandardEntitlement;
-import org.apache.wicket.PageReference;
 import org.apache.wicket.ajax.AjaxRequestTarget;
 import org.apache.wicket.event.Broadcast;
 import org.apache.wicket.extensions.ajax.markup.html.repeater.data.table.AjaxFallbackDefaultDataTable;
@@ -65,20 +63,19 @@ public class BulkContent<T extends Serializable, S> extends MultilevelPanel.Seco
 
     public BulkContent(
             final BaseModal<?> modal,
-            final PageReference pageRef,
             final Collection<T> items,
             final List<IColumn<T, S>> columns,
             final Collection<ActionLink.ActionType> actions,
             final BaseRestClient bulkActionExecutor,
             final String keyFieldName) {
+
         this(MultilevelPanel.SECOND_LEVEL_ID,
-                modal, pageRef, items, columns, actions, bulkActionExecutor, keyFieldName);
+                modal, items, columns, actions, bulkActionExecutor, keyFieldName);
     }
 
     public BulkContent(
             final String id,
             final BaseModal<?> modal,
-            final PageReference pageRef,
             final Collection<T> items,
             final List<IColumn<T, S>> columns,
             final Collection<ActionLink.ActionType> actions,
@@ -117,7 +114,7 @@ public class BulkContent<T extends Serializable, S> extends MultilevelPanel.Seco
                 dataProvider,
                 Integer.MAX_VALUE).setMarkupId("selectedObjects").setVisible(items != null && !items.isEmpty()));
 
-        final ActionLinksPanel<Serializable> actionPanel = ActionLinksPanel.builder(pageRef).build("actions");
+        final ActionLinksPanel<Serializable> actionPanel = ActionLinksPanel.builder().build("actions");
         container.add(actionPanel);
 
         for (ActionLink.ActionType action : actions) {
@@ -149,8 +146,8 @@ public class BulkContent<T extends Serializable, S> extends MultilevelPanel.Seco
                                 throw new IllegalArgumentException("Invalid bulk action executor");
                             }
 
-                            final AbstractAnyRestClient<?> anyRestClient
-                                    = AbstractAnyRestClient.class.cast(bulkActionExecutor);
+                            final AbstractAnyRestClient<?> anyRestClient =
+                                    AbstractAnyRestClient.class.cast(bulkActionExecutor);
 
                             if (items.isEmpty() || !(items.iterator().next() instanceof StatusBean)) {
                                 throw new IllegalArgumentException("Invalid items");
@@ -227,11 +224,9 @@ public class BulkContent<T extends Serializable, S> extends MultilevelPanel.Seco
                         target.add(actionPanel);
 
                         info(getString(Constants.OPERATION_SUCCEEDED));
-                    } catch (SyncopeClientException | NoSuchMethodException | SecurityException | IllegalAccessException
-                            | IllegalArgumentException | InvocationTargetException e) {
+                    } catch (Exception e) {
                         LOG.error("Bulk action failure", e);
-                        error(getString(Constants.ERROR)
-                                + ": Operation " + actionToBeAddresed.getActionId() + " not supported");
+                        error("Operation " + actionToBeAddresed.getActionId() + " not supported");
                     }
                     SyncopeConsoleSession.get().getNotificationPanel().refresh(target);
                 }

http://git-wip-us.apache.org/repos/asf/syncope/blob/f9f50c57/client/console/src/main/java/org/apache/syncope/client/console/pages/MustChangePassword.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/pages/MustChangePassword.java b/client/console/src/main/java/org/apache/syncope/client/console/pages/MustChangePassword.java
index f127d92..a25636b 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/pages/MustChangePassword.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/pages/MustChangePassword.java
@@ -18,8 +18,8 @@
  */
 package org.apache.syncope.client.console.pages;
 
+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.rest.UserSelfRestClient;
 import org.apache.syncope.client.console.wicket.markup.html.form.AjaxPasswordFieldPanel;
 import org.apache.wicket.ajax.AjaxRequestTarget;
@@ -93,7 +93,7 @@ public class MustChangePassword extends WebPage {
                 } catch (Exception e) {
                     LOG.error("While changing password for {}",
                             SyncopeConsoleSession.get().getSelfTO().getUsername(), e);
-                    error(getString(Constants.ERROR) + ": " + e.getMessage());
+                    error(StringUtils.isBlank(e.getMessage()) ? e.getClass().getName() : e.getMessage());
                     SyncopeConsoleSession.get().getNotificationPanel().refresh(target);
                 }
             }

http://git-wip-us.apache.org/repos/asf/syncope/blob/f9f50c57/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 a5c10e2..2ee818f 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
@@ -157,8 +157,8 @@ public class Realms extends BasePage {
                     target.add(content);                  
                 } catch (Exception e) {
                     LOG.error("While deleting realm", e);
-                    // Excape line breaks
-                    error(getString(Constants.ERROR) + ": " + e.getMessage().replace("\n", " "));
+                    // Escape line breaks
+                    error(e.getMessage().replace("\n", " "));
                 }
                 SyncopeConsoleSession.get().getNotificationPanel().refresh(target);
             }

http://git-wip-us.apache.org/repos/asf/syncope/blob/f9f50c57/client/console/src/main/java/org/apache/syncope/client/console/panels/AbstractLogsPanel.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/panels/AbstractLogsPanel.java b/client/console/src/main/java/org/apache/syncope/client/console/panels/AbstractLogsPanel.java
index 227d7d4..dbd79a7 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/panels/AbstractLogsPanel.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/panels/AbstractLogsPanel.java
@@ -20,6 +20,7 @@ package org.apache.syncope.client.console.panels;
 
 import java.util.Arrays;
 import java.util.List;
+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.wicket.markup.html.form.AjaxDropDownChoicePanel;
@@ -48,7 +49,7 @@ public abstract class AbstractLogsPanel<T extends AbstractBaseBean> extends Pane
             final String id,
             final PageReference pageRef,
             final List<LoggerTO> loggerTOs) {
-        
+
         super(id);
 
         WebMarkupContainer container = new WebMarkupContainer("loggerContainer");
@@ -79,7 +80,7 @@ public abstract class AbstractLogsPanel<T extends AbstractBaseBean> extends Pane
                                 target.add(loggerTOs);
                             } catch (SyncopeClientException e) {
                                 LOG.error("Error updating the logger level", e);
-                                error(getString(Constants.ERROR) + ": " + e.getMessage());
+                                error(StringUtils.isBlank(e.getMessage()) ? e.getClass().getName() : e.getMessage());
                             }
                             SyncopeConsoleSession.get().getNotificationPanel().refresh(target);
                         }

http://git-wip-us.apache.org/repos/asf/syncope/blob/f9f50c57/client/console/src/main/java/org/apache/syncope/client/console/panels/ActionDataTablePanel.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/panels/ActionDataTablePanel.java b/client/console/src/main/java/org/apache/syncope/client/console/panels/ActionDataTablePanel.java
index 65e9ca1..8c465f3 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/panels/ActionDataTablePanel.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/panels/ActionDataTablePanel.java
@@ -30,7 +30,6 @@ import org.apache.syncope.client.console.wicket.markup.html.form.ActionLink;
 import org.apache.syncope.client.console.wicket.markup.html.form.ActionLink.ActionType;
 import org.apache.syncope.client.console.wicket.markup.html.form.ActionLinksPanel;
 import org.apache.wicket.AttributeModifier;
-import org.apache.wicket.PageReference;
 import org.apache.wicket.ajax.AjaxRequestTarget;
 import org.apache.wicket.ajax.markup.html.form.AjaxButton;
 import org.apache.wicket.extensions.ajax.markup.html.IndicatingAjaxButton;
@@ -50,19 +49,14 @@ public class ActionDataTablePanel<T extends Serializable, S> extends DataTablePa
 
     private final ActionLinksPanel<Serializable> actionPanel;
 
-    private final PageReference pageRef;
-
     public ActionDataTablePanel(
             final String id,
             final List<IColumn<T, S>> columns,
             final ISortableDataProvider<T, S> dataProvider,
-            final int rowsPerPage,
-            final PageReference pageRef) {
+            final int rowsPerPage) {
 
         super(id);
 
-        this.pageRef = pageRef;
-
         bulkActionForm = new Form<>("groupForm");
         add(bulkActionForm);
 
@@ -93,7 +87,7 @@ public class ActionDataTablePanel<T extends Serializable, S> extends DataTablePa
         final WebMarkupContainer actionPanelContainer = new WebMarkupContainer("actionPanelContainer");
         bulkActionForm.add(actionPanelContainer);
 
-        actionPanel = ActionLinksPanel.builder(pageRef).build("actions");
+        actionPanel = ActionLinksPanel.builder().build("actions");
         actionPanelContainer.add(actionPanel);
 
         if (dataTable.getRowCount() == 0) {

http://git-wip-us.apache.org/repos/asf/syncope/blob/f9f50c57/client/console/src/main/java/org/apache/syncope/client/console/panels/AjaxDataTablePanel.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/panels/AjaxDataTablePanel.java b/client/console/src/main/java/org/apache/syncope/client/console/panels/AjaxDataTablePanel.java
index dad7267..d02a784 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/panels/AjaxDataTablePanel.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/panels/AjaxDataTablePanel.java
@@ -223,9 +223,8 @@ public final class AjaxDataTablePanel<T extends Serializable, S> extends DataTab
 
                     bulkModal.show(true);
                 } else {
-                    builder.multiLevelPanel.next("bulk.action", new BulkContent<T, S>(
+                    builder.multiLevelPanel.next("bulk.action", new BulkContent<>(
                             builder.baseModal,
-                            builder.pageRef,
                             group.getModelObject(),
                             // serialization problem with sublist only
                             new ArrayList<>(builder.columns.subList(1, builder.columns.size() - 1)),

http://git-wip-us.apache.org/repos/asf/syncope/blob/f9f50c57/client/console/src/main/java/org/apache/syncope/client/console/panels/AnyObjectSearchResultPanel.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/panels/AnyObjectSearchResultPanel.java b/client/console/src/main/java/org/apache/syncope/client/console/panels/AnyObjectSearchResultPanel.java
index 6cd7521..8eeb37b 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/panels/AnyObjectSearchResultPanel.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/panels/AnyObjectSearchResultPanel.java
@@ -24,6 +24,7 @@ import java.util.ArrayList;
 import java.util.Date;
 import java.util.List;
 import org.apache.commons.lang3.SerializationUtils;
+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.rest.AnyObjectRestClient;
@@ -74,9 +75,7 @@ public class AnyObjectSearchResultPanel extends AnySearchResultPanel<AnyObjectTO
 
             final Field field = ReflectionUtils.findField(AnyObjectTO.class, name);
 
-            if ("token".equalsIgnoreCase(name)) {
-                columns.add(new PropertyColumn<AnyObjectTO, String>(new ResourceModel(name, name), name, name));
-            } else if (field != null && field.getType().equals(Date.class)) {
+            if (field != null && field.getType().equals(Date.class)) {
                 columns.add(new PropertyColumn<AnyObjectTO, String>(new ResourceModel(name, name), name, name));
             } else {
                 columns.add(new PropertyColumn<AnyObjectTO, String>(new ResourceModel(name, name), name, name));
@@ -104,18 +103,17 @@ public class AnyObjectSearchResultPanel extends AnySearchResultPanel<AnyObjectTO
             for (String name : AnyObjectDisplayAttributesModalPage.ANY_OBJECT_DEFAULT_SELECTION) {
                 columns.add(new PropertyColumn<AnyObjectTO, String>(new ResourceModel(name, name), name, name));
             }
-
         }
 
         setWindowClosedReloadCallback(displayAttributeModal);
-        
+
         columns.add(new ActionColumn<AnyObjectTO, String>(new ResourceModel("actions", "")) {
 
             private static final long serialVersionUID = -3503023501954863131L;
 
             @Override
             public ActionLinksPanel<AnyObjectTO> getActions(final String componentId, final IModel<AnyObjectTO> model) {
-                final ActionLinksPanel.Builder<AnyObjectTO> panel = ActionLinksPanel.builder(page.getPageReference());
+                final ActionLinksPanel.Builder<AnyObjectTO> panel = ActionLinksPanel.builder();
 
                 panel.add(new ActionLink<AnyObjectTO>() {
 
@@ -123,11 +121,11 @@ public class AnyObjectSearchResultPanel extends AnySearchResultPanel<AnyObjectTO
 
                     @Override
                     public void onClick(final AjaxRequestTarget target, final AnyObjectTO ignore) {
-                                final IModel<AnyHandler<AnyObjectTO>> formModel
-                                        = new CompoundPropertyModel<>(new AnyHandler<>(model.getObject()));
+                        final IModel<AnyHandler<AnyObjectTO>> formModel =
+                                new CompoundPropertyModel<>(new AnyHandler<>(model.getObject()));
                         altDefaultModal.setFormModel(formModel);
 
-                        target.add(altDefaultModal.setContent(new StatusModal<AnyObjectTO>(
+                        target.add(altDefaultModal.setContent(new StatusModal<>(
                                 altDefaultModal, pageRef, formModel.getObject().getInnerObject(), false)));
 
                         altDefaultModal.header(new Model<>(
@@ -173,7 +171,8 @@ public class AnyObjectSearchResultPanel extends AnySearchResultPanel<AnyObjectTO
                                     target.add(container);
                                 } catch (SyncopeClientException e) {
                                     LOG.error("While deleting object {}", model.getObject().getKey(), e);
-                                    error(getString(Constants.ERROR) + ": " + e.getMessage());
+                                    error(StringUtils.isBlank(e.getMessage())
+                                            ? e.getClass().getName() : e.getMessage());
                                 }
                                 SyncopeConsoleSession.get().getNotificationPanel().refresh(target);
                             }
@@ -184,7 +183,7 @@ public class AnyObjectSearchResultPanel extends AnySearchResultPanel<AnyObjectTO
 
             @Override
             public ActionLinksPanel<Serializable> getHeader(final String componentId) {
-                final ActionLinksPanel.Builder<Serializable> panel = ActionLinksPanel.builder(page.getPageReference());
+                final ActionLinksPanel.Builder<Serializable> panel = ActionLinksPanel.builder();
 
                 panel.add(new ActionLink<Serializable>() {
 

http://git-wip-us.apache.org/repos/asf/syncope/blob/f9f50c57/client/console/src/main/java/org/apache/syncope/client/console/panels/AnyTypeClassesPanel.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/panels/AnyTypeClassesPanel.java b/client/console/src/main/java/org/apache/syncope/client/console/panels/AnyTypeClassesPanel.java
index 1f88ea4..8fa1b5a 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/panels/AnyTypeClassesPanel.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/panels/AnyTypeClassesPanel.java
@@ -84,7 +84,7 @@ public class AnyTypeClassesPanel extends AbstractTypesPanel<AnyTypeClassTO, AnyT
                             modal.close(target);
                         } catch (Exception e) {
                             LOG.error("While creating or updating AnyTypeClassTO", e);
-                            error(getString(Constants.ERROR) + ": " + e.getMessage());
+                            error(StringUtils.isBlank(e.getMessage()) ? e.getClass().getName() : e.getMessage());
                         }
                         SyncopeConsoleSession.get().getNotificationPanel().refresh(target);
                     }
@@ -156,7 +156,7 @@ public class AnyTypeClassesPanel extends AbstractTypesPanel<AnyTypeClassTO, AnyT
             public ActionLinksPanel<AnyTypeClassTO> getActions(
                     final String componentId, final IModel<AnyTypeClassTO> model) {
 
-                ActionLinksPanel<AnyTypeClassTO> panel = ActionLinksPanel.<AnyTypeClassTO>builder(pageRef).
+                ActionLinksPanel<AnyTypeClassTO> panel = ActionLinksPanel.<AnyTypeClassTO>builder().
                         add(new ActionLink<AnyTypeClassTO>() {
 
                             private static final long serialVersionUID = -3722207913631435501L;
@@ -180,7 +180,8 @@ public class AnyTypeClassesPanel extends AbstractTypesPanel<AnyTypeClassTO, AnyT
                                     target.add(container);
                                 } catch (Exception e) {
                                     LOG.error("While deleting {}", model.getObject(), e);
-                                    error(getString(Constants.ERROR) + ": " + e.getMessage());
+                                    error(StringUtils.isBlank(e.getMessage())
+                                            ? e.getClass().getName() : e.getMessage());
                                 }
                                 SyncopeConsoleSession.get().getNotificationPanel().refresh(target);
                             }
@@ -192,8 +193,7 @@ public class AnyTypeClassesPanel extends AbstractTypesPanel<AnyTypeClassTO, AnyT
 
             @Override
             public ActionLinksPanel<AnyTypeClassTO> getHeader(final String componentId) {
-                final ActionLinksPanel.Builder<AnyTypeClassTO> panel =
-                        ActionLinksPanel.builder(page.getPageReference());
+                final ActionLinksPanel.Builder<AnyTypeClassTO> panel = ActionLinksPanel.builder();
 
                 return panel.add(new ActionLink<AnyTypeClassTO>() {
 

http://git-wip-us.apache.org/repos/asf/syncope/blob/f9f50c57/client/console/src/main/java/org/apache/syncope/client/console/panels/AnyTypesPanel.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/panels/AnyTypesPanel.java b/client/console/src/main/java/org/apache/syncope/client/console/panels/AnyTypesPanel.java
index 4365610..978c299 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/panels/AnyTypesPanel.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/panels/AnyTypesPanel.java
@@ -78,14 +78,15 @@ public class AnyTypesPanel extends AbstractTypesPanel<AnyTypeTO, AnyTypeProvider
                         try {
                             if (getOriginalItem() == null || StringUtils.isBlank(getOriginalItem().getKey())) {
                                 SyncopeConsoleSession.get().getService(AnyTypeService.class).create(modelObject);
+                                SyncopeConsoleSession.get().refreshAuth();
                             } else {
                                 SyncopeConsoleSession.get().getService(AnyTypeService.class).update(modelObject);
                             }
                             info(getString(Constants.OPERATION_SUCCEEDED));
                             modal.close(target);
                         } catch (Exception e) {
-                            LOG.error("While creating or updating AnyTypeTO", e);
-                            error(getString(Constants.ERROR) + ": " + e.getMessage());
+                            LOG.error("While creating or updating {}", modelObject, e);
+                            error(StringUtils.isBlank(e.getMessage()) ? e.getClass().getName() : e.getMessage());
                         }
                         SyncopeConsoleSession.get().getNotificationPanel().refresh(target);
                     }
@@ -157,7 +158,7 @@ public class AnyTypesPanel extends AbstractTypesPanel<AnyTypeTO, AnyTypeProvider
             public ActionLinksPanel<AnyTypeTO> getActions(
                     final String componentId, final IModel<AnyTypeTO> model) {
 
-                ActionLinksPanel<AnyTypeTO> panel = ActionLinksPanel.<AnyTypeTO>builder(pageRef).
+                ActionLinksPanel<AnyTypeTO> panel = ActionLinksPanel.<AnyTypeTO>builder().
                         add(new ActionLink<AnyTypeTO>() {
 
                             private static final long serialVersionUID = -3722207913631435501L;
@@ -177,11 +178,14 @@ public class AnyTypesPanel extends AbstractTypesPanel<AnyTypeTO, AnyTypeProvider
                                 try {
                                     SyncopeConsoleSession.get().
                                             getService(AnyTypeService.class).delete(model.getObject().getKey());
+                                    SyncopeConsoleSession.get().refreshAuth();
+
                                     info(getString(Constants.OPERATION_SUCCEEDED));
                                     target.add(container);
                                 } catch (Exception e) {
                                     LOG.error("While deleting {}", model.getObject(), e);
-                                    error(getString(Constants.ERROR) + ": " + e.getMessage());
+                                    error(StringUtils.isBlank(e.getMessage()) 
+                                            ? e.getClass().getName() : e.getMessage());
                                 }
                                 SyncopeConsoleSession.get().getNotificationPanel().refresh(target);
                             }
@@ -193,8 +197,7 @@ public class AnyTypesPanel extends AbstractTypesPanel<AnyTypeTO, AnyTypeProvider
 
             @Override
             public ActionLinksPanel<AnyTypeTO> getHeader(final String componentId) {
-                final ActionLinksPanel.Builder<AnyTypeTO> panel =
-                        ActionLinksPanel.builder(page.getPageReference());
+                final ActionLinksPanel.Builder<AnyTypeTO> panel = ActionLinksPanel.builder();
 
                 return panel.add(new ActionLink<AnyTypeTO>() {
 

http://git-wip-us.apache.org/repos/asf/syncope/blob/f9f50c57/client/console/src/main/java/org/apache/syncope/client/console/panels/ConnectorModal.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/panels/ConnectorModal.java b/client/console/src/main/java/org/apache/syncope/client/console/panels/ConnectorModal.java
index bbb645e..33b04bc 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/panels/ConnectorModal.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/panels/ConnectorModal.java
@@ -25,6 +25,7 @@ import java.util.List;
 import org.apache.commons.collections4.CollectionUtils;
 import org.apache.commons.collections4.IterableUtils;
 import org.apache.commons.collections4.Predicate;
+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.rest.ConnectorRestClient;
@@ -166,8 +167,8 @@ public class ConnectorModal extends AbstractResourceModal<Serializable> {
             modal.close(target);
             info(getString(Constants.OPERATION_SUCCEEDED));
         } catch (Exception e) {
-            LOG.error("Failure managing resource {}", connInstanceTO, e);
-            error(getString(Constants.ERROR) + ": " + e.getMessage());
+            LOG.error("Failure managing {}", connInstanceTO, e);
+            error(StringUtils.isBlank(e.getMessage()) ? e.getClass().getName() : e.getMessage());
         }
         SyncopeConsoleSession.get().getNotificationPanel().refresh(target);
     }

http://git-wip-us.apache.org/repos/asf/syncope/blob/f9f50c57/client/console/src/main/java/org/apache/syncope/client/console/panels/DashboardControlPanel.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/panels/DashboardControlPanel.java b/client/console/src/main/java/org/apache/syncope/client/console/panels/DashboardControlPanel.java
index 0c993b8..8641aa1 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/panels/DashboardControlPanel.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/panels/DashboardControlPanel.java
@@ -19,6 +19,7 @@
 package org.apache.syncope.client.console.panels;
 
 import org.apache.syncope.client.console.widgets.JobWidget;
+import org.apache.syncope.client.console.widgets.ReconciliationWidget;
 import org.apache.syncope.common.lib.types.StandardEntitlement;
 import org.apache.wicket.PageReference;
 import org.apache.wicket.authroles.authorization.strategies.role.metadata.MetaDataRoleAuthorizationStrategy;
@@ -39,5 +40,13 @@ public class DashboardControlPanel extends Panel {
                         StandardEntitlement.TASK_LIST,
                         StandardEntitlement.REPORT_LIST));
         add(job);
+
+        ReconciliationWidget reconciliation = new ReconciliationWidget("reconciliation", pageRef);
+        MetaDataRoleAuthorizationStrategy.authorize(job, WebPage.ENABLE,
+                String.format("%s,%s,%s",
+                        StandardEntitlement.REPORT_EXECUTE,
+                        StandardEntitlement.REPORT_READ,
+                        StandardEntitlement.REPORT_LIST));
+        add(reconciliation);
     }
 }

http://git-wip-us.apache.org/repos/asf/syncope/blob/f9f50c57/client/console/src/main/java/org/apache/syncope/client/console/panels/GroupSearchResultPanel.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/panels/GroupSearchResultPanel.java b/client/console/src/main/java/org/apache/syncope/client/console/panels/GroupSearchResultPanel.java
index 17d2d87..c82b56f 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/panels/GroupSearchResultPanel.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/panels/GroupSearchResultPanel.java
@@ -25,6 +25,7 @@ import java.util.Arrays;
 import java.util.Date;
 import java.util.List;
 import org.apache.commons.lang3.SerializationUtils;
+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.rest.GroupRestClient;
@@ -105,14 +106,14 @@ public class GroupSearchResultPanel extends AnySearchResultPanel<GroupTO> {
         }
 
         setWindowClosedReloadCallback(displayAttributeModal);
-        
+
         columns.add(new ActionColumn<GroupTO, String>(new ResourceModel("actions", "")) {
 
             private static final long serialVersionUID = -3503023501954863131L;
 
             @Override
             public ActionLinksPanel<GroupTO> getActions(final String componentId, final IModel<GroupTO> model) {
-                final ActionLinksPanel.Builder<GroupTO> panel = ActionLinksPanel.builder(page.getPageReference());
+                final ActionLinksPanel.Builder<GroupTO> panel = ActionLinksPanel.builder();
 
                 panel.
                         add(new ActionLink<GroupTO>() {
@@ -121,11 +122,11 @@ public class GroupSearchResultPanel extends AnySearchResultPanel<GroupTO> {
 
                             @Override
                             public void onClick(final AjaxRequestTarget target, final GroupTO ignore) {
-                                final IModel<AnyHandler<GroupTO>> formModel
-                                        = new CompoundPropertyModel<>(new AnyHandler<>(model.getObject()));
+                                final IModel<AnyHandler<GroupTO>> formModel =
+                                        new CompoundPropertyModel<>(new AnyHandler<>(model.getObject()));
                                 altDefaultModal.setFormModel(formModel);
 
-                                target.add(altDefaultModal.setContent(new StatusModal<GroupTO>(
+                                target.add(altDefaultModal.setContent(new StatusModal<>(
                                         altDefaultModal, pageRef, formModel.getObject().getInnerObject(), false)));
 
                                 altDefaultModal.header(new Model<>(
@@ -169,8 +170,9 @@ public class GroupSearchResultPanel extends AnySearchResultPanel<GroupTO> {
                                     info(getString(Constants.OPERATION_SUCCEEDED));
                                     target.add(container);
                                 } catch (SyncopeClientException e) {
-                                    error(getString(Constants.ERROR) + ": " + e.getMessage());
                                     LOG.error("While deleting object {}", model.getObject().getKey(), e);
+                                    error(StringUtils.isBlank(e.getMessage())
+                                            ? e.getClass().getName() : e.getMessage());
                                 }
                                 SyncopeConsoleSession.get().getNotificationPanel().refresh(target);
                             }
@@ -181,7 +183,7 @@ public class GroupSearchResultPanel extends AnySearchResultPanel<GroupTO> {
 
             @Override
             public ActionLinksPanel<Serializable> getHeader(final String componentId) {
-                final ActionLinksPanel.Builder<Serializable> panel = ActionLinksPanel.builder(page.getPageReference());
+                final ActionLinksPanel.Builder<Serializable> panel = ActionLinksPanel.builder();
 
                 return panel.add(new ActionLink<Serializable>() {
 

http://git-wip-us.apache.org/repos/asf/syncope/blob/f9f50c57/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 0b6205f..ebc0b18 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
@@ -154,7 +154,7 @@ public abstract class ListViewPanel<T extends Serializable> extends WizardMgtPan
 
             @Override
             protected void populateItem(final ListItem<T> beanItem) {
-                beanItem.add(new Check<T>("check", beanItem.getModel(), checkGroup).setOutputMarkupId(true)
+                beanItem.add(new Check<>("check", beanItem.getModel(), checkGroup).setOutputMarkupId(true)
                         .setOutputMarkupPlaceholderTag(true)
                         .setVisible(ListViewPanel.this.check.getObject() == CheckAvailability.AVAILABLE
                                 || ListViewPanel.this.check.getObject() == CheckAvailability.DISABLED)
@@ -234,7 +234,7 @@ public abstract class ListViewPanel<T extends Serializable> extends WizardMgtPan
             super(pageRef);
             this.reference = reference;
             this.items = null;
-            this.actions = ActionLinksPanel.<T>builder(pageRef);
+            this.actions = ActionLinksPanel.<T>builder();
         }
 
         public Builder<T> setModel(final IModel<? extends Collection<T>> model) {

http://git-wip-us.apache.org/repos/asf/syncope/blob/f9f50c57/client/console/src/main/java/org/apache/syncope/client/console/panels/ParametersEditModalPanel.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/panels/ParametersEditModalPanel.java b/client/console/src/main/java/org/apache/syncope/client/console/panels/ParametersEditModalPanel.java
index 2074889..4d2795a 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/panels/ParametersEditModalPanel.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/panels/ParametersEditModalPanel.java
@@ -18,6 +18,7 @@
  */
 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.wicket.markup.html.bootstrap.dialog.BaseModal;
@@ -58,7 +59,7 @@ public class ParametersEditModalPanel extends AbstractModalPanel<AttrTO> {
             info(getString(Constants.OPERATION_SUCCEEDED));
         } catch (Exception e) {
             LOG.error("While creating or updating AttrTO", e);
-            error(getString(Constants.ERROR) + ": " + e.getMessage());
+            error(StringUtils.isBlank(e.getMessage()) ? e.getClass().getName() : e.getMessage());
         }
         SyncopeConsoleSession.get().getNotificationPanel().refresh(target);
     }

http://git-wip-us.apache.org/repos/asf/syncope/blob/f9f50c57/client/console/src/main/java/org/apache/syncope/client/console/panels/ParametersPanel.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/panels/ParametersPanel.java b/client/console/src/main/java/org/apache/syncope/client/console/panels/ParametersPanel.java
index a826ede..6ee4ae0 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/panels/ParametersPanel.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/panels/ParametersPanel.java
@@ -24,6 +24,7 @@ import java.util.Collection;
 import java.util.Collections;
 import java.util.Iterator;
 import java.util.List;
+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.commons.SearchableDataProvider;
@@ -142,7 +143,7 @@ public class ParametersPanel extends AbstractSearchResultPanel<
 
             @Override
             public ActionLinksPanel<AttrTO> getActions(final String componentId, final IModel<AttrTO> model) {
-                ActionLinksPanel<AttrTO> panel = ActionLinksPanel.<AttrTO>builder(pageRef).
+                ActionLinksPanel<AttrTO> panel = ActionLinksPanel.<AttrTO>builder().
                         add(new ActionLink<AttrTO>() {
 
                             private static final long serialVersionUID = -3722207913631435501L;
@@ -172,7 +173,8 @@ public class ParametersPanel extends AbstractSearchResultPanel<
                                     target.add(container);
                                 } catch (Exception e) {
                                     LOG.error("While deleting {}", model.getObject(), e);
-                                    error(getString(Constants.ERROR) + ": " + e.getMessage());
+                                    error(StringUtils.isBlank(e.getMessage())
+                                            ? e.getClass().getName() : e.getMessage());
                                 }
                                 SyncopeConsoleSession.get().getNotificationPanel().refresh(target);
                             }
@@ -184,8 +186,7 @@ public class ParametersPanel extends AbstractSearchResultPanel<
 
             @Override
             public ActionLinksPanel<AttrTO> getHeader(final String componentId) {
-                final ActionLinksPanel.Builder<AttrTO> panel =
-                        ActionLinksPanel.builder(page.getPageReference());
+                final ActionLinksPanel.Builder<AttrTO> panel = ActionLinksPanel.builder();
 
                 return panel.add(new ActionLink<AttrTO>() {
 

http://git-wip-us.apache.org/repos/asf/syncope/blob/f9f50c57/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 183e23e..73118b4 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
@@ -78,7 +78,7 @@ public abstract class Realm extends Panel {
         return realmTO;
     }
 
-    private List<ITab> buildTabList(final PageReference pageReference) {
+    private List<ITab> buildTabList(final PageReference pageRef) {
 
         final List<ITab> tabs = new ArrayList<>();
 
@@ -88,7 +88,7 @@ public abstract class Realm extends Panel {
 
             @Override
             public Panel getPanel(final String panelId) {
-                final ActionLinksPanel<RealmTO> actionLinksPanel = ActionLinksPanel.<RealmTO>builder(pageRef).
+                final ActionLinksPanel<RealmTO> actionLinksPanel = ActionLinksPanel.<RealmTO>builder().
                         add(new ActionLink<RealmTO>(realmTO) {
 
                             private static final long serialVersionUID = 2802988981431379827L;
@@ -133,14 +133,14 @@ public abstract class Realm extends Panel {
 
                 @Override
                 public Panel getPanel(final String panelId) {
-                    return getAnyPanel(panelId, pageReference, anyTypeTO);
+                    return getAnyPanel(panelId, pageRef, anyTypeTO);
                 }
             });
         }
         return tabs;
     }
 
-    private Panel getAnyPanel(final String id, final PageReference pageReference, final AnyTypeTO anyTypeTO) {
+    private Panel getAnyPanel(final String id, final PageReference pageRef, final AnyTypeTO anyTypeTO) {
         final Panel panel;
         switch (anyTypeTO.getKind()) {
             case USER:
@@ -149,7 +149,7 @@ public abstract class Realm extends Panel {
                 panel = new UserSearchResultPanel.Builder(
                         anyTypeClassRestClient.list(anyTypeTO.getClasses()),
                         anyTypeTO.getKey(),
-                        pageReference).setRealm(realmTO.getFullPath()).
+                        pageRef).setRealm(realmTO.getFullPath()).
                         addNewItemPanelBuilder(new UserWizardBuilder(
                                 BaseModal.CONTENT_ID, userTO, anyTypeTO.getClasses(), pageRef)).build(id);
                 MetaDataRoleAuthorizationStrategy.authorize(panel, WebPage.RENDER, StandardEntitlement.USER_LIST);
@@ -160,7 +160,7 @@ public abstract class Realm extends Panel {
                 panel = new GroupSearchResultPanel.Builder(
                         anyTypeClassRestClient.list(anyTypeTO.getClasses()),
                         anyTypeTO.getKey(),
-                        pageReference).setRealm(realmTO.getFullPath()).
+                        pageRef).setRealm(realmTO.getFullPath()).
                         addNewItemPanelBuilder(new GroupWizardBuilder(
                                 BaseModal.CONTENT_ID, groupTO, anyTypeTO.getClasses(), pageRef)).build(id);
                 // list of group is available to all authenticated users
@@ -172,7 +172,7 @@ public abstract class Realm extends Panel {
                 panel = new AnyObjectSearchResultPanel.Builder(
                         anyTypeClassRestClient.list(anyTypeTO.getClasses()),
                         anyTypeTO.getKey(),
-                        pageReference).setRealm(realmTO.getFullPath()).
+                        pageRef).setRealm(realmTO.getFullPath()).
                         addNewItemPanelBuilder(new AnyObjectWizardBuilder(
                                 BaseModal.CONTENT_ID, anyObjectTO, anyTypeTO.getClasses(), pageRef)).build(id);
                 MetaDataRoleAuthorizationStrategy.authorize(panel, WebPage.RENDER,

http://git-wip-us.apache.org/repos/asf/syncope/blob/f9f50c57/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
index af64f81..287e2a6 100644
--- 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
@@ -18,6 +18,7 @@
  */
 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.rest.RealmRestClient;
@@ -82,7 +83,7 @@ public class RealmModalPanel extends AbstractModalPanel<RealmTO> {
             info(getString(Constants.OPERATION_SUCCEEDED));
         } catch (Exception e) {
             LOG.error("While creating or updating realm", e);
-            error(getString(Constants.ERROR) + ": " + e.getMessage());
+            error(StringUtils.isBlank(e.getMessage()) ? e.getClass().getName() : e.getMessage());
         }
         SyncopeConsoleSession.get().getNotificationPanel().refresh(target);
     }

http://git-wip-us.apache.org/repos/asf/syncope/blob/f9f50c57/client/console/src/main/java/org/apache/syncope/client/console/panels/RelationshipTypesPanel.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/panels/RelationshipTypesPanel.java b/client/console/src/main/java/org/apache/syncope/client/console/panels/RelationshipTypesPanel.java
index 01b565e..81df00e 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/panels/RelationshipTypesPanel.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/panels/RelationshipTypesPanel.java
@@ -86,8 +86,8 @@ public class RelationshipTypesPanel extends AbstractTypesPanel<RelationshipTypeT
                             info(getString(Constants.OPERATION_SUCCEEDED));
                             modal.close(target);
                         } catch (Exception e) {
-                            LOG.error("While creating or updating RelationshipTypeTO", e);
-                            error(getString(Constants.ERROR) + ": " + e.getMessage());
+                            LOG.error("While creating or updating {}", modelObject, e);
+                            error(StringUtils.isBlank(e.getMessage()) ? e.getClass().getName() : e.getMessage());
                         }
                         SyncopeConsoleSession.get().getNotificationPanel().refresh(target);
                     }
@@ -160,7 +160,7 @@ public class RelationshipTypesPanel extends AbstractTypesPanel<RelationshipTypeT
             public ActionLinksPanel<RelationshipTypeTO> getActions(
                     final String componentId, final IModel<RelationshipTypeTO> model) {
 
-                ActionLinksPanel<RelationshipTypeTO> panel = ActionLinksPanel.<RelationshipTypeTO>builder(pageRef).
+                ActionLinksPanel<RelationshipTypeTO> panel = ActionLinksPanel.<RelationshipTypeTO>builder().
                         add(new ActionLink<RelationshipTypeTO>() {
 
                             private static final long serialVersionUID = -3722207913631435501L;
@@ -184,7 +184,8 @@ public class RelationshipTypesPanel extends AbstractTypesPanel<RelationshipTypeT
                                     target.add(container);
                                 } catch (Exception e) {
                                     LOG.error("While deleting {}", model.getObject(), e);
-                                    error(getString(Constants.ERROR) + ": " + e.getMessage());
+                                    error(StringUtils.isBlank(e.getMessage())
+                                            ? e.getClass().getName() : e.getMessage());
                                 }
                                 SyncopeConsoleSession.get().getNotificationPanel().refresh(target);
                             }
@@ -196,8 +197,7 @@ public class RelationshipTypesPanel extends AbstractTypesPanel<RelationshipTypeT
 
             @Override
             public ActionLinksPanel<RelationshipTypeTO> getHeader(final String componentId) {
-                final ActionLinksPanel.Builder<RelationshipTypeTO> panel =
-                        ActionLinksPanel.builder(page.getPageReference());
+                final ActionLinksPanel.Builder<RelationshipTypeTO> panel = ActionLinksPanel.builder();
 
                 return panel.add(new ActionLink<RelationshipTypeTO>() {
 

http://git-wip-us.apache.org/repos/asf/syncope/blob/f9f50c57/client/console/src/main/java/org/apache/syncope/client/console/panels/ResourceMappingPanel.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/panels/ResourceMappingPanel.java b/client/console/src/main/java/org/apache/syncope/client/console/panels/ResourceMappingPanel.java
index 5fb5564..0613296 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/panels/ResourceMappingPanel.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/panels/ResourceMappingPanel.java
@@ -221,9 +221,7 @@ public class ResourceMappingPanel extends Panel {
                     entity = mapItem.getIntMappingType().getAnyTypeKind();
                 }
 
-                final ActionLinksPanel.Builder<Serializable> actions = ActionLinksPanel.builder(
-                        getPage().getPageReference());
-
+                final ActionLinksPanel.Builder<Serializable> actions = ActionLinksPanel.builder();
                 actions.add(new ActionLink<Serializable>() {
 
                     private static final long serialVersionUID = -3722207913631435501L;

http://git-wip-us.apache.org/repos/asf/syncope/blob/f9f50c57/client/console/src/main/java/org/apache/syncope/client/console/panels/ResourceModal.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/panels/ResourceModal.java b/client/console/src/main/java/org/apache/syncope/client/console/panels/ResourceModal.java
index 8006430..b3405b7 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/panels/ResourceModal.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/panels/ResourceModal.java
@@ -24,6 +24,7 @@ import java.util.Collection;
 import org.apache.commons.collections4.IterableUtils;
 import org.apache.commons.collections4.Predicate;
 import org.apache.commons.lang3.SerializationUtils;
+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.rest.ConnectorRestClient;
@@ -255,8 +256,8 @@ public class ResourceModal<T extends Serializable> extends AbstractResourceModal
                 info(getString(Constants.OPERATION_SUCCEEDED));
                 modal.close(target);
             } catch (Exception e) {
-                LOG.error("Failure managing resource {}", resourceTO, e);
-                error(getString(Constants.ERROR) + ": " + e.getMessage());
+                LOG.error("Failure managing {}", resourceTO, e);
+                error(StringUtils.isBlank(e.getMessage()) ? e.getClass().getName() : e.getMessage());
             }
         }
         SyncopeConsoleSession.get().getNotificationPanel().refresh(target);

http://git-wip-us.apache.org/repos/asf/syncope/blob/f9f50c57/client/console/src/main/java/org/apache/syncope/client/console/panels/RoleSearchResultPanel.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/panels/RoleSearchResultPanel.java b/client/console/src/main/java/org/apache/syncope/client/console/panels/RoleSearchResultPanel.java
index f789ec5..3856375 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/panels/RoleSearchResultPanel.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/panels/RoleSearchResultPanel.java
@@ -23,6 +23,7 @@ import java.util.ArrayList;
 import java.util.Collection;
 import java.util.List;
 import org.apache.commons.lang3.SerializationUtils;
+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.commons.RoleDataProvider;
@@ -87,7 +88,7 @@ public class RoleSearchResultPanel
 
             @Override
             public ActionLinksPanel<RoleTO> getActions(final String componentId, final IModel<RoleTO> model) {
-                final ActionLinksPanel.Builder<RoleTO> panel = ActionLinksPanel.builder(page.getPageReference());
+                final ActionLinksPanel.Builder<RoleTO> panel = ActionLinksPanel.builder();
 
                 panel.add(new ActionLink<RoleTO>() {
 
@@ -123,7 +124,7 @@ public class RoleSearchResultPanel
                             target.add(container);
                         } catch (SyncopeClientException e) {
                             LOG.error("While deleting object {}", model.getObject().getKey(), e);
-                            error(getString(Constants.ERROR) + ": " + e.getMessage());
+                            error(StringUtils.isBlank(e.getMessage()) ? e.getClass().getName() : e.getMessage());
                         }
                         SyncopeConsoleSession.get().getNotificationPanel().refresh(target);
                     }
@@ -134,7 +135,7 @@ public class RoleSearchResultPanel
 
             @Override
             public ActionLinksPanel<RoleTO> getHeader(final String componentId) {
-                final ActionLinksPanel.Builder<RoleTO> panel = ActionLinksPanel.builder(page.getPageReference());
+                final ActionLinksPanel.Builder<RoleTO> panel = ActionLinksPanel.builder();
 
                 return panel.add(new ActionLink<RoleTO>() {
 

http://git-wip-us.apache.org/repos/asf/syncope/blob/f9f50c57/client/console/src/main/java/org/apache/syncope/client/console/panels/SchemaTypePanel.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/panels/SchemaTypePanel.java b/client/console/src/main/java/org/apache/syncope/client/console/panels/SchemaTypePanel.java
index 1370bbe..b06318d 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/panels/SchemaTypePanel.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/panels/SchemaTypePanel.java
@@ -115,8 +115,8 @@ public class SchemaTypePanel extends AbstractTypesPanel<AbstractSchemaTO, Schema
                                 info(getString(Constants.OPERATION_SUCCEEDED));
                                 modal.close(target);
                             } catch (Exception e) {
-                                LOG.error("While creating or updating schema", e);
-                                error(getString(Constants.ERROR) + ": " + e.getMessage());
+                                LOG.error("While creating or updating {}", modelObject, e);
+                                error(StringUtils.isBlank(e.getMessage()) ? e.getClass().getName() : e.getMessage());
                             }
                             SyncopeConsoleSession.get().getNotificationPanel().refresh(target);
                         }
@@ -187,7 +187,7 @@ public class SchemaTypePanel extends AbstractTypesPanel<AbstractSchemaTO, Schema
             public ActionLinksPanel<AbstractSchemaTO> getActions(
                     final String componentId, final IModel<AbstractSchemaTO> model) {
 
-                ActionLinksPanel<AbstractSchemaTO> panel = ActionLinksPanel.<AbstractSchemaTO>builder(pageRef).
+                ActionLinksPanel<AbstractSchemaTO> panel = ActionLinksPanel.<AbstractSchemaTO>builder().
                         add(new ActionLink<AbstractSchemaTO>() {
 
                             private static final long serialVersionUID = -3722207913631435501L;
@@ -222,8 +222,9 @@ public class SchemaTypePanel extends AbstractTypesPanel<AbstractSchemaTO, Schema
                                     info(getString(Constants.OPERATION_SUCCEEDED));
                                     target.add(container);
                                 } catch (Exception e) {
-                                    LOG.error(getString(Constants.ERROR) + ": " + e.getMessage());
-                                    error(getString(Constants.ERROR) + ": " + e.getMessage());
+                                    LOG.error("While deleting {}", model.getObject(), e);
+                                    error(StringUtils.isBlank(e.getMessage()) 
+                                            ? e.getClass().getName() : e.getMessage());
                                 }
                                 SyncopeConsoleSession.get().getNotificationPanel().refresh(target);
                             }
@@ -235,8 +236,7 @@ public class SchemaTypePanel extends AbstractTypesPanel<AbstractSchemaTO, Schema
 
             @Override
             public ActionLinksPanel<AbstractSchemaTO> getHeader(final String componentId) {
-                final ActionLinksPanel.Builder<AbstractSchemaTO> panel =
-                        ActionLinksPanel.builder(page.getPageReference());
+                final ActionLinksPanel.Builder<AbstractSchemaTO> panel = ActionLinksPanel.builder();
 
                 return panel.add(new ActionLink<AbstractSchemaTO>() {
 

http://git-wip-us.apache.org/repos/asf/syncope/blob/f9f50c57/client/console/src/main/java/org/apache/syncope/client/console/panels/SecurityQuestionsModalPanel.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/panels/SecurityQuestionsModalPanel.java b/client/console/src/main/java/org/apache/syncope/client/console/panels/SecurityQuestionsModalPanel.java
index 01cd411..0d27f0c 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/panels/SecurityQuestionsModalPanel.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/panels/SecurityQuestionsModalPanel.java
@@ -18,6 +18,7 @@
  */
 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.wicket.markup.html.bootstrap.dialog.BaseModal;
@@ -59,8 +60,8 @@ public class SecurityQuestionsModalPanel extends AbstractModalPanel<SecurityQues
             info(getString(Constants.OPERATION_SUCCEEDED));
             modal.close(target);
         } catch (Exception e) {
-            LOG.error("While creating or updating SecutiryQuestionTO", e);
-            error(getString(Constants.ERROR) + ": " + e.getMessage());
+            LOG.error("While creating or updating {}", securityQuestionTO, e);
+            error(StringUtils.isBlank(e.getMessage()) ? e.getClass().getName() : e.getMessage());
         }
         SyncopeConsoleSession.get().getNotificationPanel().refresh(target);
     }

http://git-wip-us.apache.org/repos/asf/syncope/blob/f9f50c57/client/console/src/main/java/org/apache/syncope/client/console/panels/SecurityQuestionsPanel.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/panels/SecurityQuestionsPanel.java b/client/console/src/main/java/org/apache/syncope/client/console/panels/SecurityQuestionsPanel.java
index 487ff94..bac8481 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/panels/SecurityQuestionsPanel.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/panels/SecurityQuestionsPanel.java
@@ -154,7 +154,7 @@ public class SecurityQuestionsPanel extends AbstractSearchResultPanel<
             public ActionLinksPanel<SecurityQuestionTO> getActions(
                     final String componentId, final IModel<SecurityQuestionTO> model) {
 
-                ActionLinksPanel<SecurityQuestionTO> panel = ActionLinksPanel.<SecurityQuestionTO>builder(pageRef).
+                ActionLinksPanel<SecurityQuestionTO> panel = ActionLinksPanel.<SecurityQuestionTO>builder().
                         add(new ActionLink<SecurityQuestionTO>() {
 
                             private static final long serialVersionUID = -3722207913631435501L;
@@ -178,7 +178,8 @@ public class SecurityQuestionsPanel extends AbstractSearchResultPanel<
                                     target.add(container);
                                 } catch (Exception e) {
                                     LOG.error("While deleting {}", model.getObject(), e);
-                                    error(getString(Constants.ERROR) + ": " + e.getMessage());
+                                    error(StringUtils.isBlank(e.getMessage())
+                                            ? e.getClass().getName() : e.getMessage());
                                 }
                                 SyncopeConsoleSession.get().getNotificationPanel().refresh(target);
                             }
@@ -190,8 +191,7 @@ public class SecurityQuestionsPanel extends AbstractSearchResultPanel<
 
             @Override
             public ActionLinksPanel<SecurityQuestionTO> getHeader(final String componentId) {
-                final ActionLinksPanel.Builder<SecurityQuestionTO> panel =
-                        ActionLinksPanel.builder(page.getPageReference());
+                final ActionLinksPanel.Builder<SecurityQuestionTO> panel = ActionLinksPanel.builder();
 
                 return panel.add(new ActionLink<SecurityQuestionTO>() {
 

http://git-wip-us.apache.org/repos/asf/syncope/blob/f9f50c57/client/console/src/main/java/org/apache/syncope/client/console/panels/UserSearchResultPanel.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/panels/UserSearchResultPanel.java b/client/console/src/main/java/org/apache/syncope/client/console/panels/UserSearchResultPanel.java
index 11e3ffa..7cb3bb5 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/panels/UserSearchResultPanel.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/panels/UserSearchResultPanel.java
@@ -25,6 +25,7 @@ import java.util.Arrays;
 import java.util.Date;
 import java.util.List;
 import org.apache.commons.lang3.SerializationUtils;
+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.rest.UserRestClient;
@@ -105,15 +106,14 @@ public class UserSearchResultPanel extends AnySearchResultPanel<UserTO> {
         }
 
         setWindowClosedReloadCallback(displayAttributeModal);
-        
+
         columns.add(new ActionColumn<UserTO, String>(new ResourceModel("actions", "")) {
 
             private static final long serialVersionUID = -3503023501954863131L;
 
             @Override
             public ActionLinksPanel<UserTO> getActions(final String componentId, final IModel<UserTO> model) {
-
-                final ActionLinksPanel.Builder<UserTO> panel = ActionLinksPanel.builder(page.getPageReference());
+                final ActionLinksPanel.Builder<UserTO> panel = ActionLinksPanel.builder();
 
                 panel.add(new ActionLink<UserTO>() {
 
@@ -122,11 +122,11 @@ public class UserSearchResultPanel extends AnySearchResultPanel<UserTO> {
                     @Override
                     public void onClick(final AjaxRequestTarget target, final UserTO ignore) {
 
-                        final IModel<AnyHandler<UserTO>> formModel
-                                = new CompoundPropertyModel<>(new AnyHandler<>(model.getObject()));
+                        final IModel<AnyHandler<UserTO>> formModel =
+                                new CompoundPropertyModel<>(new AnyHandler<>(model.getObject()));
                         altDefaultModal.setFormModel(formModel);
 
-                        target.add(altDefaultModal.setContent(new StatusModal<UserTO>(
+                        target.add(altDefaultModal.setContent(new StatusModal<>(
                                 altDefaultModal, pageRef, formModel.getObject().getInnerObject(), false)));
 
                         altDefaultModal.header(new Model<>(
@@ -140,11 +140,11 @@ public class UserSearchResultPanel extends AnySearchResultPanel<UserTO> {
 
                     @Override
                     public void onClick(final AjaxRequestTarget target, final UserTO ignore) {
-                        final IModel<AnyHandler<UserTO>> formModel
-                                = new CompoundPropertyModel<>(new AnyHandler<>(model.getObject()));
+                        final IModel<AnyHandler<UserTO>> formModel =
+                                new CompoundPropertyModel<>(new AnyHandler<>(model.getObject()));
                         altDefaultModal.setFormModel(formModel);
 
-                        target.add(altDefaultModal.setContent(new StatusModal<UserTO>(
+                        target.add(altDefaultModal.setContent(new StatusModal<>(
                                 altDefaultModal, pageRef, formModel.getObject().getInnerObject(), true)));
 
                         altDefaultModal.header(new Model<>(
@@ -186,7 +186,7 @@ public class UserSearchResultPanel extends AnySearchResultPanel<UserTO> {
                             target.add(container);
                         } catch (SyncopeClientException e) {
                             LOG.error("While deleting object {}", model.getObject().getKey(), e);
-                            error(getString(Constants.ERROR) + ": " + e.getMessage());
+                            error(StringUtils.isBlank(e.getMessage()) ? e.getClass().getName() : e.getMessage());
                         }
                         SyncopeConsoleSession.get().getNotificationPanel().refresh(target);
                     }
@@ -197,7 +197,7 @@ public class UserSearchResultPanel extends AnySearchResultPanel<UserTO> {
 
             @Override
             public ActionLinksPanel<Serializable> getHeader(final String componentId) {
-                final ActionLinksPanel.Builder<Serializable> panel = ActionLinksPanel.builder(page.getPageReference());
+                final ActionLinksPanel.Builder<Serializable> panel = ActionLinksPanel.builder();
 
                 return panel.add(new ActionLink<Serializable>() {
 

http://git-wip-us.apache.org/repos/asf/syncope/blob/f9f50c57/client/console/src/main/java/org/apache/syncope/client/console/panels/XMLWorkflowEditorModalPanel.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/panels/XMLWorkflowEditorModalPanel.java b/client/console/src/main/java/org/apache/syncope/client/console/panels/XMLWorkflowEditorModalPanel.java
index f10b05d..5c4138d 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/panels/XMLWorkflowEditorModalPanel.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/panels/XMLWorkflowEditorModalPanel.java
@@ -78,7 +78,7 @@ public class XMLWorkflowEditorModalPanel extends AbstractModalPanel<String> {
             modal.show(false);
             modal.close(target);
         } catch (SyncopeClientException e) {
-            error(getString(Constants.ERROR) + ": " + e.getMessage());
+            error(StringUtils.isBlank(e.getMessage()) ? e.getClass().getName() : e.getMessage());
         }
         SyncopeConsoleSession.get().getNotificationPanel().refresh(target);
     }

http://git-wip-us.apache.org/repos/asf/syncope/blob/f9f50c57/client/console/src/main/java/org/apache/syncope/client/console/panels/search/AnySelectionSearchResultPanel.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/panels/search/AnySelectionSearchResultPanel.java b/client/console/src/main/java/org/apache/syncope/client/console/panels/search/AnySelectionSearchResultPanel.java
index b194981..b6ddc5a 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/panels/search/AnySelectionSearchResultPanel.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/panels/search/AnySelectionSearchResultPanel.java
@@ -100,8 +100,7 @@ public abstract class AnySelectionSearchResultPanel<T extends AnyTO> extends Any
 
             @Override
             public ActionLinksPanel<T> getActions(final String componentId, final IModel<T> model) {
-
-                final ActionLinksPanel.Builder<T> panel = ActionLinksPanel.builder(page.getPageReference());
+                final ActionLinksPanel.Builder<T> panel = ActionLinksPanel.builder();
 
                 panel.add(new ActionLink<T>() {
 
@@ -110,7 +109,7 @@ public abstract class AnySelectionSearchResultPanel<T extends AnyTO> extends Any
                     @Override
                     public void onClick(final AjaxRequestTarget target, final T ignore) {
                         send(AnySelectionSearchResultPanel.this,
-                                Broadcast.BUBBLE, new ItemSelection<T>(target, model.getObject()));
+                                Broadcast.BUBBLE, new ItemSelection<>(target, model.getObject()));
                     }
                 }, ActionLink.ActionType.SELECT, String.format("%s_%s", type, AnyEntitlement.READ));
 
@@ -119,7 +118,7 @@ public abstract class AnySelectionSearchResultPanel<T extends AnyTO> extends Any
 
             @Override
             public ActionLinksPanel<T> getHeader(final String componentId) {
-                final ActionLinksPanel.Builder<T> panel = ActionLinksPanel.builder(page.getPageReference());
+                final ActionLinksPanel.Builder<T> panel = ActionLinksPanel.builder();
 
                 return panel.
                         add(new ActionLink<T>() {

http://git-wip-us.apache.org/repos/asf/syncope/blob/f9f50c57/client/console/src/main/java/org/apache/syncope/client/console/rest/AnyObjectRestClient.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/rest/AnyObjectRestClient.java b/client/console/src/main/java/org/apache/syncope/client/console/rest/AnyObjectRestClient.java
index 9007011..176ec79 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/rest/AnyObjectRestClient.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/rest/AnyObjectRestClient.java
@@ -115,7 +115,6 @@ public class AnyObjectRestClient extends AbstractAnyRestClient<AnyObjectTO> {
 
     @Override
     public BulkActionResult bulkAction(final BulkAction action) {
-        throw new UnsupportedOperationException("Not supported yet.");
+        return getService(AnyObjectService.class).bulk(action);
     }
-
 }

http://git-wip-us.apache.org/repos/asf/syncope/blob/f9f50c57/client/console/src/main/java/org/apache/syncope/client/console/rest/ExecutionRestClient.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/rest/ExecutionRestClient.java b/client/console/src/main/java/org/apache/syncope/client/console/rest/ExecutionRestClient.java
index e259fdd..7659a5d 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/rest/ExecutionRestClient.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/rest/ExecutionRestClient.java
@@ -19,10 +19,14 @@
 package org.apache.syncope.client.console.rest;
 
 import java.util.Date;
+import java.util.List;
+import org.apache.syncope.common.lib.to.ExecTO;
 
 public interface ExecutionRestClient {
 
-    void startExecution(long executionCollectorId, Date start);
+    void startExecution(long executionCollectorKey, Date start);
 
-    void deleteExecution(long executionId);
+    void deleteExecution(long executionKeyI);
+
+    List<ExecTO> listRecentExecutions(final int max);
 }

http://git-wip-us.apache.org/repos/asf/syncope/blob/f9f50c57/client/console/src/main/java/org/apache/syncope/client/console/rest/GroupRestClient.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/rest/GroupRestClient.java b/client/console/src/main/java/org/apache/syncope/client/console/rest/GroupRestClient.java
index ece8ad7..632f6cf 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/rest/GroupRestClient.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/rest/GroupRestClient.java
@@ -118,5 +118,4 @@ public class GroupRestClient extends AbstractAnyRestClient<GroupTO> {
     public BulkActionResult bulkAction(final BulkAction action) {
         return getService(GroupService.class).bulk(action);
     }
-
 }

http://git-wip-us.apache.org/repos/asf/syncope/blob/f9f50c57/client/console/src/main/java/org/apache/syncope/client/console/rest/ReportRestClient.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/rest/ReportRestClient.java b/client/console/src/main/java/org/apache/syncope/client/console/rest/ReportRestClient.java
index 73e5303..4a9b28e 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/rest/ReportRestClient.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/rest/ReportRestClient.java
@@ -21,6 +21,8 @@ package org.apache.syncope.client.console.rest;
 import java.util.Date;
 import java.util.List;
 import javax.ws.rs.core.Response;
+import org.apache.syncope.client.console.SyncopeConsoleSession;
+import org.apache.syncope.common.lib.to.ExecTO;
 import org.apache.syncope.common.lib.to.ReportTO;
 import org.apache.syncope.common.lib.types.ReportExecExportFormat;
 import org.apache.syncope.common.rest.api.beans.ExecuteQuery;
@@ -51,7 +53,7 @@ public class ReportRestClient extends BaseRestClient implements ExecutionRestCli
      *
      * @param reportKey report to delete
      */
-    public void delete(final Long reportKey) {
+    public void delete(final long reportKey) {
         getService(ReportService.class).delete(reportKey);
     }
 
@@ -60,17 +62,17 @@ public class ReportRestClient extends BaseRestClient implements ExecutionRestCli
         getService(ReportService.class).execute(new ExecuteQuery.Builder().key(reportKey).startAt(start).build());
     }
 
-    /**
-     * Delete specified report execution.
-     *
-     * @param reportExecId report execution id
-     */
     @Override
-    public void deleteExecution(final long reportExecId) {
-        getService(ReportService.class).deleteExecution(reportExecId);
+    public void deleteExecution(final long reportExecKey) {
+        getService(ReportService.class).deleteExecution(reportExecKey);
+    }
+
+    @Override
+    public List<ExecTO> listRecentExecutions(final int max) {
+        return SyncopeConsoleSession.get().getService(ReportService.class).listRecentExecutions(max);
     }
 
-    public Response exportExecutionResult(final Long executionId, final ReportExecExportFormat fmt) {
+    public Response exportExecutionResult(final long executionId, final ReportExecExportFormat fmt) {
         return getService(ReportService.class).exportExecutionResult(executionId, fmt);
     }
 }

http://git-wip-us.apache.org/repos/asf/syncope/blob/f9f50c57/client/console/src/main/java/org/apache/syncope/client/console/rest/TaskRestClient.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/rest/TaskRestClient.java b/client/console/src/main/java/org/apache/syncope/client/console/rest/TaskRestClient.java
index 92ff15a..2338911 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/rest/TaskRestClient.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/rest/TaskRestClient.java
@@ -165,6 +165,11 @@ public class TaskRestClient extends BaseRestClient implements ExecutionRestClien
         getService(TaskService.class).deleteExecution(taskExecId);
     }
 
+    @Override
+    public List<ExecTO> listRecentExecutions(final int max) {
+        return SyncopeConsoleSession.get().getService(TaskService.class).listRecentExecutions(max);
+    }
+
     public void create(final SchedTaskTO taskTO) {
         getService(TaskService.class).create(taskTO);
     }