syncope-commits mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From andreapatrice...@apache.org
Subject [syncope] branch master updated: [SYNCOPE-1421] implemented user request forms management
Date Wed, 22 May 2019 14:08:35 GMT
This is an automated email from the ASF dual-hosted git repository.

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


The following commit(s) were added to refs/heads/master by this push:
     new f76bff3  [SYNCOPE-1421] implemented user request forms management
f76bff3 is described below

commit f76bff30c0b4c7018c2d84f9ac258dfd1c823c6e
Author: Andrea Patricelli <andreapatricelli@apache.org>
AuthorDate: Tue May 14 16:12:38 2019 +0200

    [SYNCOPE-1421] implemented user request forms management
---
 .../commons/status/AbstractStatusBeanProvider.java |   2 +-
 .../ConnInstanceHistoryConfDirectoryPanel.java     |   2 +-
 .../console/panels/RemediationDirectoryPanel.java  |   2 +-
 .../panels/ResourceHistoryConfDirectoryPanel.java  |   2 +-
 .../console/status/AnyStatusDirectoryPanel.java    |   2 +-
 .../client/console/status/AnyStatusModal.java      |   2 +-
 .../status/ResourceStatusDirectoryPanel.java       |   2 +-
 .../client/console/status/ResourceStatusModal.java |   2 +-
 .../syncope/client/console/status/StatusModal.java |   2 +-
 .../client/ui}/commons/DirectoryDataProvider.java  |   2 +-
 .../client/ui}/commons/MapChoiceRenderer.java      |   2 +-
 .../markup/html/form/AjaxDateFieldPanel.java       |  22 +--
 .../markup/html/form/AjaxDateTimeFieldPanel.java   |  23 ++-
 .../commons/markup/html/form/DateFieldPanel.java   |   6 +-
 .../markup/html/form/AjaxDateFieldPanel.html       |   0
 .../markup/html/form/AjaxDateTimeFieldPanel.html   |   0
 .../client/console/commons/AnyDataProvider.java    |   1 +
 .../client/console/commons/TaskDataProvider.java   |   1 +
 .../notifications/MailTemplateDirectoryPanel.java  |   2 +-
 .../notifications/NotificationDirectoryPanel.java  |   2 +-
 .../console/panels/AccessTokenDirectoryPanel.java  |   2 +-
 .../client/console/panels/AnyTypeClassesPanel.java |   2 +-
 .../client/console/panels/AnyTypesPanel.java       |   2 +-
 .../console/panels/ApplicationDirectoryPanel.java  |   2 +-
 .../syncope/client/console/panels/BeanPanel.java   |   6 +-
 .../client/console/panels/DirectoryPanel.java      |   2 +-
 .../console/panels/DomainDirectoryPanel.java       |   2 +-
 .../console/panels/DynRealmDirectoryPanel.java     |   2 +-
 .../panels/ImplementationDirectoryPanel.java       |   2 +-
 .../panels/NetworkServiceDirectoryPanel.java       |   2 +-
 .../console/panels/ParametersDirectoryPanel.java   |   2 +-
 .../console/panels/ParametersWizardAttrStep.java   |   6 +-
 .../console/panels/PrivilegeDirectoryPanel.java    |   2 +-
 .../console/panels/RelationshipTypesPanel.java     |   2 +-
 .../client/console/panels/RoleDirectoryPanel.java  |   2 +-
 .../client/console/panels/SchemaTypePanel.java     |   2 +-
 .../console/panels/SecurityQuestionsPanel.java     |   2 +-
 .../client/console/panels/StartAtTogglePanel.java  |   6 +-
 .../panels/TypeExtensionDirectoryPanel.java        |   2 +-
 .../client/console/panels/TypesDirectoryPanel.java |   2 +-
 .../console/policies/PolicyDirectoryPanel.java     |   2 +-
 .../console/policies/PolicyRuleDirectoryPanel.java |   2 +-
 .../console/reports/ReportDirectoryPanel.java      |   2 +-
 .../reports/ReportTemplateDirectoryPanel.java      |   2 +-
 .../console/reports/ReportletDirectoryPanel.java   |   2 +-
 .../console/tasks/ExecutionsDirectoryPanel.java    |   2 +-
 .../client/console/tasks/TaskDirectoryPanel.java   |   2 +-
 .../markup/html/form/AjaxDateFieldPanel.java       |  61 --------
 .../markup/html/form/AjaxDateTimeFieldPanel.java   |  65 --------
 .../syncope/client/console/widgets/JobWidget.java  |   2 +-
 .../console/widgets/ReconDetailsModalPanel.java    |   2 +-
 .../console/widgets/ReconciliationWidget.java      |   2 +-
 .../client/console/wizards/any/PlainAttrs.java     |   9 +-
 .../markup/html/form/AjaxDateFieldPanel.html       |  29 ----
 .../client/enduser/wizards/any/PlainAttrs.java     |   9 +-
 .../console/panels/CamelRoutesDirectoryPanel.java  |   2 +-
 .../{client-enduser => client-common-ui}/pom.xml   |  33 ++--
 .../common/ui}/panels/UserRequestFormPanel.java    |  19 ++-
 .../common/ui}/panels/UserRequestFormPanel.html    |   0
 .../ui}/panels/UserRequestFormPanel.properties     |   0
 .../ui}/panels/UserRequestFormPanel_it.properties  |   0
 .../ui}/panels/UserRequestFormPanel_ja.properties  |   0
 .../panels/UserRequestFormPanel_pt_BR.properties   |   0
 .../ui}/panels/UserRequestFormPanel_ru.properties  |   0
 ext/flowable/client-console/pom.xml                |   5 +
 .../console/panels/BpmnProcessDirectoryPanel.java  |   2 +-
 .../console/panels/UserRequestDirectoryPanel.java  |   2 +-
 .../panels/UserRequestFormDirectoryPanel.java      |   2 +-
 .../console/panels/UserRequestFormModal.java       |   3 +-
 ext/flowable/client-enduser/pom.xml                |   5 +
 .../syncope/client/enduser/pages/Flowable.java     | 169 +++++++++++++++++----
 .../client/enduser/rest/UserRequestRestClient.java |  21 +--
 .../enduser/pages/Flowable$UserRequestDetails.html |  32 ++--
 .../syncope/client/enduser/pages/Flowable.html     |  27 +---
 .../client/enduser/pages/Flowable.properties       |   6 +-
 .../client/enduser/pages/Flowable_it.properties    |   6 +-
 .../client/enduser/pages/Flowable_ja.properties    |   6 +-
 .../client/enduser/pages/Flowable_pt_BR.properties |   6 +-
 .../client/enduser/pages/Flowable_ru.properties    |   6 +-
 .../apache/syncope/common/lib/to/UserRequest.java  |  21 +++
 .../core/flowable/api/UserRequestHandler.java      |   8 +
 .../flowable/impl/FlowableUserRequestHandler.java  |  36 +++--
 .../syncope/core/logic/UserRequestLogic.java       |   5 +
 ext/flowable/pom.xml                               |   1 +
 .../rest/api/service/UserRequestService.java       |  11 ++
 .../rest/cxf/service/UserRequestServiceImpl.java   |   7 +-
 .../panels/OIDCProvidersDirectoryPanel.java        |   2 +-
 .../console/panels/SAML2IdPsDirectoryPanel.java    |   2 +-
 .../console/panels/SCIMConfGeneralPanel.java       |   7 +-
 89 files changed, 402 insertions(+), 374 deletions(-)

diff --git a/client/idm/console/src/main/java/org/apache/syncope/client/console/commons/status/AbstractStatusBeanProvider.java b/client/idm/console/src/main/java/org/apache/syncope/client/console/commons/status/AbstractStatusBeanProvider.java
index dae1ba6..5bb28d7 100644
--- a/client/idm/console/src/main/java/org/apache/syncope/client/console/commons/status/AbstractStatusBeanProvider.java
+++ b/client/idm/console/src/main/java/org/apache/syncope/client/console/commons/status/AbstractStatusBeanProvider.java
@@ -21,7 +21,7 @@ package org.apache.syncope.client.console.commons.status;
 import org.apache.syncope.client.ui.commons.status.StatusBean;
 import java.util.Iterator;
 import java.util.List;
-import org.apache.syncope.client.console.commons.DirectoryDataProvider;
+import org.apache.syncope.client.ui.commons.DirectoryDataProvider;
 import org.apache.syncope.client.console.commons.SortableDataProviderComparator;
 import org.apache.wicket.extensions.markup.html.repeater.data.sort.SortOrder;
 import org.apache.wicket.model.IModel;
diff --git a/client/idm/console/src/main/java/org/apache/syncope/client/console/panels/ConnInstanceHistoryConfDirectoryPanel.java b/client/idm/console/src/main/java/org/apache/syncope/client/console/panels/ConnInstanceHistoryConfDirectoryPanel.java
index 04f7844..7975fd0 100644
--- a/client/idm/console/src/main/java/org/apache/syncope/client/console/panels/ConnInstanceHistoryConfDirectoryPanel.java
+++ b/client/idm/console/src/main/java/org/apache/syncope/client/console/panels/ConnInstanceHistoryConfDirectoryPanel.java
@@ -26,7 +26,7 @@ import java.util.List;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.syncope.client.console.SyncopeConsoleSession;
 import org.apache.syncope.client.ui.commons.Constants;
-import org.apache.syncope.client.console.commons.DirectoryDataProvider;
+import org.apache.syncope.client.ui.commons.DirectoryDataProvider;
 import org.apache.syncope.client.console.commons.IdMConstants;
 import org.apache.syncope.client.console.commons.SortableDataProviderComparator;
 import org.apache.syncope.client.console.pages.BasePage;
diff --git a/client/idm/console/src/main/java/org/apache/syncope/client/console/panels/RemediationDirectoryPanel.java b/client/idm/console/src/main/java/org/apache/syncope/client/console/panels/RemediationDirectoryPanel.java
index 1f4b45f..862314f 100644
--- a/client/idm/console/src/main/java/org/apache/syncope/client/console/panels/RemediationDirectoryPanel.java
+++ b/client/idm/console/src/main/java/org/apache/syncope/client/console/panels/RemediationDirectoryPanel.java
@@ -29,7 +29,7 @@ import java.util.List;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.syncope.client.console.SyncopeConsoleSession;
 import org.apache.syncope.client.ui.commons.Constants;
-import org.apache.syncope.client.console.commons.DirectoryDataProvider;
+import org.apache.syncope.client.ui.commons.DirectoryDataProvider;
 import org.apache.syncope.client.console.commons.IdMConstants;
 import org.apache.syncope.client.console.layout.AnyObjectFormLayoutInfo;
 import org.apache.syncope.client.console.layout.FormLayoutInfoUtils;
diff --git a/client/idm/console/src/main/java/org/apache/syncope/client/console/panels/ResourceHistoryConfDirectoryPanel.java b/client/idm/console/src/main/java/org/apache/syncope/client/console/panels/ResourceHistoryConfDirectoryPanel.java
index b9bdad4..0a9d1d3 100644
--- a/client/idm/console/src/main/java/org/apache/syncope/client/console/panels/ResourceHistoryConfDirectoryPanel.java
+++ b/client/idm/console/src/main/java/org/apache/syncope/client/console/panels/ResourceHistoryConfDirectoryPanel.java
@@ -26,7 +26,7 @@ import java.util.List;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.syncope.client.console.SyncopeConsoleSession;
 import org.apache.syncope.client.ui.commons.Constants;
-import org.apache.syncope.client.console.commons.DirectoryDataProvider;
+import org.apache.syncope.client.ui.commons.DirectoryDataProvider;
 import org.apache.syncope.client.console.commons.IdMConstants;
 import org.apache.syncope.client.console.commons.SortableDataProviderComparator;
 import org.apache.syncope.client.console.pages.BasePage;
diff --git a/client/idm/console/src/main/java/org/apache/syncope/client/console/status/AnyStatusDirectoryPanel.java b/client/idm/console/src/main/java/org/apache/syncope/client/console/status/AnyStatusDirectoryPanel.java
index 5012f4c..2c1ea4f 100644
--- a/client/idm/console/src/main/java/org/apache/syncope/client/console/status/AnyStatusDirectoryPanel.java
+++ b/client/idm/console/src/main/java/org/apache/syncope/client/console/status/AnyStatusDirectoryPanel.java
@@ -26,7 +26,7 @@ import java.util.List;
 import java.util.stream.Collectors;
 import org.apache.commons.lang3.tuple.Pair;
 import org.apache.syncope.client.ui.commons.Constants;
-import org.apache.syncope.client.console.commons.DirectoryDataProvider;
+import org.apache.syncope.client.ui.commons.DirectoryDataProvider;
 import org.apache.syncope.client.console.commons.IdMConstants;
 import org.apache.syncope.client.console.commons.status.AbstractStatusBeanProvider;
 import org.apache.syncope.client.ui.commons.status.Status;
diff --git a/client/idm/console/src/main/java/org/apache/syncope/client/console/status/AnyStatusModal.java b/client/idm/console/src/main/java/org/apache/syncope/client/console/status/AnyStatusModal.java
index 265bedd..d785e9d 100644
--- a/client/idm/console/src/main/java/org/apache/syncope/client/console/status/AnyStatusModal.java
+++ b/client/idm/console/src/main/java/org/apache/syncope/client/console/status/AnyStatusModal.java
@@ -18,7 +18,7 @@
  */
 package org.apache.syncope.client.console.status;
 
-import org.apache.syncope.client.console.commons.DirectoryDataProvider;
+import org.apache.syncope.client.ui.commons.DirectoryDataProvider;
 import org.apache.syncope.client.ui.commons.status.StatusBean;
 import org.apache.syncope.client.console.panels.DirectoryPanel;
 import org.apache.syncope.client.console.panels.MultilevelPanel;
diff --git a/client/idm/console/src/main/java/org/apache/syncope/client/console/status/ResourceStatusDirectoryPanel.java b/client/idm/console/src/main/java/org/apache/syncope/client/console/status/ResourceStatusDirectoryPanel.java
index 4d8ea6f..e6961f8 100644
--- a/client/idm/console/src/main/java/org/apache/syncope/client/console/status/ResourceStatusDirectoryPanel.java
+++ b/client/idm/console/src/main/java/org/apache/syncope/client/console/status/ResourceStatusDirectoryPanel.java
@@ -23,7 +23,7 @@ import java.util.Collection;
 import java.util.List;
 import java.util.stream.Collectors;
 import org.apache.commons.lang3.StringUtils;
-import org.apache.syncope.client.console.commons.DirectoryDataProvider;
+import org.apache.syncope.client.ui.commons.DirectoryDataProvider;
 import org.apache.syncope.client.console.commons.IdMConstants;
 import org.apache.syncope.client.console.commons.status.AbstractStatusBeanProvider;
 import org.apache.syncope.client.ui.commons.status.StatusBean;
diff --git a/client/idm/console/src/main/java/org/apache/syncope/client/console/status/ResourceStatusModal.java b/client/idm/console/src/main/java/org/apache/syncope/client/console/status/ResourceStatusModal.java
index 18a9f2c..d30c385 100644
--- a/client/idm/console/src/main/java/org/apache/syncope/client/console/status/ResourceStatusModal.java
+++ b/client/idm/console/src/main/java/org/apache/syncope/client/console/status/ResourceStatusModal.java
@@ -21,7 +21,7 @@ package org.apache.syncope.client.console.status;
 import java.util.List;
 import java.util.stream.Collectors;
 import org.apache.syncope.client.ui.commons.Constants;
-import org.apache.syncope.client.console.commons.DirectoryDataProvider;
+import org.apache.syncope.client.ui.commons.DirectoryDataProvider;
 import org.apache.syncope.client.ui.commons.status.StatusBean;
 import org.apache.syncope.client.console.panels.DirectoryPanel;
 import org.apache.syncope.client.console.panels.MultilevelPanel;
diff --git a/client/idm/console/src/main/java/org/apache/syncope/client/console/status/StatusModal.java b/client/idm/console/src/main/java/org/apache/syncope/client/console/status/StatusModal.java
index 93b560b..e793bbd 100644
--- a/client/idm/console/src/main/java/org/apache/syncope/client/console/status/StatusModal.java
+++ b/client/idm/console/src/main/java/org/apache/syncope/client/console/status/StatusModal.java
@@ -18,7 +18,7 @@
  */
 package org.apache.syncope.client.console.status;
 
-import org.apache.syncope.client.console.commons.DirectoryDataProvider;
+import org.apache.syncope.client.ui.commons.DirectoryDataProvider;
 import org.apache.syncope.client.ui.commons.status.StatusBean;
 import org.apache.syncope.client.console.panels.DirectoryPanel;
 import org.apache.syncope.client.console.panels.MultilevelPanel;
diff --git a/client/idrepo/console/src/main/java/org/apache/syncope/client/console/commons/DirectoryDataProvider.java b/client/idrepo/common-ui/src/main/java/org/apache/syncope/client/ui/commons/DirectoryDataProvider.java
similarity index 96%
rename from client/idrepo/console/src/main/java/org/apache/syncope/client/console/commons/DirectoryDataProvider.java
rename to client/idrepo/common-ui/src/main/java/org/apache/syncope/client/ui/commons/DirectoryDataProvider.java
index d7bb122..fad6184 100644
--- a/client/idrepo/console/src/main/java/org/apache/syncope/client/console/commons/DirectoryDataProvider.java
+++ b/client/idrepo/common-ui/src/main/java/org/apache/syncope/client/ui/commons/DirectoryDataProvider.java
@@ -16,7 +16,7 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.syncope.client.console.commons;
+package org.apache.syncope.client.ui.commons;
 
 import java.io.Serializable;
 import org.apache.wicket.extensions.markup.html.repeater.data.sort.SortOrder;
diff --git a/client/idrepo/console/src/main/java/org/apache/syncope/client/console/commons/MapChoiceRenderer.java b/client/idrepo/common-ui/src/main/java/org/apache/syncope/client/ui/commons/MapChoiceRenderer.java
similarity index 96%
rename from client/idrepo/console/src/main/java/org/apache/syncope/client/console/commons/MapChoiceRenderer.java
rename to client/idrepo/common-ui/src/main/java/org/apache/syncope/client/ui/commons/MapChoiceRenderer.java
index 92d060d..9bcd084 100644
--- a/client/idrepo/console/src/main/java/org/apache/syncope/client/console/commons/MapChoiceRenderer.java
+++ b/client/idrepo/common-ui/src/main/java/org/apache/syncope/client/ui/commons/MapChoiceRenderer.java
@@ -16,7 +16,7 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.syncope.client.console.commons;
+package org.apache.syncope.client.ui.commons;
 
 import java.util.List;
 import java.util.Map;
diff --git a/client/idrepo/enduser/src/main/java/org/apache/syncope/client/enduser/markup/html/form/AjaxDateFieldPanel.java b/client/idrepo/common-ui/src/main/java/org/apache/syncope/client/ui/commons/markup/html/form/AjaxDateFieldPanel.java
similarity index 67%
rename from client/idrepo/enduser/src/main/java/org/apache/syncope/client/enduser/markup/html/form/AjaxDateFieldPanel.java
rename to client/idrepo/common-ui/src/main/java/org/apache/syncope/client/ui/commons/markup/html/form/AjaxDateFieldPanel.java
index 4ba9685..779e6a8 100644
--- a/client/idrepo/enduser/src/main/java/org/apache/syncope/client/enduser/markup/html/form/AjaxDateFieldPanel.java
+++ b/client/idrepo/common-ui/src/main/java/org/apache/syncope/client/ui/commons/markup/html/form/AjaxDateFieldPanel.java
@@ -16,14 +16,11 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.syncope.client.enduser.markup.html.form;
+package org.apache.syncope.client.ui.commons.markup.html.form;
 
-import org.apache.syncope.client.ui.commons.markup.html.form.FieldPanel;
 import com.googlecode.wicket.kendo.ui.form.datetime.AjaxDatePicker;
 import java.util.Date;
 import org.apache.commons.lang3.time.FastDateFormat;
-import org.apache.syncope.client.enduser.SyncopeEnduserSession;
-import org.apache.syncope.client.ui.commons.markup.html.form.DateFieldPanel;
 import org.apache.wicket.model.IModel;
 import org.apache.wicket.model.Model;
 
@@ -31,16 +28,20 @@ public class AjaxDateFieldPanel extends DateFieldPanel {
 
     private static final long serialVersionUID = 1919852712185883648L;
 
-    public AjaxDateFieldPanel(final String id, final String name, final IModel<Date> model, final String datePattern) {
+    public AjaxDateFieldPanel(
+            final String id, 
+            final String name, 
+            final IModel<Date> model,
+            final FastDateFormat datePattern) {
         super(id, name, model, datePattern);
 
-        field = new AjaxDatePicker("field", model, AjaxDateFieldPanel.this.getLocale(), datePattern);
+        field = new AjaxDatePicker("field", model, getLocale(), datePattern.getPattern());
         add(field.setLabel(new Model<>(name)).setOutputMarkupId(true));
     }
 
     @Override
     public FieldPanel<Date> clone() {
-        FieldPanel<Date> panel = new AjaxDateFieldPanel(getId(), name, new Model<>(), fmt.getPattern());
+        FieldPanel<Date> panel = new AjaxDateFieldPanel(getId(), name, new Model<>(), fmt);
         panel.setRequired(isRequired());
         panel.setReadOnly(isReadOnly());
         panel.setTitle(title);
@@ -51,11 +52,4 @@ public class AjaxDateFieldPanel extends DateFieldPanel {
 
         return panel;
     }
-
-    @Override
-    protected FastDateFormat getDateFormat(final String datePattern) {
-        return datePattern == null
-                ? SyncopeEnduserSession.get().getDateFormat()
-                : FastDateFormat.getInstance(datePattern);
-    }
 }
diff --git a/client/idrepo/enduser/src/main/java/org/apache/syncope/client/enduser/markup/html/form/AjaxDateTimeFieldPanel.java b/client/idrepo/common-ui/src/main/java/org/apache/syncope/client/ui/commons/markup/html/form/AjaxDateTimeFieldPanel.java
similarity index 71%
rename from client/idrepo/enduser/src/main/java/org/apache/syncope/client/enduser/markup/html/form/AjaxDateTimeFieldPanel.java
rename to client/idrepo/common-ui/src/main/java/org/apache/syncope/client/ui/commons/markup/html/form/AjaxDateTimeFieldPanel.java
index 7073ae2..3fa8af4 100644
--- a/client/idrepo/enduser/src/main/java/org/apache/syncope/client/enduser/markup/html/form/AjaxDateTimeFieldPanel.java
+++ b/client/idrepo/common-ui/src/main/java/org/apache/syncope/client/ui/commons/markup/html/form/AjaxDateTimeFieldPanel.java
@@ -16,14 +16,11 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.syncope.client.enduser.markup.html.form;
+package org.apache.syncope.client.ui.commons.markup.html.form;
 
-import org.apache.syncope.client.ui.commons.markup.html.form.DateFieldPanel;
-import org.apache.syncope.client.ui.commons.markup.html.form.FieldPanel;
 import com.googlecode.wicket.kendo.ui.form.datetime.AjaxDateTimePicker;
 import java.util.Date;
 import org.apache.commons.lang3.time.FastDateFormat;
-import org.apache.syncope.client.enduser.SyncopeEnduserSession;
 import org.apache.wicket.model.IModel;
 import org.apache.wicket.model.Model;
 
@@ -32,7 +29,10 @@ public class AjaxDateTimeFieldPanel extends DateFieldPanel {
     private static final long serialVersionUID = -428975732068281726L;
 
     public AjaxDateTimeFieldPanel(
-            final String id, final String name, final IModel<Date> model, final String dateTimePattern) {
+            final String id,
+            final String name,
+            final IModel<Date> model,
+            final FastDateFormat dateTimePattern) {
 
         super(id, name, model, dateTimePattern);
 
@@ -44,7 +44,11 @@ public class AjaxDateTimeFieldPanel extends DateFieldPanel {
 
     @Override
     public FieldPanel<Date> clone() {
-        FieldPanel<Date> panel = new AjaxDateTimeFieldPanel(getId(), name, new Model<>(null), fmt.getPattern());
+        FieldPanel<Date> panel = new AjaxDateTimeFieldPanel(
+                getId(),
+                name,
+                new Model<>(null),
+                fmt);
         panel.setRequired(isRequired());
         panel.setReadOnly(isReadOnly());
         panel.setTitle(title);
@@ -55,11 +59,4 @@ public class AjaxDateTimeFieldPanel extends DateFieldPanel {
 
         return panel;
     }
-
-    @Override
-    protected FastDateFormat getDateFormat(final String datePattern) {
-        return datePattern == null
-                ? SyncopeEnduserSession.get().getDateFormat()
-                : FastDateFormat.getInstance(datePattern);
-    }
 }
diff --git a/client/idrepo/common-ui/src/main/java/org/apache/syncope/client/ui/commons/markup/html/form/DateFieldPanel.java b/client/idrepo/common-ui/src/main/java/org/apache/syncope/client/ui/commons/markup/html/form/DateFieldPanel.java
index 374e9ff..be22f64 100644
--- a/client/idrepo/common-ui/src/main/java/org/apache/syncope/client/ui/commons/markup/html/form/DateFieldPanel.java
+++ b/client/idrepo/common-ui/src/main/java/org/apache/syncope/client/ui/commons/markup/html/form/DateFieldPanel.java
@@ -37,9 +37,9 @@ public abstract class DateFieldPanel extends FieldPanel<Date> {
 
     protected final FastDateFormat fmt;
 
-    protected DateFieldPanel(final String id, final String name, final IModel<Date> model, final String datePattern) {
+    protected DateFieldPanel(final String id, final String name, final IModel<Date> model, final FastDateFormat fmt) {
         super(id, name, model);
-        fmt = getDateFormat(datePattern);
+        this.fmt = fmt;
     }
 
     @Override
@@ -126,6 +126,4 @@ public abstract class DateFieldPanel extends FieldPanel<Date> {
         response.render(JavaScriptHeaderItem.forReference(
                 new KendoCultureResourceReference(getLocale())));
     }
-
-    protected abstract FastDateFormat getDateFormat(String datePattern);
 }
diff --git a/client/idrepo/enduser/src/main/resources/org/apache/syncope/client/enduser/markup/html/form/AjaxDateFieldPanel.html b/client/idrepo/common-ui/src/main/resources/org/apache/syncope/client/ui/commons/markup/html/form/AjaxDateFieldPanel.html
similarity index 100%
rename from client/idrepo/enduser/src/main/resources/org/apache/syncope/client/enduser/markup/html/form/AjaxDateFieldPanel.html
rename to client/idrepo/common-ui/src/main/resources/org/apache/syncope/client/ui/commons/markup/html/form/AjaxDateFieldPanel.html
diff --git a/client/idrepo/enduser/src/main/resources/org/apache/syncope/client/enduser/markup/html/form/AjaxDateTimeFieldPanel.html b/client/idrepo/common-ui/src/main/resources/org/apache/syncope/client/ui/commons/markup/html/form/AjaxDateTimeFieldPanel.html
similarity index 100%
rename from client/idrepo/enduser/src/main/resources/org/apache/syncope/client/enduser/markup/html/form/AjaxDateTimeFieldPanel.html
rename to client/idrepo/common-ui/src/main/resources/org/apache/syncope/client/ui/commons/markup/html/form/AjaxDateTimeFieldPanel.html
diff --git a/client/idrepo/console/src/main/java/org/apache/syncope/client/console/commons/AnyDataProvider.java b/client/idrepo/console/src/main/java/org/apache/syncope/client/console/commons/AnyDataProvider.java
index a13927b..193bbd7 100644
--- a/client/idrepo/console/src/main/java/org/apache/syncope/client/console/commons/AnyDataProvider.java
+++ b/client/idrepo/console/src/main/java/org/apache/syncope/client/console/commons/AnyDataProvider.java
@@ -18,6 +18,7 @@
  */
 package org.apache.syncope.client.console.commons;
 
+import org.apache.syncope.client.ui.commons.DirectoryDataProvider;
 import java.util.Collections;
 import java.util.Iterator;
 import java.util.List;
diff --git a/client/idrepo/console/src/main/java/org/apache/syncope/client/console/commons/TaskDataProvider.java b/client/idrepo/console/src/main/java/org/apache/syncope/client/console/commons/TaskDataProvider.java
index b68ab42..9bf65de 100644
--- a/client/idrepo/console/src/main/java/org/apache/syncope/client/console/commons/TaskDataProvider.java
+++ b/client/idrepo/console/src/main/java/org/apache/syncope/client/console/commons/TaskDataProvider.java
@@ -18,6 +18,7 @@
  */
 package org.apache.syncope.client.console.commons;
 
+import org.apache.syncope.client.ui.commons.DirectoryDataProvider;
 import org.apache.syncope.common.lib.to.TaskTO;
 import org.apache.syncope.common.lib.types.TaskType;
 import org.apache.wicket.extensions.markup.html.repeater.data.sort.SortOrder;
diff --git a/client/idrepo/console/src/main/java/org/apache/syncope/client/console/notifications/MailTemplateDirectoryPanel.java b/client/idrepo/console/src/main/java/org/apache/syncope/client/console/notifications/MailTemplateDirectoryPanel.java
index f9b47cf..7917c93 100644
--- a/client/idrepo/console/src/main/java/org/apache/syncope/client/console/notifications/MailTemplateDirectoryPanel.java
+++ b/client/idrepo/console/src/main/java/org/apache/syncope/client/console/notifications/MailTemplateDirectoryPanel.java
@@ -27,7 +27,7 @@ import java.util.List;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.syncope.client.console.SyncopeConsoleSession;
 import org.apache.syncope.client.console.commons.TemplateContent;
-import org.apache.syncope.client.console.commons.DirectoryDataProvider;
+import org.apache.syncope.client.ui.commons.DirectoryDataProvider;
 import org.apache.syncope.client.console.commons.IdRepoConstants;
 import org.apache.syncope.client.console.commons.SortableDataProviderComparator;
 import org.apache.syncope.client.console.notifications.MailTemplateDirectoryPanel.MailTemplateProvider;
diff --git a/client/idrepo/console/src/main/java/org/apache/syncope/client/console/notifications/NotificationDirectoryPanel.java b/client/idrepo/console/src/main/java/org/apache/syncope/client/console/notifications/NotificationDirectoryPanel.java
index d0219ac..e527dae 100644
--- a/client/idrepo/console/src/main/java/org/apache/syncope/client/console/notifications/NotificationDirectoryPanel.java
+++ b/client/idrepo/console/src/main/java/org/apache/syncope/client/console/notifications/NotificationDirectoryPanel.java
@@ -27,7 +27,7 @@ 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.DirectoryDataProvider;
+import org.apache.syncope.client.ui.commons.DirectoryDataProvider;
 import org.apache.syncope.client.console.commons.IdRepoConstants;
 import org.apache.syncope.client.console.commons.SortableDataProviderComparator;
 import org.apache.syncope.client.console.notifications.NotificationDirectoryPanel.NotificationProvider;
diff --git a/client/idrepo/console/src/main/java/org/apache/syncope/client/console/panels/AccessTokenDirectoryPanel.java b/client/idrepo/console/src/main/java/org/apache/syncope/client/console/panels/AccessTokenDirectoryPanel.java
index eb492b1..5a77815 100644
--- a/client/idrepo/console/src/main/java/org/apache/syncope/client/console/panels/AccessTokenDirectoryPanel.java
+++ b/client/idrepo/console/src/main/java/org/apache/syncope/client/console/panels/AccessTokenDirectoryPanel.java
@@ -29,7 +29,7 @@ import org.apache.commons.lang3.StringUtils;
 import org.apache.cxf.rs.security.jose.jws.JwsJwtCompactConsumer;
 import org.apache.syncope.client.console.SyncopeConsoleSession;
 import org.apache.syncope.client.ui.commons.Constants;
-import org.apache.syncope.client.console.commons.DirectoryDataProvider;
+import org.apache.syncope.client.ui.commons.DirectoryDataProvider;
 import org.apache.syncope.client.console.commons.IdRepoConstants;
 import org.apache.syncope.client.console.pages.BasePage;
 import org.apache.syncope.client.console.panels.AccessTokenDirectoryPanel.AccessTokenDataProvider;
diff --git a/client/idrepo/console/src/main/java/org/apache/syncope/client/console/panels/AnyTypeClassesPanel.java b/client/idrepo/console/src/main/java/org/apache/syncope/client/console/panels/AnyTypeClassesPanel.java
index aa27c0d..87f5478 100644
--- a/client/idrepo/console/src/main/java/org/apache/syncope/client/console/panels/AnyTypeClassesPanel.java
+++ b/client/idrepo/console/src/main/java/org/apache/syncope/client/console/panels/AnyTypeClassesPanel.java
@@ -29,7 +29,7 @@ import java.util.Map;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.syncope.client.console.SyncopeConsoleSession;
 import org.apache.syncope.client.ui.commons.Constants;
-import org.apache.syncope.client.console.commons.DirectoryDataProvider;
+import org.apache.syncope.client.ui.commons.DirectoryDataProvider;
 import org.apache.syncope.client.console.commons.IdRepoConstants;
 import org.apache.syncope.client.console.commons.SortableDataProviderComparator;
 import org.apache.syncope.client.console.pages.BasePage;
diff --git a/client/idrepo/console/src/main/java/org/apache/syncope/client/console/panels/AnyTypesPanel.java b/client/idrepo/console/src/main/java/org/apache/syncope/client/console/panels/AnyTypesPanel.java
index 182246e..b1d7011 100644
--- a/client/idrepo/console/src/main/java/org/apache/syncope/client/console/panels/AnyTypesPanel.java
+++ b/client/idrepo/console/src/main/java/org/apache/syncope/client/console/panels/AnyTypesPanel.java
@@ -29,7 +29,7 @@ import java.util.Map;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.syncope.client.console.SyncopeConsoleSession;
 import org.apache.syncope.client.ui.commons.Constants;
-import org.apache.syncope.client.console.commons.DirectoryDataProvider;
+import org.apache.syncope.client.ui.commons.DirectoryDataProvider;
 import org.apache.syncope.client.console.commons.IdRepoConstants;
 import org.apache.syncope.client.console.commons.SortableDataProviderComparator;
 import org.apache.syncope.client.console.pages.BasePage;
diff --git a/client/idrepo/console/src/main/java/org/apache/syncope/client/console/panels/ApplicationDirectoryPanel.java b/client/idrepo/console/src/main/java/org/apache/syncope/client/console/panels/ApplicationDirectoryPanel.java
index a727423..652d051 100644
--- a/client/idrepo/console/src/main/java/org/apache/syncope/client/console/panels/ApplicationDirectoryPanel.java
+++ b/client/idrepo/console/src/main/java/org/apache/syncope/client/console/panels/ApplicationDirectoryPanel.java
@@ -28,7 +28,7 @@ import java.util.stream.Collectors;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.syncope.client.console.SyncopeConsoleSession;
 import org.apache.syncope.client.ui.commons.Constants;
-import org.apache.syncope.client.console.commons.DirectoryDataProvider;
+import org.apache.syncope.client.ui.commons.DirectoryDataProvider;
 import org.apache.syncope.client.console.commons.IdRepoConstants;
 import org.apache.syncope.client.console.commons.SortableDataProviderComparator;
 import org.apache.syncope.client.console.pages.BasePage;
diff --git a/client/idrepo/console/src/main/java/org/apache/syncope/client/console/panels/BeanPanel.java b/client/idrepo/console/src/main/java/org/apache/syncope/client/console/panels/BeanPanel.java
index b372650..4830877 100644
--- a/client/idrepo/console/src/main/java/org/apache/syncope/client/console/panels/BeanPanel.java
+++ b/client/idrepo/console/src/main/java/org/apache/syncope/client/console/panels/BeanPanel.java
@@ -28,6 +28,7 @@ import java.util.List;
 import java.util.Map;
 import java.util.stream.Collectors;
 import org.apache.commons.lang3.StringUtils;
+import org.apache.commons.lang3.time.FastDateFormat;
 import org.apache.commons.lang3.tuple.Pair;
 import org.apache.syncope.client.console.panels.search.AnyObjectSearchPanel;
 import org.apache.syncope.client.console.panels.search.GroupSearchPanel;
@@ -40,7 +41,7 @@ import org.apache.syncope.client.ui.commons.markup.html.form.AjaxDropDownChoiceP
 import org.apache.syncope.client.ui.commons.markup.html.form.AjaxPalettePanel;
 import org.apache.syncope.client.ui.commons.markup.html.form.AjaxSpinnerFieldPanel;
 import org.apache.syncope.client.ui.commons.markup.html.form.AjaxTextFieldPanel;
-import org.apache.syncope.client.console.wicket.markup.html.form.AjaxDateTimeFieldPanel;
+import org.apache.syncope.client.ui.commons.markup.html.form.AjaxDateTimeFieldPanel;
 import org.apache.syncope.client.console.wicket.markup.html.form.MultiFieldPanel;
 import org.apache.syncope.client.ui.commons.markup.html.form.FieldPanel;
 import org.apache.syncope.client.lib.SyncopeClient;
@@ -241,7 +242,8 @@ public class BeanPanel<T extends Serializable> extends Panel {
             result = new AjaxSpinnerFieldPanel.Builder<>().build(
                     id, fieldName, (Class<Number>) ClassUtils.resolvePrimitiveIfNecessary(type), model);
         } else if (Date.class.equals(type)) {
-            result = new AjaxDateTimeFieldPanel(id, fieldName, model, SyncopeConstants.DEFAULT_DATE_PATTERN);
+            result = new AjaxDateTimeFieldPanel(id, fieldName, model,
+                    FastDateFormat.getInstance(SyncopeConstants.DEFAULT_DATE_PATTERN));
         } else if (type.isEnum()) {
             result = new AjaxDropDownChoicePanel(id, fieldName, model).setChoices(
                     Arrays.asList(type.getEnumConstants()));
diff --git a/client/idrepo/console/src/main/java/org/apache/syncope/client/console/panels/DirectoryPanel.java b/client/idrepo/console/src/main/java/org/apache/syncope/client/console/panels/DirectoryPanel.java
index 5ae001a..8f23ce5 100644
--- a/client/idrepo/console/src/main/java/org/apache/syncope/client/console/panels/DirectoryPanel.java
+++ b/client/idrepo/console/src/main/java/org/apache/syncope/client/console/panels/DirectoryPanel.java
@@ -24,7 +24,7 @@ import java.util.Collection;
 import java.util.List;
 import org.apache.syncope.client.console.PreferenceManager;
 import org.apache.syncope.client.ui.commons.Constants;
-import org.apache.syncope.client.console.commons.DirectoryDataProvider;
+import org.apache.syncope.client.ui.commons.DirectoryDataProvider;
 import org.apache.syncope.client.console.pages.BasePage;
 import org.apache.syncope.client.ui.commons.rest.RestClient;
 import org.apache.syncope.client.ui.commons.ajax.form.IndicatorAjaxFormComponentUpdatingBehavior;
diff --git a/client/idrepo/console/src/main/java/org/apache/syncope/client/console/panels/DomainDirectoryPanel.java b/client/idrepo/console/src/main/java/org/apache/syncope/client/console/panels/DomainDirectoryPanel.java
index 597449f..82eb57e 100644
--- a/client/idrepo/console/src/main/java/org/apache/syncope/client/console/panels/DomainDirectoryPanel.java
+++ b/client/idrepo/console/src/main/java/org/apache/syncope/client/console/panels/DomainDirectoryPanel.java
@@ -26,7 +26,7 @@ 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.DirectoryDataProvider;
+import org.apache.syncope.client.ui.commons.DirectoryDataProvider;
 import org.apache.syncope.client.console.commons.IdRepoConstants;
 import org.apache.syncope.client.console.commons.SortableDataProviderComparator;
 import org.apache.syncope.client.console.pages.BasePage;
diff --git a/client/idrepo/console/src/main/java/org/apache/syncope/client/console/panels/DynRealmDirectoryPanel.java b/client/idrepo/console/src/main/java/org/apache/syncope/client/console/panels/DynRealmDirectoryPanel.java
index 85de24a..e845cae 100644
--- a/client/idrepo/console/src/main/java/org/apache/syncope/client/console/panels/DynRealmDirectoryPanel.java
+++ b/client/idrepo/console/src/main/java/org/apache/syncope/client/console/panels/DynRealmDirectoryPanel.java
@@ -27,7 +27,7 @@ import java.util.List;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.syncope.client.console.SyncopeConsoleSession;
 import org.apache.syncope.client.ui.commons.Constants;
-import org.apache.syncope.client.console.commons.DirectoryDataProvider;
+import org.apache.syncope.client.ui.commons.DirectoryDataProvider;
 import org.apache.syncope.client.console.commons.IdRepoConstants;
 import org.apache.syncope.client.console.commons.SortableDataProviderComparator;
 import org.apache.syncope.client.console.pages.BasePage;
diff --git a/client/idrepo/console/src/main/java/org/apache/syncope/client/console/panels/ImplementationDirectoryPanel.java b/client/idrepo/console/src/main/java/org/apache/syncope/client/console/panels/ImplementationDirectoryPanel.java
index 6ed390c..b4c5080 100644
--- a/client/idrepo/console/src/main/java/org/apache/syncope/client/console/panels/ImplementationDirectoryPanel.java
+++ b/client/idrepo/console/src/main/java/org/apache/syncope/client/console/panels/ImplementationDirectoryPanel.java
@@ -27,7 +27,7 @@ import java.util.List;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.syncope.client.console.SyncopeConsoleSession;
 import org.apache.syncope.client.ui.commons.Constants;
-import org.apache.syncope.client.console.commons.DirectoryDataProvider;
+import org.apache.syncope.client.ui.commons.DirectoryDataProvider;
 import org.apache.syncope.client.console.commons.IdRepoConstants;
 import org.apache.syncope.client.console.commons.SortableDataProviderComparator;
 import org.apache.syncope.client.console.pages.BasePage;
diff --git a/client/idrepo/console/src/main/java/org/apache/syncope/client/console/panels/NetworkServiceDirectoryPanel.java b/client/idrepo/console/src/main/java/org/apache/syncope/client/console/panels/NetworkServiceDirectoryPanel.java
index 206cd2e..a50a19c 100644
--- a/client/idrepo/console/src/main/java/org/apache/syncope/client/console/panels/NetworkServiceDirectoryPanel.java
+++ b/client/idrepo/console/src/main/java/org/apache/syncope/client/console/panels/NetworkServiceDirectoryPanel.java
@@ -24,7 +24,7 @@ import java.util.Collection;
 import java.util.Collections;
 import java.util.Iterator;
 import java.util.List;
-import org.apache.syncope.client.console.commons.DirectoryDataProvider;
+import org.apache.syncope.client.ui.commons.DirectoryDataProvider;
 import org.apache.syncope.client.console.commons.IdRepoConstants;
 import org.apache.syncope.client.console.panels.NetworkServiceDirectoryPanel.NetworkServiceProvider;
 import org.apache.syncope.client.console.rest.SyncopeRestClient;
diff --git a/client/idrepo/console/src/main/java/org/apache/syncope/client/console/panels/ParametersDirectoryPanel.java b/client/idrepo/console/src/main/java/org/apache/syncope/client/console/panels/ParametersDirectoryPanel.java
index 4d03c83..8c977f7 100644
--- a/client/idrepo/console/src/main/java/org/apache/syncope/client/console/panels/ParametersDirectoryPanel.java
+++ b/client/idrepo/console/src/main/java/org/apache/syncope/client/console/panels/ParametersDirectoryPanel.java
@@ -28,7 +28,7 @@ import java.util.stream.Collectors;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.syncope.client.console.SyncopeConsoleSession;
 import org.apache.syncope.client.ui.commons.Constants;
-import org.apache.syncope.client.console.commons.DirectoryDataProvider;
+import org.apache.syncope.client.ui.commons.DirectoryDataProvider;
 import org.apache.syncope.client.console.commons.IdRepoConstants;
 import org.apache.syncope.client.console.commons.SortableDataProviderComparator;
 import org.apache.syncope.client.console.pages.BasePage;
diff --git a/client/idrepo/console/src/main/java/org/apache/syncope/client/console/panels/ParametersWizardAttrStep.java b/client/idrepo/console/src/main/java/org/apache/syncope/client/console/panels/ParametersWizardAttrStep.java
index 6d296c3..8f1c8ef 100644
--- a/client/idrepo/console/src/main/java/org/apache/syncope/client/console/panels/ParametersWizardAttrStep.java
+++ b/client/idrepo/console/src/main/java/org/apache/syncope/client/console/panels/ParametersWizardAttrStep.java
@@ -22,10 +22,11 @@ import java.util.Arrays;
 import java.util.List;
 import javax.ws.rs.core.MediaType;
 import org.apache.commons.lang3.BooleanUtils;
+import org.apache.commons.lang3.time.FastDateFormat;
 import org.apache.syncope.client.ui.commons.markup.html.form.AjaxDropDownChoicePanel;
 import org.apache.syncope.client.ui.commons.markup.html.form.AjaxSpinnerFieldPanel;
 import org.apache.syncope.client.ui.commons.markup.html.form.AjaxTextFieldPanel;
-import org.apache.syncope.client.console.wicket.markup.html.form.AjaxDateTimeFieldPanel;
+import org.apache.syncope.client.ui.commons.markup.html.form.AjaxDateTimeFieldPanel;
 import org.apache.syncope.client.console.wicket.markup.html.form.BinaryFieldPanel;
 import org.apache.syncope.client.console.wicket.markup.html.form.MultiFieldPanel;
 import org.apache.syncope.client.ui.commons.markup.html.form.FieldPanel;
@@ -93,7 +94,8 @@ public class ParametersWizardAttrStep extends WizardStep {
         switch (plainSchemaTO.getType()) {
             case Date:
                 panel = new AjaxDateTimeFieldPanel(
-                        id, valueHeaderName, new Model<>(), SyncopeConstants.DEFAULT_DATE_PATTERN);
+                        id, valueHeaderName, new Model<>(),
+                        FastDateFormat.getInstance(SyncopeConstants.DEFAULT_DATE_PATTERN));
                 break;
 
             case Boolean:
diff --git a/client/idrepo/console/src/main/java/org/apache/syncope/client/console/panels/PrivilegeDirectoryPanel.java b/client/idrepo/console/src/main/java/org/apache/syncope/client/console/panels/PrivilegeDirectoryPanel.java
index a87dbef..4bfcd78 100644
--- a/client/idrepo/console/src/main/java/org/apache/syncope/client/console/panels/PrivilegeDirectoryPanel.java
+++ b/client/idrepo/console/src/main/java/org/apache/syncope/client/console/panels/PrivilegeDirectoryPanel.java
@@ -26,7 +26,7 @@ import java.util.List;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.syncope.client.console.SyncopeConsoleSession;
 import org.apache.syncope.client.ui.commons.Constants;
-import org.apache.syncope.client.console.commons.DirectoryDataProvider;
+import org.apache.syncope.client.ui.commons.DirectoryDataProvider;
 import org.apache.syncope.client.console.commons.IdRepoConstants;
 import org.apache.syncope.client.console.commons.SortableDataProviderComparator;
 import org.apache.syncope.client.console.pages.BasePage;
diff --git a/client/idrepo/console/src/main/java/org/apache/syncope/client/console/panels/RelationshipTypesPanel.java b/client/idrepo/console/src/main/java/org/apache/syncope/client/console/panels/RelationshipTypesPanel.java
index 71ac26c..9ff809c 100644
--- a/client/idrepo/console/src/main/java/org/apache/syncope/client/console/panels/RelationshipTypesPanel.java
+++ b/client/idrepo/console/src/main/java/org/apache/syncope/client/console/panels/RelationshipTypesPanel.java
@@ -29,7 +29,7 @@ import java.util.Map;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.syncope.client.console.SyncopeConsoleSession;
 import org.apache.syncope.client.ui.commons.Constants;
-import org.apache.syncope.client.console.commons.DirectoryDataProvider;
+import org.apache.syncope.client.ui.commons.DirectoryDataProvider;
 import org.apache.syncope.client.console.commons.IdRepoConstants;
 import org.apache.syncope.client.console.commons.SortableDataProviderComparator;
 import org.apache.syncope.client.console.pages.BasePage;
diff --git a/client/idrepo/console/src/main/java/org/apache/syncope/client/console/panels/RoleDirectoryPanel.java b/client/idrepo/console/src/main/java/org/apache/syncope/client/console/panels/RoleDirectoryPanel.java
index a15d688..98883cf 100644
--- a/client/idrepo/console/src/main/java/org/apache/syncope/client/console/panels/RoleDirectoryPanel.java
+++ b/client/idrepo/console/src/main/java/org/apache/syncope/client/console/panels/RoleDirectoryPanel.java
@@ -29,7 +29,7 @@ import org.apache.commons.lang3.SerializationUtils;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.syncope.client.console.SyncopeConsoleSession;
 import org.apache.syncope.client.ui.commons.Constants;
-import org.apache.syncope.client.console.commons.DirectoryDataProvider;
+import org.apache.syncope.client.ui.commons.DirectoryDataProvider;
 import org.apache.syncope.client.console.commons.IdRepoConstants;
 import org.apache.syncope.client.console.commons.SortableDataProviderComparator;
 import org.apache.syncope.client.console.layout.ConsoleLayoutInfo;
diff --git a/client/idrepo/console/src/main/java/org/apache/syncope/client/console/panels/SchemaTypePanel.java b/client/idrepo/console/src/main/java/org/apache/syncope/client/console/panels/SchemaTypePanel.java
index fd667db..ff20636 100644
--- a/client/idrepo/console/src/main/java/org/apache/syncope/client/console/panels/SchemaTypePanel.java
+++ b/client/idrepo/console/src/main/java/org/apache/syncope/client/console/panels/SchemaTypePanel.java
@@ -31,7 +31,7 @@ import java.util.Map;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.syncope.client.console.SyncopeConsoleSession;
 import org.apache.syncope.client.ui.commons.Constants;
-import org.apache.syncope.client.console.commons.DirectoryDataProvider;
+import org.apache.syncope.client.ui.commons.DirectoryDataProvider;
 import org.apache.syncope.client.console.commons.IdRepoConstants;
 import org.apache.syncope.client.console.commons.SortableDataProviderComparator;
 import org.apache.syncope.client.console.pages.BasePage;
diff --git a/client/idrepo/console/src/main/java/org/apache/syncope/client/console/panels/SecurityQuestionsPanel.java b/client/idrepo/console/src/main/java/org/apache/syncope/client/console/panels/SecurityQuestionsPanel.java
index 8b73da3..6717341 100644
--- a/client/idrepo/console/src/main/java/org/apache/syncope/client/console/panels/SecurityQuestionsPanel.java
+++ b/client/idrepo/console/src/main/java/org/apache/syncope/client/console/panels/SecurityQuestionsPanel.java
@@ -27,7 +27,7 @@ import java.util.List;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.syncope.client.console.SyncopeConsoleSession;
 import org.apache.syncope.client.ui.commons.Constants;
-import org.apache.syncope.client.console.commons.DirectoryDataProvider;
+import org.apache.syncope.client.ui.commons.DirectoryDataProvider;
 import org.apache.syncope.client.console.commons.IdRepoConstants;
 import org.apache.syncope.client.console.commons.SortableDataProviderComparator;
 import org.apache.syncope.client.console.pages.BasePage;
diff --git a/client/idrepo/console/src/main/java/org/apache/syncope/client/console/panels/StartAtTogglePanel.java b/client/idrepo/console/src/main/java/org/apache/syncope/client/console/panels/StartAtTogglePanel.java
index 08bddb8..c0e20ef 100644
--- a/client/idrepo/console/src/main/java/org/apache/syncope/client/console/panels/StartAtTogglePanel.java
+++ b/client/idrepo/console/src/main/java/org/apache/syncope/client/console/panels/StartAtTogglePanel.java
@@ -21,13 +21,14 @@ package org.apache.syncope.client.console.panels;
 import java.io.Serializable;
 import java.util.Date;
 import org.apache.commons.lang3.StringUtils;
+import org.apache.commons.lang3.time.FastDateFormat;
 import org.apache.syncope.client.console.SyncopeConsoleSession;
 import org.apache.syncope.client.ui.commons.Constants;
 import org.apache.syncope.client.console.pages.BasePage;
 import org.apache.syncope.client.console.rest.ExecutionRestClient;
 import org.apache.syncope.client.ui.commons.ajax.form.IndicatorAjaxFormComponentUpdatingBehavior;
 import org.apache.syncope.client.ui.commons.markup.html.form.AjaxCheckBoxPanel;
-import org.apache.syncope.client.console.wicket.markup.html.form.AjaxDateTimeFieldPanel;
+import org.apache.syncope.client.ui.commons.markup.html.form.AjaxDateTimeFieldPanel;
 import org.apache.syncope.common.lib.SyncopeClientException;
 import org.apache.syncope.common.lib.SyncopeConstants;
 import org.apache.wicket.PageReference;
@@ -54,7 +55,8 @@ public abstract class StartAtTogglePanel extends TogglePanel<Serializable> {
         addInnerObject(form);
 
         final AjaxDateTimeFieldPanel startAtDate = new AjaxDateTimeFieldPanel(
-                "startAtDate", "startAtDate", startAtDateModel, SyncopeConstants.DATE_PATTERNS[3]);
+                "startAtDate", "startAtDate", startAtDateModel, 
+                FastDateFormat.getInstance(SyncopeConstants.DATE_PATTERNS[3]));
 
         startAtDate.setReadOnly(true).hideLabel();
         form.add(startAtDate);
diff --git a/client/idrepo/console/src/main/java/org/apache/syncope/client/console/panels/TypeExtensionDirectoryPanel.java b/client/idrepo/console/src/main/java/org/apache/syncope/client/console/panels/TypeExtensionDirectoryPanel.java
index e32e46a..2320fd9 100644
--- a/client/idrepo/console/src/main/java/org/apache/syncope/client/console/panels/TypeExtensionDirectoryPanel.java
+++ b/client/idrepo/console/src/main/java/org/apache/syncope/client/console/panels/TypeExtensionDirectoryPanel.java
@@ -28,7 +28,7 @@ import java.util.List;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.syncope.client.console.SyncopeConsoleSession;
 import org.apache.syncope.client.ui.commons.Constants;
-import org.apache.syncope.client.console.commons.DirectoryDataProvider;
+import org.apache.syncope.client.ui.commons.DirectoryDataProvider;
 import org.apache.syncope.client.console.commons.IdRepoConstants;
 import org.apache.syncope.client.console.pages.BasePage;
 import org.apache.syncope.client.console.panels.TypeExtensionDirectoryPanel.TypeExtensionDataProvider;
diff --git a/client/idrepo/console/src/main/java/org/apache/syncope/client/console/panels/TypesDirectoryPanel.java b/client/idrepo/console/src/main/java/org/apache/syncope/client/console/panels/TypesDirectoryPanel.java
index 744fc71..57ad93c 100644
--- a/client/idrepo/console/src/main/java/org/apache/syncope/client/console/panels/TypesDirectoryPanel.java
+++ b/client/idrepo/console/src/main/java/org/apache/syncope/client/console/panels/TypesDirectoryPanel.java
@@ -19,7 +19,7 @@
 package org.apache.syncope.client.console.panels;
 
 import de.agilecoders.wicket.core.markup.html.bootstrap.dialog.Modal;
-import org.apache.syncope.client.console.commons.DirectoryDataProvider;
+import org.apache.syncope.client.ui.commons.DirectoryDataProvider;
 import org.apache.syncope.client.ui.commons.rest.RestClient;
 import org.apache.syncope.common.lib.to.EntityTO;
 import org.apache.wicket.PageReference;
diff --git a/client/idrepo/console/src/main/java/org/apache/syncope/client/console/policies/PolicyDirectoryPanel.java b/client/idrepo/console/src/main/java/org/apache/syncope/client/console/policies/PolicyDirectoryPanel.java
index f2a4a37..b2b8892 100644
--- a/client/idrepo/console/src/main/java/org/apache/syncope/client/console/policies/PolicyDirectoryPanel.java
+++ b/client/idrepo/console/src/main/java/org/apache/syncope/client/console/policies/PolicyDirectoryPanel.java
@@ -28,7 +28,7 @@ import org.apache.commons.lang3.SerializationUtils;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.syncope.client.console.SyncopeConsoleSession;
 import org.apache.syncope.client.ui.commons.Constants;
-import org.apache.syncope.client.console.commons.DirectoryDataProvider;
+import org.apache.syncope.client.ui.commons.DirectoryDataProvider;
 import org.apache.syncope.client.console.commons.IdRepoConstants;
 import org.apache.syncope.client.console.commons.SortableDataProviderComparator;
 import org.apache.syncope.client.console.pages.BasePage;
diff --git a/client/idrepo/console/src/main/java/org/apache/syncope/client/console/policies/PolicyRuleDirectoryPanel.java b/client/idrepo/console/src/main/java/org/apache/syncope/client/console/policies/PolicyRuleDirectoryPanel.java
index 8188ba7..9cde5e3 100644
--- a/client/idrepo/console/src/main/java/org/apache/syncope/client/console/policies/PolicyRuleDirectoryPanel.java
+++ b/client/idrepo/console/src/main/java/org/apache/syncope/client/console/policies/PolicyRuleDirectoryPanel.java
@@ -29,7 +29,7 @@ import java.util.stream.Collectors;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.syncope.client.console.SyncopeConsoleSession;
 import org.apache.syncope.client.ui.commons.Constants;
-import org.apache.syncope.client.console.commons.DirectoryDataProvider;
+import org.apache.syncope.client.ui.commons.DirectoryDataProvider;
 import org.apache.syncope.client.console.commons.IdRepoConstants;
 import org.apache.syncope.client.console.commons.SortableDataProviderComparator;
 import org.apache.syncope.client.console.pages.BasePage;
diff --git a/client/idrepo/console/src/main/java/org/apache/syncope/client/console/reports/ReportDirectoryPanel.java b/client/idrepo/console/src/main/java/org/apache/syncope/client/console/reports/ReportDirectoryPanel.java
index 2ce05b8..70e07fd 100644
--- a/client/idrepo/console/src/main/java/org/apache/syncope/client/console/reports/ReportDirectoryPanel.java
+++ b/client/idrepo/console/src/main/java/org/apache/syncope/client/console/reports/ReportDirectoryPanel.java
@@ -28,7 +28,7 @@ import org.apache.commons.lang3.SerializationUtils;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.syncope.client.console.SyncopeConsoleSession;
 import org.apache.syncope.client.ui.commons.Constants;
-import org.apache.syncope.client.console.commons.DirectoryDataProvider;
+import org.apache.syncope.client.ui.commons.DirectoryDataProvider;
 import org.apache.syncope.client.console.commons.IdRepoConstants;
 import org.apache.syncope.client.console.commons.SortableDataProviderComparator;
 import org.apache.syncope.client.console.pages.BasePage;
diff --git a/client/idrepo/console/src/main/java/org/apache/syncope/client/console/reports/ReportTemplateDirectoryPanel.java b/client/idrepo/console/src/main/java/org/apache/syncope/client/console/reports/ReportTemplateDirectoryPanel.java
index 868d9e1..220fc90 100644
--- a/client/idrepo/console/src/main/java/org/apache/syncope/client/console/reports/ReportTemplateDirectoryPanel.java
+++ b/client/idrepo/console/src/main/java/org/apache/syncope/client/console/reports/ReportTemplateDirectoryPanel.java
@@ -28,7 +28,7 @@ import org.apache.commons.lang3.StringUtils;
 import org.apache.syncope.client.console.SyncopeConsoleSession;
 import org.apache.syncope.client.console.commons.TemplateContent;
 import org.apache.syncope.client.ui.commons.Constants;
-import org.apache.syncope.client.console.commons.DirectoryDataProvider;
+import org.apache.syncope.client.ui.commons.DirectoryDataProvider;
 import org.apache.syncope.client.console.commons.IdRepoConstants;
 import org.apache.syncope.client.console.commons.SortableDataProviderComparator;
 import org.apache.syncope.client.console.notifications.TemplateModal;
diff --git a/client/idrepo/console/src/main/java/org/apache/syncope/client/console/reports/ReportletDirectoryPanel.java b/client/idrepo/console/src/main/java/org/apache/syncope/client/console/reports/ReportletDirectoryPanel.java
index e9a5f5c..7d0fce3 100644
--- a/client/idrepo/console/src/main/java/org/apache/syncope/client/console/reports/ReportletDirectoryPanel.java
+++ b/client/idrepo/console/src/main/java/org/apache/syncope/client/console/reports/ReportletDirectoryPanel.java
@@ -29,7 +29,7 @@ import java.util.stream.Collectors;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.syncope.client.console.SyncopeConsoleSession;
 import org.apache.syncope.client.ui.commons.Constants;
-import org.apache.syncope.client.console.commons.DirectoryDataProvider;
+import org.apache.syncope.client.ui.commons.DirectoryDataProvider;
 import org.apache.syncope.client.console.commons.IdRepoConstants;
 import org.apache.syncope.client.console.commons.SortableDataProviderComparator;
 import org.apache.syncope.client.console.pages.BasePage;
diff --git a/client/idrepo/console/src/main/java/org/apache/syncope/client/console/tasks/ExecutionsDirectoryPanel.java b/client/idrepo/console/src/main/java/org/apache/syncope/client/console/tasks/ExecutionsDirectoryPanel.java
index bf53630..9db6fa6 100644
--- a/client/idrepo/console/src/main/java/org/apache/syncope/client/console/tasks/ExecutionsDirectoryPanel.java
+++ b/client/idrepo/console/src/main/java/org/apache/syncope/client/console/tasks/ExecutionsDirectoryPanel.java
@@ -24,7 +24,7 @@ import java.util.Iterator;
 import java.util.List;
 import org.apache.syncope.client.console.SyncopeConsoleSession;
 import org.apache.syncope.client.ui.commons.Constants;
-import org.apache.syncope.client.console.commons.DirectoryDataProvider;
+import org.apache.syncope.client.ui.commons.DirectoryDataProvider;
 import org.apache.syncope.client.console.commons.IdRepoConstants;
 import org.apache.syncope.client.console.pages.BasePage;
 import org.apache.syncope.client.console.panels.DirectoryPanel;
diff --git a/client/idrepo/console/src/main/java/org/apache/syncope/client/console/tasks/TaskDirectoryPanel.java b/client/idrepo/console/src/main/java/org/apache/syncope/client/console/tasks/TaskDirectoryPanel.java
index 022b21a..1f80387 100644
--- a/client/idrepo/console/src/main/java/org/apache/syncope/client/console/tasks/TaskDirectoryPanel.java
+++ b/client/idrepo/console/src/main/java/org/apache/syncope/client/console/tasks/TaskDirectoryPanel.java
@@ -18,7 +18,7 @@
  */
 package org.apache.syncope.client.console.tasks;
 
-import org.apache.syncope.client.console.commons.DirectoryDataProvider;
+import org.apache.syncope.client.ui.commons.DirectoryDataProvider;
 import org.apache.syncope.client.console.commons.TaskDataProvider;
 import org.apache.syncope.client.console.panels.DirectoryPanel;
 import org.apache.syncope.client.console.panels.AjaxDataTablePanel;
diff --git a/client/idrepo/console/src/main/java/org/apache/syncope/client/console/wicket/markup/html/form/AjaxDateFieldPanel.java b/client/idrepo/console/src/main/java/org/apache/syncope/client/console/wicket/markup/html/form/AjaxDateFieldPanel.java
deleted file mode 100644
index 7d9bb08..0000000
--- a/client/idrepo/console/src/main/java/org/apache/syncope/client/console/wicket/markup/html/form/AjaxDateFieldPanel.java
+++ /dev/null
@@ -1,61 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.syncope.client.console.wicket.markup.html.form;
-
-import com.googlecode.wicket.kendo.ui.form.datetime.AjaxDatePicker;
-import java.util.Date;
-import org.apache.commons.lang3.time.FastDateFormat;
-import org.apache.syncope.client.console.SyncopeConsoleSession;
-import org.apache.syncope.client.ui.commons.markup.html.form.DateFieldPanel;
-import org.apache.syncope.client.ui.commons.markup.html.form.FieldPanel;
-import org.apache.wicket.model.IModel;
-import org.apache.wicket.model.Model;
-
-public class AjaxDateFieldPanel extends DateFieldPanel {
-
-    private static final long serialVersionUID = 1919852712185883648L;
-
-    public AjaxDateFieldPanel(final String id, final String name, final IModel<Date> model, final String datePattern) {
-        super(id, name, model, datePattern);
-
-        field = new AjaxDatePicker("field", model, SyncopeConsoleSession.get().getLocale(), datePattern);
-        add(field.setLabel(new Model<>(name)).setOutputMarkupId(true));
-    }
-
-    @Override
-    public FieldPanel<Date> clone() {
-        FieldPanel<Date> panel = new AjaxDateFieldPanel(getId(), name, new Model<>(), fmt.getPattern());
-        panel.setRequired(isRequired());
-        panel.setReadOnly(isReadOnly());
-        panel.setTitle(title);
-
-        if (isRequiredLabelAdded) {
-            panel.addRequiredLabel();
-        }
-
-        return panel;
-    }
-
-    @Override
-    protected FastDateFormat getDateFormat(final String datePattern) {
-        return datePattern == null
-                ? SyncopeConsoleSession.get().getDateFormat()
-                : FastDateFormat.getInstance(datePattern);
-    }
-}
diff --git a/client/idrepo/console/src/main/java/org/apache/syncope/client/console/wicket/markup/html/form/AjaxDateTimeFieldPanel.java b/client/idrepo/console/src/main/java/org/apache/syncope/client/console/wicket/markup/html/form/AjaxDateTimeFieldPanel.java
deleted file mode 100644
index 46fad5f..0000000
--- a/client/idrepo/console/src/main/java/org/apache/syncope/client/console/wicket/markup/html/form/AjaxDateTimeFieldPanel.java
+++ /dev/null
@@ -1,65 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.syncope.client.console.wicket.markup.html.form;
-
-import org.apache.syncope.client.ui.commons.markup.html.form.DateFieldPanel;
-import org.apache.syncope.client.ui.commons.markup.html.form.FieldPanel;
-import com.googlecode.wicket.kendo.ui.form.datetime.AjaxDateTimePicker;
-import java.util.Date;
-import org.apache.commons.lang3.time.FastDateFormat;
-import org.apache.syncope.client.console.SyncopeConsoleSession;
-import org.apache.wicket.model.IModel;
-import org.apache.wicket.model.Model;
-
-public class AjaxDateTimeFieldPanel extends DateFieldPanel {
-
-    private static final long serialVersionUID = -428975732068281726L;
-
-    public AjaxDateTimeFieldPanel(
-            final String id, final String name, final IModel<Date> model, final String dateTimePattern) {
-
-        super(id, name, model, dateTimePattern);
-
-        // dateTimePattern should be spit into separate date and time pattern strings in order to be passed to the
-        // AjaxDateTimePicker constructor, but there is no safe way to do that - ignoring
-        field = new AjaxDateTimePicker("field", model, SyncopeConsoleSession.get().getLocale());
-        add(field.setLabel(new Model<>(name)).setOutputMarkupId(true));
-    }
-
-    @Override
-    public FieldPanel<Date> clone() {
-        FieldPanel<Date> panel = new AjaxDateTimeFieldPanel(getId(), name, new Model<>(null), fmt.getPattern());
-        panel.setRequired(isRequired());
-        panel.setReadOnly(isReadOnly());
-        panel.setTitle(title);
-
-        if (isRequiredLabelAdded) {
-            panel.addRequiredLabel();
-        }
-
-        return panel;
-    }
-
-    @Override
-    protected FastDateFormat getDateFormat(final String datePattern) {
-        return datePattern == null
-                ? SyncopeConsoleSession.get().getDateFormat()
-                : FastDateFormat.getInstance(datePattern);
-    }
-}
diff --git a/client/idrepo/console/src/main/java/org/apache/syncope/client/console/widgets/JobWidget.java b/client/idrepo/console/src/main/java/org/apache/syncope/client/console/widgets/JobWidget.java
index d127d13..1963899 100644
--- a/client/idrepo/console/src/main/java/org/apache/syncope/client/console/widgets/JobWidget.java
+++ b/client/idrepo/console/src/main/java/org/apache/syncope/client/console/widgets/JobWidget.java
@@ -29,7 +29,7 @@ import java.util.List;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.syncope.client.console.SyncopeConsoleSession;
 import org.apache.syncope.client.ui.commons.Constants;
-import org.apache.syncope.client.console.commons.DirectoryDataProvider;
+import org.apache.syncope.client.ui.commons.DirectoryDataProvider;
 import org.apache.syncope.client.console.commons.SortableDataProviderComparator;
 import org.apache.syncope.client.console.pages.BasePage;
 import org.apache.syncope.client.console.panels.DirectoryPanel;
diff --git a/client/idrepo/console/src/main/java/org/apache/syncope/client/console/widgets/ReconDetailsModalPanel.java b/client/idrepo/console/src/main/java/org/apache/syncope/client/console/widgets/ReconDetailsModalPanel.java
index 3f7bd2f..66571dd 100644
--- a/client/idrepo/console/src/main/java/org/apache/syncope/client/console/widgets/ReconDetailsModalPanel.java
+++ b/client/idrepo/console/src/main/java/org/apache/syncope/client/console/widgets/ReconDetailsModalPanel.java
@@ -25,7 +25,7 @@ import java.util.Iterator;
 import java.util.List;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.syncope.client.ui.commons.Constants;
-import org.apache.syncope.client.console.commons.DirectoryDataProvider;
+import org.apache.syncope.client.ui.commons.DirectoryDataProvider;
 import org.apache.syncope.client.console.commons.SortableDataProviderComparator;
 import org.apache.syncope.client.console.panels.AbstractModalPanel;
 import org.apache.syncope.client.console.panels.DirectoryPanel;
diff --git a/client/idrepo/console/src/main/java/org/apache/syncope/client/console/widgets/ReconciliationWidget.java b/client/idrepo/console/src/main/java/org/apache/syncope/client/console/widgets/ReconciliationWidget.java
index 9e5244b..c630ca9 100644
--- a/client/idrepo/console/src/main/java/org/apache/syncope/client/console/widgets/ReconciliationWidget.java
+++ b/client/idrepo/console/src/main/java/org/apache/syncope/client/console/widgets/ReconciliationWidget.java
@@ -36,7 +36,7 @@ import org.apache.commons.lang3.tuple.Pair;
 import org.apache.syncope.client.console.SyncopeWebApplication;
 import org.apache.syncope.client.console.SyncopeConsoleSession;
 import org.apache.syncope.client.ui.commons.Constants;
-import org.apache.syncope.client.console.commons.DirectoryDataProvider;
+import org.apache.syncope.client.ui.commons.DirectoryDataProvider;
 import org.apache.syncope.client.console.commons.SortableDataProviderComparator;
 import org.apache.syncope.client.console.pages.BasePage;
 import org.apache.syncope.client.console.panels.DirectoryPanel;
diff --git a/client/idrepo/console/src/main/java/org/apache/syncope/client/console/wizards/any/PlainAttrs.java b/client/idrepo/console/src/main/java/org/apache/syncope/client/console/wizards/any/PlainAttrs.java
index 7a9de30..981842b 100644
--- a/client/idrepo/console/src/main/java/org/apache/syncope/client/console/wizards/any/PlainAttrs.java
+++ b/client/idrepo/console/src/main/java/org/apache/syncope/client/console/wizards/any/PlainAttrs.java
@@ -30,7 +30,9 @@ import java.util.Optional;
 import java.util.stream.Collectors;
 import org.apache.commons.collections4.ListUtils;
 import org.apache.commons.lang3.StringUtils;
+import org.apache.commons.lang3.time.FastDateFormat;
 import org.apache.syncope.client.console.SyncopeConsoleSession;
+import org.apache.syncope.client.ui.commons.markup.html.form.AjaxDateFieldPanel;
 import org.apache.syncope.client.ui.commons.SchemaUtils;
 import org.apache.syncope.client.ui.commons.ajax.markup.html.LabelInfo;
 import org.apache.syncope.client.ui.commons.wicket.markup.html.bootstrap.tabs.Accordion;
@@ -40,8 +42,7 @@ import org.apache.syncope.client.ui.commons.markup.html.form.AjaxDropDownChoiceP
 import org.apache.syncope.client.ui.commons.markup.html.form.AjaxSpinnerFieldPanel;
 import org.apache.syncope.client.ui.commons.markup.html.form.AjaxTextFieldPanel;
 import org.apache.syncope.client.console.wicket.markup.html.form.BinaryFieldPanel;
-import org.apache.syncope.client.console.wicket.markup.html.form.AjaxDateFieldPanel;
-import org.apache.syncope.client.console.wicket.markup.html.form.AjaxDateTimeFieldPanel;
+import org.apache.syncope.client.ui.commons.markup.html.form.AjaxDateTimeFieldPanel;
 import org.apache.syncope.client.console.wicket.markup.html.form.MultiFieldPanel;
 import org.apache.syncope.client.ui.commons.markup.html.form.EncryptedFieldPanel;
 import org.apache.syncope.client.ui.commons.markup.html.form.FieldPanel;
@@ -268,13 +269,13 @@ public class PlainAttrs extends AbstractAttrs<PlainSchemaTO> {
                             "panel",
                             schemaTO.getLabel(SyncopeConsoleSession.get().getLocale()),
                             new Model<>(),
-                            datePattern);
+                            FastDateFormat.getInstance(datePattern));
                 } else {
                     panel = new AjaxDateFieldPanel(
                             "panel",
                             schemaTO.getLabel(SyncopeConsoleSession.get().getLocale()),
                             new Model<>(),
-                            datePattern);
+                            FastDateFormat.getInstance(datePattern));
                 }
 
                 if (required) {
diff --git a/client/idrepo/console/src/main/resources/org/apache/syncope/client/console/wicket/markup/html/form/AjaxDateFieldPanel.html b/client/idrepo/console/src/main/resources/org/apache/syncope/client/console/wicket/markup/html/form/AjaxDateFieldPanel.html
deleted file mode 100644
index 084c8a9..0000000
--- a/client/idrepo/console/src/main/resources/org/apache/syncope/client/console/wicket/markup/html/form/AjaxDateFieldPanel.html
+++ /dev/null
@@ -1,29 +0,0 @@
-<!--
-Licensed to the Apache Software Foundation (ASF) under one
-or more contributor license agreements.  See the NOTICE file
-distributed with this work for additional information
-regarding copyright ownership.  The ASF licenses this file
-to you under the Apache License, Version 2.0 (the
-"License"); you may not use this file except in compliance
-with the License.  You may obtain a copy of the License at
-
-  http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing,
-software distributed under the License is distributed on an
-"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-KIND, either express or implied.  See the License for the
-specific language governing permissions and limitations
-under the License.
--->
-<html xmlns="http://www.w3.org/1999/xhtml" xmlns:wicket="http://wicket.apache.org">
-  <wicket:extend>
-    <wicket:enclosure child="field-label">
-      <label wicket:id="field-label">[LABEL]</label><span wicket:id="required"/>
-      <span wicket:id="externalAction"/>
-    </wicket:enclosure>
-    <div class="input-group">
-      <input wicket:id="field" type="text"></input>
-    </div>
-  </wicket:extend>
-</html>
\ No newline at end of file
diff --git a/client/idrepo/enduser/src/main/java/org/apache/syncope/client/enduser/wizards/any/PlainAttrs.java b/client/idrepo/enduser/src/main/java/org/apache/syncope/client/enduser/wizards/any/PlainAttrs.java
index 9a4aed0..5371399 100644
--- a/client/idrepo/enduser/src/main/java/org/apache/syncope/client/enduser/wizards/any/PlainAttrs.java
+++ b/client/idrepo/enduser/src/main/java/org/apache/syncope/client/enduser/wizards/any/PlainAttrs.java
@@ -29,8 +29,8 @@ import java.util.Optional;
 import java.util.stream.Collectors;
 import org.apache.commons.collections4.ListUtils;
 import org.apache.commons.lang3.StringUtils;
-import org.apache.syncope.client.enduser.markup.html.form.AjaxDateFieldPanel;
-import org.apache.syncope.client.enduser.markup.html.form.AjaxDateTimeFieldPanel;
+import org.apache.commons.lang3.time.FastDateFormat;
+import org.apache.syncope.client.ui.commons.markup.html.form.AjaxDateFieldPanel;
 import org.apache.syncope.client.enduser.markup.html.form.BinaryFieldPanel;
 import org.apache.syncope.client.enduser.markup.html.form.MultiFieldPanel;
 import org.apache.syncope.client.ui.commons.markup.html.form.EncryptedFieldPanel;
@@ -38,6 +38,7 @@ import org.apache.syncope.client.ui.commons.SchemaUtils;
 import org.apache.syncope.client.ui.commons.ajax.markup.html.LabelInfo;
 import org.apache.syncope.client.ui.commons.markup.html.form.AbstractFieldPanel;
 import org.apache.syncope.client.ui.commons.markup.html.form.AjaxCheckBoxPanel;
+import org.apache.syncope.client.ui.commons.markup.html.form.AjaxDateTimeFieldPanel;
 import org.apache.syncope.client.ui.commons.markup.html.form.AjaxDropDownChoicePanel;
 import org.apache.syncope.client.ui.commons.markup.html.form.AjaxSpinnerFieldPanel;
 import org.apache.syncope.client.ui.commons.markup.html.form.AjaxTextFieldPanel;
@@ -255,13 +256,13 @@ public class PlainAttrs extends AbstractAttrs<PlainSchemaTO> {
                             "panel",
                             schemaTO.getLabel(getLocale()),
                             new Model<>(),
-                            datePattern);
+                            FastDateFormat.getInstance(datePattern));
                 } else {
                     panel = new AjaxDateFieldPanel(
                             "panel",
                             schemaTO.getLabel(getLocale()),
                             new Model<>(),
-                            datePattern);
+                            FastDateFormat.getInstance(datePattern));
                 }
 
                 if (required) {
diff --git a/ext/camel/client-console/src/main/java/org/apache/syncope/client/console/panels/CamelRoutesDirectoryPanel.java b/ext/camel/client-console/src/main/java/org/apache/syncope/client/console/panels/CamelRoutesDirectoryPanel.java
index 51f325c..4252367 100644
--- a/ext/camel/client-console/src/main/java/org/apache/syncope/client/console/panels/CamelRoutesDirectoryPanel.java
+++ b/ext/camel/client-console/src/main/java/org/apache/syncope/client/console/panels/CamelRoutesDirectoryPanel.java
@@ -24,7 +24,7 @@ import java.util.Collection;
 import java.util.Collections;
 import java.util.Iterator;
 import java.util.List;
-import org.apache.syncope.client.console.commons.DirectoryDataProvider;
+import org.apache.syncope.client.ui.commons.DirectoryDataProvider;
 import org.apache.syncope.client.console.commons.SortableDataProviderComparator;
 import org.apache.syncope.client.console.pages.BasePage;
 import org.apache.syncope.client.console.panels.CamelRoutesDirectoryPanel.CamelRoutesProvider;
diff --git a/ext/flowable/client-enduser/pom.xml b/ext/flowable/client-common-ui/pom.xml
similarity index 79%
copy from ext/flowable/client-enduser/pom.xml
copy to ext/flowable/client-common-ui/pom.xml
index 7210c9f..c06a5c6 100644
--- a/ext/flowable/client-enduser/pom.xml
+++ b/ext/flowable/client-common-ui/pom.xml
@@ -20,17 +20,17 @@ under the License.
 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
 
   <modelVersion>4.0.0</modelVersion>
-
+  
   <parent>
     <groupId>org.apache.syncope.ext</groupId>
     <artifactId>syncope-ext-flowable</artifactId>
     <version>3.0.0-SNAPSHOT</version>
   </parent>
-
-  <name>Apache Syncope Ext: Flowable Client Enduser</name>
-  <description>Apache Syncope Ext: Flowable Client Enduser</description>
+    
+  <name>Apache Syncope Ext: Flowable Common UI Lib</name>
+  <description>Apache Syncope Ext: Flowable Common UI Lib</description>
   <groupId>org.apache.syncope.ext.flowable</groupId>
-  <artifactId>syncope-ext-flowable-client-enduser</artifactId>
+  <artifactId>syncope-ext-flowable-client-common-ui</artifactId>
   <packaging>jar</packaging>
   
   <properties>
@@ -39,26 +39,20 @@ under the License.
   
   <dependencies>
     <dependency>
-      <groupId>org.apache.syncope.ext.flowable</groupId>
-      <artifactId>syncope-ext-flowable-common-lib</artifactId>
+      <groupId>org.apache.syncope.client.idrepo</groupId>
+      <artifactId>syncope-client-idrepo-common-ui</artifactId>      
       <version>${project.version}</version>
     </dependency>
     <dependency>
       <groupId>org.apache.syncope.ext.flowable</groupId>
-      <artifactId>syncope-ext-flowable-rest-api</artifactId>
+      <artifactId>syncope-ext-flowable-common-lib</artifactId>
       <version>${project.version}</version>
     </dependency>
-    
     <dependency>
-      <groupId>org.apache.syncope.client.idrepo</groupId>
-      <artifactId>syncope-client-idrepo-enduser</artifactId>
+      <groupId>org.apache.syncope.ext.flowable</groupId>
+      <artifactId>syncope-ext-flowable-rest-api</artifactId>
       <version>${project.version}</version>
     </dependency>
- 
-    <dependency>
-      <groupId>javax.servlet</groupId>
-      <artifactId>javax.servlet-api</artifactId>
-    </dependency>
   </dependencies>
   
   <build>
@@ -68,12 +62,5 @@ under the License.
         <artifactId>maven-checkstyle-plugin</artifactId>
       </plugin>
     </plugins>
-    <resources>
-      <resource>
-        <directory>src/main/resources</directory>
-        <filtering>true</filtering>
-      </resource>
-    </resources>
   </build>
-  
 </project>
\ No newline at end of file
diff --git a/ext/flowable/client-console/src/main/java/org/apache/syncope/client/console/panels/UserRequestFormPanel.java b/ext/flowable/client-common-ui/src/main/java/org/apache/syncope/ext/client/common/ui/panels/UserRequestFormPanel.java
similarity index 92%
rename from ext/flowable/client-console/src/main/java/org/apache/syncope/client/console/panels/UserRequestFormPanel.java
rename to ext/flowable/client-common-ui/src/main/java/org/apache/syncope/ext/client/common/ui/panels/UserRequestFormPanel.java
index 7ba5dfe..11d6b2a 100644
--- a/ext/flowable/client-console/src/main/java/org/apache/syncope/client/console/panels/UserRequestFormPanel.java
+++ b/ext/flowable/client-common-ui/src/main/java/org/apache/syncope/ext/client/common/ui/panels/UserRequestFormPanel.java
@@ -16,7 +16,7 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.syncope.client.console.panels;
+package org.apache.syncope.ext.client.common.ui.panels;
 
 import java.text.ParseException;
 import java.util.ArrayList;
@@ -26,8 +26,8 @@ import java.util.List;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.commons.lang3.math.NumberUtils;
 import org.apache.commons.lang3.time.FastDateFormat;
-import org.apache.syncope.client.console.commons.MapChoiceRenderer;
-import org.apache.syncope.client.console.wicket.markup.html.form.AjaxDateTimeFieldPanel;
+import org.apache.syncope.client.ui.commons.MapChoiceRenderer;
+import org.apache.syncope.client.ui.commons.markup.html.form.AjaxDateTimeFieldPanel;
 import org.apache.syncope.client.ui.commons.markup.html.form.AjaxDropDownChoicePanel;
 import org.apache.syncope.client.ui.commons.markup.html.form.AjaxSpinnerFieldPanel;
 import org.apache.syncope.client.ui.commons.markup.html.form.AjaxTextFieldPanel;
@@ -54,8 +54,13 @@ public abstract class UserRequestFormPanel extends Panel {
 
     protected static final Logger LOG = LoggerFactory.getLogger(UserRequestFormPanel.class);
 
-    public UserRequestFormPanel(final PageReference pageRef, final UserRequestForm form) {
-        super(MultilevelPanel.FIRST_LEVEL_ID);
+    public UserRequestFormPanel(final String id, final PageReference pageRef, final UserRequestForm form) {
+        this(id, pageRef, form, true);
+    }
+
+    public UserRequestFormPanel(final String id, final PageReference pageRef, final UserRequestForm form,
+            final boolean showDetails) {
+        super(id);
 
         IModel<List<UserRequestFormProperty>> formProps = new LoadableDetachableModel<List<UserRequestFormProperty>>() {
 
@@ -123,7 +128,7 @@ public abstract class UserRequestFormPanel extends Panel {
                                 prop.setValue(formatter.format(object));
                             }
 
-                        }, prop.getDatePattern());
+                        }, formatter);
                         break;
 
                     case Enum:
@@ -190,7 +195,7 @@ public abstract class UserRequestFormPanel extends Panel {
         MetaDataRoleAuthorizationStrategy.authorize(userDetails, ENABLE, IdRepoEntitlement.USER_READ);
 
         boolean enabled = form.getUserTO() != null;
-        userDetails.setVisible(enabled).setEnabled(enabled);
+        userDetails.setVisible(enabled && showDetails).setEnabled(enabled);
 
         add(propView);
         add(userDetails);
diff --git a/ext/flowable/client-console/src/main/resources/org/apache/syncope/client/console/panels/UserRequestFormPanel.html b/ext/flowable/client-common-ui/src/main/resources/org/apache/syncope/ext/client/common/ui/panels/UserRequestFormPanel.html
similarity index 100%
rename from ext/flowable/client-console/src/main/resources/org/apache/syncope/client/console/panels/UserRequestFormPanel.html
rename to ext/flowable/client-common-ui/src/main/resources/org/apache/syncope/ext/client/common/ui/panels/UserRequestFormPanel.html
diff --git a/ext/flowable/client-console/src/main/resources/org/apache/syncope/client/console/panels/UserRequestFormPanel.properties b/ext/flowable/client-common-ui/src/main/resources/org/apache/syncope/ext/client/common/ui/panels/UserRequestFormPanel.properties
similarity index 100%
rename from ext/flowable/client-console/src/main/resources/org/apache/syncope/client/console/panels/UserRequestFormPanel.properties
rename to ext/flowable/client-common-ui/src/main/resources/org/apache/syncope/ext/client/common/ui/panels/UserRequestFormPanel.properties
diff --git a/ext/flowable/client-console/src/main/resources/org/apache/syncope/client/console/panels/UserRequestFormPanel_it.properties b/ext/flowable/client-common-ui/src/main/resources/org/apache/syncope/ext/client/common/ui/panels/UserRequestFormPanel_it.properties
similarity index 100%
rename from ext/flowable/client-console/src/main/resources/org/apache/syncope/client/console/panels/UserRequestFormPanel_it.properties
rename to ext/flowable/client-common-ui/src/main/resources/org/apache/syncope/ext/client/common/ui/panels/UserRequestFormPanel_it.properties
diff --git a/ext/flowable/client-console/src/main/resources/org/apache/syncope/client/console/panels/UserRequestFormPanel_ja.properties b/ext/flowable/client-common-ui/src/main/resources/org/apache/syncope/ext/client/common/ui/panels/UserRequestFormPanel_ja.properties
similarity index 100%
rename from ext/flowable/client-console/src/main/resources/org/apache/syncope/client/console/panels/UserRequestFormPanel_ja.properties
rename to ext/flowable/client-common-ui/src/main/resources/org/apache/syncope/ext/client/common/ui/panels/UserRequestFormPanel_ja.properties
diff --git a/ext/flowable/client-console/src/main/resources/org/apache/syncope/client/console/panels/UserRequestFormPanel_pt_BR.properties b/ext/flowable/client-common-ui/src/main/resources/org/apache/syncope/ext/client/common/ui/panels/UserRequestFormPanel_pt_BR.properties
similarity index 100%
rename from ext/flowable/client-console/src/main/resources/org/apache/syncope/client/console/panels/UserRequestFormPanel_pt_BR.properties
rename to ext/flowable/client-common-ui/src/main/resources/org/apache/syncope/ext/client/common/ui/panels/UserRequestFormPanel_pt_BR.properties
diff --git a/ext/flowable/client-console/src/main/resources/org/apache/syncope/client/console/panels/UserRequestFormPanel_ru.properties b/ext/flowable/client-common-ui/src/main/resources/org/apache/syncope/ext/client/common/ui/panels/UserRequestFormPanel_ru.properties
similarity index 100%
rename from ext/flowable/client-console/src/main/resources/org/apache/syncope/client/console/panels/UserRequestFormPanel_ru.properties
rename to ext/flowable/client-common-ui/src/main/resources/org/apache/syncope/ext/client/common/ui/panels/UserRequestFormPanel_ru.properties
diff --git a/ext/flowable/client-console/pom.xml b/ext/flowable/client-console/pom.xml
index 165ad1c..9b89261 100644
--- a/ext/flowable/client-console/pom.xml
+++ b/ext/flowable/client-console/pom.xml
@@ -52,6 +52,11 @@ under the License.
     </dependency>
     <dependency>
       <groupId>org.apache.syncope.ext.flowable</groupId>
+      <artifactId>syncope-ext-flowable-client-common-ui</artifactId>
+      <version>${project.version}</version>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.syncope.ext.flowable</groupId>
       <artifactId>syncope-ext-flowable-rest-api</artifactId>
       <version>${project.version}</version>
     </dependency>
diff --git a/ext/flowable/client-console/src/main/java/org/apache/syncope/client/console/panels/BpmnProcessDirectoryPanel.java b/ext/flowable/client-console/src/main/java/org/apache/syncope/client/console/panels/BpmnProcessDirectoryPanel.java
index e420949..7dc2cdb 100644
--- a/ext/flowable/client-console/src/main/java/org/apache/syncope/client/console/panels/BpmnProcessDirectoryPanel.java
+++ b/ext/flowable/client-console/src/main/java/org/apache/syncope/client/console/panels/BpmnProcessDirectoryPanel.java
@@ -34,7 +34,7 @@ import org.apache.commons.lang3.tuple.Pair;
 import org.apache.syncope.client.console.SyncopeConsoleSession;
 import org.apache.syncope.client.console.SyncopeWebApplication;
 import org.apache.syncope.client.ui.commons.Constants;
-import org.apache.syncope.client.console.commons.DirectoryDataProvider;
+import org.apache.syncope.client.ui.commons.DirectoryDataProvider;
 import org.apache.syncope.client.console.commons.SortableDataProviderComparator;
 import org.apache.syncope.client.console.pages.BasePage;
 import org.apache.syncope.client.console.pages.ModelerPopupPage;
diff --git a/ext/flowable/client-console/src/main/java/org/apache/syncope/client/console/panels/UserRequestDirectoryPanel.java b/ext/flowable/client-console/src/main/java/org/apache/syncope/client/console/panels/UserRequestDirectoryPanel.java
index 827e477..428a641 100644
--- a/ext/flowable/client-console/src/main/java/org/apache/syncope/client/console/panels/UserRequestDirectoryPanel.java
+++ b/ext/flowable/client-console/src/main/java/org/apache/syncope/client/console/panels/UserRequestDirectoryPanel.java
@@ -27,7 +27,7 @@ import java.util.List;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.syncope.client.console.SyncopeConsoleSession;
 import org.apache.syncope.client.ui.commons.Constants;
-import org.apache.syncope.client.console.commons.DirectoryDataProvider;
+import org.apache.syncope.client.ui.commons.DirectoryDataProvider;
 import org.apache.syncope.client.console.pages.BasePage;
 import org.apache.syncope.client.console.panels.UserRequestDirectoryPanel.UserRequestProvider;
 import org.apache.syncope.client.console.rest.UserRequestRestClient;
diff --git a/ext/flowable/client-console/src/main/java/org/apache/syncope/client/console/panels/UserRequestFormDirectoryPanel.java b/ext/flowable/client-console/src/main/java/org/apache/syncope/client/console/panels/UserRequestFormDirectoryPanel.java
index 6202c0b..e68ccda 100644
--- a/ext/flowable/client-console/src/main/java/org/apache/syncope/client/console/panels/UserRequestFormDirectoryPanel.java
+++ b/ext/flowable/client-console/src/main/java/org/apache/syncope/client/console/panels/UserRequestFormDirectoryPanel.java
@@ -28,7 +28,7 @@ import java.util.List;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.syncope.client.console.SyncopeConsoleSession;
 import org.apache.syncope.client.ui.commons.Constants;
-import org.apache.syncope.client.console.commons.DirectoryDataProvider;
+import org.apache.syncope.client.ui.commons.DirectoryDataProvider;
 import org.apache.syncope.client.console.rest.UserRequestRestClient;
 import org.apache.syncope.client.console.panels.UserRequestFormDirectoryPanel.UserRequestFormProvider;
 import org.apache.syncope.client.console.layout.FormLayoutInfoUtils;
diff --git a/ext/flowable/client-console/src/main/java/org/apache/syncope/client/console/panels/UserRequestFormModal.java b/ext/flowable/client-console/src/main/java/org/apache/syncope/client/console/panels/UserRequestFormModal.java
index eb469e6..23bd807 100644
--- a/ext/flowable/client-console/src/main/java/org/apache/syncope/client/console/panels/UserRequestFormModal.java
+++ b/ext/flowable/client-console/src/main/java/org/apache/syncope/client/console/panels/UserRequestFormModal.java
@@ -26,6 +26,7 @@ import org.apache.syncope.client.console.wicket.markup.html.bootstrap.dialog.Bas
 import org.apache.syncope.client.ui.commons.panels.SubmitableModalPanel;
 import org.apache.syncope.client.ui.commons.panels.WizardModalPanel;
 import org.apache.syncope.common.lib.to.UserRequestForm;
+import org.apache.syncope.ext.client.common.ui.panels.UserRequestFormPanel;
 import org.apache.wicket.PageReference;
 import org.apache.wicket.ajax.AjaxRequestTarget;
 import org.apache.wicket.markup.html.panel.Panel;
@@ -49,7 +50,7 @@ public class UserRequestFormModal extends Panel implements SubmitableModalPanel,
         this.pageRef = pageRef;
 
         MultilevelPanel mlp = new MultilevelPanel("userRequestForm");
-        mlp.setFirstLevel(new UserRequestFormPanel(pageRef, formTO) {
+        mlp.setFirstLevel(new UserRequestFormPanel(MultilevelPanel.FIRST_LEVEL_ID, pageRef, formTO) {
 
             private static final long serialVersionUID = -2195387360323687302L;
 
diff --git a/ext/flowable/client-enduser/pom.xml b/ext/flowable/client-enduser/pom.xml
index 7210c9f..81be2c7 100644
--- a/ext/flowable/client-enduser/pom.xml
+++ b/ext/flowable/client-enduser/pom.xml
@@ -43,6 +43,11 @@ under the License.
       <artifactId>syncope-ext-flowable-common-lib</artifactId>
       <version>${project.version}</version>
     </dependency>
+     <dependency>
+      <groupId>org.apache.syncope.ext.flowable</groupId>
+      <artifactId>syncope-ext-flowable-client-common-ui</artifactId>
+      <version>${project.version}</version>
+    </dependency>
     <dependency>
       <groupId>org.apache.syncope.ext.flowable</groupId>
       <artifactId>syncope-ext-flowable-rest-api</artifactId>
diff --git a/ext/flowable/client-enduser/src/main/java/org/apache/syncope/client/enduser/pages/Flowable.java b/ext/flowable/client-enduser/src/main/java/org/apache/syncope/client/enduser/pages/Flowable.java
index 113f222..18c8ff3 100644
--- a/ext/flowable/client-enduser/src/main/java/org/apache/syncope/client/enduser/pages/Flowable.java
+++ b/ext/flowable/client-enduser/src/main/java/org/apache/syncope/client/enduser/pages/Flowable.java
@@ -19,8 +19,9 @@
 package org.apache.syncope.client.enduser.pages;
 
 import java.util.Collections;
-import java.util.List;
+import java.util.Iterator;
 import java.util.stream.Collectors;
+import org.apache.commons.lang3.StringUtils;
 import org.apache.syncope.client.enduser.SyncopeEnduserSession;
 import org.apache.syncope.client.enduser.annotations.ExtPage;
 import org.apache.syncope.client.enduser.markup.html.form.BpmnProcessesAjaxPanel;
@@ -29,20 +30,28 @@ import org.apache.syncope.client.enduser.rest.UserRequestRestClient;
 import org.apache.syncope.client.ui.commons.Constants;
 import org.apache.syncope.client.ui.commons.ajax.form.IndicatorAjaxFormComponentUpdatingBehavior;
 import org.apache.syncope.client.ui.commons.wicket.markup.html.bootstrap.tabs.Accordion;
+import org.apache.syncope.common.lib.SyncopeClientException;
 import org.apache.syncope.common.lib.to.UserRequest;
+import org.apache.syncope.common.lib.to.UserRequestForm;
+import org.apache.syncope.ext.client.common.ui.panels.UserRequestFormPanel;
 import org.apache.wicket.ajax.AjaxRequestTarget;
+import org.apache.wicket.ajax.markup.html.AjaxLink;
+import org.apache.wicket.ajax.markup.html.form.AjaxButton;
 import org.apache.wicket.ajax.markup.html.navigation.paging.AjaxPagingNavigator;
 import org.apache.wicket.extensions.markup.html.repeater.util.SortParam;
 import org.apache.wicket.extensions.markup.html.tabs.AbstractTab;
 import org.apache.wicket.extensions.markup.html.tabs.ITab;
 import org.apache.wicket.markup.html.WebMarkupContainer;
-import org.apache.wicket.markup.html.list.ListItem;
-import org.apache.wicket.markup.html.list.PageableListView;
+import org.apache.wicket.markup.html.basic.Label;
+import org.apache.wicket.markup.html.form.Form;
+import org.apache.wicket.markup.html.panel.Fragment;
 import org.apache.wicket.markup.html.panel.Panel;
+import org.apache.wicket.markup.repeater.Item;
+import org.apache.wicket.markup.repeater.data.DataView;
+import org.apache.wicket.markup.repeater.data.IDataProvider;
 import org.apache.wicket.model.IModel;
 import org.apache.wicket.model.Model;
 import org.apache.wicket.model.StringResourceModel;
-import org.apache.wicket.model.util.ListModel;
 import org.apache.wicket.request.mapper.parameter.PageParameters;
 
 @ExtPage(label = "User Requests")
@@ -52,53 +61,49 @@ public class Flowable extends BaseExtPage {
 
     private final int rowsPerPage = 10;
 
-    protected final IModel<List<UserRequest>> userRequests;
-
     private final Model<String> bpmnProcessModel = new Model<>();
 
     private final BpmnProcessRestClient restClient = new BpmnProcessRestClient();
 
     private final UserRequestRestClient userRequestRestClient = new UserRequestRestClient();
 
+    private final WebMarkupContainer paginationContainer;
+
+    private final DataView<UserRequest> urDataView;
+
     public Flowable(final PageParameters parameters) {
         super(parameters);
 
-        this.userRequests = new ListModel<>(userRequestRestClient.getUserRequests(1, rowsPerPage,
-                SyncopeEnduserSession.get().getSelfTO().getUsername(), new SortParam<>("name", true)));
-        final WebMarkupContainer content = new WebMarkupContainer("content");
-        content.setOutputMarkupId(true);
+        paginationContainer = new WebMarkupContainer("content");
+        paginationContainer.setOutputMarkupId(true);
 
         // list of accordions containing request form (if any) and delete button
-        PageableListView<UserRequest> userReqsListView = new PageableListView<>("userRequests", userRequests,
-                rowsPerPage) {
+        urDataView = new DataView<UserRequest>("userRequests", new URDataProvider(rowsPerPage, "bpmnProcess")) {
 
             private static final long serialVersionUID = -5002600396458362774L;
 
             @Override
-            protected void populateItem(final ListItem<UserRequest> item) {
+            protected void populateItem(final Item<UserRequest> item) {
                 final UserRequest userRequest = item.getModelObject();
                 item.add(new Accordion("userRequestDetails", Collections.<ITab>singletonList(new AbstractTab(
-                        new StringResourceModel("user.requests.accordion", content, Model.of(userRequest))) {
+                        new StringResourceModel("user.requests.accordion", paginationContainer,
+                                Model.of(userRequest))) {
 
                     private static final long serialVersionUID = 1037272333056449378L;
 
                     @Override
                     public WebMarkupContainer getPanel(final String panelId) {
-                        // find the form associated to the current request
-                        return new Panel("userRequestForm") {
-
-                            private static final long serialVersionUID = -957948639666058749L;
-
-                        };
+                        // find the form associated to the current request, if any
+                        return new UserRequestDetails(panelId, userRequest);
                     }
                 }), Model.of(-1)).setOutputMarkupId(true));
             }
-
         };
 
-        userReqsListView.setOutputMarkupId(true);
-        content.add(userReqsListView);
-        content.add(new AjaxPagingNavigator("navigator", userReqsListView));
+        urDataView.setItemsPerPage(rowsPerPage);
+        urDataView.setOutputMarkupId(true);
+        paginationContainer.add(urDataView);
+        paginationContainer.add(new AjaxPagingNavigator("navigator", urDataView));
 
         // autocomplete select with bpmnProcesses
         final BpmnProcessesAjaxPanel bpmnProcesses =
@@ -109,16 +114,25 @@ public class Flowable extends BaseExtPage {
 
                     @Override
                     protected void onUpdate(final AjaxRequestTarget target) {
-                        userRequestRestClient.start(bpmnProcessModel.getObject(), null);
-                        target.add(userReqsListView);
+                        if (StringUtils.isNotBlank(bpmnProcessModel.getObject())) {
+                            try {
+                                userRequestRestClient.start(bpmnProcessModel.getObject(), null);
+                            } catch (Exception e) {
+                                LOG.error("Unable to start bpmnProcess [{}]", bpmnProcessModel.getObject(), e);
+                                SyncopeEnduserSession.get()
+                                        .error(String.format("Unable to start bpmnProcess [%s]", e.getMessage()));
+                                notificationPanel.refresh(target);
+                            }
+                            target.add(paginationContainer);
+                        }
                     }
                 });
         bpmnProcesses.setChoices(restClient.getDefinitions().stream()
                 .filter(definition -> !definition.isUserWorkflow())
                 .map(definition -> definition.getKey()).collect(Collectors.toList()));
-        content.add(bpmnProcesses);
+        paginationContainer.add(bpmnProcesses);
 
-        body.add(content);
+        body.add(paginationContainer);
     }
 
     @Override
@@ -127,4 +141,103 @@ public class Flowable extends BaseExtPage {
         navbar.setActiveNavItem(getClass().getSimpleName().toLowerCase());
     }
 
+    public class UserRequestDetails extends Panel {
+
+        private static final long serialVersionUID = -2447602429647965090L;
+
+        public UserRequestDetails(final String id, final UserRequest userRequest) {
+            super(id);
+
+            final UserRequestForm formTO = userRequest.getHasForm()
+                    ? userRequestRestClient.getForm(userRequest.getTaskId()).orElse(null)
+                    : null;
+
+            add(formTO == null || formTO.getProperties() == null || formTO.getProperties().isEmpty()
+                    ? new Fragment("fragContainer", "formDetails", UserRequestDetails.this)
+                            .add(new Label("executionId", userRequest.getExecutionId()))
+                            .add(new Label("startTime", userRequest.getStartTime()))
+                    : new Fragment("fragContainer", "formProperties", UserRequestDetails.this)
+                            .add(new Form<>("userRequestWrapForm")
+                                    .add(new UserRequestFormPanel(
+                                            "userRequestFormPanel",
+                                            getPageReference(),
+                                            formTO,
+                                            false) {
+
+                                        private static final long serialVersionUID = 3617895525072546591L;
+
+                                        @Override
+                                        protected void viewDetails(final AjaxRequestTarget target) {
+                                            // do nothing
+                                        }
+                                    })
+                                    .add(new AjaxButton("submit") {
+
+                                        private static final long serialVersionUID = 4284361595033427185L;
+
+                                        @Override
+                                        protected void onSubmit(final AjaxRequestTarget target) {
+                                            try {
+                                                userRequestRestClient.claimForm(formTO.getTaskId());
+                                                userRequestRestClient.submitForm(formTO);
+                                                target.add(paginationContainer);
+                                            } catch (SyncopeClientException sce) {
+                                                LOG.error("Unable to submit user request form for BPMN process [{}]",
+                                                        formTO.getBpmnProcess(), sce);
+                                                SyncopeEnduserSession.get().error(StringUtils.isBlank(sce.getMessage())
+                                                        ? sce.getClass().getName()
+                                                        : sce.getMessage());
+                                                notificationPanel.refresh(target);
+                                            }
+                                        }
+
+                                    }.setOutputMarkupId(true))));
+
+            add(new AjaxLink<Void>("delete") {
+
+                private static final long serialVersionUID = 3669569969172391336L;
+
+                @Override
+                public void onClick(final AjaxRequestTarget target) {
+                    userRequestRestClient.cancelRequest(userRequest.getExecutionId(), null);
+                    target.add(paginationContainer);
+                }
+
+            });
+        }
+    }
+
+    public class URDataProvider implements IDataProvider<UserRequest> {
+
+        private static final long serialVersionUID = 1169386589403139714L;
+
+        protected final int paginatorRows;
+
+        protected final String sortParam;
+
+        public URDataProvider(final int paginatorRows, final String sortParam) {
+            this.paginatorRows = paginatorRows;
+            this.sortParam = sortParam;
+        }
+
+        @Override
+        public Iterator<UserRequest> iterator(final long first, final long count) {
+            final int page = ((int) first / paginatorRows);
+            return userRequestRestClient.getUserRequests((page < 0 ? 0 : page) + 1,
+                    paginatorRows,
+                    SyncopeEnduserSession.get().getSelfTO().getUsername(),
+                    new SortParam<>(sortParam, true)).iterator();
+        }
+
+        @Override
+        public long size() {
+            return userRequestRestClient.countUserRequests();
+        }
+
+        @Override
+        public IModel<UserRequest> model(final UserRequest ur) {
+            return Model.of(ur);
+        }
+    }
+
 }
diff --git a/ext/flowable/client-enduser/src/main/java/org/apache/syncope/client/enduser/rest/UserRequestRestClient.java b/ext/flowable/client-enduser/src/main/java/org/apache/syncope/client/enduser/rest/UserRequestRestClient.java
index 6179ade..2933faa 100644
--- a/ext/flowable/client-enduser/src/main/java/org/apache/syncope/client/enduser/rest/UserRequestRestClient.java
+++ b/ext/flowable/client-enduser/src/main/java/org/apache/syncope/client/enduser/rest/UserRequestRestClient.java
@@ -22,7 +22,6 @@ import java.util.List;
 import java.util.Optional;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.syncope.client.enduser.SyncopeEnduserSession;
-import org.apache.syncope.common.lib.to.PagedResult;
 import org.apache.syncope.common.lib.to.UserRequest;
 import org.apache.syncope.common.lib.to.UserRequestForm;
 import org.apache.syncope.common.rest.api.beans.UserRequestFormQuery;
@@ -36,8 +35,11 @@ public class UserRequestRestClient extends BaseRestClient {
 
     public int countUserRequests() {
         return getService(UserRequestService.class).
-                list(new UserRequestQuery.Builder().page(1).size(1).build()).
-                getTotalCount();
+                list(new UserRequestQuery.Builder()
+                        .user(SyncopeEnduserSession.get().getSelfTO().getUsername())
+                        .page(1)
+                        .size(1)
+                        .build()).getTotalCount();
     }
 
     public List<UserRequest> getUserRequests(
@@ -68,13 +70,8 @@ public class UserRequestRestClient extends BaseRestClient {
                 getResult();
     }
 
-    public Optional<UserRequestForm> getForm(final String userKey) {
-        PagedResult<UserRequestForm> forms = getService(UserRequestService.class).
-                getForms(new UserRequestFormQuery.Builder().user(userKey).page(1).size(1).build());
-        UserRequestForm form = forms.getResult().isEmpty()
-                ? null
-                : forms.getResult().get(0);
-        return Optional.ofNullable(form);
+    public Optional<UserRequestForm> getForm(final String taskId) {
+        return Optional.ofNullable(getService(UserRequestService.class).getForm(taskId));
     }
 
     public void submitForm(final UserRequestForm form) {
@@ -84,4 +81,8 @@ public class UserRequestRestClient extends BaseRestClient {
     public void start(final String bpmnProcess, final String user) {
         getService(UserRequestService.class).start(bpmnProcess, user);
     }
+
+    public UserRequestForm claimForm(final String taskKey) {
+        return getService(UserRequestService.class).claimForm(taskKey);
+    }
 }
diff --git a/client/idrepo/console/src/main/resources/org/apache/syncope/client/console/wicket/markup/html/form/AjaxDateTimeFieldPanel.html b/ext/flowable/client-enduser/src/main/resources/org/apache/syncope/client/enduser/pages/Flowable$UserRequestDetails.html
similarity index 51%
rename from client/idrepo/console/src/main/resources/org/apache/syncope/client/console/wicket/markup/html/form/AjaxDateTimeFieldPanel.html
rename to ext/flowable/client-enduser/src/main/resources/org/apache/syncope/client/enduser/pages/Flowable$UserRequestDetails.html
index 1b11685..606b6c6 100644
--- a/client/idrepo/console/src/main/resources/org/apache/syncope/client/console/wicket/markup/html/form/AjaxDateTimeFieldPanel.html
+++ b/ext/flowable/client-enduser/src/main/resources/org/apache/syncope/client/enduser/pages/Flowable$UserRequestDetails.html
@@ -17,20 +17,20 @@ specific language governing permissions and limitations
 under the License.
 -->
 <html xmlns="http://www.w3.org/1999/xhtml" xmlns:wicket="http://wicket.apache.org">
-  <wicket:head>
-    <style type="text/css">
-      div.input-group-addon:last-child {
-        border: 1px solid #ccc !important;
-      }
-    </style>
-  </wicket:head>
-  <wicket:extend>
-    <wicket:enclosure child="field-label">
-      <label wicket:id="field-label">[LABEL]</label><span wicket:id="required"/>
-      <span wicket:id="externalAction"/>
-    </wicket:enclosure>
-    <div class="input-group">
-      <span wicket:id="field"/>
-    </div>
-  </wicket:extend>
+  <wicket:panel>
+    <span wicket:id="fragContainer"/>
+    <wicket:fragment wicket:id="formProperties">
+      <form wicket:id="userRequestWrapForm" class="form-horizontal">
+        <span wicket:id="userRequestFormPanel"></span>
+        <div>
+          <input wicket:id="submit" type="submit" wicket:message="value:submit" class="btn btn-primary pull-right"/>
+        </div>
+      </form>
+    </wicket:fragment>
+    <wicket:fragment wicket:id="formDetails">
+      <span><wicket:message key="executionId"/>: <label wicket:id="executionId"/></span>
+      <span><wicket:message key="startTime"/>: <label wicket:id="startTime"/></span>
+    </wicket:fragment>
+    <input wicket:id="delete" type="button" wicket:message="value:delete" class="btn btn-danger pull-left">
+  </wicket:panel>
 </html>
\ No newline at end of file
diff --git a/ext/flowable/client-enduser/src/main/resources/org/apache/syncope/client/enduser/pages/Flowable.html b/ext/flowable/client-enduser/src/main/resources/org/apache/syncope/client/enduser/pages/Flowable.html
index 07dadcd..82daccb 100644
--- a/ext/flowable/client-enduser/src/main/resources/org/apache/syncope/client/enduser/pages/Flowable.html
+++ b/ext/flowable/client-enduser/src/main/resources/org/apache/syncope/client/enduser/pages/Flowable.html
@@ -18,10 +18,8 @@ under the License.
 -->
 <html xmlns="http://www.w3.org/1999/xhtml" xmlns:wicket="http://wicket.apache.org">
   <wicket:extend>
-
     <section class="content" wicket:id="content">
       <div id="flowable_wrapper" class="container-fluid password_reset_wrapper">
-
         <div class="row">
           <div class="col-md-6 col-md-offset-3">
 
@@ -35,29 +33,16 @@ under the License.
               <span wicket:id="bpmnProcesses">[BPMN PROCESSES]</span>
             </div>
 
-          </div> <!-- col -->
-        </div> <!-- row -->
+          </div>
+        </div>
 
         <div class="row">
           <div class="col-md-6 col-md-offset-3">
-
             <table>
               <tbody>
                 <tr wicket:id="userRequests">
                   <td>
-                    <span wicket:id="userRequestDetails">
-                      <div wicket:id="userRequestDetails">
-                        <wicket:panel>
-                          <div wicket:id="userRequestForm">
-                            <div class="form-group">
-                              <span wicket:id="panel">
-                                [panel for dynamic input type markup]
-                              </span>
-                            </div>
-                          </div>
-                        </wicket:panel>
-                      </div>
-                    </span>
+                    <div wicket:id="userRequestDetails"/>
                   </td>
                 </tr>
               </tbody>
@@ -67,11 +52,9 @@ under the License.
                 </tr>
               </tfoot>
             </table>
-
-          </div> <!-- col -->
-        </div> <!-- row -->
+          </div>
+        </div>
       </div>
     </section>
-
   </wicket:extend>
 </html>
\ No newline at end of file
diff --git a/ext/flowable/client-enduser/src/main/resources/org/apache/syncope/client/enduser/pages/Flowable.properties b/ext/flowable/client-enduser/src/main/resources/org/apache/syncope/client/enduser/pages/Flowable.properties
index 6a7b4c6..2794d58 100644
--- a/ext/flowable/client-enduser/src/main/resources/org/apache/syncope/client/enduser/pages/Flowable.properties
+++ b/ext/flowable/client-enduser/src/main/resources/org/apache/syncope/client/enduser/pages/Flowable.properties
@@ -14,5 +14,9 @@
 # KIND, either express or implied.  See the License for the
 # specific language governing permissions and limitations
 # under the License.
-user.requests.accordion=${bpmnProcess}
+user.requests.accordion=${bpmnProcess} (${activityId})
 bpmn.process.title=Requests
+submit=Submit
+executionId=Execution ID
+startTime=Start time
+delete=Delete
diff --git a/ext/flowable/client-enduser/src/main/resources/org/apache/syncope/client/enduser/pages/Flowable_it.properties b/ext/flowable/client-enduser/src/main/resources/org/apache/syncope/client/enduser/pages/Flowable_it.properties
index 9bc6c8d..7fe088f 100644
--- a/ext/flowable/client-enduser/src/main/resources/org/apache/syncope/client/enduser/pages/Flowable_it.properties
+++ b/ext/flowable/client-enduser/src/main/resources/org/apache/syncope/client/enduser/pages/Flowable_it.properties
@@ -14,5 +14,9 @@
 # KIND, either express or implied.  See the License for the
 # specific language governing permissions and limitations
 # under the License.
-user.requests.accordion=${bpmnProcess}
+user.requests.accordion=${bpmnProcess} (${activityId})
 bpmn.process.title=Richieste
+submit=Salva
+executionId=Execution ID
+startTime=Eseguito il
+delete=Cancella
diff --git a/ext/flowable/client-enduser/src/main/resources/org/apache/syncope/client/enduser/pages/Flowable_ja.properties b/ext/flowable/client-enduser/src/main/resources/org/apache/syncope/client/enduser/pages/Flowable_ja.properties
index 28e0ad5..ef027d1 100644
--- a/ext/flowable/client-enduser/src/main/resources/org/apache/syncope/client/enduser/pages/Flowable_ja.properties
+++ b/ext/flowable/client-enduser/src/main/resources/org/apache/syncope/client/enduser/pages/Flowable_ja.properties
@@ -14,5 +14,9 @@
 # KIND, either express or implied.  See the License for the
 # specific language governing permissions and limitations
 # under the License.
-user.requests.accordion=${bpmnProcess}
+user.requests.accordion=${bpmnProcess} (${activityId})
 bpmn.process.title=\u30ea\u30af\u30a8\u30b9\u30c8
+submit=\u63d0\u51fa\u3059\u308b
+executionId=\u5b9f\u884cID
+startTime=\u59cb\u307e\u308b\u6642\u9593
+delete=\u30af\u30ea\u30a2
diff --git a/ext/flowable/client-enduser/src/main/resources/org/apache/syncope/client/enduser/pages/Flowable_pt_BR.properties b/ext/flowable/client-enduser/src/main/resources/org/apache/syncope/client/enduser/pages/Flowable_pt_BR.properties
index c6b0d8d..46781a8 100644
--- a/ext/flowable/client-enduser/src/main/resources/org/apache/syncope/client/enduser/pages/Flowable_pt_BR.properties
+++ b/ext/flowable/client-enduser/src/main/resources/org/apache/syncope/client/enduser/pages/Flowable_pt_BR.properties
@@ -14,5 +14,9 @@
 # KIND, either express or implied.  See the License for the
 # specific language governing permissions and limitations
 # under the License.
-user.requests.accordion=${bpmnProcess}
+user.requests.accordion=${bpmnProcess} (${activityId})
 bpmn.process.title=Os pedidos
+submit=Enviar
+executionId=Execution ID
+startTime=Hora de in\u00edcio
+delete=Limpa
diff --git a/ext/flowable/client-enduser/src/main/resources/org/apache/syncope/client/enduser/pages/Flowable_ru.properties b/ext/flowable/client-enduser/src/main/resources/org/apache/syncope/client/enduser/pages/Flowable_ru.properties
index 9830685..73ad536 100644
--- a/ext/flowable/client-enduser/src/main/resources/org/apache/syncope/client/enduser/pages/Flowable_ru.properties
+++ b/ext/flowable/client-enduser/src/main/resources/org/apache/syncope/client/enduser/pages/Flowable_ru.properties
@@ -14,5 +14,9 @@
 # KIND, either express or implied.  See the License for the
 # specific language governing permissions and limitations
 # under the License.
-user.requests.accordion=${bpmnProcess}
+user.requests.accordion=${bpmnProcess} (${activityId})
 bpmn.process.title=\u0417\u0430\u043f\u0440\u043e\u0441\u044b
+submit=\u041e\u0442\u043f\u0440\u0430\u0432\u0438\u0442\u044c
+executionId=\u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f
+startTime=\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e\u0435 \u0432\u0440\u0435\u043c\u044f
+delete=\u0440\u0430\u0441\u0441\u0435\u0435\u0442\u0441\u044f
diff --git a/ext/flowable/common-lib/src/main/java/org/apache/syncope/common/lib/to/UserRequest.java b/ext/flowable/common-lib/src/main/java/org/apache/syncope/common/lib/to/UserRequest.java
index b0ce0a5..5992dab 100644
--- a/ext/flowable/common-lib/src/main/java/org/apache/syncope/common/lib/to/UserRequest.java
+++ b/ext/flowable/common-lib/src/main/java/org/apache/syncope/common/lib/to/UserRequest.java
@@ -39,6 +39,10 @@ public class UserRequest extends BaseBean {
 
     private String activityId;
 
+    private String taskId;
+
+    private boolean hasForm;
+
     public String getBpmnProcess() {
         return bpmnProcess;
     }
@@ -78,4 +82,21 @@ public class UserRequest extends BaseBean {
     public void setActivityId(final String activityId) {
         this.activityId = activityId;
     }
+
+    public String getTaskId() {
+        return taskId;
+    }
+
+    public void setTaskId(final String taskId) {
+        this.taskId = taskId;
+    }
+
+    public boolean getHasForm() {
+        return hasForm;
+    }
+
+    public void setHasForm(final boolean hasForm) {
+        this.hasForm = hasForm;
+    }
+
 }
diff --git a/ext/flowable/flowable-bpmn/src/main/java/org/apache/syncope/core/flowable/api/UserRequestHandler.java b/ext/flowable/flowable-bpmn/src/main/java/org/apache/syncope/core/flowable/api/UserRequestHandler.java
index 5bd8c9b..c2024ca 100644
--- a/ext/flowable/flowable-bpmn/src/main/java/org/apache/syncope/core/flowable/api/UserRequestHandler.java
+++ b/ext/flowable/flowable-bpmn/src/main/java/org/apache/syncope/core/flowable/api/UserRequestHandler.java
@@ -85,6 +85,14 @@ public interface UserRequestHandler {
     void cancelByUser(AnyDeletedEvent event);
 
     /**
+     * Get the form matching the provided task id.
+     *
+     * @param taskId  user key (optional)
+     * @return the form for the given task id
+     */
+    UserRequestForm getForm(String taskId);
+
+    /**
      * Get the forms matching the provided parameters.
      *
      * @param userKey user key (optional)
diff --git a/ext/flowable/flowable-bpmn/src/main/java/org/apache/syncope/core/flowable/impl/FlowableUserRequestHandler.java b/ext/flowable/flowable-bpmn/src/main/java/org/apache/syncope/core/flowable/impl/FlowableUserRequestHandler.java
index 49df2c3..03c5a7e 100644
--- a/ext/flowable/flowable-bpmn/src/main/java/org/apache/syncope/core/flowable/impl/FlowableUserRequestHandler.java
+++ b/ext/flowable/flowable-bpmn/src/main/java/org/apache/syncope/core/flowable/impl/FlowableUserRequestHandler.java
@@ -123,8 +123,11 @@ public class FlowableUserRequestHandler implements UserRequestHandler {
         userRequest.setStartTime(procInst.getStartTime());
         userRequest.setUsername(userDAO.find(split.getRight()).getUsername());
         userRequest.setExecutionId(procInst.getId());
-        userRequest.setActivityId(engine.getTaskService().createTaskQuery().
-                processInstanceId(procInst.getProcessInstanceId()).singleResult().getTaskDefinitionKey());
+        final Task task = engine.getTaskService().createTaskQuery()
+                .processInstanceId(procInst.getProcessInstanceId()).singleResult();
+        userRequest.setActivityId(task.getTaskDefinitionKey());
+        userRequest.setTaskId(task.getId());
+        userRequest.setHasForm(StringUtils.isNotBlank(task.getFormKey()));
         return userRequest;
     }
 
@@ -399,7 +402,6 @@ public class FlowableUserRequestHandler implements UserRequestHandler {
         }
         formTO.setUsername(user.getUsername());
 
-        formTO.setExecutionId(procInstId);
         formTO.setTaskId(taskId);
         formTO.setFormKey(formKey);
 
@@ -446,6 +448,11 @@ public class FlowableUserRequestHandler implements UserRequestHandler {
         return formTO;
     }
 
+    @Override
+    public UserRequestForm getForm(final String taskId) {
+        return getForm(getTask(taskId));
+    }
+
     @Transactional(readOnly = true)
     @Override
     public Pair<Integer, List<UserRequestForm>> getForms(
@@ -518,15 +525,7 @@ public class FlowableUserRequestHandler implements UserRequestHandler {
     }
 
     protected Pair<Task, TaskFormData> parseTask(final String taskId) {
-        Task task;
-        try {
-            task = engine.getTaskService().createTaskQuery().taskWithFormKey().taskId(taskId).singleResult();
-            if (task == null) {
-                throw new FlowableException("NULL result");
-            }
-        } catch (FlowableException e) {
-            throw new NotFoundException("Flowable Task " + taskId, e);
-        }
+        Task task = getTask(taskId);
 
         TaskFormData formData;
         try {
@@ -538,6 +537,19 @@ public class FlowableUserRequestHandler implements UserRequestHandler {
         return Pair.of(task, formData);
     }
 
+    protected Task getTask(final String taskId) throws NotFoundException {
+        Task task;
+        try {
+            task = engine.getTaskService().createTaskQuery().taskWithFormKey().taskId(taskId).singleResult();
+            if (task == null) {
+                throw new FlowableException("NULL result");
+            }
+        } catch (FlowableException e) {
+            throw new NotFoundException("Flowable Task " + taskId, e);
+        }
+        return task;
+    }
+
     @Override
     public UserRequestForm claimForm(final String taskId) {
         Pair<Task, TaskFormData> parsed = parseTask(taskId);
diff --git a/ext/flowable/logic/src/main/java/org/apache/syncope/core/logic/UserRequestLogic.java b/ext/flowable/logic/src/main/java/org/apache/syncope/core/logic/UserRequestLogic.java
index e7c8727..390782e 100644
--- a/ext/flowable/logic/src/main/java/org/apache/syncope/core/logic/UserRequestLogic.java
+++ b/ext/flowable/logic/src/main/java/org/apache/syncope/core/logic/UserRequestLogic.java
@@ -153,6 +153,11 @@ public class UserRequestLogic extends AbstractTransactionalLogic<EntityTO> {
     }
 
     @PreAuthorize("isAuthenticated()")
+    public UserRequestForm getForm(final String taskId) {
+        return userRequestHandler.getForm(taskId);
+    }
+    
+    @PreAuthorize("isAuthenticated()")
     @Transactional(readOnly = true)
     public Pair<Integer, List<UserRequestForm>> getForms(
             final String userKey,
diff --git a/ext/flowable/pom.xml b/ext/flowable/pom.xml
index 726e20d..826b068 100644
--- a/ext/flowable/pom.xml
+++ b/ext/flowable/pom.xml
@@ -45,6 +45,7 @@ under the License.
     <module>flowable-bpmn</module>
     <module>client-console</module>
     <module>client-enduser</module>
+    <module>client-common-ui</module>
   </modules>
 
 </project>
diff --git a/ext/flowable/rest-api/src/main/java/org/apache/syncope/common/rest/api/service/UserRequestService.java b/ext/flowable/rest-api/src/main/java/org/apache/syncope/common/rest/api/service/UserRequestService.java
index 7c2369b..e61894c 100644
--- a/ext/flowable/rest-api/src/main/java/org/apache/syncope/common/rest/api/service/UserRequestService.java
+++ b/ext/flowable/rest-api/src/main/java/org/apache/syncope/common/rest/api/service/UserRequestService.java
@@ -92,6 +92,17 @@ public interface UserRequestService extends JAXRSService {
             @QueryParam("reason") String reason);
 
     /**
+     * Returns a user request form matching the given task id.
+     *
+     * @param taskId workflow task id
+     * @return the form for the given task id
+     */
+    @GET
+    @Path("forms/{taskId}")
+    @Produces({ MediaType.APPLICATION_JSON, RESTHeaders.APPLICATION_YAML, MediaType.APPLICATION_XML })
+    UserRequestForm getForm(@NotNull @PathParam("taskId") String taskId);
+
+    /**
      * Returns a list of user request forms matching the given query.
      *
      * @param query query conditions
diff --git a/ext/flowable/rest-cxf/src/main/java/org/apache/syncope/core/rest/cxf/service/UserRequestServiceImpl.java b/ext/flowable/rest-cxf/src/main/java/org/apache/syncope/core/rest/cxf/service/UserRequestServiceImpl.java
index 580ca76..547cf34 100644
--- a/ext/flowable/rest-cxf/src/main/java/org/apache/syncope/core/rest/cxf/service/UserRequestServiceImpl.java
+++ b/ext/flowable/rest-cxf/src/main/java/org/apache/syncope/core/rest/cxf/service/UserRequestServiceImpl.java
@@ -68,13 +68,18 @@ public class UserRequestServiceImpl extends AbstractServiceImpl implements UserR
     public UserRequestForm claimForm(final String taskId) {
         return logic.claimForm(taskId);
     }
-    
+
     @Override
     public UserRequestForm unclaimForm(final String taskId) {
         return logic.unclaimForm(taskId);
     }
 
     @Override
+    public UserRequestForm getForm(final String taskId) {
+        return logic.getForm(taskId);
+    }
+
+    @Override
     public PagedResult<UserRequestForm> getForms(final UserRequestFormQuery query) {
         if (query.getUser() != null) {
             query.setUser(getActualKey(userDAO, query.getUser()));
diff --git a/ext/oidcclient/client-console/src/main/java/org/apache/syncope/client/console/panels/OIDCProvidersDirectoryPanel.java b/ext/oidcclient/client-console/src/main/java/org/apache/syncope/client/console/panels/OIDCProvidersDirectoryPanel.java
index b687eb5..7f850d1 100644
--- a/ext/oidcclient/client-console/src/main/java/org/apache/syncope/client/console/panels/OIDCProvidersDirectoryPanel.java
+++ b/ext/oidcclient/client-console/src/main/java/org/apache/syncope/client/console/panels/OIDCProvidersDirectoryPanel.java
@@ -28,7 +28,7 @@ import java.util.List;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.syncope.client.console.SyncopeConsoleSession;
 import org.apache.syncope.client.ui.commons.Constants;
-import org.apache.syncope.client.console.commons.DirectoryDataProvider;
+import org.apache.syncope.client.ui.commons.DirectoryDataProvider;
 import org.apache.syncope.client.console.commons.SortableDataProviderComparator;
 import org.apache.syncope.client.console.layout.UserFormLayoutInfo;
 import org.apache.syncope.client.console.pages.BasePage;
diff --git a/ext/saml2sp/client-console/src/main/java/org/apache/syncope/client/console/panels/SAML2IdPsDirectoryPanel.java b/ext/saml2sp/client-console/src/main/java/org/apache/syncope/client/console/panels/SAML2IdPsDirectoryPanel.java
index 8cdd6bd..9c81f1e 100644
--- a/ext/saml2sp/client-console/src/main/java/org/apache/syncope/client/console/panels/SAML2IdPsDirectoryPanel.java
+++ b/ext/saml2sp/client-console/src/main/java/org/apache/syncope/client/console/panels/SAML2IdPsDirectoryPanel.java
@@ -30,7 +30,7 @@ import org.apache.commons.lang3.StringUtils;
 import org.apache.syncope.client.console.wizards.SAML2IdPWizardBuilder;
 import org.apache.syncope.client.console.SyncopeConsoleSession;
 import org.apache.syncope.client.ui.commons.Constants;
-import org.apache.syncope.client.console.commons.DirectoryDataProvider;
+import org.apache.syncope.client.ui.commons.DirectoryDataProvider;
 import org.apache.syncope.client.console.commons.SortableDataProviderComparator;
 import org.apache.syncope.client.console.layout.UserFormLayoutInfo;
 import org.apache.syncope.client.console.pages.BasePage;
diff --git a/ext/scimv2/client-console/src/main/java/org/apache/syncope/client/console/panels/SCIMConfGeneralPanel.java b/ext/scimv2/client-console/src/main/java/org/apache/syncope/client/console/panels/SCIMConfGeneralPanel.java
index e0bfa4d..50eb499 100644
--- a/ext/scimv2/client-console/src/main/java/org/apache/syncope/client/console/panels/SCIMConfGeneralPanel.java
+++ b/ext/scimv2/client-console/src/main/java/org/apache/syncope/client/console/panels/SCIMConfGeneralPanel.java
@@ -19,7 +19,8 @@
 package org.apache.syncope.client.console.panels;
 
 import java.util.Date;
-import org.apache.syncope.client.console.wicket.markup.html.form.AjaxDateTimeFieldPanel;
+import org.apache.commons.lang3.time.FastDateFormat;
+import org.apache.syncope.client.ui.commons.markup.html.form.AjaxDateTimeFieldPanel;
 import org.apache.syncope.client.ui.commons.markup.html.form.AjaxTextFieldPanel;
 import org.apache.syncope.common.lib.SyncopeConstants;
 import org.apache.syncope.common.lib.scim.SCIMConf;
@@ -53,7 +54,7 @@ public class SCIMConfGeneralPanel extends SCIMConfTabPanel {
                         scimGeneralConf.setCreationDate(object);
                     }
 
-                }, SyncopeConstants.DEFAULT_DATE_PATTERN);
+                }, FastDateFormat.getInstance(SyncopeConstants.DEFAULT_DATE_PATTERN));
         creationDatePanel.setEnabled(false);
 
         AjaxDateTimeFieldPanel lastChangeDatePanel =
@@ -71,7 +72,7 @@ public class SCIMConfGeneralPanel extends SCIMConfTabPanel {
                         scimGeneralConf.setLastChangeDate(object);
                     }
 
-                }, SyncopeConstants.DEFAULT_DATE_PATTERN);
+                }, FastDateFormat.getInstance(SyncopeConstants.DEFAULT_DATE_PATTERN));
         lastChangeDatePanel.setEnabled(false);
 
         AjaxTextFieldPanel bulkMaxOperationsPanel =


Mime
View raw message